1 /* Searching a string for a character among a given set of characters. 2 Copyright (C) 1999, 2002, 2006-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 "mbuiter.h" 24 25 /* Find the first occurrence in the character string STRING of any character 26 in the character string ACCEPT. Return the pointer to it, or NULL if none 27 exists. */ 28 char * 29 mbspbrk (const char *string, const char *accept) /* */ 30 { 31 /* Optimize two cases. */ 32 if (accept[0] == '\0') 33 return NULL; 34 if (accept[1] == '\0') 35 return mbschr (string, accept[0]); 36 /* General case. */ 37 if (MB_CUR_MAX > 1) 38 { 39 mbui_iterator_t iter; 40 41 for (mbui_init (iter, string); mbui_avail (iter); mbui_advance (iter)) 42 { 43 if (mb_len (mbui_cur (iter)) == 1) 44 { 45 if (mbschr (accept, * mbui_cur_ptr (iter))) 46 return (char *) mbui_cur_ptr (iter); 47 } 48 else 49 { 50 mbui_iterator_t aiter; 51 52 for (mbui_init (aiter, accept); 53 mbui_avail (aiter); 54 mbui_advance (aiter)) 55 if (mb_equal (mbui_cur (aiter), mbui_cur (iter))) 56 return (char *) mbui_cur_ptr (iter); 57 } 58 } 59 return NULL; 60 } 61 else 62 return strpbrk (string, accept); 63 }