|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH] lib/nolibc: Add strtok to string.h
Added strtok and dependent functions to string.h
These are required for the Xen network netfront driver.
Functions are copied without modifications
Taken from musl v1.1.19
Commit <55df09bfccbfe21fc9dd7d8f94550c0ff25ace04>
Signed-off-by: Razvan Cojocaru <razvan.cojocaru93@xxxxxxxxx>
---
lib/nolibc/include/string.h | 4 +++
lib/nolibc/string.c | 74 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 78 insertions(+)
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..77b6798 100644
--- a/lib/nolibc/string.c
+++ b/lib/nolibc/string.c
@@ -166,3 +166,77 @@ 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 |