diff options
Diffstat (limited to 'libc/string/strtok_r.c')
-rw-r--r-- | libc/string/strtok_r.c | 54 |
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) |