diff options
author | Bruno Haible <bruno@clisp.org> | 2007-02-05 03:30:43 +0000 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2007-02-05 03:30:43 +0000 |
commit | 0c5f9b8dce91dda584a06675e91a8c69d4f2575d (patch) | |
tree | 2d07197dd0f69b85615ab6f455b1546e04cb3c0d /lib/mbstok_r.c | |
parent | 2a2eb440165889566a738cd355381b4b28870206 (diff) | |
download | gnulib-0c5f9b8dce91dda584a06675e91a8c69d4f2575d.tar.gz |
New module 'mbstok_r'.
Diffstat (limited to 'lib/mbstok_r.c')
-rw-r--r-- | lib/mbstok_r.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/lib/mbstok_r.c b/lib/mbstok_r.c new file mode 100644 index 0000000000..fb6bdef396 --- /dev/null +++ b/lib/mbstok_r.c @@ -0,0 +1,71 @@ +/* Tokenizing a string. + Copyright (C) 1999, 2002, 2006-2007 Free Software Foundation, Inc. + Written by Bruno Haible <bruno@clisp.org>, 2007. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include <config.h> + +/* Specification. */ +#include <string.h> + +#if HAVE_MBRTOWC +# include "mbuiter.h" +#endif + +char * +mbstok_r (char *string, const char *delim, char **save_ptr) +{ +#if HAVE_MBRTOWC + if (MB_CUR_MAX > 1) + { + if (string == NULL) + { + string = *save_ptr; + if (string == NULL) + return NULL; /* reminder that end of token sequence has been + reached */ + } + + /* Skip leading delimiters. */ + string += mbsspn (string, delim); + + /* Found a token? */ + if (*string == '\0') + { + *save_ptr = NULL; + return NULL; + } + + /* Move past the token. */ + { + char *token_end = mbspbrk (string, delim); + + if (token_end != NULL) + { + /* NUL-terminate the token. */ + *token_end = '\0'; + *save_ptr = token_end + 1; + } + else + *save_ptr = NULL; + } + + return string; + } + else +#endif + return strtok_r (string, delim, save_ptr); +} |