From 948c0953527fe3bef28904b38a16a9e4342e7e98 Mon Sep 17 00:00:00 2001 From: Charles Date: Fri, 3 Apr 2020 00:29:26 +0200 Subject: Added ft_fnmatch function --- include/libft_str.h | 9 ++- src/str/ft_fnmatch.c | 37 ++++++++++++ test/src/main.c | 1 + test/src/runner/test_runner_str.c | 5 ++ test/src/str/test_ft_fnmatch.c | 117 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 src/str/ft_fnmatch.c create mode 100644 test/src/str/test_ft_fnmatch.c 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 +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* 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 +# include # include "libft_ctype.h" typedef enum @@ -74,6 +75,12 @@ int ft_strnequ(char const *s1, char const *s2, size_t n); 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 +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* 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")); +} -- cgit