[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH] lib/nolibc: Add strtok and offset macro
Added strtok to string.h, taken from musl libc. Also included offset macro to stddef.h These two are needed for the Xen network netfront driver. Signed-off-by: Razvan Cojocaru <razvan.cojocaru93@xxxxxxxxx> --- lib/nolibc/include/stddef.h | 4 +++ lib/nolibc/include/string.h | 4 +++ lib/nolibc/string.c | 64 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+) diff --git a/lib/nolibc/include/stddef.h b/lib/nolibc/include/stddef.h index 1e66615..a8ed523 100644 --- a/lib/nolibc/include/stddef.h +++ b/lib/nolibc/include/stddef.h @@ -49,6 +49,10 @@ typedef __sptr ptrdiff_t; #define NULL ((void *) 0) #endif +#ifndef offsetof +#define offsetof(t, d) __offsetof(t, d) +#endif + #ifdef __cplusplus } #endif diff --git a/lib/nolibc/include/string.h b/lib/nolibc/include/string.h index 4d12a5a..19fc5b1 100644 --- a/lib/nolibc/include/string.h +++ b/lib/nolibc/include/string.h @@ -57,6 +57,10 @@ const char *strchr(const char *str, int c); int strncmp(const char *str1, const char *str2, size_t len); int strcmp(const char *str1, const char *str2); +size_t strcspn(const char *s, const char *c); +size_t strspn(const char *s, const char *c); +char *strtok(char *restrict s, const char *restrict sep); + #ifdef __cplusplus } #endif diff --git a/lib/nolibc/string.c b/lib/nolibc/string.c index bf89106..a7f7b61 100644 --- a/lib/nolibc/string.c +++ b/lib/nolibc/string.c @@ -166,3 +166,67 @@ int strcmp(const char *str1, const char *str2) return __res; } + +/* Taken from musl libc */ +#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) +#define BITOP(a,b,op) \ + ((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a)))) + +char *__strchrnul(const char *s, int c) +{ + size_t *w, k; + + c = (unsigned char)c; + if (!c) return (char *)s + strlen(s); + + for (; (uintptr_t)s % ALIGN; s++) + if (!*s || *(unsigned char *)s == c) return (char *)s; + k = ONES * c; + for (w = (void *)s; !HASZERO(*w) && !HASZERO(*w^k); w++); + for (s = (void *)w; *s && *(unsigned char *)s != c; s++); + return (char *)s; +} + +size_t strcspn(const char *s, const char *c) +{ + const char *a = s; + size_t byteset[32/sizeof(size_t)]; + + if (!c[0] || !c[1]) return __strchrnul(s, *c)-a; + + memset(byteset, 0, sizeof byteset); + for (; *c && BITOP(byteset, *(unsigned char *)c, |=); c++); + for (; *s && !BITOP(byteset, *(unsigned char *)s, &); s++); + return s-a; +} + +size_t strspn(const char *s, const char *c) +{ + const char *a = s; + size_t byteset[32/sizeof(size_t)] = { 0 }; + + if (!c[0]) return 0; + if (!c[1]) { + for (; *s == *c; s++); + return s-a; + } + + for (; *c && BITOP(byteset, *(unsigned char *)c, |=); c++); + for (; *s && BITOP(byteset, *(unsigned char *)s, &); s++); + return s-a; +} + +char *strtok(char *restrict s, const char *restrict sep) +{ + static char *p; + if (!s && !(s = p)) return NULL; + s += strspn(s, sep); + if (!*s) return p = 0; + p = s + strcspn(s, sep); + if (*p) *p++ = 0; + else p = 0; + return s; +} -- 2.7.4 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |