From 7d626e7e9638d7e85c3dacce8a4aee009850a1a2 Mon Sep 17 00:00:00 2001 From: Charles Date: Thu, 13 Feb 2020 21:05:15 +0100 Subject: Filled mem* tests --- src/mem/ft_memmem.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) (limited to 'src/mem/ft_memmem.c') diff --git a/src/mem/ft_memmem.c b/src/mem/ft_memmem.c index b69efa0..fa1446c 100644 --- a/src/mem/ft_memmem.c +++ b/src/mem/ft_memmem.c @@ -6,7 +6,7 @@ /* By: cacharle +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/02/13 01:54:55 by cacharle #+# #+# */ -/* Updated: 2020/02/13 03:13:23 by cacharle ### ########.fr */ +/* Updated: 2020/02/13 21:04:46 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,41 +14,45 @@ #define BAD_TABLE_SIZE 256 -static void st_bad_table_init(size_t bad_table[BAD_TABLE_SIZE], +static void st_bad_table_init(size_t bad_table[BAD_TABLE_SIZE], const char *little, size_t little_len) { size_t i; - ft_memset_pattern4(bad_table, &little_len, 4 * BAD_TABLE_SIZE); i = 0; - while (i < little_len) + while (i < BAD_TABLE_SIZE) + bad_table[i++] = little_len; + i = 0; + while (i < little_len - 1) { bad_table[(int)little[i]] = little_len - i - 1; i++; } } -static t_ftbool st_memcmp_end(const void *s1, const void *s2, size_t n) +static int st_memcmp_end(const void *s1, const void *s2, size_t n) { while (n-- > 0) - if (((t_ftbyte*)s1)[n] != ((t_ftbyte*)s2)[n]) - return (FALSE); - return (TRUE); + if (*(t_ftbyte*)(s1 + n) != *(t_ftbyte*)(s2 + n)) + return (*(t_ftbyte*)(s1 + n) - *(t_ftbyte*)(s2 + n)); + return (0); } -void *ft_memmem(const void *big, size_t big_len, +void *ft_memmem(const void *big, size_t big_len, const void *little, size_t little_len) { size_t i; size_t bad_table[BAD_TABLE_SIZE]; + if (big_len < little_len || little_len == 0 || big_len == 0) + return (NULL); st_bad_table_init(bad_table, little, little_len); i = 0; - while (i < big_len - little_len) + while (i <= big_len - little_len) { - if (st_memcmp_end((t_ftbyte*)big + i, little, little_len)) - return ((t_ftbyte*)big + i); - i += bad_table[(int)(((t_ftbyte*)big)[i + big_len] - 1)]; + if (st_memcmp_end(big + i, little, little_len) == 0) + return ((void*)big + i); + i += bad_table[*(t_ftbyte*)(big + i + little_len - 1)]; } return (NULL); } -- cgit