1 /* Copyright (C) 1995-2022 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3 
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8 
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13 
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <https://www.gnu.org/licenses/>.  */
17 
18 #include <wchar.h>
19 #include <errno.h>
20 
21 
22 /* Parse WCS into tokens separated by characters in DELIM.  If WCS is
23    NULL, the last string wcstok() was called with is used.  */
24 wchar_t *
wcstok(wchar_t * wcs,const wchar_t * delim,wchar_t ** save_ptr)25 wcstok (wchar_t *wcs, const wchar_t *delim, wchar_t **save_ptr)
26 {
27   wchar_t *result;
28 
29   if (wcs == NULL)
30     {
31       if (*save_ptr == NULL)
32 	{
33 	  __set_errno (EINVAL);
34 	  return NULL;
35 	}
36       else
37 	wcs = *save_ptr;
38     }
39 
40   /* Scan leading delimiters.  */
41   wcs += wcsspn (wcs, delim);
42   if (*wcs == L'\0')
43     {
44       *save_ptr = NULL;
45       return NULL;
46     }
47 
48   /* Find the end of the token.	 */
49   result = wcs;
50   wcs = wcspbrk (result, delim);
51   if (wcs == NULL)
52     /* This token finishes the string.	*/
53     *save_ptr = NULL;
54   else
55     {
56       /* Terminate the token and make *SAVE_PTR point past it.  */
57       *wcs = L'\0';
58       *save_ptr = wcs + 1;
59     }
60   return result;
61 }
62