|
Message-Id: <1359936735-31915-3-git-send-email-nwmcsween@gmail.com> Date: Mon, 4 Feb 2013 00:12:13 +0000 From: Nathan McSween <nwmcsween@...il.com> To: musl@...ts.openwall.com Cc: Nathan McSween <nwmcsween@...il.com> Subject: [PATCH 2/4] String: refactor to utilize word.h and optimize --- src/string/memchr.c | 42 ++++++++++++++++++++++++------------------ src/string/memset.c | 39 +++++++++++++++++++++++---------------- src/string/strlen.c | 29 ++++++++++++++++------------- 3 files changed, 63 insertions(+), 47 deletions(-) diff --git a/src/string/memchr.c b/src/string/memchr.c index a0472f7..559facc 100644 --- a/src/string/memchr.c +++ b/src/string/memchr.c @@ -1,24 +1,30 @@ -#include <string.h> -#include <stdlib.h> +#include <stddef.h> #include <stdint.h> -#include <limits.h> - -#define SS (sizeof(size_t)) -#define ALIGN (sizeof(size_t)-1) -#define ONES ((size_t)-1/UCHAR_MAX) -#define HIGHS (ONES * (UCHAR_MAX/2+1)) -#define HASZERO(x) ((x)-ONES & ~(x) & HIGHS) +#include <string.h> +#include "word.h" -void *memchr(const void *src, int c, size_t n) +/** + * memchr - Word sized c standard memchr. + * @s: Source + * @c: Character + * @n: Max size of @s + */ +void *memchr(const void *s, int c, size_t n) { - const unsigned char *s = src; + const unsigned char *cs = (const unsigned char *)s; + const size_t *w; + c = (unsigned char)c; - for (; ((uintptr_t)s & ALIGN) && n && *s != c; s++, n--); - if (n && *s != c) { - const size_t *w; - size_t k = ONES * c; - for (w = (const void *)s; n>=SS && !HASZERO(*w^k); w++, n-=SS); - for (s = (const void *)w; n && *s != c; s++, n--); + + for (; (uintptr_t)cs % sizeof(size_t); cs++, n--) { + if (!n) return NULL; + if (*cs == c) return (void *)cs; } - return n ? (void *)s : 0; + + for (w = (const size_t *)cs; !word_has_char(*w, c); w++, n--) + if (!n) return NULL; + for (cs = (const unsigned char *)w; *cs != c; cs++, n--) + if (!n) return NULL; + + return (void *)cs; } diff --git a/src/string/memset.c b/src/string/memset.c index 20e47c4..8c87548 100644 --- a/src/string/memset.c +++ b/src/string/memset.c @@ -1,21 +1,28 @@ -#include <string.h> -#include <stdlib.h> +#include <stddef.h> #include <stdint.h> -#include <limits.h> - -#define SS (sizeof(size_t)) -#define ALIGN (sizeof(size_t)-1) -#define ONES ((size_t)-1/UCHAR_MAX) +#include <string.h> +#include "word.h" -void *memset(void *dest, int c, size_t n) +/** + * memset - Word sized c standard memset. + * @d: Destination + * @c: Charater to set + * @n: Max size to set to @c in @d + */ +void *memset(void *d, int c, size_t n) { - unsigned char *s = dest; + unsigned char *cd = (unsigned char *)d; + const size_t wc = WORD_LSB_ONE * (unsigned char)c; + size_t *wd; + c = (unsigned char)c; - for (; ((uintptr_t)s & ALIGN) && n; n--) *s++ = c; - if (n) { - size_t *w, k = ONES * c; - for (w = (void *)s; n>=SS; n-=SS, w++) *w = k; - for (s = (void *)w; n; n--, s++) *s = c; - } - return dest; + + for (; (uintptr_t)cd % sizeof(size_t); *cd++ = c, n--) + if (!n) return d; + + for (wd = (size_t *)cd; n >= sizeof(size_t) + ; *wd++ = wc, n -= sizeof(size_t)); + for (cd = (unsigned char *)wd; n; *cd++ = c, n--); + + return d; } diff --git a/src/string/strlen.c b/src/string/strlen.c index d6f8631..2b356f0 100644 --- a/src/string/strlen.c +++ b/src/string/strlen.c @@ -1,19 +1,22 @@ -#include <string.h> -#include <stdlib.h> +#include <stddef.h> #include <stdint.h> -#include <limits.h> - -#define ALIGN (sizeof(size_t)) -#define ONES ((size_t)-1/UCHAR_MAX) -#define HIGHS (ONES * (UCHAR_MAX/2+1)) -#define HASZERO(x) ((x)-ONES & ~(x) & HIGHS) +#include <string.h> +#include "word.h" +/** + * strlen - Word sized c standard strlen. + * @s: Source + */ size_t strlen(const char *s) { - const char *a = s; + const char *z = s; const size_t *w; - for (; (uintptr_t)s % ALIGN; s++) if (!*s) return s-a; - for (w = (const void *)s; !HASZERO(*w); w++); - for (s = (const void *)w; *s; s++); - return s-a; + + for (; (uintptr_t)s % sizeof(size_t); s++) + if (!*s) return s - z; + + for (w = (const size_t *)s; !word_has_zero(*w); w++); + for (s = (const char *)w; *s; s++); + + return s - z; } -- 1.7.11.4
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.