e91ea191cf5d8f584dad91d597d891287416f63d
[gnulib.git] / lib / unistr / u-strpbrk.h
1 /* Search for some characters in UTF-8/UTF-16/UTF-32 string.
2    Copyright (C) 1999, 2002, 2006, 2009-2012 Free Software Foundation, Inc.
3    Written by Bruno Haible <bruno@clisp.org>, 2002.
4
5    This program is free software: you can redistribute it and/or modify it
6    under the terms of the GNU Lesser General Public License as published
7    by the Free Software Foundation; either version 3 of the License, or
8    (at your option) 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 GNU
13    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 <http://www.gnu.org/licenses/>.  */
17
18 UNIT *
19 FUNC (const UNIT *str, const UNIT *accept)
20 {
21   /* Optimize two cases.  */
22   if (accept[0] == 0)
23     return NULL;
24   {
25     ucs4_t uc;
26     int count = U_STRMBTOUC (&uc, accept);
27     if (count >= 0 && accept[count] == 0)
28       return U_STRCHR (str, uc);
29   }
30   /* General case.  */
31   {
32     const UNIT *ptr = str;
33
34     for (;;)
35       {
36         ucs4_t uc;
37         int count = U_STRMBTOUC (&uc, ptr);
38         if (count <= 0)
39           break;
40         if (U_STRCHR (accept, uc))
41           return (UNIT *) ptr;
42         ptr += count;
43       }
44     return NULL;
45   }
46 }