1 /* Tokenizing a string. 2 Copyright (C) 2007-2021 Free Software Foundation, Inc. 3 Written by Bruno Haible <bruno@clisp.org>, 2007. 4 5 This file is free software: you can redistribute it and/or modify 6 it under the terms of the GNU Lesser General Public License as 7 published by the Free Software Foundation; either version 3 of the 8 License, or (at your option) any later version. 9 10 This file 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 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public License 16 along with this program. If not, see <https://www.gnu.org/licenses/>. */ 17 18 #include <config.h> 19 20 /* Specification. */ 21 #include <string.h> 22 23 #include <stdlib.h> 24 25 #include "mbuiter.h" 26 27 char * 28 mbssep (char **stringp, const char *delim) /* */ 29 { 30 if (MB_CUR_MAX > 1) 31 { 32 char *start = *stringp; 33 char *ptr; 34 35 if (start == NULL) 36 return NULL; 37 38 /* No need to optimize the cases of 0 or 1 delimiters specially, 39 since mbspbrk already optimizes them. */ 40 41 ptr = mbspbrk (start, delim); 42 43 if (ptr == NULL) 44 { 45 *stringp = NULL; 46 return start; 47 } 48 else 49 { 50 mbui_iterator_t iter; 51 52 mbui_init (iter, ptr); 53 if (!mbui_avail (iter)) 54 abort (); 55 mbui_advance (iter); 56 *ptr = '\0'; 57 *stringp = (char *) mbui_cur_ptr (iter); 58 return start; 59 } 60 } 61 else 62 return strsep (stringp, delim); 63 }