1/* Search character in piece of UTF-8 string.
2   Copyright (C) 1999, 2002, 2006-2007, 2009-2010 Free Software Foundation,
3   Inc.
4   Written by Bruno Haible <bruno@clisp.org>, 2002.
5
6   This program is free software: you can redistribute it and/or modify it
7   under the terms of the GNU Lesser General Public License as published
8   by the Free Software Foundation; either version 3 of the License, or
9   (at your option) any later version.
10
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   Lesser General Public License for more details.
15
16   You should have received a copy of the GNU Lesser General Public License
17   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
18
19#include <config.h>
20
21/* Specification.  */
22#include "unistr.h"
23
24uint8_t *
25u8_chr (const uint8_t *s, size_t n, ucs4_t uc)
26{
27  uint8_t c[6];
28
29  if (uc < 0x80)
30    {
31      uint8_t c0 = uc;
32
33      for (; n > 0; s++, n--)
34        {
35          if (*s == c0)
36            return (uint8_t *) s;
37        }
38    }
39  else
40    switch (u8_uctomb_aux (c, uc, 6))
41      {
42      case 2:
43        if (n > 1)
44          {
45            uint8_t c0 = c[0];
46            uint8_t c1 = c[1];
47
48            for (n--; n > 0; s++, n--)
49              {
50                if (*s == c0 && s[1] == c1)
51                  return (uint8_t *) s;
52              }
53          }
54        break;
55
56      case 3:
57        if (n > 2)
58          {
59            uint8_t c0 = c[0];
60            uint8_t c1 = c[1];
61            uint8_t c2 = c[2];
62
63            for (n -= 2; n > 0; s++, n--)
64              {
65                if (*s == c0 && s[1] == c1 && s[2] == c2)
66                  return (uint8_t *) s;
67              }
68          }
69        break;
70
71      case 4:
72        if (n > 3)
73          {
74            uint8_t c0 = c[0];
75            uint8_t c1 = c[1];
76            uint8_t c2 = c[2];
77            uint8_t c3 = c[3];
78
79            for (n -= 3; n > 0; s++, n--)
80              {
81                if (*s == c0 && s[1] == c1 && s[2] == c2 && s[3] == c3)
82                  return (uint8_t *) s;
83              }
84          }
85        break;
86      }
87  return NULL;
88}
89