aboutsummaryrefslogtreecommitdiff
path: root/src/mem/ft_memchr.c
diff options
context:
space:
mode:
authorCharles Cabergs <me@cacharle.xyz>2020-08-02 11:05:33 +0200
committerCharles Cabergs <me@cacharle.xyz>2020-08-02 11:05:33 +0200
commit5d2f925b20ceaea4122c59d2d2c4e7d4ae991fde (patch)
tree80911dc3c32e9f230750e7e1042d413dfb6efab2 /src/mem/ft_memchr.c
parentee32953ea79616e72f5428cdf40c834714a891c9 (diff)
parentb96b82194ccad2cddbb46b77aa1962a57c47ff44 (diff)
downloadlibft-5d2f925b20ceaea4122c59d2d2c4e7d4ae991fde.tar.gz
libft-5d2f925b20ceaea4122c59d2d2c4e7d4ae991fde.tar.bz2
libft-5d2f925b20ceaea4122c59d2d2c4e7d4ae991fde.zip
Merge branch 'master' into ft_ssl
Diffstat (limited to 'src/mem/ft_memchr.c')
-rw-r--r--src/mem/ft_memchr.c41
1 files changed, 33 insertions, 8 deletions
diff --git a/src/mem/ft_memchr.c b/src/mem/ft_memchr.c
index 4fd8689..848b436 100644
--- a/src/mem/ft_memchr.c
+++ b/src/mem/ft_memchr.c
@@ -6,21 +6,46 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2019/10/07 09:55:31 by cacharle #+# #+# */
-/* Updated: 2020/02/13 04:28:00 by cacharle ### ########.fr */
+/* Updated: 2020/05/12 21:39:04 by charles ### ########.fr */
/* */
/* ************************************************************************** */
#include "libft.h"
+/*
+** Determining if a long word contain byte n
+**
+** xor all bytes with n, then check for zero byte like in ft_strlen.
+*/
+
+#define HIMAGIC 0x8080808080808080L
+#define LOMAGIC 0x0101010101010101L
+
void *ft_memchr(const void *s, int c, size_t n)
{
- size_t i;
- t_ftbyte *cast_s;
+ uint64_t buf;
+ uint64_t lw;
- cast_s = (t_ftbyte*)s;
- i = -1;
- while (++i < n)
- if (cast_s[i] == (unsigned char)c)
- return (cast_s + i);
+ c = (uint8_t)c;
+ while (((uint64_t)s & 0b111) != 0 && n > 0)
+ {
+ if (*(uint8_t*)s == (uint8_t)c)
+ return ((void*)s);
+ n--;
+ s++;
+ }
+ buf = c | c << 8 | c << 16 | c << 24;
+ buf |= buf << 32;
+ while (n >= 8)
+ {
+ lw = *(uint64_t*)s ^ buf;
+ if ((lw - LOMAGIC) & ~lw & HIMAGIC)
+ break ;
+ n -= 8;
+ s += 8;
+ }
+ while (n-- > 0)
+ if (*(uint8_t*)s++ == (uint8_t)c)
+ return ((void*)(s - 1));
return (NULL);
}