summaryrefslogtreecommitdiff
path: root/libc/string/strtok_r.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/string/strtok_r.c')
-rw-r--r--libc/string/strtok_r.c54
1 files changed, 45 insertions, 9 deletions
diff --git a/libc/string/strtok_r.c b/libc/string/strtok_r.c
index 3f92c034d..c8ba588eb 100644
--- a/libc/string/strtok_r.c
+++ b/libc/string/strtok_r.c
@@ -1,19 +1,55 @@
/*
+ * Copyright (C) 2002 Manuel Novoa III
* Copyright (C) 2000-2005 Erik Andersen <andersen@uclibc.org>
*
* Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
*/
-#define L_strtok_r
-#define Wstrtok_r __strtok_r
+#include "_string.h"
-#undef Wstrspn
-#define Wstrspn __strspn
-#undef Wstrpbrk
-#define Wstrpbrk __strpbrk
+#ifdef WANT_WIDE
+# define __Wstrtok_r __wcstok
+# define Wstrtok_r wcstok
+# define Wstrspn __wcsspn
+# define Wstrpbrk __wcspbrk
+#else
+# define __Wstrtok_r __strtok_r
+# define Wstrtok_r strtok_r
+# define Wstrspn __strspn
+# define Wstrpbrk __strpbrk
+#endif
-#include "wstring.c"
+Wchar attribute_hidden *__Wstrtok_r(Wchar * __restrict s1, const Wchar * __restrict s2,
+ Wchar ** __restrict next_start)
+{
+ register Wchar *s;
+ register Wchar *p;
-strong_alias(__strtok_r, strtok_r)
+#if 1
+ if (((s = s1) != NULL) || ((s = *next_start) != NULL)) {
+ if (*(s += Wstrspn(s, s2))) {
+ if ((p = Wstrpbrk(s, s2)) != NULL) {
+ *p++ = 0;
+ }
+ } else {
+ p = s = NULL;
+ }
+ *next_start = p;
+ }
+ return s;
+#else
+ if (!(s = s1)) {
+ s = *next_start;
+ }
+ if (s && *(s += Wstrspn(s, s2))) {
+ if (*(p = s + Wstrcspn(s, s2))) {
+ *p++ = 0;
+ }
+ *next_start = p;
+ return s;
+ }
+ return NULL; /* TODO: set *next_start = NULL for safety? */
+#endif
+}
-#undef L_strtok_r
+strong_alias(__Wstrtok_r,Wstrtok_r)