New module 'mbstok_r'.
[gnulib.git] / lib / mbstok_r.c
1 /* Tokenizing a string.
2    Copyright (C) 1999, 2002, 2006-2007 Free Software Foundation, Inc.
3    Written by Bruno Haible <bruno@clisp.org>, 2007.
4
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 2, or (at your option)
8    any later version.
9
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with this program; if not, write to the Free Software Foundation,
17    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
18
19 #include <config.h>
20
21 /* Specification.  */
22 #include <string.h>
23
24 #if HAVE_MBRTOWC
25 # include "mbuiter.h"
26 #endif
27
28 char *
29 mbstok_r (char *string, const char *delim, char **save_ptr)
30 {
31 #if HAVE_MBRTOWC
32   if (MB_CUR_MAX > 1)
33     {
34       if (string == NULL)
35         {
36           string = *save_ptr;
37           if (string == NULL)
38             return NULL; /* reminder that end of token sequence has been
39                             reached */
40         }
41
42       /* Skip leading delimiters.  */
43       string += mbsspn (string, delim);
44
45       /* Found a token?  */
46       if (*string == '\0')
47         {
48           *save_ptr = NULL;
49           return NULL;
50         }
51
52       /* Move past the token.  */
53       {
54         char *token_end = mbspbrk (string, delim);
55
56         if (token_end != NULL)
57           {
58             /* NUL-terminate the token.  */
59             *token_end = '\0';
60             *save_ptr = token_end + 1;
61           }
62         else
63           *save_ptr = NULL;
64       }
65
66       return string;
67     }
68   else
69 #endif
70     return strtok_r (string, delim, save_ptr);
71 }