diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-05-09 12:31:50 +0200 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-05-09 12:31:50 +0200 |
| commit | 02abc030a68cb2fdd2f21c96db830ec8cb9176ad (patch) | |
| tree | 0c2d67c94a3618639fc2cd29d8bc78820e41c254 | |
| parent | b5124347359833fcde33452978c62133879c6c9e (diff) | |
| parent | 3a2d19df9e509d0b015c786eb02f8315ff0ad91c (diff) | |
| download | libft-02abc030a68cb2fdd2f21c96db830ec8cb9176ad.tar.gz libft-02abc030a68cb2fdd2f21c96db830ec8cb9176ad.tar.bz2 libft-02abc030a68cb2fdd2f21c96db830ec8cb9176ad.zip | |
Merge remote-tracking branch 'origin/minishell'
87 files changed, 2271 insertions, 368 deletions
@@ -6,7 +6,7 @@ # By: cacharle <marvin@42.fr> +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2019/10/08 15:45:53 by cacharle #+# #+# # -# Updated: 2020/04/01 21:58:00 by charles ### ########.fr # +# Updated: 2020/05/09 12:28:11 by charles ### ########.fr # # # # **************************************************************************** # @@ -30,6 +30,9 @@ INCLUDE_DIR = include CC = gcc OFLAG ?= -O0 CCFLAGS = $(OFLAG) -I$(INCLUDE_DIR) -Wall -Wextra -Werror +ifeq ($(TRAVIS_COMPILER),gcc) +CCFLAGS += -Wno-unused-result +endif ifeq ($(TRAVIS_COMPILER),gcc) CCFLAGS += -Wno-unused-result @@ -28,166 +28,9 @@ Much like the `.gitignore` file, you can put the files/directory to ignore when ## Documentation -### mem - -| Name | Prototype | Description | Tested | -|--------------------|-------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------|--------| -| ft_bzero | `void ft_bzero(void *s, size_t n)` | fill `n` bytes of `s` with 0 | [x] | -| ft_calloc | `void *ft_calloc(size_t count, size_t size)` | allocate `count` element of `size` and initialize them to 0 | [x] | -| ft_memccpy | `void *ft_memccpy(void *dest, const void *src, int c, size_t n)` | copy `n` byte from `src` to `dest` until `c` is reached | [x] | -| ft_memchr | `void *ft_memchr(const void *s, int c, size_t n)` | return the address of the first occurance of `c` in `s` or NULL if `c` isn't found | [x] | -| ft_memcmp | `int ft_memcmp(const void *s1, const void *s2, size_t n)` | compare `n` byte of `s1` and `s2` | [x] | -| ft_memcpy | `void *ft_memcpy(void *dest, const void *src, size_t n)` | copy `n` byte from `src` to `dest` | [x] | -| ft_memmem | `void *ft_memmem(const void *big, size_t big_len, const void *little, size_t little_len)` | search `little` in `big` | [x] | -| ft_memmove | `void *ft_memmove(void *dst, const void *src, size_t len)` | copy `len` byte from `src` to `dst` and the copied memory can overlap | [x] | -| ft_memset | `void *ft_memset(void *s, int c, size_t n)` | set `n` byte of `s` to `c` | [x] | -| ft_memset_pattern4 | `void ft_memset_pattern4(void *b, const void *pattern4, size_t len)` | set `len` byte of `b` to a reapeated pattern of 4 bytes | [x] | -| ft_memswap | `void ft_memswap(void *a, void *b, size_t size)` | swap `a` and `b` memory | [x] | - -### algo - -| Name | Prototype | Description | Tested | -|---------------|-----------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------|--------| -| ft_bsearch | `void *ft_bsearch(const void *base, size_t nel, size_t width, t_ftsearch_const *consts)` | search `consts.key` in `base` using binary search (NULL if not found) | [x] | -| ft_compar_int | `int ft_compar_int(const void *a, const void *b)` | comparison function of `int` | [x] | -| ft_heapsort | `int ft_heapsort(void *base, size_t nel, size_t width, int (*compar)(const void *, const void *))` | sort `base` using heapsort | [?] | -| ft_is_set | `t_ftbool ft_is_set(void *base, size_t nel, size_t width, t_ftcompar_func compar)` | check is `base` has unique elements | [x] | -| ft_lfind | `void *ft_lfind(const void *base, size_t *nelp, size_t width, t_ftsearch_const *consts)` | search `consts.key` in `base` using linear search (NULL if not found) | [x] | -| ft_lsearch | `void *ft_lsearch(const void *base, size_t *nelp, size_t width, t_ftsearch_const *consts)` | search `consts.key` in `base` using linear search (insert at the end if not found) | [x] | -| ft_mergesort | `int ft_mergesort(void *base, size_t nel, size_t width, int (*compar)(const void *, const void *))` | sort `base` using mergesort | [x] | -| ft_qsort | `void ft_qsort(void *base, size_t nel, size_t width, t_ftcompar_func compar)` | sort `base` using quicksort | [x] | -| ft_reverse | `void ft_reverse(void *base, size_t nel, size_t width)` | reverse `base` | [x] | - -### bt - -| Name | Prototype | Description | Tested | -|--------------|---------------------------------------------------------------|----------------------------------------------|--------| -| ft_btdestroy | `void ft_btdestroy(t_ftbtree *tree, void (*del)(void *data))` | destroy `tree` and apply `del` on nodes data | [ ] | -| ft_btnew | `t_ftbtree *ft_btnew(void *data)` | create a new node with `data` | [ ] | - -### ctype - -| Name | Prototype | Description | Tested | -|------------|-------------------------|----------------------------------------------------|--------| -| ft_isalnum | `int ft_isalnum(int c)` | c is alphanumeric | [x] | -| ft_isalpha | `int ft_isalpha(int c)` | c is alphabetic | [x] | -| ft_isascii | `int ft_isascii(int c)` | c is ascii | [x] | -| ft_isblank | `int ft_isblank(int c)` | c is `\t` ` ` | [x] | -| ft_isdigit | `int ft_isdigit(int c)` | c is a digit | [x] | -| ft_isprint | `int ft_isprint(int c)` | c is a printable character | [x] | -| ft_isspace | `int ft_isspace(int c)` | c is `\t` `\n` `\v` `\f` `\r` ` ` | [x] | -| ft_todigit | `int ft_todigit(int c)` | convert lower case to upper case | [x] | -| ft_tolower | `int ft_tolower(int c)` | convert upper case to lower case | [x] | -| ft_toupper | `int ft_toupper(int c)` | convert digit character to int (-1 if not a digit) | [x] | - -### ht - -| Name | Prototype | Description | Tested | -|------------------|-------------------------------------------------------------------------|-----------------------------------------------------------|--------| -| ft_htcontent_new | `t_ftht_content *ft_htcontent_new(char *key, void *value)` | create a new key/value pair | [x] | -| ft_htdelone | `void ft_htdelone(t_ftht *ht, char *key, void (*del)(t_ftht_content*))` | delete element at `key` | [x] | -| ft_htdestroy | `void ft_htdestroy(t_ftht *ht, void (*del)(t_ftht_content*))` | destroy `ht` with the `del` functions applied on values | [x] | -| ft_htget | `void *ft_htget(t_ftht *ht, char *key)` | return value at `key` | [x] | -| ft_htnew | `t_ftht *ft_htnew(t_ftsize size)` | create a new hash table with a underlying array of `size` | [x] | -| ft_htset | `t_ftht_content *ft_htset(t_ftht *ht, char *key, void *value)` | set `key` to value, if element doesn't exist, create it | [x] | - -### io - -| Name | Prototype | Description | Tested | -|---------------|-----------------------------------------|------------------------------------------------|--------| -| ft_getchar | `char ft_getchar(void)` | read one character from stdin and return it | [ ] | -| ft_next_line | `int ft_next_line(int fd, char **line)` | read a line of `fd` and put it in `line` | [ ] | -| ft_putchar | `void ft_putchar(char c)` | write a character on stdout | [ ] | -| ft_putchar_fd | `void ft_putchar_fd(char c, int fd)` | write a character on `fd` | [ ] | -| ft_putendl | `void ft_putendl(char *s)` | write a string followed by a newline on stdout | [ ] | -| ft_putendl_fd | `void ft_putendl_fd(char *s, int fd)` | write a string followed by a newline on `fd` | [ ] | -| ft_putnbr | `void ft_putnbr(int n)` | write a number on stdout | [ ] | -| ft_putnbr_fd | `void ft_putnbr_fd(int n, int fd)` | write a number on `fd` | [ ] | -| ft_putstr | `void ft_putstr(char const *s)` | write a string on stdout | [ ] | -| ft_putstr_fd | `void ft_putstr_fd(char *s, int fd)` | write a string on `fd` | [ ] | - -### printf - -| Name | Prototype | Description | Tested | -|---------------|----------------------------------------------------------------------------|---------------------------------------------------------------------|--------| -| ft_asprintf | `int ft_asprintf(char **ret, const char *format, ...)` | allocate and return the formated string | [ ] | -| ft_dprintf | `int ft_dprintf(int fd, const char *format, ...)` | write formated string to `fd` | [ ] | -| ft_printf | `int ft_printf(const char *format, ...)` | write formated string to stdout | [ ] | -| ft_snprintf | `int ft_snprintf(char *str, size_t size, const char *format, ...)` | write formated string in `str` with max `size` character | [ ] | -| ft_sprintf | `int ft_sprintf(char *str, const char *format, ...)` | write formated string in `str` | [ ] | -| ft_vasprintf | `int ft_vasprintf(char **ret, const char *format, va_list ap)` | allocate and return the formated string, with `ap` | [ ] | -| ft_vdprintf | `int ft_vdprintf(int fd, const char *format, va_list ap)` | write formated string to `fd` , with `ap` | [ ] | -| ft_vprintf | `int ft_vprintf(const char *format, va_list ap)` | write formated string to stdout, with `ap` | [ ] | -| ft_vsnprintf | `int ft_vsnprintf(char *str, size_t size, const char *format, va_list ap)` | write formated string in `str` with max `size` character, with `ap` | [ ] | -| ft_vsprintf | `int ft_vsprintf(char *str, const char *format, va_list ap)` | write formated string in `str`, with `ap` | [ ] | - -### lst - -| Name | Prototype | Description | Tested | -|--------------------|---------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------|--------| -| ft_lstadd_back | `void ft_lstadd_back(t_ftlst **alst, t_ftlst *new)` | add `new` at the start of `alst` | [x] | -| ft_lstadd_front | `void ft_lstadd_front(t_ftlst **alst, t_ftlst *new)` | add `new` at the end of `alst` | [x] | -| ft_lstbsearch | `t_ftlst *ft_lstbsearch(t_ftlst *lst, t_ftbool (*equal)(void *ref, void *content), void *ref)` | search `ref` in `lst` using binary search | [x] | -| ft_lstlsearch | `t_ftlst *ft_lstlsearch(t_ftlst *lst, t_ftbool (*equal)(void *ref, void *content), void *ref)` | search `ref` in `lst` using linear search (push back if not found)| [x] | -| ft_lstlfind | `t_ftlst *ft_lstlsearch(t_ftlst *lst, t_ftbool (*equal)(void *ref, void *content), void *ref)` | search `ref` in `lst` using linear search | [x] | -| ft_lstclear | `void ft_lstclear(t_ftlst **lst, void (*del)(void *))` | free all data with `del`, free all nodes and set `*lst` to NULL | [x] | -| ft_lstdelone | `void ft_lstdelone(t_ftlst *lst, void (*del)(void *))` | free `lst` node | [x] | -| ft_lstiter | `void ft_lstiter(t_ftlst *lst, void (*f)(void *))` | apply `f` on each node of `lst` | [x] | -| ft_lstlast | `t_ftlst *ft_lstlast(t_ftlst *lst)` | return the last node of `lst` | [x] | -| ft_lstmap | `t_ftlst *ft_lstmap(t_ftlst *lst, void *(*f)(void *), void (*del)(void *))` | create a new list which is `lst` with all node passed through `f` | [x] | -| ft_lstnew | `t_ftlst *ft_lstnew(void const *content)` | create a new node with `content` | [x] | -| ft_lstpop_front | `void ft_lstpop_front(t_ftlst **lst, void (*del)(void *))` | remove the front of `lst` | [x] | -| ft_lstremove_if | `void ft_lstremove_if(t_ftlst **lst, int (*cmp)(const void *ref, const void *content), void *ref, void (*del)(void *content))` | remove all element which verify `equal` | [x] | -| ft_lstreverse | `void ft_lstreverse(t_ftlst **lst)` | reverse `lst` | [x] | -| ft_lstreverse_ret | `t_ftlst *ft_lstreverse_ret(t_ftlst *lst)` | reverse `lst` and return it | [x] | -| ft_lstsize | `int ft_lstsize(t_ftlst *lst)` | return the number of node in `lst` | [x] | -| ft_lstsort | `void ft_lstsort(t_ftlst **begin_list, int (*cmp)(void *, void*))` | sort `begin_list` using mergesort | [x] | -| ft_lstsorted_merge | `t_ftlst *ft_lstsorted_merge(t_ftlst *l1, t_ftlst *l2, int (*cmp)(void *, void *))` | merge 2 sorted list and return the merged and still sorted one | [x] | - -### str - -| Name | Prototype | Description | Tested | -|----------------|--------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------|--------| -| ft_atoi | `int ft_atoi(const char *nptr)` | convert `nptr` to an int | [ ] | -| ft_atoi_strict | `int ft_atoi_strict(const char *s )` | convert `nptr` to an int without spaces or other characters | [ ] | -| ft_itoa | `char *ft_itoa(int n)` | return a string which represent `n` | [ ] | -| ft_split | `char **ft_split(char const *s, char c)` | return the strings in between `c` in `s` | [ ] | -| ft_strcasecmp | `int ft_strcasecmp(const char *s1, const char *s2)` | compare `s1` and `s2` ignoring case | [ ] | -| ft_strcat | `char *ft_strcat(char *dest, const char *src)` | concatenate `dest` and `src` in `dest` | [ ] | -| ft_strchr | `char *ft_strchr(const char *s, int c)` | search `c` in `s`, return address if found, NULL otherwise | [ ] | -| ft_strcmp | `int ft_strcmp(const char *s1, const char *s2)` | compare `s1` and `s2` | [ ] | -| ft_strcount | `int ft_strcount(char *str, char c)` | count the number of occurence of `c` in `str` | [ ] | -| ft_strcpy | `char *ft_strcpy(char *dest, const char *src)` | copy `src` in `dest` | [ ] | -| ft_strcspn | `size_t ft_strcspn(const char *s, const char *charset)` | return the index of the first character in `charset` | [ ] | -| ft_strdup | `char *ft_strdup(const char *s)` | allocate and copy `s` in a new string then return it | [ ] | -| ft_strequ | `int ft_strequ(char const *s1, char const *s2)` | test if `s1` and `s2` are equal | [ ] | -| ft_striter | `void ft_striter(char *s, void (*f)(char *))` | apply `f` over every character of `s` | [ ] | -| ft_striteri | `void ft_striteri(char *s, void (*f)(unsigned int, char *))` | apply `f` over every character of `s` with index | [ ] | -| ft_strjoin | `char *ft_strjoin(char const *s1, char const *s2)` | allocate a concatenation of `s1` and `s2` | [ ] | -| ft_strjoinf | `char *ft_strjoinf(char const *s1, char const *s2, t_ftstrjoin_tag tag)` | allocate a concatenation of `s1` and `s2` then free `s1`, `s2` or both according to `tag` | [ ] | -| ft_strlcat | `size_t ft_strlcat(char *dst, const char *src, size_t size)` | concatenate `dest` and `src` in dest with maximum `size - 1` character | [ ] | -| ft_strlcpy | `size_t ft_strlcpy(char *dst, const char *src, size_t size)` | copy `src` in `dest` with maximum `size - 1` character | [ ] | -| ft_strlen | `size_t ft_strlen(const char *s)` | return the length of `s` | [x] | -| ft_strmap | `char *ft_strmap(char const *s, char (*f)(char))` | allocate a copy of `s` with every character passed through `f` | [ ] | -| ft_strmapi | `char *ft_strmapi(char *s, char (*f)(unsigned int, char))` | allocate a copy of `s` with every character passed through `f` with index | [ ] | -| ft_strncasecmp | `int ft_strncasecmp(const char *s1, const char *s2, size_t n)` | compare `s1` and `s2` ignoring case until `n` | [ ] | -| ft_strncat | `char *ft_strncat(char *dest, const char *src, size_t n)` | concatenate `dest` and `src` in dest with maximum `n` character | [ ] | -| ft_strncmp | `int ft_strncmp(const char *s1, const char *s2, size_t n)` | compare `s1` and `s2` until `n` | [ ] | -| ft_strncpy | `char *ft_strncpy(char *dest, const char *src, size_t n)` | copy `src` in `dest` with maximum `n` character | [ ] | -| ft_strndup | `char *ft_strndup(const char *s1, size_t n)` | allocate and copy `s` until `n` in a new string then return it | [ ] | -| ft_strnequ | `int ft_strnequ(char const *s1, char const *s2, size_t n)` | test if `s1` and `s2` are not equal | [ ] | -| ft_strnlen | `size_t ft_strnlen(const char *s, size_t maxlen)` | return the length of `s` until `maxlen` | [ ] | -| ft_strnstr | `char *ft_strnstr(const char *haystack, const char *needle, size_t len)` | search `len` character of `haystack` for `needle` | [ ] | -| ft_strpbrk | `char *ft_strpbrk(const char *s, const char *charset)` | return the address of the first character in `charset` in `s` (NULL if not any) | [ ] | -| ft_strrchr | `char *ft_strrchr(const char *s, int c)` | search `c` in `s` from the end, return the address of first match (NULL if not found) | [ ] | -| ft_strsep | `char *ft_strsep(char **stringp, const char *delim)` | find first occurance of `delim` in `*stringp` replace it with `'\0'` return pointer to the match and store char after in `*stringp` | [ ] | -| ft_strspn | `size_t ft_strspn(const char *s, const char *charset)` | return the index of the first character not in `charset` | [ ] | -| ft_strstr | `char *ft_strstr(const char *haystack, const char *needle)` | search for `needle` in `haystack` (NULL if not found) | [ ] | -| ft_strtol | `long ft_strtol(const char *s, char **endptr, int base)` | convert `s` to a long int and store address of the next to last digit in `endptr`, according to `base` (2..26) | [ ] | -| ft_strtolower | `char *ft_strtolower(char *s)` | convert all characters of `s` to lower case | [ ] | -| ft_strtoupper | `char *ft_strtoupper(char *s)` | convert all characters of `s` to upper case | [ ] | -| ft_strtrim | `char *ft_strtrim(char const *s1, char const *set)` | remove the characters in `set` at the start and end of `s1` | [ ] | -| ft_substr | `char *ft_substr(char const *s, unsigned int start, size_t len)` | allocate and fill substring in `s` at `start` with length `len` | [ ] | +1. Install [Doxygen](http://doxygen.nl/manual/install.html) +2. Run `make doc` +3. Open doc/html/index.html in your browser or read the man in doc/man/man3 ## School correction state diff --git a/include/libft.h b/include/libft.h index 74f074b..e982608 100644 --- a/include/libft.h +++ b/include/libft.h @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/10/07 09:45:02 by cacharle #+# #+# */ -/* Updated: 2020/02/10 02:19:47 by cacharle ### ########.fr */ +/* Updated: 2020/04/03 06:32:37 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,18 +17,18 @@ # include <stdarg.h> # include <stdlib.h> # include <stddef.h> +# include <stdbool.h> # include <limits.h> # include <errno.h> -# include "libft_types.h" -# include "libft_ctype.h" -# include "libft_io.h" -# include "libft_mem.h" -# include "libft_str.h" - # ifdef __linux__ # include <stdio.h> # define OPEN_MAX FOPEN_MAX # endif +# include "libft_io.h" +# include "libft_mem.h" +# include "libft_str.h" +# include "libft_ctype.h" + #endif diff --git a/include/libft_algo.h b/include/libft_algo.h index 7223e7b..e859de5 100644 --- a/include/libft_algo.h +++ b/include/libft_algo.h @@ -1,24 +1,33 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* ft_algo.h :+: :+: :+: */ +/* libft_algo.h :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/19 07:22:57 by cacharle #+# #+# */ -/* Updated: 2020/02/10 05:58:26 by cacharle ### ########.fr */ +/* Updated: 2020/04/04 23:33:51 by charles ### ########.fr */ /* */ /* ************************************************************************** */ +/* +** \file libft_algo.h +** \brief Algorithms +*/ + #ifndef LIBFT_ALGO_H # define LIBFT_ALGO_H # include <stdlib.h> -# include <stddef.h> # include "libft_mem.h" -# include "libft_types.h" +# include "libft_def.h" +# include "libft_str.h" -typedef int (*t_ftcompar_func)(const void*, const void*); +/* +** \brief Range struct +** \param lo Lower bound +** \param hi Upper bound +*/ typedef struct { @@ -26,6 +35,14 @@ typedef struct int hi; } t_ftrange; +/* +** \brief Merge sort consts struct +** \param base Array to sort +** \param left Left subarray +** \param right Right subarray +** \note Only used internaly by ft_mergesort +*/ + struct s_merge_sorted_arrays { void *base; @@ -33,15 +50,20 @@ struct s_merge_sorted_arrays void *right; }; +/* +** remove this horror +*/ + typedef struct s_ft_search_const { const void *key; t_ftcompar_func compar; } t_ftsearch_const; -t_ftbool ft_is_set(void *base, size_t nel, size_t width, +bool ft_is_set(void *base, size_t nel, size_t width, t_ftcompar_func compar); int ft_compar_int(const void *a, const void *b); +int ft_compar_str(const void *s1_p, const void *s2_p); void ft_qsort(void *base, size_t nel, size_t width, t_ftcompar_func compar); int ft_mergesort(void *base, size_t nel, size_t width, diff --git a/include/libft_types.h b/include/libft_def.h index 3987a80..fa8d550 100644 --- a/include/libft_types.h +++ b/include/libft_def.h @@ -1,17 +1,26 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* libft_types.h :+: :+: :+: */ +/* libft_def.h :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/31 10:36:56 by cacharle #+# #+# */ -/* Updated: 2020/02/28 12:10:02 by cacharle ### ########.fr */ +/* Updated: 2020/05/09 12:31:09 by charles ### ########.fr */ /* */ /* ************************************************************************** */ -#ifndef LIBFT_TYPES_H -# define LIBFT_TYPES_H +/* +** \file libft_def.h +** \brief Type and constant definition +*/ + +#ifndef LIBFT_DEF_H +# define LIBFT_DEF_H + +# include <stddef.h> +# include <stdint.h> +# include <stdbool.h> # define TRUE 1 # define FALSE 0 @@ -27,4 +36,22 @@ typedef unsigned int t_ftuint; typedef long int t_ftlong; typedef unsigned long int t_ftulong; +/* +** \brief Standard delete function +** \param x Resource to delete +*/ + +typedef void (*t_ftdel_func)(void *x); + +/* +** \brief Standard comparison function +** \param x1 Resource 1 +** \param x2 Resource 2 +** \return negative number if x1 < x2, +** 0 if x1 == x2, +** positive number if x1 > x2 +*/ + +typedef int (*t_ftcompar_func)(const void *x1, const void *x2); + #endif diff --git a/include/libft_dlst.h b/include/libft_dlst.h new file mode 100644 index 0000000..9870ea7 --- /dev/null +++ b/include/libft_dlst.h @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* libft_dlst.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/03 15:15:04 by charles #+# #+# */ +/* Updated: 2020/04/03 15:44:32 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef LIBFT_DLST_H +# define LIBFT_DLST_H + +# include <stdlib.h> +# include "libft_def.h" + +typedef struct s_ftdlst +{ + struct s_ftdlst *prev; + struct s_ftdlst *next; + void *data; +} t_ftdlst; + +t_ftdlst *ft_dlstnew(void *data); +void ft_dlstdestroy(t_ftdlst *dlst, t_ftdel_func del); +void ft_dlstdelone(t_ftdlst *dlst, t_ftdel_func del); + +#endif diff --git a/include/libft_dstr.h b/include/libft_dstr.h new file mode 100644 index 0000000..732e475 --- /dev/null +++ b/include/libft_dstr.h @@ -0,0 +1,44 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* libft_dstr.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/03 10:39:51 by charles #+# #+# */ +/* Updated: 2020/04/05 00:37:05 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef LIBFT_DSTR_H +# define LIBFT_DSTR_H + +# include <stdlib.h> +# include "libft_def.h" +# include "libft_str.h" +# include "libft_mem.h" + +/* +** \brief Dynamic string struct +** \param str Underlying null-terminated character array +** \param length Number of character (not including the '\0') +** \param capacity Maximum length - 1 of the current string +*/ + +typedef struct s_ftdstr +{ + char *str; + size_t length; + size_t capacity; +} t_ftdstr; + +t_ftdstr *ft_dstrnew(char *from); +void ft_dstrdestroy(t_ftdstr *dstr); +t_ftdstr *ft_dstrgrow(t_ftdstr *dstr, size_t at_least); +char *ft_dstrunwrap(t_ftdstr *dstr); +t_ftdstr *ft_dstrinsert(t_ftdstr *dstr, char *inserted, size_t i); +void ft_dstrerase(t_ftdstr *dstr, size_t start, size_t len); +t_ftdstr *ft_dstrsubstitute(t_ftdstr *dstr, char *replacement, + size_t start, size_t end); + +#endif diff --git a/include/libft_ht.h b/include/libft_ht.h index 10c6fc7..c53ee4d 100644 --- a/include/libft_ht.h +++ b/include/libft_ht.h @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/31 10:36:09 by cacharle #+# #+# */ -/* Updated: 2020/04/01 17:59:35 by charles ### ########.fr */ +/* Updated: 2020/04/04 22:34:53 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,7 +19,9 @@ */ # include "libft.h" +# include "libft_def.h" # include "libft_lst.h" +# include "libft_mem.h" /* ** \brief Hash table entry, key/value pair @@ -27,45 +29,42 @@ ** \param value Pointer to data */ -typedef struct s_ftht_entry +typedef struct s_ftht_entry { - char *key; - void *value; -} t_ftht_entry; - -typedef t_ftlst* t_ftht_bucket; + char *key; + void *value; +} t_ftht_entry; /* ** \brief Hash table struct ** \param size Number of buckets -** \param buckets Bucket array +** \param buckets Bucket array, each bucket is a linked list */ -typedef struct s_ftht +typedef struct s_ftht { - t_ftsize size; - t_ftht_bucket *buckets; -} t_ftht; - -typedef t_ftuint t_ftht_digest; + size_t size; + t_ftlst **buckets; +} t_ftht; -t_ftht_digest ft_hthash(t_ftht *ht, char *key); +size_t ft_hthash(t_ftht *ht, char *key); -t_ftht *ft_htnew(t_ftsize size); -void ft_htdestroy(t_ftht *ht, void (*del)(t_ftht_entry*)); -void *ft_htget(t_ftht *ht, char *key); -t_ftht_entry *ft_htset(t_ftht *ht, char *key, void *value, - void (*del)(t_ftht_entry*)); -void ft_htdelone(t_ftht *ht, char *key, - void (*del)(t_ftht_entry*)); -t_ftht_entry *ft_htentry_new(char *key, void *value); -void ft_htiter(t_ftht *ht, void (*f)(t_ftht_entry*)); +t_ftht *ft_htnew(size_t size); +void ft_htdestroy(t_ftht *ht, t_ftdel_func del); +void *ft_htget(t_ftht *ht, char *key); +t_ftht_entry *ft_htset(t_ftht *ht, char *key, void *value, + t_ftdel_func del); +void ft_htdelone(t_ftht *ht, char *key, t_ftdel_func del); +t_ftht_entry *ft_htentry_new(char *key, void *value); +void ft_htiter(t_ftht *ht, void (*f)(t_ftht_entry*)); /* ** internals */ -int ft_inter_htkey_cmp(const void *ref_key, - const void *content); +int ft_inter_htkey_cmp(const void *ref_key, const void *content); +void ft_inter_htdel_first_order(t_ftht_entry *entry); +void ft_inter_htdel_first_order_setup(t_ftdel_func del); +void ft_inter_htdel_first_order_teardown(void); #endif diff --git a/include/libft_lst.h b/include/libft_lst.h index d7157a9..2938bd2 100644 --- a/include/libft_lst.h +++ b/include/libft_lst.h @@ -19,7 +19,7 @@ */ # include <stdlib.h> -# include "libft_types.h" +# include "libft_def.h" # include "libft_algo.h" /* diff --git a/include/libft_mem.h b/include/libft_mem.h index 7ec7122..f26180d 100644 --- a/include/libft_mem.h +++ b/include/libft_mem.h @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/31 10:35:57 by cacharle #+# #+# */ -/* Updated: 2020/02/28 12:17:48 by cacharle ### ########.fr */ +/* Updated: 2020/05/09 12:28:55 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,8 +14,7 @@ # define LIBFT_MEM_H # include <stddef.h> -# include <stdint.h> -# include "libft_types.h" +# include "libft_def.h" void ft_bzero(void *s, size_t n); void *ft_memset(void *s, int c, size_t n); diff --git a/include/libft_str.h b/include/libft_str.h index a373e86..07a5fe0 100644 --- a/include/libft_str.h +++ b/include/libft_str.h @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/31 10:39:22 by cacharle #+# #+# */ -/* Updated: 2020/05/08 13:39:12 by charles ### ########.fr */ +/* Updated: 2020/05/09 12:29:21 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,6 +14,7 @@ # define LIBFT_STR_H # include <stddef.h> +# include <stdbool.h> # include "libft_ctype.h" # include "libft_mem.h" # include "libft_util.h" @@ -52,7 +53,8 @@ int ft_atoi(const char *nptr); void ft_striter(char *s, void (*f)(char *)); void ft_striteri(char *s, void (*f)(unsigned int, char *)); -char *ft_substr(char const *s, unsigned int start, size_t len); +char *ft_strsub(char const *s, size_t start, size_t len); +char *ft_strsubf(char const *s, size_t start, size_t len); char *ft_strjoin(char const *s1, char const *s2); char *ft_strjoin3(char const *s1, char const *s2, char const *s3); char *ft_strjoinf(char const *s1, char const *s2, t_ftstrjoinf_tag tag); @@ -75,6 +77,20 @@ int ft_strequ(char const *s1, char const *s2); int ft_strnequ(char const *s1, char const *s2, size_t n); char *ft_strtolower(char *s); char *ft_strtoupper(char *s); +char *ft_strcat3(char *dest, const char *src1, const char *src2); + +/* +** glob +*/ + +bool ft_fnmatch(const char *pattern, const char *string); + +/* +** NULL terminated string array +*/ + +char *ft_strsjoin(char **strs, char *delim); +char *ft_strsjoinf(char **strs, char *delim); /* ** bloat ? diff --git a/include/libft_vec.h b/include/libft_vec.h index 62ec257..8424bd5 100644 --- a/include/libft_vec.h +++ b/include/libft_vec.h @@ -6,7 +6,7 @@ /* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/01 18:57:16 by charles #+# #+# */ -/* Updated: 2020/04/01 19:40:53 by charles ### ########.fr */ +/* Updated: 2020/04/04 15:55:29 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,8 +19,9 @@ */ # include <stdlib.h> -# include <stddef.h> +# include "libft_def.h" # include "libft_mem.h" +# include "libft_algo.h" /* ** \brief Vector struct @@ -40,7 +41,11 @@ t_ftvec *ft_vecnew(size_t capacity); void ft_vecdestroy(t_ftvec *vec, void (*del)(void *elem)); t_ftvec *ft_vecgrow(t_ftvec *vec); t_ftvec *ft_vecpush(t_ftvec *vec, void *pushed); +t_ftvec *ft_vecpush_safe(t_ftvec *vec, void *pushed); void ft_vecpop(t_ftvec *vec, void (*del)(void *elem)); void ft_veciter(t_ftvec *vec, void (*f)(void *elem)); +void ft_vecremove(t_ftvec *vec, size_t i, void (*del)(void *elem)); +t_ftvec *ft_vecinsert(t_ftvec *vec, size_t i, void *elem); +void ft_vecsort(t_ftvec *vec, t_ftcompar_func cmp); #endif diff --git a/script/create_test.sh b/script/create_test.sh new file mode 100755 index 0000000..a0c9773 --- /dev/null +++ b/script/create_test.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +[ $# -eq 0 ] && echo "Usage $0 src_file_path+" && exit 1 + +for src_file_path in $@ +do + src_file_dir=`dirname $src_file_path` + src_file_name=`basename $src_file_path` + src_file_name_no_ext=`echo $src_file_name | sed 's/\.c//'` + template='script/test.template.c' + + test_file_path="test/$src_file_dir/test_$src_file_name" + + [ -f $test_file_path ] && + echo "Cannot create test $test_file_path already exists" && + continue + + mkdir -p "test/$src_file_dir" + sed "s/<funcname>/$src_file_name_no_ext/" $template > $test_file_path + echo "Created new test file at $test_file_path" +done + diff --git a/script/test.template.c b/script/test.template.c new file mode 100644 index 0000000..f6d71e8 --- /dev/null +++ b/script/test.template.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* test.template.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 19:41:59 by charles #+# #+# */ +/* Updated: 2020/04/04 20:23:33 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_test.h" + +TEST_GROUP(<funcname>); + +TEST_SETUP(<funcname>) +{} + +TEST_TEAR_DOWN(<funcname>) +{} + +TEST(<funcname>, basic) +{ + TEST_FAIL_MESSAGE("<funcname> test not implemented"); +} diff --git a/script/test_prettier.sh b/script/test_prettier.sh new file mode 100755 index 0000000..bd6b9a3 --- /dev/null +++ b/script/test_prettier.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +while read line +do + # echo `echo $line | sed +done diff --git a/src/algo/ft_compar_int.c b/src/algo/ft_compar_int.c index 848dc71..ab057bf 100644 --- a/src/algo/ft_compar_int.c +++ b/src/algo/ft_compar_int.c @@ -6,12 +6,19 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/19 08:24:43 by cacharle #+# #+# */ -/* Updated: 2020/01/19 08:27:38 by cacharle ### ########.fr */ +/* Updated: 2020/04/04 22:30:09 by charles ### ########.fr */ /* */ /* ************************************************************************** */ #include "libft.h" +/* +** \brief Comparison function for 2 ints +** \param a Pointer to first int +** \param b Pointer to first int +** \return The difference between a and b +*/ + int ft_compar_int(const void *a, const void *b) { return (*(int*)a - *(int*)b); diff --git a/src/algo/ft_compar_str.c b/src/algo/ft_compar_str.c new file mode 100644 index 0000000..6749ab0 --- /dev/null +++ b/src/algo/ft_compar_str.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_compar_str.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/04 15:44:24 by charles #+# #+# */ +/* Updated: 2020/04/04 22:31:15 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_algo.h" + +/* +** \brief String comparison function +** \param s1_p Pointer to first string +** \param s2_p Pointer to second string +** \return `strcmp` of both strings +*/ + +int ft_compar_str(const void *s1_p, const void *s2_p) +{ + return (ft_strcmp(*(const char**)s1_p, *(const char**)s2_p)); +} diff --git a/src/algo/ft_is_set.c b/src/algo/ft_is_set.c index 3e7ae31..fd26a88 100644 --- a/src/algo/ft_is_set.c +++ b/src/algo/ft_is_set.c @@ -6,14 +6,21 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/19 07:17:15 by cacharle #+# #+# */ -/* Updated: 2020/02/10 02:51:41 by cacharle ### ########.fr */ +/* Updated: 2020/04/04 22:33:03 by charles ### ########.fr */ /* */ /* ************************************************************************** */ -#include "libft.h" #include "libft_algo.h" -t_ftbool ft_is_set(void *base, size_t nel, size_t width, +/* +** \brief Test whether array only contains unique elements +** \param base Array to test +** \param nel Number of element in the array +** \param width Size of an element +** \param compar Comparison function to test if 2 elements are equal +*/ + +bool ft_is_set(void *base, size_t nel, size_t width, t_ftcompar_func compar) { size_t i; diff --git a/src/algo/ft_mergesort.c b/src/algo/ft_mergesort.c index 25b4255..8556145 100644 --- a/src/algo/ft_mergesort.c +++ b/src/algo/ft_mergesort.c @@ -6,12 +6,19 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/10 02:26:41 by cacharle #+# #+# */ -/* Updated: 2020/02/13 23:14:21 by cacharle ### ########.fr */ +/* Updated: 2020/04/04 22:40:55 by charles ### ########.fr */ /* */ /* ************************************************************************** */ #include "libft_algo.h" +/* +** \brief Helper function to return in case of error +** \param left Left subarray +** \param right Right subarray +** \return -1 to indicate error +*/ + static int st_mergesort_error(void *left, void *right) { free(left); @@ -19,6 +26,13 @@ static int st_mergesort_error(void *left, void *right) return (-1); } +/* +** \brief Merge 2 sorted arrays +** \param arrays Struct containing the arrays (base, left, right) +** \param nel Number of element in base +** \param compar Comparison function +*/ + static void st_merge_sorted(struct s_merge_sorted_arrays *arrays, size_t nel, size_t width, int (*compar)(const void *, const void *)) { @@ -49,6 +63,14 @@ static void st_merge_sorted(struct s_merge_sorted_arrays *arrays, size_t nel, arrays->right + ri++ * width, width); } +/* +** \brief Sort an array using the merge sort algorithm +** \param base Array to sort +** \param nel Number of element in the array +** \param width Size of each element +** \return 0 on success, -1 on error +*/ + int ft_mergesort(void *base, size_t nel, size_t width, int (*compar)(const void *, const void *)) { diff --git a/src/algo/ft_qsort.c b/src/algo/ft_qsort.c index 9bcfcdf..0c1c0f7 100644 --- a/src/algo/ft_qsort.c +++ b/src/algo/ft_qsort.c @@ -6,12 +6,19 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/19 07:25:51 by cacharle #+# #+# */ -/* Updated: 2020/02/10 02:55:14 by cacharle ### ########.fr */ +/* Updated: 2020/04/04 22:10:29 by charles ### ########.fr */ /* */ /* ************************************************************************** */ #include "libft_algo.h" +/* +** \brief Helper to create a new range +** \param lo Lower bound +** \param hi Higher bound +** \return Range struct (not allocated) +*/ + static t_ftrange ft_range_new(int lo, int hi) { t_ftrange range; @@ -21,6 +28,16 @@ static t_ftrange ft_range_new(int lo, int hi) return (range); } +/* +** \brief Array partitionning, +** takes a pivot and place every element lower than it before +** and every element greater after +** \param base Partitioned array +** \param range Lower and upper bound +** \param width Single element size +** \param compar Comparison function +*/ + static int ft_qsort_partition(void *base, t_ftrange range, size_t width, t_ftcompar_func compar) { @@ -43,6 +60,14 @@ static int ft_qsort_partition(void *base, t_ftrange range, return (p); } +/* +** \brief Qsort recursion function +** \param base Array to sort +** \param range Lower and upper bound which define the area to sort +** \param width Single element size +** \param compar Comparision function +*/ + static void ft_qsort_rec(void *base, t_ftrange range, size_t width, t_ftcompar_func compar) { @@ -55,6 +80,14 @@ static void ft_qsort_rec(void *base, t_ftrange range, ft_qsort_rec(base, ft_range_new(pivot + 1, range.hi), width, compar); } +/* +** \brief Sort an array using the Quick sort algorithm +** \param base Array to sort +** \param nel Number of element in the array +** \param width Size of each element +** \param compar Comparision function +*/ + void ft_qsort(void *base, size_t nel, size_t width, t_ftcompar_func compar) { diff --git a/src/algo/ft_reverse.c b/src/algo/ft_reverse.c index 0bc447f..c617338 100644 --- a/src/algo/ft_reverse.c +++ b/src/algo/ft_reverse.c @@ -6,12 +6,19 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/10 05:07:13 by cacharle #+# #+# */ -/* Updated: 2020/02/10 05:19:22 by cacharle ### ########.fr */ +/* Updated: 2020/04/04 22:36:23 by charles ### ########.fr */ /* */ /* ************************************************************************** */ #include "libft_algo.h" +/* +** \brief Reverse an array +** \param base Array to reverse +** \param nel Number of element in the array +** \param width Size of each elements +*/ + void ft_reverse(void *base, size_t nel, size_t width) { size_t i; diff --git a/src/dlst/ft_dlstdelone.c b/src/dlst/ft_dlstdelone.c new file mode 100644 index 0000000..7f826f5 --- /dev/null +++ b/src/dlst/ft_dlstdelone.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_dlstdelone.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/03 15:28:47 by charles #+# #+# */ +/* Updated: 2020/04/03 15:40:32 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_dlst.h" + +void ft_dlstdelone(t_ftdlst *dlst, t_ftdel_func del) +{ + if (dlst == NULL) + return ; + if (dlst->prev != NULL) + dlst->prev->next = dlst->next; + if (dlst->next != NULL) + dlst->next->prev = dlst->prev; + if (del != NULL) + del(dlst->data); + free(dlst); +} diff --git a/src/dlst/ft_dlstdestroy.c b/src/dlst/ft_dlstdestroy.c new file mode 100644 index 0000000..6ce0d98 --- /dev/null +++ b/src/dlst/ft_dlstdestroy.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_dlstdestroy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/03 15:22:51 by charles #+# #+# */ +/* Updated: 2020/04/03 15:44:26 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_dlst.h" + +void ft_dlstdestroy(t_ftdlst *dlst, t_ftdel_func del) +{ + if (dlst == NULL) + return ; + if (dlst->prev != NULL) + { + dlst->prev->next = NULL; + ft_dlstdestroy(dlst->prev, del); + } + if (dlst->next != NULL) + { + dlst->next->prev = NULL; + ft_dlstdestroy(dlst->next, del); + } + if (del != NULL) + del(dlst->data); + free(dlst); +} diff --git a/src/dlst/ft_dlstnew.c b/src/dlst/ft_dlstnew.c new file mode 100644 index 0000000..6eb9346 --- /dev/null +++ b/src/dlst/ft_dlstnew.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_dlstnew.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/03 15:21:38 by charles #+# #+# */ +/* Updated: 2020/04/03 15:22:45 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_dlst.h" + +t_ftdlst *ft_dlstnew(void *data) +{ + t_ftdlst *dlst; + + if ((dlst = (t_ftdlst*)malloc(sizeof(t_ftdlst))) == NULL) + return (NULL); + dlst->prev = NULL; + dlst->next = NULL; + dlst->data = data; + return (dlst); +} diff --git a/src/dstr/ft_dstrdestroy.c b/src/dstr/ft_dstrdestroy.c new file mode 100644 index 0000000..c76b692 --- /dev/null +++ b/src/dstr/ft_dstrdestroy.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_dstrdestroy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/03 13:58:46 by charles #+# #+# */ +/* Updated: 2020/04/04 19:51:28 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_dstr.h" + +/* +** \brief Destroy a dynamic string +** \param dstr Dynamic string to destroy +*/ + +void ft_dstrdestroy(t_ftdstr *dstr) +{ + if (dstr == NULL) + return ; + free(dstr->str); + free(dstr); +} diff --git a/src/dstr/ft_dstrerase.c b/src/dstr/ft_dstrerase.c new file mode 100644 index 0000000..3d4732b --- /dev/null +++ b/src/dstr/ft_dstrerase.c @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_dstrerase.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/05 00:39:12 by charles #+# #+# */ +/* Updated: 2020/04/05 01:11:07 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_dstr.h" + +/* +** \brief Erase part of a dynamic string +** \param dstr Dynamic string to erase from +** \param start Erase starting index +** \param len Number of character to erase +*/ + +void ft_dstrerase(t_ftdstr *dstr, size_t start, size_t len) +{ + if (start > dstr->length) + return ; + if (start + len > dstr->length) + len = dstr->length - start; + ft_memmove( + dstr->str + start, + dstr->str + start + len, + dstr->length - start - len + ); + dstr->length -= len; + dstr->str[dstr->length] = '\0'; +} diff --git a/src/dstr/ft_dstrgrow.c b/src/dstr/ft_dstrgrow.c new file mode 100644 index 0000000..40cad86 --- /dev/null +++ b/src/dstr/ft_dstrgrow.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_dstrgrow.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/03 14:17:09 by charles #+# #+# */ +/* Updated: 2020/04/04 19:56:26 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_dstr.h" + +#define FT_DSTR_GROWTH_FACTOR 1.5 + +/* +** \brief Grow the capacity of a dynamic string +** \param dstr Dynamic string to grow +** \param at_least Minimum capacity - 1 required +** \return Passed dynamic string or NULL on error +*/ + +t_ftdstr *ft_dstrgrow(t_ftdstr *dstr, size_t at_least) +{ + size_t new_capacity; + char *new_str; + + if (at_least < dstr->capacity - 1) + return (dstr); + new_capacity = dstr->capacity <= 1 ? 2 : dstr->capacity; + while (at_least > new_capacity - 1) + new_capacity *= FT_DSTR_GROWTH_FACTOR; + if ((new_str = (char*)malloc(sizeof(char) * new_capacity)) == NULL) + return (NULL); + ft_memcpy(new_str, dstr->str, dstr->capacity); + dstr->capacity = new_capacity; + free(dstr->str); + dstr->str = new_str; + return (dstr); +} diff --git a/src/dstr/ft_dstrinsert.c b/src/dstr/ft_dstrinsert.c new file mode 100644 index 0000000..931f5d8 --- /dev/null +++ b/src/dstr/ft_dstrinsert.c @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_dstrinsert.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/03 14:00:44 by charles #+# #+# */ +/* Updated: 2020/04/04 21:21:19 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_dstr.h" + +/* +** \brief Insert string in dynamic string +** \param dstr Dynamic string where the string will be inserted +** \param inserted Static string to insert +** \param i Index where it should be inserted +** \return Passed dynamic string or NULL on error +*/ + +t_ftdstr *ft_dstrinsert(t_ftdstr *dstr, char *inserted, size_t i) +{ + size_t inserted_len; + + if (i > dstr->length) + return (NULL); + inserted_len = ft_strlen(inserted); + if (ft_dstrgrow(dstr, dstr->capacity + inserted_len) == NULL) + return (NULL); + ft_memmove(dstr->str + i + inserted_len, + dstr->str + i, + dstr->length - i + 1); + ft_memcpy(dstr->str + i, inserted, inserted_len); + dstr->length += inserted_len; + return (dstr); +} diff --git a/src/dstr/ft_dstrnew.c b/src/dstr/ft_dstrnew.c new file mode 100644 index 0000000..8ae4a64 --- /dev/null +++ b/src/dstr/ft_dstrnew.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_dstrnew.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/03 13:54:52 by charles #+# #+# */ +/* Updated: 2020/04/04 19:50:38 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_dstr.h" + +/* +** \brief Create a new dynamic string +** \param from Static string to create the dynamic one from +** (will be duplicated) +** \return Created dynamic string or NULL on malloc error +*/ + +t_ftdstr *ft_dstrnew(char *from) +{ + t_ftdstr *dstr; + + if ((dstr = (t_ftdstr*)malloc(sizeof(t_ftdstr))) == NULL || + (dstr->str = ft_strdup(from)) == NULL) + return (NULL); + dstr->length = ft_strlen(from); + dstr->capacity = dstr->length + 1; + return (dstr); +} diff --git a/src/dstr/ft_dstrsubstitute.c b/src/dstr/ft_dstrsubstitute.c new file mode 100644 index 0000000..84adc29 --- /dev/null +++ b/src/dstr/ft_dstrsubstitute.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_dstrsubstitute.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/05 00:22:55 by charles #+# #+# */ +/* Updated: 2020/04/05 00:38:40 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_dstr.h" + +/* +** \brief Substitute part of a dynamic string for an other string +** \param dstr Dynamic string to substitute in +** \param replacement Replacement text +** \param start Substitution start index +** \param len Substitution length +*/ + +t_ftdstr *ft_dstrsubstitute( + t_ftdstr *dstr, + char *replacement, + size_t start, + size_t len +) +{ + ft_dstrerase(dstr, start, len); + return (ft_dstrinsert(dstr, replacement, start)); +} diff --git a/src/dstr/ft_dstrunwrap.c b/src/dstr/ft_dstrunwrap.c new file mode 100644 index 0000000..5b29b5b --- /dev/null +++ b/src/dstr/ft_dstrunwrap.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_dstrunwrap.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/03 13:59:35 by charles #+# #+# */ +/* Updated: 2020/04/04 19:58:41 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_dstr.h" + +/* +** \brief Destroy dynamic string but keep the underlying static string +** \param dstr Dynamic string to unwrap +** \return Underlying string of the dynamic one +*/ + +char *ft_dstrunwrap(t_ftdstr *dstr) +{ + char *tmp; + + tmp = dstr->str; + free(dstr); + return (tmp); +} diff --git a/src/ht/ft_htdelone.c b/src/ht/ft_htdelone.c index 7374a44..bc2e047 100644 --- a/src/ht/ft_htdelone.c +++ b/src/ht/ft_htdelone.c @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/30 09:27:18 by cacharle #+# #+# */ -/* Updated: 2020/02/28 12:10:16 by cacharle ### ########.fr */ +/* Updated: 2020/04/03 07:14:28 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,14 +16,15 @@ /* ** \brief Delete one hash table entry ** \param key Key of entry to delete -** \param del Function to destroy the entry -** \warning The del function HAS to free the key +** \param del Function to destroy the entry value ** \note Do nothing if their is to entry which correspond to key */ -void ft_htdelone(t_ftht *ht, char *key, void (*del)(t_ftht_entry*)) +void ft_htdelone(t_ftht *ht, char *key, void (*del)(void*)) { + ft_inter_htdel_first_order_setup(del); ft_lstremove_if(ht->buckets + ft_hthash(ht, key), ft_inter_htkey_cmp, key, - (void (*)(void*))del); + (void (*)(void*))ft_inter_htdel_first_order); + ft_inter_htdel_first_order_teardown(); } diff --git a/src/ht/ft_htdestroy.c b/src/ht/ft_htdestroy.c index ff362d2..c43754e 100644 --- a/src/ht/ft_htdestroy.c +++ b/src/ht/ft_htdestroy.c @@ -6,11 +6,10 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/30 08:31:02 by cacharle #+# #+# */ -/* Updated: 2020/02/28 12:10:31 by cacharle ### ########.fr */ +/* Updated: 2020/04/03 07:01:30 by charles ### ########.fr */ /* */ /* ************************************************************************** */ -#include "libft.h" #include "libft_ht.h" /* @@ -19,12 +18,15 @@ ** \warning The del function HAS to free the key */ -void ft_htdestroy(t_ftht *ht, void (*del)(t_ftht_entry*)) +void ft_htdestroy(t_ftht *ht, t_ftdel_func del) { if (ht == NULL) return ; + ft_inter_htdel_first_order_setup(del); while (ht->size-- > 0) - ft_lstdestroy(ht->buckets + ht->size, (void (*)(void*))del); + ft_lstdestroy(ht->buckets + ht->size, + (void (*)(void*))ft_inter_htdel_first_order); + ft_inter_htdel_first_order_teardown(); free(ht->buckets); free(ht); } diff --git a/src/ht/ft_htget.c b/src/ht/ft_htget.c index a6383fe..75da785 100644 --- a/src/ht/ft_htget.c +++ b/src/ht/ft_htget.c @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/30 08:33:21 by cacharle #+# #+# */ -/* Updated: 2020/04/01 18:02:57 by charles ### ########.fr */ +/* Updated: 2020/04/03 07:12:58 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,8 +22,8 @@ void *ft_htget(t_ftht *ht, char *key) { - t_ftht_digest digest; - t_ftlst *found; + size_t digest; + t_ftlst *found; if (ht == NULL || key == NULL) return (NULL); diff --git a/src/ht/ft_hthash.c b/src/ht/ft_hthash.c index 3369d24..c5d42ea 100644 --- a/src/ht/ft_hthash.c +++ b/src/ht/ft_hthash.c @@ -20,9 +20,9 @@ */ // maybe use a less efficient but understandable function -t_ftht_digest ft_hthash(t_ftht *ht, char *key) +size_t ft_hthash(t_ftht *ht, char *key) { - t_ftht_digest digest; + size_t digest; if (*key == '\0') return (0); diff --git a/src/ht/ft_htnew.c b/src/ht/ft_htnew.c index e5335d2..585c211 100644 --- a/src/ht/ft_htnew.c +++ b/src/ht/ft_htnew.c @@ -6,11 +6,10 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/30 08:19:16 by cacharle #+# #+# */ -/* Updated: 2020/02/28 12:23:43 by cacharle ### ########.fr */ +/* Updated: 2020/04/04 22:34:55 by charles ### ########.fr */ /* */ /* ************************************************************************** */ -#include "libft.h" #include "libft_ht.h" /* @@ -19,7 +18,7 @@ ** \return Created hash table or NULL is an allocation failed */ -t_ftht *ft_htnew(t_ftsize size) +t_ftht *ft_htnew(size_t size) { t_ftht *ht; @@ -27,7 +26,7 @@ t_ftht *ft_htnew(t_ftsize size) return (NULL); if ((ht = (t_ftht*)malloc(sizeof(t_ftht))) == NULL) return (NULL); - ht->buckets = (t_ftht_bucket*)ft_calloc(size, sizeof(t_ftht_entry)); + ht->buckets = (t_ftlst**)ft_calloc(size, sizeof(t_ftlst*)); if (ht->buckets == NULL) { free(ht); diff --git a/src/ht/ft_htset.c b/src/ht/ft_htset.c index 68d3752..b3a44ee 100644 --- a/src/ht/ft_htset.c +++ b/src/ht/ft_htset.c @@ -6,18 +6,17 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/30 08:41:52 by cacharle #+# #+# */ -/* Updated: 2020/04/01 18:02:12 by charles ### ########.fr */ +/* Updated: 2020/04/03 07:13:17 by charles ### ########.fr */ /* */ /* ************************************************************************** */ -#include "libft.h" #include "libft_ht.h" /* ** \brief Create/Update a entry in hash table. ** \note If `key` already exist in `ht` -** only updates the list node content. -** Else create a new list node in addition the list content. +** only updates the list node entry. +** Else create a new list node in addition the list entry. ** \param ht Hash table where the entry is modified ** \param key Key of the new entry ** \param value Value of the new entry @@ -25,32 +24,36 @@ ** \return Pointer to the created entry, NULL if an allocation failed. */ -t_ftht_entry *ft_htset(t_ftht *ht, char *key, void *value, - void (*del)(t_ftht_entry*)) +t_ftht_entry *ft_htset( + t_ftht *ht, + char *key, + void *value, + void (*del)(void*) +) { - t_ftht_digest digest; - t_ftht_entry *content; - t_ftht_bucket bucket; + size_t digest; + t_ftht_entry *entry; t_ftlst *tmp; if (ht == NULL || key == NULL) return (NULL); - if ((content = ft_htentry_new(key, value)) == NULL) - return (NULL); digest = ft_hthash(ht, key); tmp = ft_lstlfind(ht->buckets[digest], ft_inter_htkey_cmp, key); if (tmp != NULL) { if (del != NULL) - del(tmp->data); - tmp->data = content; + del(((t_ftht_entry*)tmp->data)->value); + ((t_ftht_entry*)tmp->data)->value = value; return ((t_ftht_entry*)tmp->data); } - if ((bucket = ft_lstnew(content)) == NULL) + if ((entry = ft_htentry_new(key, value)) == NULL) + return (NULL); + if ((tmp = ft_lstnew(entry)) == NULL) { - del(content); + free(entry->key); + free(entry); return (NULL); } - ft_lstpush_front(ht->buckets + digest, bucket); - return (content); + ft_lstpush_front(ht->buckets + digest, tmp); + return (entry); } diff --git a/src/ht/ft_inter_htdel_first_order.c b/src/ht/ft_inter_htdel_first_order.c new file mode 100644 index 0000000..b6fd770 --- /dev/null +++ b/src/ht/ft_inter_htdel_first_order.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_inter_htdel_first_order.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/03 06:56:54 by charles #+# #+# */ +/* Updated: 2020/04/03 06:58:36 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_ht.h" + +static t_ftdel_func g_htdelone_value_del_func = NULL; + +void ft_inter_htdel_first_order(t_ftht_entry *entry) +{ + if (g_htdelone_value_del_func != NULL) + g_htdelone_value_del_func(entry->value); + free(entry->key); + free(entry); +} + +void ft_inter_htdel_first_order_setup(t_ftdel_func del) +{ + g_htdelone_value_del_func = del; +} + +void ft_inter_htdel_first_order_teardown(void) +{ + g_htdelone_value_del_func = NULL; +} diff --git a/src/str/ft_atoi.c b/src/str/ft_atoi.c index d6fa5bb..b8f979d 100644 --- a/src/str/ft_atoi.c +++ b/src/str/ft_atoi.c @@ -6,14 +6,17 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/10/07 09:46:16 by cacharle #+# #+# */ -/* Updated: 2020/01/15 10:56:06 by cacharle ### ########.fr */ +/* Updated: 2020/04/04 22:34:33 by charles ### ########.fr */ /* */ /* ************************************************************************** */ #include "libft.h" /* -** Convert a string to an int +** \brief Extract first int in a string +** (takes as much digits has possible) +** \param str String to convert +** \return Extracted int */ int ft_atoi(const char *str) diff --git a/src/str/ft_fnmatch.c b/src/str/ft_fnmatch.c new file mode 100644 index 0000000..5fc35d8 --- /dev/null +++ b/src/str/ft_fnmatch.c @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_fnmatch.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/02 23:24:16 by charles #+# #+# */ +/* Updated: 2020/04/03 00:28:46 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_str.h" + +/* +** \brief Search a glob pattern in a string +** \param pattern Glob pattern '*' are interpreted as zero or more character +** \param string String to search in +** \return True if pattern was found, false otherwise +*/ + +bool ft_fnmatch(const char *pattern, const char *string) +{ + if (*pattern == '\0') + return (*string == '\0'); + if (*string == '\0') + return (*pattern == '\0' || (*pattern == '*' && pattern[1] == '\0')); + if (*pattern == '*') + { + if (ft_fnmatch(pattern + 1, string)) + return (true); + return (ft_fnmatch(pattern, string + 1)); + } + if (*pattern != *string) + return (false); + return (ft_fnmatch(pattern + 1, string + 1)); +} diff --git a/src/str/ft_strcasecmp.c b/src/str/ft_strcasecmp.c index 044e6de..6dd86eb 100644 --- a/src/str/ft_strcasecmp.c +++ b/src/str/ft_strcasecmp.c @@ -11,7 +11,7 @@ /* ************************************************************************** */ #include "libft_str.h" -#include "libft_types.h" +#include "libft_def.h" int ft_strcasecmp(const char *s1, const char *s2) { diff --git a/src/str/ft_strcat3.c b/src/str/ft_strcat3.c new file mode 100644 index 0000000..1f7c5df --- /dev/null +++ b/src/str/ft_strcat3.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strcat3.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/05 12:53:05 by charles #+# #+# */ +/* Updated: 2020/04/05 12:55:49 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_str.h" + +/* +** \brief Wrapper around ft_strcat to concatenate 3 strings +** \param dest Destination of the concatenation +** \param src1 First concatenation +** \param src2 Second concatenation +** \return Pointer to destination +*/ + +char *ft_strcat3(char *dest, const char *src1, const char *src2) +{ + return (ft_strcat(ft_strcat(dest, src1), src2)); +} diff --git a/src/str/ft_strncasecmp.c b/src/str/ft_strncasecmp.c index aafdc8c..7153237 100644 --- a/src/str/ft_strncasecmp.c +++ b/src/str/ft_strncasecmp.c @@ -11,7 +11,7 @@ /* ************************************************************************** */ #include "libft.h" -#include "libft_types.h" +#include "libft_def.h" int ft_strncasecmp(const char *s1, const char *s2, size_t n) { diff --git a/src/str/ft_strncmp.c b/src/str/ft_strncmp.c index a0371e4..3e01708 100644 --- a/src/str/ft_strncmp.c +++ b/src/str/ft_strncmp.c @@ -6,11 +6,10 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/10/07 10:27:34 by cacharle #+# #+# */ -/* Updated: 2020/02/10 04:17:50 by cacharle ### ########.fr */ +/* Updated: 2020/05/09 12:29:41 by charles ### ########.fr */ /* */ /* ************************************************************************** */ -#include "libft.h" #include "libft_str.h" int ft_strncmp(const char *s1, const char *s2, size_t n) diff --git a/src/str/ft_strsep.c b/src/str/ft_strsep.c index 2000706..50197fb 100644 --- a/src/str/ft_strsep.c +++ b/src/str/ft_strsep.c @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/10 04:44:11 by cacharle #+# #+# */ -/* Updated: 2020/02/10 04:51:15 by cacharle ### ########.fr */ +/* Updated: 2020/04/04 12:48:24 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,13 +15,18 @@ char *ft_strsep(char **stringp, const char *delim) { char *tmp; + char *origin; - if (stringp == NULL || *stringp == NULL || delim == NULL) + if (*stringp == NULL) return (NULL); + origin = *stringp; tmp = ft_strpbrk(*stringp, delim); if (tmp == NULL) - return (NULL); + { + *stringp = NULL; + return (origin); + } *tmp = '\0'; - *stringp = tmp; - return (tmp); + *stringp = tmp + 1; + return (origin); } diff --git a/src/str/ft_strsjoin.c b/src/str/ft_strsjoin.c new file mode 100644 index 0000000..0923bde --- /dev/null +++ b/src/str/ft_strsjoin.c @@ -0,0 +1,50 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strsjoin.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/04 14:30:08 by charles #+# #+# */ +/* Updated: 2020/04/04 23:34:30 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_str.h" + +/* +** \brief Join null-terminated array of strings +** \param strs Array of strings +** \param delim String iterspersed between strings +** \return Joined string or NULL on error +** \note Empty strings are ignored +*/ + +char *ft_strsjoin(char **strs, char *delim) +{ + int i; + size_t join_len; + size_t delim_len; + char *join; + + delim_len = ft_strlen(delim); + join_len = 0; + i = -1; + while (strs[++i] != NULL) + { + join_len += ft_strlen(strs[i]); + if (strs[i + 1] != NULL) + join_len += delim_len; + } + if ((join = (char*)malloc(sizeof(char) * (join_len + 1))) == NULL) + return (NULL); + join[0] = '\0'; + i = -1; + while (strs[++i] != NULL) + { + ft_strcat(join, strs[i]); + if (*strs[i] != '\0' && strs[i + 1] != NULL) + ft_strcat(join, delim); + } + return (join); +} diff --git a/src/str/ft_strsjoinf.c b/src/str/ft_strsjoinf.c new file mode 100644 index 0000000..36a2892 --- /dev/null +++ b/src/str/ft_strsjoinf.c @@ -0,0 +1,29 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strsjoinf.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/04 14:27:33 by charles #+# #+# */ +/* Updated: 2020/04/04 23:24:24 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_str.h" + +/* +** \brief Join null-terminated array of strings and free the array +** \param strs Array of strings +** \param delim String which will be put between each string +** \return Joined string or NULL on error +*/ + +char *ft_strsjoinf(char **strs, char *delim) +{ + char *ret; + + ret = ft_strsjoin(strs, delim); + ft_split_destroy(strs); + return (ret); +} diff --git a/src/str/ft_substr.c b/src/str/ft_strsub.c index 59fe3f2..c7121bd 100644 --- a/src/str/ft_substr.c +++ b/src/str/ft_strsub.c @@ -1,23 +1,37 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* ft_substr.c :+: :+: :+: */ +/* ft_strsub.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/10/17 08:28:49 by cacharle #+# #+# */ -/* Updated: 2020/02/14 03:44:42 by cacharle ### ########.fr */ +/* Updated: 2020/05/09 12:30:39 by charles ### ########.fr */ /* */ /* ************************************************************************** */ -#include "libft.h" +#include "libft_str.h" -char *ft_substr(char const *s, unsigned int start, size_t len) +/* +** \brief Extract a substring from a string +** \param s String to extract from +** \param start Starting index of the substring +** \param len Substring length +** \return The created substring or NULL on error +*/ + +char *ft_strsub(char const *s, size_t start, size_t len) { - char *sub; + char *sub; + size_t s_len; if (s == NULL) return (NULL); + s_len = ft_strlen(s); + if (start > s_len) + return (NULL); + if (start + len > s_len) + len = s_len - start; if ((sub = (char*)malloc(sizeof(char) * (len + 1))) == NULL) return (NULL); sub[len] = '\0'; diff --git a/src/str/ft_strsubf.c b/src/str/ft_strsubf.c new file mode 100644 index 0000000..dc49ba5 --- /dev/null +++ b/src/str/ft_strsubf.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strsubf.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/05 13:48:13 by charles #+# #+# */ +/* Updated: 2020/04/05 13:51:47 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_str.h" + +/* +** \brief Wrapper around ft_substr which free the original string +** \param s String to extract from (will be free) +** \param start Starting index of the substring +** \param len Substring length +** \return The created substring or NULL on error +*/ + +char *ft_strsubf(char const *s, size_t start, size_t len) +{ + char *ret; + + ret = ft_strsub(s, start, len); + free((void*)s); + return (ret); +} diff --git a/src/str/ft_strtrim.c b/src/str/ft_strtrim.c index aa48826..fa9b192 100644 --- a/src/str/ft_strtrim.c +++ b/src/str/ft_strtrim.c @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/10/07 10:24:16 by cacharle #+# #+# */ -/* Updated: 2019/11/20 03:52:58 by cacharle ### ########.fr */ +/* Updated: 2020/04/05 13:50:43 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -27,5 +27,5 @@ char *ft_strtrim(char const *s1, char const *set) while (s1[start + len - 1] && ft_strchr(set, s1[start + len - 1]) != NULL) len--; - return (ft_substr(s1, start, len)); + return (ft_strsub(s1, start, len)); } diff --git a/src/vec/ft_vecgrow.c b/src/vec/ft_vecgrow.c index bb8b8c7..2213c88 100644 --- a/src/vec/ft_vecgrow.c +++ b/src/vec/ft_vecgrow.c @@ -6,7 +6,7 @@ /* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/01 19:13:07 by charles #+# #+# */ -/* Updated: 2020/04/01 21:15:20 by charles ### ########.fr */ +/* Updated: 2020/04/02 10:43:01 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -35,7 +35,7 @@ t_ftvec *ft_vecgrow(t_ftvec *vec) new_capacity = vec->capacity * FT_VEC_GROWTH_FACTOR; if ((new_data = (void**)malloc(sizeof(void*) * new_capacity)) == NULL) return (NULL); - ft_memcpy(new_data, vec->data, vec->size); + ft_memcpy(new_data, vec->data, vec->size * sizeof(void*)); free(vec->data); vec->data = new_data; vec->capacity = new_capacity; diff --git a/src/vec/ft_vecinsert.c b/src/vec/ft_vecinsert.c new file mode 100644 index 0000000..1682daa --- /dev/null +++ b/src/vec/ft_vecinsert.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vecinsert.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/02 10:46:59 by charles #+# #+# */ +/* Updated: 2020/04/02 11:04:19 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_vec.h" + +/* +** \brief Insert element in vector +** \param vec Vector where element is inserted +** \param i Index where element should be inserted, +** bound checking is performed +** \param elem Element to insert +** \return Passed vector or NULL on error +*/ + +t_ftvec *ft_vecinsert(t_ftvec *vec, size_t i, void *elem) +{ + if (i > vec->size) + return (NULL); + if (vec->capacity <= vec->size) + if (ft_vecgrow(vec) == NULL) + return (NULL); + ft_memmove(vec->data + i + 1, vec->data + i, + (vec->size - i) * sizeof(void*)); + vec->data[i] = elem; + vec->size++; + return (vec); +} diff --git a/src/vec/ft_vecnew.c b/src/vec/ft_vecnew.c index 8a8736a..0def9c9 100644 --- a/src/vec/ft_vecnew.c +++ b/src/vec/ft_vecnew.c @@ -6,7 +6,7 @@ /* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/01 19:03:49 by charles #+# #+# */ -/* Updated: 2020/04/01 20:00:00 by charles ### ########.fr */ +/* Updated: 2020/04/04 21:24:36 by charles ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/vec/ft_vecpush.c b/src/vec/ft_vecpush.c index fc903ef..026ae3d 100644 --- a/src/vec/ft_vecpush.c +++ b/src/vec/ft_vecpush.c @@ -6,7 +6,7 @@ /* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/01 19:22:20 by charles #+# #+# */ -/* Updated: 2020/04/01 20:20:06 by charles ### ########.fr */ +/* Updated: 2020/04/02 10:51:38 by charles ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/src/vec/ft_vecpush_safe.c b/src/vec/ft_vecpush_safe.c new file mode 100644 index 0000000..8e5a8d4 --- /dev/null +++ b/src/vec/ft_vecpush_safe.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vecpush_safe.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/04 13:29:48 by charles #+# #+# */ +/* Updated: 2020/04/04 14:24:19 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_vec.h" + +/* +** \brief Wrapper around ft_vecpush which reject null element +** \param vec Pushed vector +** \param pushed Element pushed which can't be NULL +** \return NULL if pushed is NULL, whatever ft_vecpush returns otherwise +*/ + +t_ftvec *ft_vecpush_safe(t_ftvec *vec, void *pushed) +{ + if (pushed == NULL) + return (NULL); + return (ft_vecpush(vec, pushed)); +} diff --git a/src/vec/ft_vecremove.c b/src/vec/ft_vecremove.c new file mode 100644 index 0000000..d24ba29 --- /dev/null +++ b/src/vec/ft_vecremove.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vecremove.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 22:45:07 by charles #+# #+# */ +/* Updated: 2020/04/01 22:58:21 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_vec.h" + +/* +** \brief Remove element from vector +** \param vec Vector to remove from +** \param i Index of the element to remove +** \param del Delete function applied to ith element +*/ + +void ft_vecremove(t_ftvec *vec, size_t i, void (*del)(void *elem)) +{ + if (vec->size == 0 || i > vec->size - 1) + return ; + if (del != NULL) + del(vec->data[i]); + ft_memmove(vec->data + i, vec->data + i + 1, + (vec->size - i - 1) * sizeof(void*)); + vec->size--; +} diff --git a/src/vec/ft_vecsort.c b/src/vec/ft_vecsort.c new file mode 100644 index 0000000..8aa5c2a --- /dev/null +++ b/src/vec/ft_vecsort.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_vecsort.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/04 15:53:23 by charles #+# #+# */ +/* Updated: 2020/04/04 19:30:31 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_vec.h" + +/* +** \brief Wrapper around ft_qsort +** \param vec Vector to sort +** \param cmp Function to compare each vector element +*/ + +void ft_vecsort(t_ftvec *vec, t_ftcompar_func cmp) +{ + ft_qsort(vec->data, vec->size, sizeof(void*), cmp); +} diff --git a/test/Makefile b/test/Makefile index cf065c6..48e08a9 100644 --- a/test/Makefile +++ b/test/Makefile @@ -6,7 +6,7 @@ # By: cacharle <marvin@42.fr> +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2020/02/15 04:35:44 by cacharle #+# #+# # -# Updated: 2020/02/28 12:13:30 by cacharle ### ########.fr # +# Updated: 2020/04/04 20:58:20 by charles ### ########.fr # # # # **************************************************************************** # @@ -52,7 +52,7 @@ $(NAME): libft_all $(OBJ) @echo "Test: Compiling: $@" @$(CC) $(CCFLAGS) -c -o $@ $< -clean: +clean: @echo "Test: Removing object" @$(RM) $(OBJ) @@ -65,7 +65,7 @@ fclean: clean re: fclean all re_dep: clean_dep fclean all - + unity_all: @$(MAKE) $(MAKE_ARGS) -s -C $(UNITY_DIR) all diff --git a/test/include/libft_test.h b/test/include/libft_test.h index efa15cd..c58d533 100644 --- a/test/include/libft_test.h +++ b/test/include/libft_test.h @@ -21,6 +21,7 @@ # include "libft_lst.h" # include "libft_ht.h" # include "libft_vec.h" +# include "libft_dstr.h" # include "helper/helper_segfault.h" diff --git a/test/src/algo/test_ft_qsort.c b/test/src/algo/test_ft_qsort.c index 25a5ef6..00062b0 100644 --- a/test/src/algo/test_ft_qsort.c +++ b/test/src/algo/test_ft_qsort.c @@ -8,19 +8,43 @@ TEST_SETUP(ft_qsort) TEST_TEAR_DOWN(ft_qsort) {} -static int compar(const void *a, const void *b) -{ - return *(int*)a - *(int*)b; -} - TEST(ft_qsort, basic) { int arr[] = {3, 4, 1, 2, 7, 189, -1, -134, 7, 1, 34}; int sorted_arr[sizeof(arr)]; - memcpy(sorted_arr, arr, sizeof(arr)); - qsort(sorted_arr, sizeof(arr) / sizeof(int), sizeof(int), compar); - - ft_qsort(arr, sizeof(arr) / sizeof(int), sizeof(int), compar); + qsort(sorted_arr, sizeof(arr) / sizeof(int), sizeof(int), ft_compar_int); + ft_qsort(arr, sizeof(arr) / sizeof(int), sizeof(int), ft_compar_int); TEST_ASSERT_EQUAL_INT_ARRAY(sorted_arr, arr, sizeof(arr) / sizeof(int)); } + +TEST(ft_qsort, strings) +{ + char *arr[] = {"zzz", "fff", "aaa"}; + char *sorted[sizeof(arr)]; + memcpy(sorted, arr, sizeof(arr)); + qsort(sorted, sizeof(arr) / sizeof(char*), sizeof(char*), ft_compar_str); + ft_qsort(arr, sizeof(arr) / sizeof(char*), sizeof(char*), ft_compar_str); + TEST_ASSERT_EQUAL_STRING_ARRAY(sorted, arr, sizeof(arr) / sizeof(char*)); + + char *arr2[] = {"abcdef", "abcde", "abcd", "abc", "ab", "a", ""}; + char *sorted2[sizeof(arr2)]; + memcpy(sorted2, arr2, sizeof(arr2)); + qsort(sorted2, sizeof(arr2) / sizeof(char*), sizeof(char*), ft_compar_str); + ft_qsort(arr2, sizeof(arr2) / sizeof(char*), sizeof(char*), ft_compar_str); + TEST_ASSERT_EQUAL_STRING_ARRAY(sorted2, arr2, sizeof(arr2) / sizeof(char*)); + + char *arr3[] = {"", "a", "ab", "abc", "abcd", "abcde", "abcdef"}; + char *sorted3[sizeof(arr3)]; + memcpy(sorted3, arr3, sizeof(arr3)); + qsort(sorted3, sizeof(arr3) / sizeof(char*), sizeof(char*), ft_compar_str); + ft_qsort(arr3, sizeof(arr3) / sizeof(char*), sizeof(char*), ft_compar_str); + TEST_ASSERT_EQUAL_STRING_ARRAY(sorted3, arr3, sizeof(arr3) / sizeof(char*)); + + char *arr4[] = {"ast.c", "z.c", "path.c", "main.c", "utils.c", "preprocess.c", "env.c"}; + char *sorted4[sizeof(arr4)]; + memcpy(sorted4, arr4, sizeof(arr4)); + qsort(sorted4, sizeof(arr4) / sizeof(char*), sizeof(char*), ft_compar_str); + ft_qsort(arr4, sizeof(arr4) / sizeof(char*), sizeof(char*), ft_compar_str); + TEST_ASSERT_EQUAL_STRING_ARRAY(sorted4, arr4, sizeof(arr4) / sizeof(char*)); +} diff --git a/test/src/dstr/test_ft_dstrdestroy.c b/test/src/dstr/test_ft_dstrdestroy.c new file mode 100644 index 0000000..1a6cb41 --- /dev/null +++ b/test/src/dstr/test_ft_dstrdestroy.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* test_ft_dstrdestroy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 19:41:59 by charles #+# #+# */ +/* Updated: 2020/04/04 21:04:51 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_test.h" + +TEST_GROUP(ft_dstrdestroy); + +TEST_SETUP(ft_dstrdestroy) +{} + +TEST_TEAR_DOWN(ft_dstrdestroy) +{} + +TEST(ft_dstrdestroy, basic) +{ + TEST_PASS(); +} diff --git a/test/src/dstr/test_ft_dstrerase.c b/test/src/dstr/test_ft_dstrerase.c new file mode 100644 index 0000000..01ed560 --- /dev/null +++ b/test/src/dstr/test_ft_dstrerase.c @@ -0,0 +1,69 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* test_ft_dstrerase.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 19:41:59 by charles #+# #+# */ +/* Updated: 2020/04/05 01:02:40 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_test.h" + +TEST_GROUP(ft_dstrerase); + +TEST_SETUP(ft_dstrerase) +{} + +TEST_TEAR_DOWN(ft_dstrerase) +{} + +TEST(ft_dstrerase, basic) +{ + t_ftdstr *dstr; + + dstr = ft_dstrnew("bonjour"); + ft_dstrerase(dstr, 0, 0); + TEST_ASSERT_NOT_NULL(dstr); + TEST_ASSERT_EQUAL(7, dstr->length); + TEST_ASSERT_EQUAL(8, dstr->capacity); + TEST_ASSERT_EQUAL_STRING("bonjour", dstr->str); + + ft_dstrerase(dstr, 2, 0); + TEST_ASSERT_NOT_NULL(dstr); + TEST_ASSERT_EQUAL(7, dstr->length); + TEST_ASSERT_EQUAL(8, dstr->capacity); + TEST_ASSERT_EQUAL_STRING("bonjour", dstr->str); + + ft_dstrerase(dstr, 2, 1); + TEST_ASSERT_NOT_NULL(dstr); + TEST_ASSERT_EQUAL(6, dstr->length); + TEST_ASSERT_EQUAL(8, dstr->capacity); + TEST_ASSERT_EQUAL_STRING("bojour", dstr->str); + + ft_dstrerase(dstr, 6, 1); + TEST_ASSERT_NOT_NULL(dstr); + TEST_ASSERT_EQUAL(6, dstr->length); + TEST_ASSERT_EQUAL(8, dstr->capacity); + TEST_ASSERT_EQUAL_STRING("bojour", dstr->str); + + ft_dstrerase(dstr, 5, 1); + TEST_ASSERT_NOT_NULL(dstr); + TEST_ASSERT_EQUAL(5, dstr->length); + TEST_ASSERT_EQUAL(8, dstr->capacity); + TEST_ASSERT_EQUAL_STRING("bojou", dstr->str); + + ft_dstrerase(dstr, 0, 2); + TEST_ASSERT_NOT_NULL(dstr); + TEST_ASSERT_EQUAL(3, dstr->length); + TEST_ASSERT_EQUAL(8, dstr->capacity); + TEST_ASSERT_EQUAL_STRING("jou", dstr->str); + + ft_dstrerase(dstr, 0, 10); + TEST_ASSERT_NOT_NULL(dstr); + TEST_ASSERT_EQUAL(0, dstr->length); + TEST_ASSERT_EQUAL(8, dstr->capacity); + TEST_ASSERT_EQUAL_STRING("", dstr->str); +} diff --git a/test/src/dstr/test_ft_dstrgrow.c b/test/src/dstr/test_ft_dstrgrow.c new file mode 100644 index 0000000..1e3edb6 --- /dev/null +++ b/test/src/dstr/test_ft_dstrgrow.c @@ -0,0 +1,52 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* test_ft_dstrgrow.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 19:41:59 by charles #+# #+# */ +/* Updated: 2020/04/04 21:12:16 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_test.h" + +TEST_GROUP(ft_dstrgrow); + +TEST_SETUP(ft_dstrgrow) +{} + +TEST_TEAR_DOWN(ft_dstrgrow) +{} + +TEST(ft_dstrgrow, basic) +{ + t_ftdstr *dstr; + + dstr = ft_dstrnew("bonjour"); + TEST_ASSERT_NOT_NULL(ft_dstrgrow(dstr, 3)); + TEST_ASSERT_GREATER_OR_EQUAL(3, dstr->capacity - 1); + TEST_ASSERT_EQUAL_STRING("bonjour", dstr->str); + TEST_ASSERT_EQUAL(strlen("bonjour"), dstr->length); + + TEST_ASSERT_NOT_NULL(ft_dstrgrow(dstr, 16)); + TEST_ASSERT_GREATER_OR_EQUAL(16, dstr->capacity - 1); + TEST_ASSERT_EQUAL_STRING("bonjour", dstr->str); + TEST_ASSERT_EQUAL(strlen("bonjour"), dstr->length); + + TEST_ASSERT_NOT_NULL(ft_dstrgrow(dstr, 8)); + TEST_ASSERT_GREATER_OR_EQUAL(8, dstr->capacity - 1); + TEST_ASSERT_EQUAL_STRING("bonjour", dstr->str); + TEST_ASSERT_EQUAL(strlen("bonjour"), dstr->length); + + TEST_ASSERT_NOT_NULL(ft_dstrgrow(dstr, 20)); + TEST_ASSERT_GREATER_OR_EQUAL(20, dstr->capacity - 1); + TEST_ASSERT_EQUAL_STRING("bonjour", dstr->str); + TEST_ASSERT_EQUAL(strlen("bonjour"), dstr->length); + + TEST_ASSERT_NOT_NULL(ft_dstrgrow(dstr, 32)); + TEST_ASSERT_GREATER_OR_EQUAL(32, dstr->capacity - 1); + TEST_ASSERT_EQUAL_STRING("bonjour", dstr->str); + TEST_ASSERT_EQUAL(strlen("bonjour"), dstr->length); +} diff --git a/test/src/dstr/test_ft_dstrinsert.c b/test/src/dstr/test_ft_dstrinsert.c new file mode 100644 index 0000000..61f407c --- /dev/null +++ b/test/src/dstr/test_ft_dstrinsert.c @@ -0,0 +1,59 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* test_ft_dstrinsert.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 19:41:59 by charles #+# #+# */ +/* Updated: 2020/04/04 21:21:51 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_test.h" + +TEST_GROUP(ft_dstrinsert); + +TEST_SETUP(ft_dstrinsert) +{} + +TEST_TEAR_DOWN(ft_dstrinsert) +{} + +TEST(ft_dstrinsert, basic) +{ + t_ftdstr *dstr; + + dstr = ft_dstrnew(""); + + TEST_ASSERT_NULL(ft_dstrinsert(dstr, "", 1)); + TEST_ASSERT_NULL(ft_dstrinsert(dstr, "test", 1)); + TEST_ASSERT_NULL(ft_dstrinsert(dstr, "", 5)); + TEST_ASSERT_NULL(ft_dstrinsert(dstr, "test", 5)); + + TEST_ASSERT_NOT_NULL(ft_dstrinsert(dstr, "bonjour", 0)); + TEST_ASSERT_NOT_NULL(dstr->str); + TEST_ASSERT_EQUAL_STRING("bonjour", dstr->str); + TEST_ASSERT_EQUAL(strlen(dstr->str), dstr->length); + TEST_ASSERT_GREATER_THAN(strlen(dstr->str), dstr->capacity); + + TEST_ASSERT_NULL(ft_dstrinsert(dstr, "abc", 8)); + + TEST_ASSERT_NOT_NULL(ft_dstrinsert(dstr, "{{{", 0)); + TEST_ASSERT_NOT_NULL(dstr->str); + TEST_ASSERT_EQUAL_STRING("{{{bonjour", dstr->str); + TEST_ASSERT_EQUAL(strlen(dstr->str), dstr->length); + TEST_ASSERT_GREATER_THAN(strlen(dstr->str), dstr->capacity); + + TEST_ASSERT_NOT_NULL(ft_dstrinsert(dstr, "]]]", dstr->length)); + TEST_ASSERT_NOT_NULL(dstr->str); + TEST_ASSERT_EQUAL_STRING("{{{bonjour]]]", dstr->str); + TEST_ASSERT_EQUAL(strlen(dstr->str), dstr->length); + TEST_ASSERT_GREATER_THAN(strlen(dstr->str), dstr->capacity); + + TEST_ASSERT_NOT_NULL(ft_dstrinsert(dstr, "<>", 6)); + TEST_ASSERT_NOT_NULL(dstr->str); + TEST_ASSERT_EQUAL_STRING("{{{bon<>jour]]]", dstr->str); + TEST_ASSERT_EQUAL(strlen(dstr->str), dstr->length); + TEST_ASSERT_GREATER_THAN(strlen(dstr->str), dstr->capacity); +} diff --git a/test/src/dstr/test_ft_dstrnew.c b/test/src/dstr/test_ft_dstrnew.c new file mode 100644 index 0000000..33024e4 --- /dev/null +++ b/test/src/dstr/test_ft_dstrnew.c @@ -0,0 +1,60 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* test_ft_dstrnew.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 19:41:59 by charles #+# #+# */ +/* Updated: 2020/04/04 21:03:25 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_test.h" + +TEST_GROUP(ft_dstrnew); + +TEST_SETUP(ft_dstrnew) +{} + +TEST_TEAR_DOWN(ft_dstrnew) +{} + +TEST(ft_dstrnew, basic) +{ + t_ftdstr *dstr; + + dstr = ft_dstrnew(""); + TEST_ASSERT_NOT_NULL(dstr); + TEST_ASSERT_NOT_NULL(dstr->str); + TEST_ASSERT_EQUAL_STRING("", dstr->str); + TEST_ASSERT_EQUAL(1, dstr->capacity); + TEST_ASSERT_EQUAL(0, dstr->length); + ft_dstrdestroy(dstr); + + dstr = ft_dstrnew("abc"); + TEST_ASSERT_NOT_NULL(dstr); + TEST_ASSERT_NOT_NULL(dstr->str); + TEST_ASSERT_EQUAL_STRING("abc", dstr->str); + TEST_ASSERT_EQUAL(strlen("abc") + 1, dstr->capacity); + TEST_ASSERT_EQUAL(strlen("abc"), dstr->length); + ft_dstrdestroy(dstr); + + dstr = ft_dstrnew("hidden\0text"); + TEST_ASSERT_NOT_NULL(dstr); + TEST_ASSERT_NOT_NULL(dstr->str); + TEST_ASSERT_EQUAL_STRING("hidden\0text", dstr->str); + TEST_ASSERT_EQUAL(strlen("hidden") + 1, dstr->capacity); + TEST_ASSERT_EQUAL(strlen("hidden"), dstr->length); + ft_dstrdestroy(dstr); + + char *long_string = "asdkfjasl;asdjiojxocijioajsdfopijasdofijasiodfjaospidj"\ + "fopiasjdfoijasdopifjaspoidjfopiasjdfpoiajsdfoijd"; + dstr = ft_dstrnew(long_string); + TEST_ASSERT_NOT_NULL(dstr); + TEST_ASSERT_NOT_NULL(dstr->str); + TEST_ASSERT_EQUAL_STRING(long_string, dstr->str); + TEST_ASSERT_EQUAL(strlen(long_string) + 1, dstr->capacity); + TEST_ASSERT_EQUAL(strlen(long_string), dstr->length); + ft_dstrdestroy(dstr); +} diff --git a/test/src/dstr/test_ft_dstrsubstitute.c b/test/src/dstr/test_ft_dstrsubstitute.c new file mode 100644 index 0000000..d81b944 --- /dev/null +++ b/test/src/dstr/test_ft_dstrsubstitute.c @@ -0,0 +1,64 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* test_ft_dstrsubstitute.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 19:41:59 by charles #+# #+# */ +/* Updated: 2020/04/05 01:09:47 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_test.h" + +TEST_GROUP(ft_dstrsubstitute); + +TEST_SETUP(ft_dstrsubstitute) +{} + +TEST_TEAR_DOWN(ft_dstrsubstitute) +{} + +TEST(ft_dstrsubstitute, basic) +{ + t_ftdstr *dstr; + + dstr = ft_dstrnew("bonjour"); + TEST_ASSERT_NULL(ft_dstrsubstitute(dstr, "bonjour", 8, 1)); + + TEST_ASSERT_NOT_NULL(ft_dstrsubstitute(dstr, "{{{", 0, 0)); + TEST_ASSERT_NOT_NULL(dstr); + TEST_ASSERT_NOT_NULL(dstr->str); + TEST_ASSERT_EQUAL(10, dstr->length); + TEST_ASSERT_GREATER_OR_EQUAL(11, dstr->capacity); + TEST_ASSERT_EQUAL_STRING("{{{bonjour", dstr->str); + + TEST_ASSERT_NOT_NULL(ft_dstrsubstitute(dstr, "]]]", dstr->length, 0)); + TEST_ASSERT_NOT_NULL(dstr); + TEST_ASSERT_NOT_NULL(dstr->str); + TEST_ASSERT_EQUAL(13, dstr->length); + TEST_ASSERT_GREATER_OR_EQUAL(14, dstr->capacity); + TEST_ASSERT_EQUAL_STRING("{{{bonjour]]]", dstr->str); + + TEST_ASSERT_NOT_NULL(ft_dstrsubstitute(dstr, "aurevoir", 3, 7)); + TEST_ASSERT_NOT_NULL(dstr); + TEST_ASSERT_NOT_NULL(dstr->str); + TEST_ASSERT_EQUAL(14, dstr->length); + TEST_ASSERT_GREATER_OR_EQUAL(15, dstr->capacity); + TEST_ASSERT_EQUAL_STRING("{{{aurevoir]]]", dstr->str); + + TEST_ASSERT_NOT_NULL(ft_dstrsubstitute(dstr, "<>", 0, dstr->length)); + TEST_ASSERT_NOT_NULL(dstr); + TEST_ASSERT_NOT_NULL(dstr->str); + TEST_ASSERT_EQUAL(2, dstr->length); + TEST_ASSERT_GREATER_OR_EQUAL(3, dstr->capacity); + TEST_ASSERT_EQUAL_STRING("<>", dstr->str); + + TEST_ASSERT_NOT_NULL(ft_dstrsubstitute(dstr, "<>", 0, dstr->length)); + TEST_ASSERT_NOT_NULL(dstr); + TEST_ASSERT_NOT_NULL(dstr->str); + TEST_ASSERT_EQUAL(2, dstr->length); + TEST_ASSERT_GREATER_OR_EQUAL(3, dstr->capacity); + TEST_ASSERT_EQUAL_STRING("<>", dstr->str); +} diff --git a/test/src/dstr/test_ft_dstrunwrap.c b/test/src/dstr/test_ft_dstrunwrap.c new file mode 100644 index 0000000..dbc334a --- /dev/null +++ b/test/src/dstr/test_ft_dstrunwrap.c @@ -0,0 +1,42 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* test_ft_dstrunwrap.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 19:41:59 by charles #+# #+# */ +/* Updated: 2020/04/04 21:07:16 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_test.h" + +TEST_GROUP(ft_dstrunwrap); + +TEST_SETUP(ft_dstrunwrap) +{} + +TEST_TEAR_DOWN(ft_dstrunwrap) +{} + +TEST(ft_dstrunwrap, basic) +{ + t_ftdstr *dstr; + char *ret; + + dstr = ft_dstrnew("bonjour"); + ret = ft_dstrunwrap(dstr); + TEST_ASSERT_NOT_NULL(ret); + TEST_ASSERT_EQUAL_STRING("bonjour", ret); + + dstr = ft_dstrnew(""); + ret = ft_dstrunwrap(dstr); + TEST_ASSERT_NOT_NULL(ret); + TEST_ASSERT_EQUAL_STRING("", ret); + + dstr = ft_dstrnew("hidden\0text"); + ret = ft_dstrunwrap(dstr); + TEST_ASSERT_NOT_NULL(ret); + TEST_ASSERT_EQUAL_STRING("hidden", ret); +} diff --git a/test/src/ht/test_ft_htdelone.c b/test/src/ht/test_ft_htdelone.c index 5ba4822..a64b34e 100644 --- a/test/src/ht/test_ft_htdelone.c +++ b/test/src/ht/test_ft_htdelone.c @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/19 02:08:00 by cacharle #+# #+# */ -/* Updated: 2020/02/19 02:46:10 by cacharle ### ########.fr */ +/* Updated: 2020/04/03 07:08:38 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,23 +20,17 @@ TEST_SETUP(ft_htdelone) TEST_TEAR_DOWN(ft_htdelone) {} -static void st_del(t_ftht_entry *v) -{ - free(v->key); - free(v); -} - TEST(ft_htdelone, basic) { t_ftht *ht = ft_htnew(3); - ft_htset(ht, "bonjour", "je", st_del); - ft_htset(ht, "a", "yay", st_del); - ft_htset(ht, "b", "aasdf", st_del); - ft_htset(ht, "c", "a", st_del); - ft_htset(ht, "d", "dd", st_del); + ft_htset(ht, "bonjour", strdup("je"), free); + ft_htset(ht, "a", strdup("yay"), free); + ft_htset(ht, "b", strdup("aasdf"), free); + ft_htset(ht, "c", "a", NULL); + ft_htset(ht, "d", "dd", NULL); - ft_htdelone(ht, "bonjour", st_del); + ft_htdelone(ht, "bonjour", free); void *ptr = ft_htget(ht, "bonjour"); TEST_ASSERT_NULL(ptr); TEST_ASSERT_NOT_NULL(ft_htget(ht, "a")); @@ -44,25 +38,25 @@ TEST(ft_htdelone, basic) TEST_ASSERT_NOT_NULL(ft_htget(ht, "c")); TEST_ASSERT_NOT_NULL(ft_htget(ht, "d")); - ft_htdelone(ht, "a", st_del); + ft_htdelone(ht, "a", free); ptr = ft_htget(ht, "a"); TEST_ASSERT_NULL(ptr); TEST_ASSERT_NOT_NULL(ft_htget(ht, "b")); TEST_ASSERT_NOT_NULL(ft_htget(ht, "c")); TEST_ASSERT_NOT_NULL(ft_htget(ht, "d")); - ft_htdelone(ht, "b", st_del); + ft_htdelone(ht, "b", free); ptr = ft_htget(ht, "b"); TEST_ASSERT_NULL(ptr); TEST_ASSERT_NOT_NULL(ft_htget(ht, "c")); TEST_ASSERT_NOT_NULL(ft_htget(ht, "d")); - ft_htdelone(ht, "c", st_del); + ft_htdelone(ht, "c", NULL); ptr = ft_htget(ht, "c"); TEST_ASSERT_NULL(ptr); TEST_ASSERT_NOT_NULL(ft_htget(ht, "d")); - ft_htdelone(ht, "d", st_del); + ft_htdelone(ht, "d", NULL); ptr = ft_htget(ht, "d"); TEST_ASSERT_NULL(ptr); } diff --git a/test/src/ht/test_ft_htdestroy.c b/test/src/ht/test_ft_htdestroy.c index 1512a48..4d212e1 100644 --- a/test/src/ht/test_ft_htdestroy.c +++ b/test/src/ht/test_ft_htdestroy.c @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/19 02:45:27 by cacharle #+# #+# */ -/* Updated: 2020/02/19 02:49:36 by cacharle ### ########.fr */ +/* Updated: 2020/04/03 07:07:07 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,19 +20,13 @@ TEST_SETUP(ft_htdestroy) TEST_TEAR_DOWN(ft_htdestroy) {} -static void st_del(t_ftht_entry *v) -{ - free(v->key); - free(v); -} - TEST(ft_htdestroy, basic) { t_ftht *ht = ft_htnew(2); - ft_htset(ht, "a", "1", st_del); - ft_htset(ht, "b", "2", st_del); - ft_htset(ht, "c", "3", st_del); - ft_htset(ht, "d", "4", st_del); - ft_htdestroy(ht, st_del); + ft_htset(ht, "a", strdup("1"), free); + ft_htset(ht, "b", strdup("2"), free); + ft_htset(ht, "c", "3", NULL); + ft_htset(ht, "d", "4", NULL); + ft_htdestroy(ht, NULL); } diff --git a/test/src/ht/test_ft_htget.c b/test/src/ht/test_ft_htget.c index 386c3dc..4d4b4eb 100644 --- a/test/src/ht/test_ft_htget.c +++ b/test/src/ht/test_ft_htget.c @@ -16,12 +16,6 @@ TEST_TEAR_DOWN(ft_htget) int helper_segfault_pid; -static void st_del(t_ftht_entry *c) -{ - free(c->key); - free(c); -} - TEST(ft_htget, segfault) { TEST_ASSERT_SEGFAULT(ft_htget((t_ftht*)NULL, "")); @@ -43,72 +37,72 @@ TEST(ft_htget, error_null) TEST(ft_htget, basic) { - ft_htset(ht, strdup("a"), strdup("data1"), st_del); - ft_htset(ht, strdup("b"), strdup("data2"), st_del); - ft_htset(ht, strdup("c"), strdup("data3"), st_del); + ft_htset(ht, strdup("a"), strdup("data1"), free); + ft_htset(ht, strdup("b"), strdup("data2"), free); + ft_htset(ht, strdup("c"), strdup("data3"), free); char *s = ft_htget(ht, "a"); TEST_ASSERT_NOT_NULL(s); - TEST_ASSERT_EQUAL_STRING(s, "data1"); + TEST_ASSERT_EQUAL_STRING(s, "data1"); s = ft_htget(ht, "b"); TEST_ASSERT_NOT_NULL(s); - TEST_ASSERT_EQUAL_STRING(s, "data2"); + TEST_ASSERT_EQUAL_STRING(s, "data2"); s = ft_htget(ht, "c"); TEST_ASSERT_NOT_NULL(s); - TEST_ASSERT_EQUAL_STRING(s, "data3"); + TEST_ASSERT_EQUAL_STRING(s, "data3"); - ft_htset(ht, strdup("a"), strdup("bonjour1"), st_del); - ft_htset(ht, strdup("b"), strdup("bonjour2"), st_del); - ft_htset(ht, strdup("c"), strdup("bonjour3"), st_del); + ft_htset(ht, strdup("a"), strdup("bonjour1"), free); + ft_htset(ht, strdup("b"), strdup("bonjour2"), free); + ft_htset(ht, strdup("c"), strdup("bonjour3"), free); s = ft_htget(ht, "a"); TEST_ASSERT_NOT_NULL(s); - TEST_ASSERT_EQUAL_STRING(s, "bonjour1"); + TEST_ASSERT_EQUAL_STRING(s, "bonjour1"); s = ft_htget(ht, "b"); TEST_ASSERT_NOT_NULL(s); - TEST_ASSERT_EQUAL_STRING(s, "bonjour2"); + TEST_ASSERT_EQUAL_STRING(s, "bonjour2"); s = ft_htget(ht, "c"); TEST_ASSERT_NOT_NULL(s); - TEST_ASSERT_EQUAL_STRING(s, "bonjour3"); + TEST_ASSERT_EQUAL_STRING(s, "bonjour3"); } TEST(ft_htget, collision) { t_ftht *small = ft_htnew(1); - ft_htset(small, strdup("a"), strdup("data1"), st_del); - ft_htset(small, strdup("b"), strdup("data2"), st_del); - ft_htset(small, strdup("c"), strdup("data3"), st_del); + ft_htset(small, strdup("a"), strdup("data1"), free); + ft_htset(small, strdup("b"), strdup("data2"), free); + ft_htset(small, strdup("c"), strdup("data3"), free); char *s = ft_htget(small, "a"); TEST_ASSERT_NOT_NULL(s); - TEST_ASSERT_EQUAL_STRING(s, "data1"); + TEST_ASSERT_EQUAL_STRING(s, "data1"); s = ft_htget(small, "b"); TEST_ASSERT_NOT_NULL(s); - TEST_ASSERT_EQUAL_STRING(s, "data2"); + TEST_ASSERT_EQUAL_STRING(s, "data2"); s = ft_htget(small, "c"); TEST_ASSERT_NOT_NULL(s); - TEST_ASSERT_EQUAL_STRING(s, "data3"); + TEST_ASSERT_EQUAL_STRING(s, "data3"); - ft_htset(small, strdup("a"), strdup("bonjour1"), st_del); - ft_htset(small, strdup("b"), strdup("bonjour2"), st_del); - ft_htset(small, strdup("c"), strdup("bonjour3"), st_del); + ft_htset(small, strdup("a"), strdup("bonjour1"), free); + ft_htset(small, strdup("b"), strdup("bonjour2"), free); + ft_htset(small, strdup("c"), strdup("bonjour3"), free); s = ft_htget(small, "a"); TEST_ASSERT_NOT_NULL(s); - TEST_ASSERT_EQUAL_STRING(s, "bonjour1"); + TEST_ASSERT_EQUAL_STRING(s, "bonjour1"); s = ft_htget(small, "b"); TEST_ASSERT_NOT_NULL(s); - TEST_ASSERT_EQUAL_STRING(s, "bonjour2"); + TEST_ASSERT_EQUAL_STRING(s, "bonjour2"); s = ft_htget(small, "c"); TEST_ASSERT_NOT_NULL(s); - TEST_ASSERT_EQUAL_STRING(s, "bonjour3"); + TEST_ASSERT_EQUAL_STRING(s, "bonjour3"); } diff --git a/test/src/ht/test_ft_htset.c b/test/src/ht/test_ft_htset.c index 96d848e..70232fd 100644 --- a/test/src/ht/test_ft_htset.c +++ b/test/src/ht/test_ft_htset.c @@ -14,12 +14,6 @@ TEST_TEAR_DOWN(ft_htset) /* ft_htdestroy_key(ht); */ } -static void st_del(t_ftht_entry *c) -{ - free(c->key); - free(c); -} - TEST(ft_htset, segfault) { TEST_ASSERT_SEGFAULT(ft_htset(NULL, "", strdup(""), NULL)); @@ -57,14 +51,14 @@ TEST(ft_htset, reset) small = ft_htnew(3); - t_ftht_entry *content = ft_htset(small, "bonjour", ft_strdup("content"), st_del); + t_ftht_entry *content = ft_htset(small, "bonjour", ft_strdup("content"), free); TEST_ASSERT_NOT_NULL(content); TEST_ASSERT_NOT_NULL(content->key); TEST_ASSERT_NOT_NULL(content->value); TEST_ASSERT_EQUAL_STRING(content->key, "bonjour"); TEST_ASSERT_EQUAL_STRING(content->value, "content"); - t_ftht_entry *content_re = ft_htset(small, "bonjour", ft_strdup("yo"), st_del); + t_ftht_entry *content_re = ft_htset(small, "bonjour", ft_strdup("yo"), free); TEST_ASSERT_NOT_NULL(content_re); TEST_ASSERT_NOT_NULL(content_re->key); TEST_ASSERT_NOT_NULL(content_re->value); @@ -77,21 +71,21 @@ TEST(ft_htset, collision) t_ftht *small = NULL; small = ft_htnew(1); - t_ftht_entry *content1 = ft_htset(small, "bonjour", strdup("content1"), st_del); + t_ftht_entry *content1 = ft_htset(small, "bonjour", strdup("content1"), free); TEST_ASSERT_NOT_NULL(content1); TEST_ASSERT_NOT_NULL(content1->key); TEST_ASSERT_NOT_NULL(content1->value); TEST_ASSERT_EQUAL_STRING(content1->key, "bonjour"); TEST_ASSERT_EQUAL_STRING(content1->value, "content1"); - t_ftht_entry *content2 = ft_htset(small, "aurevoir", strdup("content2"), st_del); + t_ftht_entry *content2 = ft_htset(small, "aurevoir", strdup("content2"), free); TEST_ASSERT_NOT_NULL(content2); TEST_ASSERT_NOT_NULL(content2->key); TEST_ASSERT_NOT_NULL(content2->value); TEST_ASSERT_EQUAL_STRING(content2->key, "aurevoir"); TEST_ASSERT_EQUAL_STRING(content2->value, "content2"); - t_ftht_entry *content3 = ft_htset(small, "aloa", strdup("content3"), st_del); + t_ftht_entry *content3 = ft_htset(small, "aloa", strdup("content3"), free); TEST_ASSERT_NOT_NULL(content3); TEST_ASSERT_NOT_NULL(content3->key); TEST_ASSERT_NOT_NULL(content3->value); diff --git a/test/src/main.c b/test/src/main.c index 83e8d5f..e962577 100644 --- a/test/src/main.c +++ b/test/src/main.c @@ -29,6 +29,11 @@ static void run_all_test(void) // str RUN_TEST_GROUP(ft_strlen); + RUN_TEST_GROUP(ft_fnmatch); + RUN_TEST_GROUP(ft_strsjoin); + RUN_TEST_GROUP(ft_strsjoinf); + RUN_TEST_GROUP(ft_strsub); + RUN_TEST_GROUP(ft_strsubf); // ht RUN_TEST_GROUP(ft_htentry_new); @@ -76,8 +81,21 @@ static void run_all_test(void) RUN_TEST_GROUP(ft_vecnew); RUN_TEST_GROUP(ft_vecpop); RUN_TEST_GROUP(ft_vecpush); + RUN_TEST_GROUP(ft_vecremove); + RUN_TEST_GROUP(ft_vecinsert); + RUN_TEST_GROUP(ft_vecpush_safe); + + // dstr + RUN_TEST_GROUP(ft_dstrdestroy); + RUN_TEST_GROUP(ft_dstrgrow); + RUN_TEST_GROUP(ft_dstrinsert); + RUN_TEST_GROUP(ft_dstrnew); + RUN_TEST_GROUP(ft_dstrunwrap); + RUN_TEST_GROUP(ft_dstrsubstitute); + RUN_TEST_GROUP(ft_dstrerase); } + int main(int argc, const char **argv) { return UnityMain(argc, argv, run_all_test); diff --git a/test/src/runner/test_runner_algo.c b/test/src/runner/test_runner_algo.c index 8873797..f2afdb3 100644 --- a/test/src/runner/test_runner_algo.c +++ b/test/src/runner/test_runner_algo.c @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/13 21:25:52 by cacharle #+# #+# */ -/* Updated: 2020/02/13 21:37:15 by cacharle ### ########.fr */ +/* Updated: 2020/04/04 15:22:43 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -51,6 +51,7 @@ TEST_GROUP_RUNNER(ft_mergesort) TEST_GROUP_RUNNER(ft_qsort) { RUN_TEST_CASE(ft_qsort, basic); + RUN_TEST_CASE(ft_qsort, strings); } TEST_GROUP_RUNNER(ft_reverse) diff --git a/test/src/runner/test_runner_dstr.c b/test/src/runner/test_runner_dstr.c new file mode 100644 index 0000000..a6d9bdd --- /dev/null +++ b/test/src/runner/test_runner_dstr.c @@ -0,0 +1,48 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* test_runner_dstr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/04 20:44:42 by charles #+# #+# */ +/* Updated: 2020/04/05 00:48:08 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_test.h" + +TEST_GROUP_RUNNER(ft_dstrdestroy) +{ + RUN_TEST_CASE(ft_dstrdestroy, basic); +} + +TEST_GROUP_RUNNER(ft_dstrgrow) +{ + RUN_TEST_CASE(ft_dstrgrow, basic); +} + +TEST_GROUP_RUNNER(ft_dstrinsert) +{ + RUN_TEST_CASE(ft_dstrinsert, basic); +} + +TEST_GROUP_RUNNER(ft_dstrnew) +{ + RUN_TEST_CASE(ft_dstrnew, basic); +} + +TEST_GROUP_RUNNER(ft_dstrunwrap) +{ + RUN_TEST_CASE(ft_dstrunwrap, basic); +} + +TEST_GROUP_RUNNER(ft_dstrsubstitute) +{ + RUN_TEST_CASE(ft_dstrsubstitute, basic); +} + +TEST_GROUP_RUNNER(ft_dstrerase) +{ + RUN_TEST_CASE(ft_dstrerase, basic); +} diff --git a/test/src/runner/test_runner_ht.c b/test/src/runner/test_runner_ht.c index 1563a72..e7fbcf3 100644 --- a/test/src/runner/test_runner_ht.c +++ b/test/src/runner/test_runner_ht.c @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/12 22:44:39 by cacharle #+# #+# */ -/* Updated: 2020/02/28 12:17:33 by cacharle ### ########.fr */ +/* Updated: 2020/04/03 07:11:32 by charles ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/test/src/runner/test_runner_str.c b/test/src/runner/test_runner_str.c index 3d829ad..8d3b68a 100644 --- a/test/src/runner/test_runner_str.c +++ b/test/src/runner/test_runner_str.c @@ -4,3 +4,28 @@ TEST_GROUP_RUNNER(ft_strlen) { RUN_TEST_CASE(ft_strlen, basic); } + +TEST_GROUP_RUNNER(ft_fnmatch) +{ + RUN_TEST_CASE(ft_fnmatch, basic); +} + +TEST_GROUP_RUNNER(ft_strsjoin) +{ + RUN_TEST_CASE(ft_strsjoin, basic); +} + +TEST_GROUP_RUNNER(ft_strsjoinf) +{ + RUN_TEST_CASE(ft_strsjoinf, basic); +} + +TEST_GROUP_RUNNER(ft_strsub) +{ + RUN_TEST_CASE(ft_strsub, basic); +} + +TEST_GROUP_RUNNER(ft_strsubf) +{ + RUN_TEST_CASE(ft_strsubf, basic); +} diff --git a/test/src/runner/test_runner_vec.c b/test/src/runner/test_runner_vec.c index af91360..5a57def 100644 --- a/test/src/runner/test_runner_vec.c +++ b/test/src/runner/test_runner_vec.c @@ -6,7 +6,7 @@ /* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/01 19:55:53 by charles #+# #+# */ -/* Updated: 2020/04/01 19:58:25 by charles ### ########.fr */ +/* Updated: 2020/04/04 23:26:54 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -43,3 +43,22 @@ TEST_GROUP_RUNNER(ft_vecpush) RUN_TEST_CASE(ft_vecpush, basic); } +TEST_GROUP_RUNNER(ft_vecremove) +{ + RUN_TEST_CASE(ft_vecremove, basic); +} + +TEST_GROUP_RUNNER(ft_vecinsert) +{ + RUN_TEST_CASE(ft_vecinsert, basic); +} + +TEST_GROUP_RUNNER(ft_vecsort) +{ + RUN_TEST_CASE(ft_vecsort, basic); +} + +TEST_GROUP_RUNNER(ft_vecpush_safe) +{ + RUN_TEST_CASE(ft_vecpush_safe, basic); +} diff --git a/test/src/str/test_ft_fnmatch.c b/test/src/str/test_ft_fnmatch.c new file mode 100644 index 0000000..f7dc892 --- /dev/null +++ b/test/src/str/test_ft_fnmatch.c @@ -0,0 +1,117 @@ +#include "libft_test.h" + +TEST_GROUP(ft_fnmatch); + +TEST_SETUP(ft_fnmatch) +{} + +TEST_TEAR_DOWN(ft_fnmatch) +{} + +TEST(ft_fnmatch, basic) +{ + TEST_ASSERT_TRUE(ft_fnmatch("", "")); + TEST_ASSERT_TRUE(ft_fnmatch("l", "l")); + TEST_ASSERT_TRUE(ft_fnmatch("kl", "kl")); + TEST_ASSERT_TRUE(ft_fnmatch("jkl", "jkl")); + TEST_ASSERT_TRUE(ft_fnmatch("ijkl", "ijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("hijkl", "hijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("ghijkl", "ghijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("fghijkl", "fghijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("efghijkl", "efghijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("defghijkl", "defghijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("cdefghijkl", "cdefghijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("bcdefghijkl", "bcdefghijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("abcdefghijkl", "abcdefghijkl")); + + TEST_ASSERT_FALSE(ft_fnmatch("", "a")); + TEST_ASSERT_FALSE(ft_fnmatch("", "ab")); + TEST_ASSERT_FALSE(ft_fnmatch("", "abc")); + TEST_ASSERT_FALSE(ft_fnmatch("a", "ab")); + TEST_ASSERT_FALSE(ft_fnmatch("ab", "abc")); + TEST_ASSERT_FALSE(ft_fnmatch("a", "")); + TEST_ASSERT_FALSE(ft_fnmatch("ab", "")); + TEST_ASSERT_FALSE(ft_fnmatch("abc", "")); + TEST_ASSERT_FALSE(ft_fnmatch("ab", "a")); + TEST_ASSERT_FALSE(ft_fnmatch("abc", "ab")); + + TEST_ASSERT_TRUE(ft_fnmatch("*", "")); + TEST_ASSERT_TRUE(ft_fnmatch("*", "l")); + TEST_ASSERT_TRUE(ft_fnmatch("*", "kl")); + TEST_ASSERT_TRUE(ft_fnmatch("*", "jkl")); + TEST_ASSERT_TRUE(ft_fnmatch("*", "ijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("*", "hijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("*", "ghijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("*", "fghijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("*", "efghijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("*", "defghijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("*", "cdefghijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("*", "bcdefghijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("*", "abcdefghijkl")); + + TEST_ASSERT_TRUE(ft_fnmatch("*.c", ".c")); + TEST_ASSERT_TRUE(ft_fnmatch("*.c", "l.c")); + TEST_ASSERT_TRUE(ft_fnmatch("*.c", "kl.c")); + TEST_ASSERT_TRUE(ft_fnmatch("*.c", "jkl.c")); + TEST_ASSERT_TRUE(ft_fnmatch("*.c", "ijkl.c")); + TEST_ASSERT_TRUE(ft_fnmatch("*.c", "hijkl.c")); + TEST_ASSERT_TRUE(ft_fnmatch("*.c", "ghijkl.c")); + TEST_ASSERT_TRUE(ft_fnmatch("*.c", "fghijkl.c")); + TEST_ASSERT_TRUE(ft_fnmatch("*.c", "efghijkl.c")); + TEST_ASSERT_TRUE(ft_fnmatch("*.c", "defghijkl.c")); + TEST_ASSERT_TRUE(ft_fnmatch("*.c", "cdefghijkl.c")); + TEST_ASSERT_TRUE(ft_fnmatch("*.c", "bcdefghijkl.c")); + TEST_ASSERT_TRUE(ft_fnmatch("*.c", "abcdefghijkl.c")); + + TEST_ASSERT_TRUE(ft_fnmatch("../*", "../")); + TEST_ASSERT_TRUE(ft_fnmatch("../*", "../l")); + TEST_ASSERT_TRUE(ft_fnmatch("../*", "../kl")); + TEST_ASSERT_TRUE(ft_fnmatch("../*", "../jkl")); + TEST_ASSERT_TRUE(ft_fnmatch("../*", "../ijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("../*", "../hijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("../*", "../ghijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("../*", "../fghijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("../*", "../efghijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("../*", "../defghijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("../*", "../cdefghijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("../*", "../bcdefghijkl")); + TEST_ASSERT_TRUE(ft_fnmatch("../*", "../abcdefghijkl")); + + TEST_ASSERT_TRUE(ft_fnmatch("../*.c", "../.c")); + TEST_ASSERT_TRUE(ft_fnmatch("../*.c", "../l.c")); + TEST_ASSERT_TRUE(ft_fnmatch("../*.c", "../kl.c")); + TEST_ASSERT_TRUE(ft_fnmatch("../*.c", "../jkl.c")); + TEST_ASSERT_TRUE(ft_fnmatch("../*.c", "../ijkl.c")); + TEST_ASSERT_TRUE(ft_fnmatch("../*.c", "../hijkl.c")); + TEST_ASSERT_TRUE(ft_fnmatch("../*.c", "../ghijkl.c")); + TEST_ASSERT_TRUE(ft_fnmatch("../*.c", "../fghijkl.c")); + TEST_ASSERT_TRUE(ft_fnmatch("../*.c", "../efghijkl.c")); + TEST_ASSERT_TRUE(ft_fnmatch("../*.c", "../defghijkl.c")); + TEST_ASSERT_TRUE(ft_fnmatch("../*.c", "../cdefghijkl.c")); + TEST_ASSERT_TRUE(ft_fnmatch("../*.c", "../bcdefghijkl.c")); + TEST_ASSERT_TRUE(ft_fnmatch("../*.c", "../abcdefghijkl.c")); + + TEST_ASSERT_TRUE(ft_fnmatch("*.*", ".")); + TEST_ASSERT_TRUE(ft_fnmatch("*.*", "a.a")); + TEST_ASSERT_TRUE(ft_fnmatch("*.*", "ab.ab")); + TEST_ASSERT_TRUE(ft_fnmatch("*.*", "abc.abc")); + TEST_ASSERT_TRUE(ft_fnmatch("*.*", "abcd.abcd")); + TEST_ASSERT_TRUE(ft_fnmatch("*.*", "abcde.abcde")); + TEST_ASSERT_TRUE(ft_fnmatch("*.*", "abcdef.abcdef")); + TEST_ASSERT_TRUE(ft_fnmatch("*.*", "abcdefg.abcdefg")); + TEST_ASSERT_TRUE(ft_fnmatch("*.*", "abcdefgh.abcdefgh")); + + TEST_ASSERT_FALSE(ft_fnmatch("*.c", ".h")); + TEST_ASSERT_FALSE(ft_fnmatch("*.c", "a.h")); + TEST_ASSERT_FALSE(ft_fnmatch("*.c", "ab.h")); + TEST_ASSERT_FALSE(ft_fnmatch("*.c", "abc.h")); + TEST_ASSERT_FALSE(ft_fnmatch("*.c", "abcd.h")); + + TEST_ASSERT_FALSE(ft_fnmatch("*.c", ".h")); + TEST_ASSERT_FALSE(ft_fnmatch("*.c", "a.h")); + TEST_ASSERT_FALSE(ft_fnmatch("*.c", "ab.h")); + TEST_ASSERT_FALSE(ft_fnmatch("*.c", "abc.h")); + TEST_ASSERT_FALSE(ft_fnmatch("*.c", "abcd.h")); + + TEST_ASSERT_TRUE(ft_fnmatch("da*da*da*", "daaadabadmanda")); +} diff --git a/test/src/str/test_ft_strsjoin.c b/test/src/str/test_ft_strsjoin.c new file mode 100644 index 0000000..0fac07b --- /dev/null +++ b/test/src/str/test_ft_strsjoin.c @@ -0,0 +1,57 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* test_ft_strsjoin.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 19:41:59 by charles #+# #+# */ +/* Updated: 2020/04/04 23:32:26 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_test.h" + +TEST_GROUP(ft_strsjoin); + +TEST_SETUP(ft_strsjoin) +{} + +TEST_TEAR_DOWN(ft_strsjoin) +{} + +TEST(ft_strsjoin, basic) +{ + char *join; + char *arr[] = {"bonjour", "je", "suis", NULL}; + char *arr2[] = {"", "bonjour", "", "", "", "je", "suis", NULL}; + char *null_arr[] = {NULL}; + + join = ft_strsjoin(arr, " "); + TEST_ASSERT_NOT_NULL(join); + TEST_ASSERT_EQUAL_STRING("bonjour je suis", join); + + join = ft_strsjoin(arr, "<|>"); + TEST_ASSERT_NOT_NULL(join); + TEST_ASSERT_EQUAL_STRING("bonjour<|>je<|>suis", join); + + join = ft_strsjoin(arr, ""); + TEST_ASSERT_NOT_NULL(join); + TEST_ASSERT_EQUAL_STRING("bonjourjesuis", join); + + join = ft_strsjoin(arr2, " "); + TEST_ASSERT_NOT_NULL(join); + TEST_ASSERT_EQUAL_STRING("bonjour je suis", join); + + join = ft_strsjoin(arr2, "<|>"); + TEST_ASSERT_NOT_NULL(join); + TEST_ASSERT_EQUAL_STRING("bonjour<|>je<|>suis", join); + + join = ft_strsjoin(arr2, ""); + TEST_ASSERT_NOT_NULL(join); + TEST_ASSERT_EQUAL_STRING("bonjourjesuis", join); + + join = ft_strsjoin(null_arr, "abc"); + TEST_ASSERT_NOT_NULL(join); + TEST_ASSERT_EQUAL_STRING("", join); +} diff --git a/test/src/str/test_ft_strsjoinf.c b/test/src/str/test_ft_strsjoinf.c new file mode 100644 index 0000000..d5184a9 --- /dev/null +++ b/test/src/str/test_ft_strsjoinf.c @@ -0,0 +1,87 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* test_ft_strsjoinf.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 19:41:59 by charles #+# #+# */ +/* Updated: 2020/04/04 23:25:39 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_test.h" + +TEST_GROUP(ft_strsjoinf); + +TEST_SETUP(ft_strsjoinf) +{} + +TEST_TEAR_DOWN(ft_strsjoinf) +{} + +TEST(ft_strsjoinf, basic) +{ + char *join; + char *arr_orig[] = {"bonjour", "je", "suis", NULL}; + char *arr2_orig[] = {"", "bonjour", "", "", "", "je", "suis", NULL}; + char **null_arr; + char **arr; + char **arr2; + + size_t i; + + arr = malloc(sizeof(arr_orig)); + for (i = 0; i < sizeof(arr_orig) / sizeof(char*) - 1; i++) + arr[i] = strdup(arr_orig[i]); + arr[i] = NULL; + join = ft_strsjoinf(arr, " "); + TEST_ASSERT_NOT_NULL(join); + TEST_ASSERT_EQUAL_STRING("bonjour je suis", join); + + arr = malloc(sizeof(arr_orig)); + for (i = 0; i < sizeof(arr_orig) / sizeof(char*) - 1; i++) + arr[i] = strdup(arr_orig[i]); + arr[i] = NULL; + join = ft_strsjoinf(arr, "<|>"); + TEST_ASSERT_NOT_NULL(join); + TEST_ASSERT_EQUAL_STRING("bonjour<|>je<|>suis", join); + + arr = malloc(sizeof(arr_orig)); + for (i = 0; i < sizeof(arr_orig) / sizeof(char*) - 1; i++) + arr[i] = strdup(arr_orig[i]); + arr[i] = NULL; + join = ft_strsjoinf(arr, ""); + TEST_ASSERT_NOT_NULL(join); + TEST_ASSERT_EQUAL_STRING("bonjourjesuis", join); + + arr2 = malloc(sizeof(arr2_orig)); + for (i = 0; i < sizeof(arr2_orig) / sizeof(char*) - 1; i++) + arr2[i] = strdup(arr2_orig[i]); + arr2[i] = NULL; + join = ft_strsjoinf(arr2, " "); + TEST_ASSERT_NOT_NULL(join); + TEST_ASSERT_EQUAL_STRING("bonjour je suis", join); + + arr2 = malloc(sizeof(arr2_orig)); + for (i = 0; i < sizeof(arr2_orig) / sizeof(char*) - 1; i++) + arr2[i] = strdup(arr2_orig[i]); + arr2[i] = NULL; + join = ft_strsjoinf(arr2, "<|>"); + TEST_ASSERT_NOT_NULL(join); + TEST_ASSERT_EQUAL_STRING("bonjour<|>je<|>suis", join); + + arr2 = malloc(sizeof(arr2_orig)); + for (i = 0; i < sizeof(arr2_orig) / sizeof(char*) - 1; i++) + arr2[i] = strdup(arr2_orig[i]); + arr2[i] = NULL; + join = ft_strsjoinf(arr2, ""); + TEST_ASSERT_NOT_NULL(join); + TEST_ASSERT_EQUAL_STRING("bonjourjesuis", join); + + null_arr = malloc(sizeof(char*)); + null_arr[0] = NULL; + join = ft_strsjoinf(null_arr, "abc"); + TEST_ASSERT_NOT_NULL(join); + TEST_ASSERT_EQUAL_STRING("", join); +} diff --git a/test/src/str/test_ft_strsub.c b/test/src/str/test_ft_strsub.c new file mode 100644 index 0000000..91ab4d3 --- /dev/null +++ b/test/src/str/test_ft_strsub.c @@ -0,0 +1,54 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* test_ft_strsub.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 19:41:59 by charles #+# #+# */ +/* Updated: 2020/04/05 14:02:11 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_test.h" + +TEST_GROUP(ft_strsub); + +TEST_SETUP(ft_strsub) +{} + +TEST_TEAR_DOWN(ft_strsub) +{} + +TEST(ft_strsub, basic) +{ + char *s = "[test]"; + char *ret; + + ret = ft_strsub(s, 0, strlen(s)); + TEST_ASSERT_NOT_NULL(ret); + TEST_ASSERT_EQUAL_STRING("[test]", ret); + free(ret); + + ret = ft_strsub(s, 1, strlen(s) - 2); + TEST_ASSERT_NOT_NULL(ret); + TEST_ASSERT_EQUAL_STRING("test", ret); + free(ret); + + ret = ft_strsub(s, strlen(s) - 4, 100); + TEST_ASSERT_NOT_NULL(ret); + TEST_ASSERT_EQUAL_STRING("est]", ret); + free(ret); + + ret = ft_strsub(s, 3, 100); + TEST_ASSERT_NOT_NULL(ret); + TEST_ASSERT_EQUAL_STRING("st]", ret); + free(ret); + + ret = ft_strsub(s, strlen(s), 100); + TEST_ASSERT_NOT_NULL(ret); + TEST_ASSERT_EQUAL_STRING("", ret); + free(ret); + + TEST_ASSERT_NULL(ft_strsub(s, strlen(s) + 1, 1)); +} diff --git a/test/src/str/test_ft_strsubf.c b/test/src/str/test_ft_strsubf.c new file mode 100644 index 0000000..827c849 --- /dev/null +++ b/test/src/str/test_ft_strsubf.c @@ -0,0 +1,61 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* test_ft_strsubf.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 19:41:59 by charles #+# #+# */ +/* Updated: 2020/04/05 14:03:20 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_test.h" + +TEST_GROUP(ft_strsubf); + +TEST_SETUP(ft_strsubf) +{} + +TEST_TEAR_DOWN(ft_strsubf) +{} + +TEST(ft_strsubf, basic) +{ + char *orig = "[test]"; + char *s; + char *ret; + + s = strdup(orig); + ret = ft_strsub(s, 0, strlen(s)); + TEST_ASSERT_NOT_NULL(ret); + TEST_ASSERT_EQUAL_STRING("[test]", ret); + free(ret); + + s = strdup(orig); + ret = ft_strsub(s, 1, strlen(s) - 2); + TEST_ASSERT_NOT_NULL(ret); + TEST_ASSERT_EQUAL_STRING("test", ret); + free(ret); + + s = strdup(orig); + ret = ft_strsub(s, strlen(s) - 4, 100); + TEST_ASSERT_NOT_NULL(ret); + TEST_ASSERT_EQUAL_STRING("est]", ret); + free(ret); + + s = strdup(orig); + ret = ft_strsub(s, 3, 100); + TEST_ASSERT_NOT_NULL(ret); + TEST_ASSERT_EQUAL_STRING("st]", ret); + free(ret); + + s = strdup(orig); + ret = ft_strsub(s, strlen(s), 100); + TEST_ASSERT_NOT_NULL(ret); + TEST_ASSERT_EQUAL_STRING("", ret); + free(ret); + + s = strdup(orig); + TEST_ASSERT_NULL(ft_strsub(s, strlen(s) + 1, 1)); +} diff --git a/test/src/vec/test_ft_vecgrow.c b/test/src/vec/test_ft_vecgrow.c index 0b40390..8a80c7e 100644 --- a/test/src/vec/test_ft_vecgrow.c +++ b/test/src/vec/test_ft_vecgrow.c @@ -6,7 +6,7 @@ /* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/04/01 19:41:59 by charles #+# #+# */ -/* Updated: 2020/04/01 21:17:13 by charles ### ########.fr */ +/* Updated: 2020/04/02 10:41:28 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -24,24 +24,51 @@ TEST(ft_vecgrow, basic) { t_ftvec *vec = ft_vecnew(1); TEST_ASSERT_NOT_NULL(vec); + vec->size = 1; + vec->data[0] = (void*)(0xfefefefeUL << 32); + TEST_ASSERT_NOT_NULL(ft_vecgrow(vec)); TEST_ASSERT_EQUAL(2, vec->capacity); - TEST_ASSERT_EQUAL(0, vec->size); + TEST_ASSERT_EQUAL(1, vec->size); + TEST_ASSERT_EQUAL_HEX64(0xfefefefeUL << 32, vec->data[0]); + vec->size = 2; + vec->data[1] = (void*)(0xfafafafaUL << 32); + TEST_ASSERT_NOT_NULL(ft_vecgrow(vec)); TEST_ASSERT_EQUAL(3, vec->capacity); - TEST_ASSERT_EQUAL(0, vec->size); + TEST_ASSERT_EQUAL(2, vec->size); + TEST_ASSERT_EQUAL_HEX64(0xfefefefeUL << 32, vec->data[0]); + TEST_ASSERT_EQUAL_HEX64(0xfafafafaUL << 32, vec->data[1]); + vec->size = 3; + vec->data[2] = (void*)(0xfbfbfbfbUL << 32); + TEST_ASSERT_NOT_NULL(ft_vecgrow(vec)); TEST_ASSERT_EQUAL(4, vec->capacity); - TEST_ASSERT_EQUAL(0, vec->size); + TEST_ASSERT_EQUAL(3, vec->size); + TEST_ASSERT_EQUAL_HEX64(0xfefefefeUL << 32, vec->data[0]); + TEST_ASSERT_EQUAL_HEX64(0xfafafafaUL << 32, vec->data[1]); + TEST_ASSERT_EQUAL_HEX64(0xfbfbfbfbUL << 32, vec->data[2]); + TEST_ASSERT_NOT_NULL(ft_vecgrow(vec)); TEST_ASSERT_EQUAL(6, vec->capacity); - TEST_ASSERT_EQUAL(0, vec->size); + TEST_ASSERT_EQUAL(3, vec->size); + TEST_ASSERT_EQUAL_HEX64(0xfefefefeUL << 32, vec->data[0]); + TEST_ASSERT_EQUAL_HEX64(0xfafafafaUL << 32, vec->data[1]); + TEST_ASSERT_EQUAL_HEX64(0xfbfbfbfbUL << 32, vec->data[2]); + TEST_ASSERT_NOT_NULL(ft_vecgrow(vec)); TEST_ASSERT_EQUAL(9, vec->capacity); - TEST_ASSERT_EQUAL(0, vec->size); + TEST_ASSERT_EQUAL(3, vec->size); + TEST_ASSERT_EQUAL_HEX64(0xfefefefeUL << 32, vec->data[0]); + TEST_ASSERT_EQUAL_HEX64(0xfafafafaUL << 32, vec->data[1]); + TEST_ASSERT_EQUAL_HEX64(0xfbfbfbfbUL << 32, vec->data[2]); + TEST_ASSERT_NOT_NULL(ft_vecgrow(vec)); TEST_ASSERT_EQUAL(13, vec->capacity); - TEST_ASSERT_EQUAL(0, vec->size); + TEST_ASSERT_EQUAL(3, vec->size); + TEST_ASSERT_EQUAL_HEX64(0xfefefefeUL << 32, vec->data[0]); + TEST_ASSERT_EQUAL_HEX64(0xfafafafaUL << 32, vec->data[1]); + TEST_ASSERT_EQUAL_HEX64(0xfbfbfbfbUL << 32, vec->data[2]); ft_vecdestroy(vec, NULL); } diff --git a/test/src/vec/test_ft_vecinsert.c b/test/src/vec/test_ft_vecinsert.c new file mode 100644 index 0000000..9b89813 --- /dev/null +++ b/test/src/vec/test_ft_vecinsert.c @@ -0,0 +1,66 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* test_ft_vecinsert.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 22:48:58 by charles #+# #+# */ +/* Updated: 2020/04/02 11:05:14 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_test.h" + +TEST_GROUP(ft_vecinsert); + +TEST_SETUP(ft_vecinsert) +{} + +TEST_TEAR_DOWN(ft_vecinsert) +{} + +TEST(ft_vecinsert, basic) +{ + t_ftvec *vec; + + vec = ft_vecnew(2); + vec->data[0] = (void*)(1UL << 32); + vec->data[1] = (void*)(2UL << 32); + vec->size = 2; + + TEST_ASSERT_NOT_NULL(ft_vecinsert(vec, 0, (void*)(0xfefefefeUL << 32))); + TEST_ASSERT_EQUAL(3, vec->capacity); + TEST_ASSERT_EQUAL(3, vec->size); + TEST_ASSERT_EQUAL_HEX64((void*)(0xfefefefeUL << 32), vec->data[0]); + TEST_ASSERT_EQUAL_HEX64((void*)(1UL << 32), vec->data[1]); + TEST_ASSERT_EQUAL_HEX64((void*)(2UL << 32), vec->data[2]); + + TEST_ASSERT_NOT_NULL(ft_vecinsert(vec, 1, (void*)(0xfafafafaUL << 32))); + TEST_ASSERT_EQUAL(4, vec->capacity); + TEST_ASSERT_EQUAL(4, vec->size); + TEST_ASSERT_EQUAL_HEX64((void*)(0xfefefefeUL << 32), vec->data[0]); + TEST_ASSERT_EQUAL_HEX64((void*)(0xfafafafaUL << 32), vec->data[1]); + TEST_ASSERT_EQUAL_HEX64((void*)(1UL << 32), vec->data[2]); + TEST_ASSERT_EQUAL_HEX64((void*)(2UL << 32), vec->data[3]); + + TEST_ASSERT_NOT_NULL(ft_vecinsert(vec, 2, (void*)(0xfbfbfbfbUL << 32))); + TEST_ASSERT_EQUAL(6, vec->capacity); + TEST_ASSERT_EQUAL(5, vec->size); + TEST_ASSERT_EQUAL_HEX64((void*)(0xfefefefeUL << 32), vec->data[0]); + TEST_ASSERT_EQUAL_HEX64((void*)(0xfafafafaUL << 32), vec->data[1]); + TEST_ASSERT_EQUAL_HEX64((void*)(0xfbfbfbfbUL << 32), vec->data[2]); + TEST_ASSERT_EQUAL_HEX64((void*)(1UL << 32), vec->data[3]); + + TEST_ASSERT_NOT_NULL(ft_vecinsert(vec, vec->size, (void*)(0xfcUL << 31))); + TEST_ASSERT_EQUAL(6, vec->capacity); + TEST_ASSERT_EQUAL(6, vec->size); + TEST_ASSERT_EQUAL_HEX64((void*)(0xfefefefeUL << 32), vec->data[0]); + TEST_ASSERT_EQUAL_HEX64((void*)(0xfafafafaUL << 32), vec->data[1]); + TEST_ASSERT_EQUAL_HEX64((void*)(0xfbfbfbfbUL << 32), vec->data[2]); + TEST_ASSERT_EQUAL_HEX64((void*)(1UL << 32), vec->data[3]); + TEST_ASSERT_EQUAL_HEX64((void*)(2UL << 32), vec->data[4]); + TEST_ASSERT_EQUAL_HEX64((void*)(0xfcUL << 31), vec->data[5]); + + ft_vecdestroy(vec, NULL); +} diff --git a/test/src/vec/test_ft_vecpush_safe.c b/test/src/vec/test_ft_vecpush_safe.c new file mode 100644 index 0000000..8546829 --- /dev/null +++ b/test/src/vec/test_ft_vecpush_safe.c @@ -0,0 +1,45 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* test_ft_vecpush_safe.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 19:41:59 by charles #+# #+# */ +/* Updated: 2020/04/04 23:31:08 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_test.h" + +TEST_GROUP(ft_vecpush_safe); + +TEST_SETUP(ft_vecpush_safe) +{} + +TEST_TEAR_DOWN(ft_vecpush_safe) +{} + +TEST(ft_vecpush_safe, basic) +{ + t_ftvec *vec; + + vec = ft_vecnew(1); + TEST_ASSERT_NULL(ft_vecpush_safe(vec, NULL)); + + TEST_ASSERT_NOT_NULL(ft_vecpush_safe(vec, (void*)0x1UL)); + TEST_ASSERT_EQUAL_HEX(0x1, (unsigned long)vec->data[0]); + TEST_ASSERT_GREATER_OR_EQUAL(1, vec->capacity); + TEST_ASSERT_EQUAL(1, vec->size); + + TEST_ASSERT_NULL(ft_vecpush_safe(vec, NULL)); + TEST_ASSERT_NULL(ft_vecpush_safe(vec, NULL)); + + TEST_ASSERT_NOT_NULL(ft_vecpush_safe(vec, (void*)0x2UL)); + TEST_ASSERT_EQUAL_HEX(0x2, (unsigned long)vec->data[1]); + TEST_ASSERT_GREATER_OR_EQUAL(2, vec->capacity); + TEST_ASSERT_EQUAL(2, vec->size); + + TEST_ASSERT_NULL(ft_vecpush_safe(vec, NULL)); + TEST_ASSERT_NULL(ft_vecpush_safe(vec, NULL)); +} diff --git a/test/src/vec/test_ft_vecremove.c b/test/src/vec/test_ft_vecremove.c new file mode 100644 index 0000000..8cecc19 --- /dev/null +++ b/test/src/vec/test_ft_vecremove.c @@ -0,0 +1,64 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* test_ft_vecremove.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/01 22:48:58 by charles #+# #+# */ +/* Updated: 2020/04/01 22:56:37 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_test.h" + +TEST_GROUP(ft_vecremove); + +TEST_SETUP(ft_vecremove) +{} + +TEST_TEAR_DOWN(ft_vecremove) +{} + +TEST(ft_vecremove, basic) +{ + t_ftvec *vec; + + vec = ft_vecnew(4); + for (size_t i = 0; i < 4; i++) + vec->data[i] = (void*)(i + 1); + vec->size = 4; + + ft_vecremove(vec, 0, NULL); + TEST_ASSERT_EQUAL(3, vec->size); + TEST_ASSERT_EQUAL(4, vec->capacity); + TEST_ASSERT_EQUAL_UINT64(2, (size_t)vec->data[0]); + TEST_ASSERT_EQUAL_UINT64(3, (size_t)vec->data[1]); + TEST_ASSERT_EQUAL_UINT64(4, (size_t)vec->data[2]); + + ft_vecremove(vec, 1, NULL); + TEST_ASSERT_EQUAL(2, vec->size); + TEST_ASSERT_EQUAL(4, vec->capacity); + TEST_ASSERT_EQUAL_UINT64(2, (size_t)vec->data[0]); + TEST_ASSERT_EQUAL_UINT64(4, (size_t)vec->data[1]); + + ft_vecremove(vec, 1, NULL); + TEST_ASSERT_EQUAL(1, vec->size); + TEST_ASSERT_EQUAL(4, vec->capacity); + TEST_ASSERT_EQUAL_UINT64(2, (size_t)vec->data[0]); + + ft_vecremove(vec, 1, NULL); + TEST_ASSERT_EQUAL(1, vec->size); + TEST_ASSERT_EQUAL(4, vec->capacity); + TEST_ASSERT_EQUAL_UINT64(2, (size_t)vec->data[0]); + + ft_vecremove(vec, 0, NULL); + TEST_ASSERT_EQUAL(0, vec->size); + TEST_ASSERT_EQUAL(4, vec->capacity); + + ft_vecremove(vec, 0, NULL); + TEST_ASSERT_EQUAL(0, vec->size); + TEST_ASSERT_EQUAL(4, vec->capacity); + + ft_vecdestroy(vec, NULL); +} diff --git a/test/src/vec/test_ft_vecsort.c b/test/src/vec/test_ft_vecsort.c new file mode 100644 index 0000000..bfdad01 --- /dev/null +++ b/test/src/vec/test_ft_vecsort.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* test_ft_vecsort.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/04/04 19:31:13 by charles #+# #+# */ +/* Updated: 2020/04/04 19:45:27 by charles ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft_test.h" + +TEST_GROUP(ft_vecsort); + +TEST_SETUP(ft_vecsort) +{} + +TEST_TEAR_DOWN(ft_vecsort) +{} + +TEST(ft_vecsort, basic) +{ + t_ftvec *vec = ft_vecnew(1); + char* arr[] = {"bonjour", "je", "suis", "lala", "z", "b"}; + char* sorted[] = {"bonjour", "je", "suis", "lala", "z", "b"}; + + for (size_t i = 0; i < sizeof(arr) / sizeof(char*); i++) + ft_vecpush(vec, arr[i]); + ft_vecsort(vec, ft_compar_str); + ft_qsort(sorted, sizeof(sorted) / sizeof(char*), sizeof(char*), ft_compar_str); + TEST_ASSERT_EQUAL_STRING_ARRAY(sorted, vec->data, vec->size); +} |
