aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-04-04 15:58:24 +0200
committerCharles <sircharlesaze@gmail.com>2020-04-04 15:58:24 +0200
commit51b845a6a202b50966f50e166cfb11bcbdccbe33 (patch)
tree35658c668ab4aa9214f311b209996c52fc8030e0
parent636c3ff6b600c291a40877ac52d8b0a1a58b9b79 (diff)
downloadlibft-51b845a6a202b50966f50e166cfb11bcbdccbe33.tar.gz
libft-51b845a6a202b50966f50e166cfb11bcbdccbe33.tar.bz2
libft-51b845a6a202b50966f50e166cfb11bcbdccbe33.zip
Added ft_strsjoin, ft_strsjoinf, ft_compar_str, ft_vecsort, ft_vecpush_safe
-rw-r--r--include/libft_algo.h4
-rw-r--r--include/libft_str.h10
-rw-r--r--include/libft_vec.h7
-rw-r--r--src/algo/ft_compar_str.c18
-rw-r--r--src/str/ft_strsep.c15
-rw-r--r--src/str/ft_strsjoin.c42
-rw-r--r--src/str/ft_strsjoinf.c22
-rw-r--r--src/vec/ft_vecpush_safe.c27
-rw-r--r--src/vec/ft_vecsort.c18
-rw-r--r--test/src/algo/test_ft_qsort.c42
-rw-r--r--test/src/runner/test_runner_algo.c3
11 files changed, 189 insertions, 19 deletions
diff --git a/include/libft_algo.h b/include/libft_algo.h
index 04191e6..e726d1f 100644
--- a/include/libft_algo.h
+++ b/include/libft_algo.h
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/01/19 07:22:57 by cacharle #+# #+# */
-/* Updated: 2020/04/03 07:05:04 by charles ### ########.fr */
+/* Updated: 2020/04/04 15:46:10 by charles ### ########.fr */
/* */
/* ************************************************************************** */
@@ -16,6 +16,7 @@
# include <stdlib.h>
# include "libft_mem.h"
# include "libft_def.h"
+# include "libft_str.h"
typedef struct
{
@@ -39,6 +40,7 @@ typedef struct s_ft_search_const
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_str.h b/include/libft_str.h
index 1b0703f..2b105bf 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/04/02 23:45:42 by charles ### ########.fr */
+/* Updated: 2020/04/04 14:41:46 by charles ### ########.fr */
/* */
/* ************************************************************************** */
@@ -16,6 +16,7 @@
# include <stddef.h>
# include <stdbool.h>
# include "libft_ctype.h"
+# include "libft_util.h"
typedef enum
{
@@ -82,6 +83,13 @@ char *ft_strtoupper(char *s);
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 c4e3e22..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/02 11:00:57 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,9 +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/src/algo/ft_compar_str.c b/src/algo/ft_compar_str.c
new file mode 100644
index 0000000..0d3e6ff
--- /dev/null
+++ b/src/algo/ft_compar_str.c
@@ -0,0 +1,18 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_compar_str.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/04/04 15:44:24 by charles #+# #+# */
+/* Updated: 2020/04/04 15:46:28 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft_algo.h"
+
+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/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..507903b
--- /dev/null
+++ b/src/str/ft_strsjoin.c
@@ -0,0 +1,42 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strsjoin.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/04/04 14:30:08 by charles #+# #+# */
+/* Updated: 2020/04/04 14:45:58 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft_str.h"
+
+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 + 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..f5077c1
--- /dev/null
+++ b/src/str/ft_strsjoinf.c
@@ -0,0 +1,22 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_strsjoinf.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/04/04 14:27:33 by charles #+# #+# */
+/* Updated: 2020/04/04 14:29:49 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft_str.h"
+
+char *ft_strsjoinf(char **strs, char *delim)
+{
+ char *ret;
+
+ ret = ft_strsjoin(strs, delim);
+ ft_split_destroy(strs);
+ return (ret);
+}
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_vecsort.c b/src/vec/ft_vecsort.c
new file mode 100644
index 0000000..99b1a5f
--- /dev/null
+++ b/src/vec/ft_vecsort.c
@@ -0,0 +1,18 @@
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* ft_vecsort.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: charles <charles.cabergs@gmail.com> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* Created: 2020/04/04 15:53:23 by charles #+# #+# */
+/* Updated: 2020/04/04 15:55:21 by charles ### ########.fr */
+/* */
+/* ************************************************************************** */
+
+#include "libft_vec.h"
+
+void ft_vecsort(t_ftvec *vec, t_ftcompar_func cmp)
+{
+ ft_qsort(vec->data, vec->size, sizeof(void*), cmp);
+}
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/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)