[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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.