aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libft_str.h9
-rw-r--r--src/str/ft_fnmatch.c37
-rw-r--r--test/src/main.c1
-rw-r--r--test/src/runner/test_runner_str.c5
-rw-r--r--test/src/str/test_ft_fnmatch.c117
5 files changed, 168 insertions, 1 deletions
diff --git a/include/libft_str.h b/include/libft_str.h
index ea6115d..1b0703f 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/02/28 12:09:56 by cacharle ### ########.fr */
+/* Updated: 2020/04/02 23:45:42 by charles ### ########.fr */
/* */
/* ************************************************************************** */
@@ -14,6 +14,7 @@
# define LIBFT_STR_H
# include <stddef.h>
+# include <stdbool.h>
# include "libft_ctype.h"
typedef enum
@@ -75,6 +76,12 @@ char *ft_strtolower(char *s);
char *ft_strtoupper(char *s);
/*
+** glob
+*/
+
+bool ft_fnmatch(const char *pattern, const char *string);
+
+/*
** bloat ?
*/
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/test/src/main.c b/test/src/main.c
index ad5c9e8..b9e8bf7 100644
--- a/test/src/main.c
+++ b/test/src/main.c
@@ -29,6 +29,7 @@ static void run_all_test(void)
// str
RUN_TEST_GROUP(ft_strlen);
+ RUN_TEST_GROUP(ft_fnmatch);
// ht
RUN_TEST_GROUP(ft_htentry_new);
diff --git a/test/src/runner/test_runner_str.c b/test/src/runner/test_runner_str.c
index 3d829ad..a299786 100644
--- a/test/src/runner/test_runner_str.c
+++ b/test/src/runner/test_runner_str.c
@@ -4,3 +4,8 @@ TEST_GROUP_RUNNER(ft_strlen)
{
RUN_TEST_CASE(ft_strlen, basic);
}
+
+TEST_GROUP_RUNNER(ft_fnmatch)
+{
+ RUN_TEST_CASE(ft_fnmatch, 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"));
+}