aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mem/ft_memmem.c30
-rw-r--r--src/mem/ft_memset_pattern4.c5
2 files changed, 20 insertions, 15 deletions
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 <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
}
diff --git a/src/mem/ft_memset_pattern4.c b/src/mem/ft_memset_pattern4.c
index d16f420..112ce6d 100644
--- a/src/mem/ft_memset_pattern4.c
+++ b/src/mem/ft_memset_pattern4.c
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/13 03:06:41 by cacharle #+# #+# */
-/* Updated: 2020/02/13 03:10:42 by cacharle ### ########.fr */
+/* Updated: 2020/02/13 19:58:10 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
@@ -20,6 +20,7 @@ void ft_memset_pattern4(void *b, const void *pattern4, size_t len)
while (i-- > 0)
((int*)b)[i] = *(int*)pattern4;
i = len % 4;
+ len -= len % 4;
while (i-- > 0)
- ((int*)b)[len / 4 + i] = ((t_ftbyte*)pattern4)[i];
+ ((t_ftbyte*)b)[len + i] = ((t_ftbyte*)pattern4)[i];
}