| /* |
| * 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. |
| */ |
| |
| #include "_string.h" |
| |
| #ifdef WANT_WIDE |
| # define Wstrtok_r wcstok |
| # define Wstrspn wcsspn |
| # define Wstrpbrk wcspbrk |
| #else |
| # define Wstrtok_r strtok_r |
| # define Wstrspn strspn |
| # define Wstrpbrk strpbrk |
| #endif |
| |
| Wchar *Wstrtok_r(Wchar * __restrict s1, const Wchar * __restrict s2, |
| Wchar ** __restrict next_start) |
| { |
| register Wchar *s; |
| register Wchar *p; |
| |
| #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 |
| } |
| |
| #ifndef WANT_WIDE |
| libc_hidden_def(strtok_r) |
| #endif |