Coverage Report

Created: 2023-03-26 07:33

/src/gnutls/lib/unistring/unistr.h
Line
Count
Source (jump to first uncovered line)
1
/* DO NOT EDIT! GENERATED AUTOMATICALLY! */
2
/* Elementary Unicode string functions.
3
   Copyright (C) 2001-2002, 2005-2023 Free Software Foundation, Inc.
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 2.1 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
#ifndef _UNISTR_H
19
#define _UNISTR_H
20
21
#include "unitypes.h"
22
23
/* Get bool.  */
24
#include <stdbool.h>
25
26
/* Get size_t, ptrdiff_t.  */
27
#include <stddef.h>
28
29
/* Get free().  */
30
#include <stdlib.h>
31
32
#ifdef __cplusplus
33
extern "C" {
34
#endif
35
36
37
/* Conventions:
38
39
   All functions prefixed with u8_ operate on UTF-8 encoded strings.
40
   Their unit is an uint8_t (1 byte).
41
42
   All functions prefixed with u16_ operate on UTF-16 encoded strings.
43
   Their unit is an uint16_t (a 2-byte word).
44
45
   All functions prefixed with u32_ operate on UCS-4 encoded strings.
46
   Their unit is an uint32_t (a 4-byte word).
47
48
   All argument pairs (s, n) denote a Unicode string s[0..n-1] with exactly
49
   n units.
50
51
   All arguments starting with "str" and the arguments of functions starting
52
   with u8_str/u16_str/u32_str denote a NUL terminated string, i.e. a string
53
   which terminates at the first NUL unit.  This termination unit is
54
   considered part of the string for all memory allocation purposes, but
55
   is not considered part of the string for all other logical purposes.
56
57
   Functions returning a string result take a (resultbuf, lengthp) argument
58
   pair.  If resultbuf is not NULL and the result fits into *lengthp units,
59
   it is put in resultbuf, and resultbuf is returned.  Otherwise, a freshly
60
   allocated string is returned.  In both cases, *lengthp is set to the
61
   length (number of units) of the returned string.  In case of error,
62
   NULL is returned and errno is set.  */
63
64
65
/* Elementary string checks.  */
66
67
/* Check whether an UTF-8 string is well-formed.
68
   Return NULL if valid, or a pointer to the first invalid unit otherwise.  */
69
extern const uint8_t *
70
       u8_check (const uint8_t *s, size_t n)
71
       _UC_ATTRIBUTE_PURE;
72
73
/* Check whether an UTF-16 string is well-formed.
74
   Return NULL if valid, or a pointer to the first invalid unit otherwise.  */
75
extern const uint16_t *
76
       u16_check (const uint16_t *s, size_t n)
77
       _UC_ATTRIBUTE_PURE;
78
79
/* Check whether an UCS-4 string is well-formed.
80
   Return NULL if valid, or a pointer to the first invalid unit otherwise.  */
81
extern const uint32_t *
82
       u32_check (const uint32_t *s, size_t n)
83
       _UC_ATTRIBUTE_PURE;
84
85
86
/* Elementary string conversions.  */
87
88
/* Convert an UTF-8 string to an UTF-16 string.  */
89
extern uint16_t *
90
       u8_to_u16 (const uint8_t *s, size_t n, uint16_t *resultbuf,
91
                  size_t *lengthp);
92
93
/* Convert an UTF-8 string to an UCS-4 string.  */
94
extern uint32_t *
95
       u8_to_u32 (const uint8_t *s, size_t n, uint32_t *resultbuf,
96
                  size_t *lengthp);
97
98
/* Convert an UTF-16 string to an UTF-8 string.  */
99
extern uint8_t *
100
       u16_to_u8 (const uint16_t *s, size_t n, uint8_t *resultbuf,
101
                  size_t *lengthp);
102
103
/* Convert an UTF-16 string to an UCS-4 string.  */
104
extern uint32_t *
105
       u16_to_u32 (const uint16_t *s, size_t n, uint32_t *resultbuf,
106
                   size_t *lengthp);
107
108
/* Convert an UCS-4 string to an UTF-8 string.  */
109
extern uint8_t *
110
       u32_to_u8 (const uint32_t *s, size_t n, uint8_t *resultbuf,
111
                  size_t *lengthp);
112
113
/* Convert an UCS-4 string to an UTF-16 string.  */
114
extern uint16_t *
115
       u32_to_u16 (const uint32_t *s, size_t n, uint16_t *resultbuf,
116
                   size_t *lengthp);
117
118
119
/* Elementary string functions.  */
120
121
/* Return the length (number of units) of the first character in S, which is
122
   no longer than N.  Return 0 if it is the NUL character.  Return -1 upon
123
   failure.  */
124
/* Similar to mblen(), except that s must not be NULL.  */
125
extern int
126
       u8_mblen (const uint8_t *s, size_t n)
127
       _UC_ATTRIBUTE_PURE;
128
extern int
129
       u16_mblen (const uint16_t *s, size_t n)
130
       _UC_ATTRIBUTE_PURE;
131
extern int
132
       u32_mblen (const uint32_t *s, size_t n)
133
       _UC_ATTRIBUTE_PURE;
134
135
/* Return the length (number of units) of the first character in S, putting
136
   its 'ucs4_t' representation in *PUC.  Upon failure, *PUC is set to 0xfffd,
137
   and an appropriate number of units is returned.
138
   The number of available units, N, must be > 0.  */
139
/* Similar to mbtowc(), except that puc and s must not be NULL, n must be > 0,
140
   and the NUL character is not treated specially.  */
141
/* The variants with _unsafe suffix are for backward compatibility with
142
   libunistring versions < 0.9.7.  */
143
144
#if GNULIB_UNISTR_U8_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
145
# if !HAVE_INLINE
146
extern int
147
       u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n);
148
# else
149
extern int
150
       u8_mbtouc_unsafe_aux (ucs4_t *puc, const uint8_t *s, size_t n);
151
static inline int
152
u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n)
153
0
{
154
0
  uint8_t c = *s;
155
0
156
0
  if (c < 0x80)
157
0
    {
158
0
      *puc = c;
159
0
      return 1;
160
0
    }
161
0
  else
162
0
    return u8_mbtouc_unsafe_aux (puc, s, n);
163
0
}
Unexecuted instantiation: str-idna.c:u8_mbtouc_unsafe
Unexecuted instantiation: str-iconv.c:u8_mbtouc_unsafe
Unexecuted instantiation: str-unicode.c:u8_mbtouc_unsafe
Unexecuted instantiation: u16-normalize.c:u8_mbtouc_unsafe
Unexecuted instantiation: u16-to-u8.c:u8_mbtouc_unsafe
Unexecuted instantiation: u16-uctomb-aux.c:u8_mbtouc_unsafe
Unexecuted instantiation: u32-normalize.c:u8_mbtouc_unsafe
Unexecuted instantiation: u32-to-u8.c:u8_mbtouc_unsafe
Unexecuted instantiation: u8-check.c:u8_mbtouc_unsafe
Unexecuted instantiation: u8-to-u16.c:u8_mbtouc_unsafe
Unexecuted instantiation: u8-to-u32.c:u8_mbtouc_unsafe
Unexecuted instantiation: u8-uctomb-aux.c:u8_mbtouc_unsafe
Unexecuted instantiation: u16-cpy.c:u8_mbtouc_unsafe
Unexecuted instantiation: u16-mbtouc-unsafe-aux.c:u8_mbtouc_unsafe
Unexecuted instantiation: u16-mbtoucr.c:u8_mbtouc_unsafe
Unexecuted instantiation: u32-cpy.c:u8_mbtouc_unsafe
Unexecuted instantiation: u8-mbtoucr.c:u8_mbtouc_unsafe
164
# endif
165
#endif
166
167
#if GNULIB_UNISTR_U16_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
168
# if !HAVE_INLINE
169
extern int
170
       u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n);
171
# else
172
extern int
173
       u16_mbtouc_unsafe_aux (ucs4_t *puc, const uint16_t *s, size_t n);
174
static inline int
175
u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n)
176
0
{
177
0
  uint16_t c = *s;
178
179
0
  if (c < 0xd800 || c >= 0xe000)
180
0
    {
181
0
      *puc = c;
182
0
      return 1;
183
0
    }
184
0
  else
185
0
    return u16_mbtouc_unsafe_aux (puc, s, n);
186
0
}
Unexecuted instantiation: str-idna.c:u16_mbtouc_unsafe
Unexecuted instantiation: str-iconv.c:u16_mbtouc_unsafe
Unexecuted instantiation: str-unicode.c:u16_mbtouc_unsafe
Unexecuted instantiation: u16-normalize.c:u16_mbtouc_unsafe
Unexecuted instantiation: u16-to-u8.c:u16_mbtouc_unsafe
Unexecuted instantiation: u16-uctomb-aux.c:u16_mbtouc_unsafe
Unexecuted instantiation: u32-normalize.c:u16_mbtouc_unsafe
Unexecuted instantiation: u32-to-u8.c:u16_mbtouc_unsafe
Unexecuted instantiation: u8-check.c:u16_mbtouc_unsafe
Unexecuted instantiation: u8-to-u16.c:u16_mbtouc_unsafe
Unexecuted instantiation: u8-to-u32.c:u16_mbtouc_unsafe
Unexecuted instantiation: u8-uctomb-aux.c:u16_mbtouc_unsafe
Unexecuted instantiation: u16-cpy.c:u16_mbtouc_unsafe
Unexecuted instantiation: u16-mbtouc-unsafe-aux.c:u16_mbtouc_unsafe
Unexecuted instantiation: u16-mbtoucr.c:u16_mbtouc_unsafe
Unexecuted instantiation: u32-cpy.c:u16_mbtouc_unsafe
Unexecuted instantiation: u8-mbtoucr.c:u16_mbtouc_unsafe
187
# endif
188
#endif
189
190
#if GNULIB_UNISTR_U32_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
191
# if !HAVE_INLINE
192
extern int
193
       u32_mbtouc_unsafe (ucs4_t *puc, const uint32_t *s, size_t n);
194
# else
195
static inline int
196
u32_mbtouc_unsafe (ucs4_t *puc,
197
                   const uint32_t *s, _GL_ATTRIBUTE_MAYBE_UNUSED size_t n)
198
0
{
199
0
  uint32_t c = *s;
200
201
0
  if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
202
0
    *puc = c;
203
0
  else
204
    /* invalid multibyte character */
205
0
    *puc = 0xfffd;
206
0
  return 1;
207
0
}
Unexecuted instantiation: str-idna.c:u32_mbtouc_unsafe
Unexecuted instantiation: str-iconv.c:u32_mbtouc_unsafe
Unexecuted instantiation: str-unicode.c:u32_mbtouc_unsafe
Unexecuted instantiation: u16-normalize.c:u32_mbtouc_unsafe
Unexecuted instantiation: u16-to-u8.c:u32_mbtouc_unsafe
Unexecuted instantiation: u16-uctomb-aux.c:u32_mbtouc_unsafe
Unexecuted instantiation: u32-normalize.c:u32_mbtouc_unsafe
Unexecuted instantiation: u32-to-u8.c:u32_mbtouc_unsafe
Unexecuted instantiation: u8-check.c:u32_mbtouc_unsafe
Unexecuted instantiation: u8-to-u16.c:u32_mbtouc_unsafe
Unexecuted instantiation: u8-to-u32.c:u32_mbtouc_unsafe
Unexecuted instantiation: u8-uctomb-aux.c:u32_mbtouc_unsafe
Unexecuted instantiation: u16-cpy.c:u32_mbtouc_unsafe
Unexecuted instantiation: u16-mbtouc-unsafe-aux.c:u32_mbtouc_unsafe
Unexecuted instantiation: u16-mbtoucr.c:u32_mbtouc_unsafe
Unexecuted instantiation: u32-cpy.c:u32_mbtouc_unsafe
Unexecuted instantiation: u8-mbtoucr.c:u32_mbtouc_unsafe
208
# endif
209
#endif
210
211
#if GNULIB_UNISTR_U8_MBTOUC || HAVE_LIBUNISTRING
212
# if !HAVE_INLINE
213
extern int
214
       u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n);
215
# else
216
extern int
217
       u8_mbtouc_aux (ucs4_t *puc, const uint8_t *s, size_t n);
218
static inline int
219
u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n)
220
{
221
  uint8_t c = *s;
222
223
  if (c < 0x80)
224
    {
225
      *puc = c;
226
      return 1;
227
    }
228
  else
229
    return u8_mbtouc_aux (puc, s, n);
230
}
231
# endif
232
#endif
233
234
#if GNULIB_UNISTR_U16_MBTOUC || HAVE_LIBUNISTRING
235
# if !HAVE_INLINE
236
extern int
237
       u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n);
238
# else
239
extern int
240
       u16_mbtouc_aux (ucs4_t *puc, const uint16_t *s, size_t n);
241
static inline int
242
u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n)
243
{
244
  uint16_t c = *s;
245
246
  if (c < 0xd800 || c >= 0xe000)
247
    {
248
      *puc = c;
249
      return 1;
250
    }
251
  else
252
    return u16_mbtouc_aux (puc, s, n);
253
}
254
# endif
255
#endif
256
257
#if GNULIB_UNISTR_U32_MBTOUC || HAVE_LIBUNISTRING
258
# if !HAVE_INLINE
259
extern int
260
       u32_mbtouc (ucs4_t *puc, const uint32_t *s, size_t n);
261
# else
262
static inline int
263
u32_mbtouc (ucs4_t *puc, const uint32_t *s,
264
            _GL_ATTRIBUTE_MAYBE_UNUSED size_t n)
265
{
266
  uint32_t c = *s;
267
268
  if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
269
    *puc = c;
270
  else
271
    /* invalid multibyte character */
272
    *puc = 0xfffd;
273
  return 1;
274
}
275
# endif
276
#endif
277
278
/* Return the length (number of units) of the first character in S, putting
279
   its 'ucs4_t' representation in *PUC.  Upon failure, *PUC is set to 0xfffd,
280
   and -1 is returned for an invalid sequence of units, -2 is returned for an
281
   incomplete sequence of units.
282
   The number of available units, N, must be > 0.  */
283
/* Similar to u*_mbtouc(), except that the return value gives more details
284
   about the failure, similar to mbrtowc().  */
285
286
#if GNULIB_UNISTR_U8_MBTOUCR || HAVE_LIBUNISTRING
287
extern int
288
       u8_mbtoucr (ucs4_t *puc, const uint8_t *s, size_t n);
289
#endif
290
291
#if GNULIB_UNISTR_U16_MBTOUCR || HAVE_LIBUNISTRING
292
extern int
293
       u16_mbtoucr (ucs4_t *puc, const uint16_t *s, size_t n);
294
#endif
295
296
#if GNULIB_UNISTR_U32_MBTOUCR || HAVE_LIBUNISTRING
297
extern int
298
       u32_mbtoucr (ucs4_t *puc, const uint32_t *s, size_t n);
299
#endif
300
301
/* Put the multibyte character represented by UC in S, returning its
302
   length.  Return -1 upon failure, -2 if the number of available units, N,
303
   is too small.  The latter case cannot occur if N >= 6/2/1, respectively.  */
304
/* Similar to wctomb(), except that s must not be NULL, and the argument n
305
   must be specified.  */
306
307
#if GNULIB_UNISTR_U8_UCTOMB || HAVE_LIBUNISTRING
308
/* Auxiliary function, also used by u8_chr, u8_strchr, u8_strrchr.  */
309
extern int
310
       u8_uctomb_aux (uint8_t *s, ucs4_t uc, ptrdiff_t n);
311
# if !HAVE_INLINE
312
extern int
313
       u8_uctomb (uint8_t *s, ucs4_t uc, ptrdiff_t n);
314
# else
315
static inline int
316
u8_uctomb (uint8_t *s, ucs4_t uc, ptrdiff_t n)
317
0
{
318
0
  if (uc < 0x80 && n > 0)
319
0
    {
320
0
      s[0] = uc;
321
0
      return 1;
322
0
    }
323
0
  else
324
0
    return u8_uctomb_aux (s, uc, n);
325
0
}
Unexecuted instantiation: str-idna.c:u8_uctomb
Unexecuted instantiation: str-iconv.c:u8_uctomb
Unexecuted instantiation: str-unicode.c:u8_uctomb
Unexecuted instantiation: u16-normalize.c:u8_uctomb
Unexecuted instantiation: u16-to-u8.c:u8_uctomb
Unexecuted instantiation: u16-uctomb-aux.c:u8_uctomb
Unexecuted instantiation: u32-normalize.c:u8_uctomb
Unexecuted instantiation: u32-to-u8.c:u8_uctomb
Unexecuted instantiation: u8-check.c:u8_uctomb
Unexecuted instantiation: u8-to-u16.c:u8_uctomb
Unexecuted instantiation: u8-to-u32.c:u8_uctomb
Unexecuted instantiation: u8-uctomb-aux.c:u8_uctomb
Unexecuted instantiation: u16-cpy.c:u8_uctomb
Unexecuted instantiation: u16-mbtouc-unsafe-aux.c:u8_uctomb
Unexecuted instantiation: u16-mbtoucr.c:u8_uctomb
Unexecuted instantiation: u32-cpy.c:u8_uctomb
Unexecuted instantiation: u8-mbtoucr.c:u8_uctomb
326
# endif
327
#endif
328
329
#if GNULIB_UNISTR_U16_UCTOMB || HAVE_LIBUNISTRING
330
/* Auxiliary function, also used by u16_chr, u16_strchr, u16_strrchr.  */
331
extern int
332
       u16_uctomb_aux (uint16_t *s, ucs4_t uc, ptrdiff_t n);
333
# if !HAVE_INLINE
334
extern int
335
       u16_uctomb (uint16_t *s, ucs4_t uc, ptrdiff_t n);
336
# else
337
static inline int
338
u16_uctomb (uint16_t *s, ucs4_t uc, ptrdiff_t n)
339
0
{
340
0
  if (uc < 0xd800 && n > 0)
341
0
    {
342
0
      s[0] = uc;
343
0
      return 1;
344
0
    }
345
0
  else
346
0
    return u16_uctomb_aux (s, uc, n);
347
0
}
Unexecuted instantiation: str-idna.c:u16_uctomb
Unexecuted instantiation: str-iconv.c:u16_uctomb
Unexecuted instantiation: str-unicode.c:u16_uctomb
Unexecuted instantiation: u16-normalize.c:u16_uctomb
Unexecuted instantiation: u16-to-u8.c:u16_uctomb
Unexecuted instantiation: u16-uctomb-aux.c:u16_uctomb
Unexecuted instantiation: u32-normalize.c:u16_uctomb
Unexecuted instantiation: u32-to-u8.c:u16_uctomb
Unexecuted instantiation: u8-check.c:u16_uctomb
Unexecuted instantiation: u8-to-u16.c:u16_uctomb
Unexecuted instantiation: u8-to-u32.c:u16_uctomb
Unexecuted instantiation: u8-uctomb-aux.c:u16_uctomb
Unexecuted instantiation: u16-cpy.c:u16_uctomb
Unexecuted instantiation: u16-mbtouc-unsafe-aux.c:u16_uctomb
Unexecuted instantiation: u16-mbtoucr.c:u16_uctomb
Unexecuted instantiation: u32-cpy.c:u16_uctomb
Unexecuted instantiation: u8-mbtoucr.c:u16_uctomb
348
# endif
349
#endif
350
351
#if GNULIB_UNISTR_U32_UCTOMB || HAVE_LIBUNISTRING
352
# if !HAVE_INLINE
353
extern int
354
       u32_uctomb (uint32_t *s, ucs4_t uc, ptrdiff_t n);
355
# else
356
static inline int
357
u32_uctomb (uint32_t *s, ucs4_t uc, ptrdiff_t n)
358
0
{
359
0
  if (uc < 0xd800 || (uc >= 0xe000 && uc < 0x110000))
360
0
    {
361
0
      if (n > 0)
362
0
        {
363
0
          *s = uc;
364
0
          return 1;
365
0
        }
366
0
      else
367
0
        return -2;
368
0
    }
369
0
  else
370
0
    return -1;
371
0
}
Unexecuted instantiation: str-idna.c:u32_uctomb
Unexecuted instantiation: str-iconv.c:u32_uctomb
Unexecuted instantiation: str-unicode.c:u32_uctomb
Unexecuted instantiation: u16-normalize.c:u32_uctomb
Unexecuted instantiation: u16-to-u8.c:u32_uctomb
Unexecuted instantiation: u16-uctomb-aux.c:u32_uctomb
Unexecuted instantiation: u32-normalize.c:u32_uctomb
Unexecuted instantiation: u32-to-u8.c:u32_uctomb
Unexecuted instantiation: u8-check.c:u32_uctomb
Unexecuted instantiation: u8-to-u16.c:u32_uctomb
Unexecuted instantiation: u8-to-u32.c:u32_uctomb
Unexecuted instantiation: u8-uctomb-aux.c:u32_uctomb
Unexecuted instantiation: u16-cpy.c:u32_uctomb
Unexecuted instantiation: u16-mbtouc-unsafe-aux.c:u32_uctomb
Unexecuted instantiation: u16-mbtoucr.c:u32_uctomb
Unexecuted instantiation: u32-cpy.c:u32_uctomb
Unexecuted instantiation: u8-mbtoucr.c:u32_uctomb
372
# endif
373
#endif
374
375
/* Copy N units from SRC to DEST.  */
376
/* Similar to memcpy().  */
377
extern uint8_t *
378
       u8_cpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
379
extern uint16_t *
380
       u16_cpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
381
extern uint32_t *
382
       u32_cpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
383
384
/* Copy N units from SRC to DEST, guaranteeing correct behavior for
385
   overlapping memory areas.  */
386
/* Similar to memmove().  */
387
extern uint8_t *
388
       u8_move (uint8_t *dest, const uint8_t *src, size_t n);
389
extern uint16_t *
390
       u16_move (uint16_t *dest, const uint16_t *src, size_t n);
391
extern uint32_t *
392
       u32_move (uint32_t *dest, const uint32_t *src, size_t n);
393
394
/* Set the first N characters of S to UC.  UC should be a character that
395
   occupies only 1 unit.  */
396
/* Similar to memset().  */
397
extern uint8_t *
398
       u8_set (uint8_t *s, ucs4_t uc, size_t n);
399
extern uint16_t *
400
       u16_set (uint16_t *s, ucs4_t uc, size_t n);
401
extern uint32_t *
402
       u32_set (uint32_t *s, ucs4_t uc, size_t n);
403
404
/* Compare S1 and S2, each of length N.  */
405
/* Similar to memcmp().  */
406
extern int
407
       u8_cmp (const uint8_t *s1, const uint8_t *s2, size_t n)
408
       _UC_ATTRIBUTE_PURE;
409
extern int
410
       u16_cmp (const uint16_t *s1, const uint16_t *s2, size_t n)
411
       _UC_ATTRIBUTE_PURE;
412
extern int
413
       u32_cmp (const uint32_t *s1, const uint32_t *s2, size_t n)
414
       _UC_ATTRIBUTE_PURE;
415
416
/* Compare S1 and S2.  */
417
/* Similar to the gnulib function memcmp2().  */
418
extern int
419
       u8_cmp2 (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2)
420
       _UC_ATTRIBUTE_PURE;
421
extern int
422
       u16_cmp2 (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2)
423
       _UC_ATTRIBUTE_PURE;
424
extern int
425
       u32_cmp2 (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2)
426
       _UC_ATTRIBUTE_PURE;
427
428
/* Search the string at S for UC.  */
429
/* Similar to memchr().  */
430
extern uint8_t *
431
       u8_chr (const uint8_t *s, size_t n, ucs4_t uc)
432
       _UC_ATTRIBUTE_PURE;
433
extern uint16_t *
434
       u16_chr (const uint16_t *s, size_t n, ucs4_t uc)
435
       _UC_ATTRIBUTE_PURE;
436
extern uint32_t *
437
       u32_chr (const uint32_t *s, size_t n, ucs4_t uc)
438
       _UC_ATTRIBUTE_PURE;
439
440
/* Count the number of Unicode characters in the N units from S.  */
441
/* Similar to mbsnlen().  */
442
extern size_t
443
       u8_mbsnlen (const uint8_t *s, size_t n)
444
       _UC_ATTRIBUTE_PURE;
445
extern size_t
446
       u16_mbsnlen (const uint16_t *s, size_t n)
447
       _UC_ATTRIBUTE_PURE;
448
extern size_t
449
       u32_mbsnlen (const uint32_t *s, size_t n)
450
       _UC_ATTRIBUTE_PURE;
451
452
/* Elementary string functions with memory allocation.  */
453
454
/* Make a freshly allocated copy of S, of length N.  */
455
extern uint8_t *
456
       u8_cpy_alloc (const uint8_t *s, size_t n);
457
extern uint16_t *
458
       u16_cpy_alloc (const uint16_t *s, size_t n);
459
extern uint32_t *
460
       u32_cpy_alloc (const uint32_t *s, size_t n);
461
462
/* Elementary string functions on NUL terminated strings.  */
463
464
/* Return the length (number of units) of the first character in S.
465
   Return 0 if it is the NUL character.  Return -1 upon failure.  */
466
extern int
467
       u8_strmblen (const uint8_t *s)
468
       _UC_ATTRIBUTE_PURE;
469
extern int
470
       u16_strmblen (const uint16_t *s)
471
       _UC_ATTRIBUTE_PURE;
472
extern int
473
       u32_strmblen (const uint32_t *s)
474
       _UC_ATTRIBUTE_PURE;
475
476
/* Return the length (number of units) of the first character in S, putting
477
   its 'ucs4_t' representation in *PUC.  Return 0 if it is the NUL
478
   character.  Return -1 upon failure.  */
479
extern int
480
       u8_strmbtouc (ucs4_t *puc, const uint8_t *s);
481
extern int
482
       u16_strmbtouc (ucs4_t *puc, const uint16_t *s);
483
extern int
484
       u32_strmbtouc (ucs4_t *puc, const uint32_t *s);
485
486
/* Forward iteration step.  Advances the pointer past the next character,
487
   or returns NULL if the end of the string has been reached.  Puts the
488
   character's 'ucs4_t' representation in *PUC.  */
489
extern const uint8_t *
490
       u8_next (ucs4_t *puc, const uint8_t *s);
491
extern const uint16_t *
492
       u16_next (ucs4_t *puc, const uint16_t *s);
493
extern const uint32_t *
494
       u32_next (ucs4_t *puc, const uint32_t *s);
495
496
/* Backward iteration step.  Advances the pointer to point to the previous
497
   character, or returns NULL if the beginning of the string had been reached.
498
   Puts the character's 'ucs4_t' representation in *PUC.  */
499
extern const uint8_t *
500
       u8_prev (ucs4_t *puc, const uint8_t *s, const uint8_t *start);
501
extern const uint16_t *
502
       u16_prev (ucs4_t *puc, const uint16_t *s, const uint16_t *start);
503
extern const uint32_t *
504
       u32_prev (ucs4_t *puc, const uint32_t *s, const uint32_t *start);
505
506
/* Return the number of units in S.  */
507
/* Similar to strlen(), wcslen().  */
508
extern size_t
509
       u8_strlen (const uint8_t *s)
510
       _UC_ATTRIBUTE_PURE;
511
extern size_t
512
       u16_strlen (const uint16_t *s)
513
       _UC_ATTRIBUTE_PURE;
514
extern size_t
515
       u32_strlen (const uint32_t *s)
516
       _UC_ATTRIBUTE_PURE;
517
518
/* Return the number of units in S, but at most MAXLEN.  */
519
/* Similar to strnlen(), wcsnlen().  */
520
extern size_t
521
       u8_strnlen (const uint8_t *s, size_t maxlen)
522
       _UC_ATTRIBUTE_PURE;
523
extern size_t
524
       u16_strnlen (const uint16_t *s, size_t maxlen)
525
       _UC_ATTRIBUTE_PURE;
526
extern size_t
527
       u32_strnlen (const uint32_t *s, size_t maxlen)
528
       _UC_ATTRIBUTE_PURE;
529
530
/* Copy SRC to DEST.  */
531
/* Similar to strcpy(), wcscpy().  */
532
extern uint8_t *
533
       u8_strcpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src);
534
extern uint16_t *
535
       u16_strcpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src);
536
extern uint32_t *
537
       u32_strcpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src);
538
539
/* Copy SRC to DEST, returning the address of the terminating NUL in DEST.  */
540
/* Similar to stpcpy().  */
541
extern uint8_t *
542
       u8_stpcpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src);
543
extern uint16_t *
544
       u16_stpcpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src);
545
extern uint32_t *
546
       u32_stpcpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src);
547
548
/* Copy no more than N units of SRC to DEST.  */
549
/* Similar to strncpy(), wcsncpy().  */
550
extern uint8_t *
551
       u8_strncpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
552
extern uint16_t *
553
       u16_strncpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
554
extern uint32_t *
555
       u32_strncpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
556
557
/* Copy no more than N units of SRC to DEST.  Return a pointer past the last
558
   non-NUL unit written into DEST.  */
559
/* Similar to stpncpy().  */
560
extern uint8_t *
561
       u8_stpncpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
562
extern uint16_t *
563
       u16_stpncpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
564
extern uint32_t *
565
       u32_stpncpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
566
567
/* Append SRC onto DEST.  */
568
/* Similar to strcat(), wcscat().  */
569
extern uint8_t *
570
       u8_strcat (uint8_t *_UC_RESTRICT dest, const uint8_t *src);
571
extern uint16_t *
572
       u16_strcat (uint16_t *_UC_RESTRICT dest, const uint16_t *src);
573
extern uint32_t *
574
       u32_strcat (uint32_t *_UC_RESTRICT dest, const uint32_t *src);
575
576
/* Append no more than N units of SRC onto DEST.  */
577
/* Similar to strncat(), wcsncat().  */
578
extern uint8_t *
579
       u8_strncat (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
580
extern uint16_t *
581
       u16_strncat (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
582
extern uint32_t *
583
       u32_strncat (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
584
585
/* Compare S1 and S2.  */
586
/* Similar to strcmp(), wcscmp().  */
587
#ifdef __sun
588
/* Avoid a collision with the u8_strcmp() function in Solaris 11 libc.  */
589
extern int
590
       u8_strcmp_gnu (const uint8_t *s1, const uint8_t *s2)
591
       _UC_ATTRIBUTE_PURE;
592
# define u8_strcmp u8_strcmp_gnu
593
#else
594
extern int
595
       u8_strcmp (const uint8_t *s1, const uint8_t *s2)
596
       _UC_ATTRIBUTE_PURE;
597
#endif
598
extern int
599
       u16_strcmp (const uint16_t *s1, const uint16_t *s2)
600
       _UC_ATTRIBUTE_PURE;
601
extern int
602
       u32_strcmp (const uint32_t *s1, const uint32_t *s2)
603
       _UC_ATTRIBUTE_PURE;
604
605
/* Compare S1 and S2 using the collation rules of the current locale.
606
   Return -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2.
607
   Upon failure, set errno and return any value.  */
608
/* Similar to strcoll(), wcscoll().  */
609
extern int
610
       u8_strcoll (const uint8_t *s1, const uint8_t *s2);
611
extern int
612
       u16_strcoll (const uint16_t *s1, const uint16_t *s2);
613
extern int
614
       u32_strcoll (const uint32_t *s1, const uint32_t *s2);
615
616
/* Compare no more than N units of S1 and S2.  */
617
/* Similar to strncmp(), wcsncmp().  */
618
extern int
619
       u8_strncmp (const uint8_t *s1, const uint8_t *s2, size_t n)
620
       _UC_ATTRIBUTE_PURE;
621
extern int
622
       u16_strncmp (const uint16_t *s1, const uint16_t *s2, size_t n)
623
       _UC_ATTRIBUTE_PURE;
624
extern int
625
       u32_strncmp (const uint32_t *s1, const uint32_t *s2, size_t n)
626
       _UC_ATTRIBUTE_PURE;
627
628
/* Duplicate S, returning an identical malloc'd string.  */
629
/* Similar to strdup(), wcsdup().  */
630
extern uint8_t *
631
       u8_strdup (const uint8_t *s)
632
       _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
633
extern uint16_t *
634
       u16_strdup (const uint16_t *s)
635
       _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
636
extern uint32_t *
637
       u32_strdup (const uint32_t *s)
638
       _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
639
640
/* Find the first occurrence of UC in STR.  */
641
/* Similar to strchr(), wcschr().  */
642
extern uint8_t *
643
       u8_strchr (const uint8_t *str, ucs4_t uc)
644
       _UC_ATTRIBUTE_PURE;
645
extern uint16_t *
646
       u16_strchr (const uint16_t *str, ucs4_t uc)
647
       _UC_ATTRIBUTE_PURE;
648
extern uint32_t *
649
       u32_strchr (const uint32_t *str, ucs4_t uc)
650
       _UC_ATTRIBUTE_PURE;
651
652
/* Find the last occurrence of UC in STR.  */
653
/* Similar to strrchr(), wcsrchr().  */
654
extern uint8_t *
655
       u8_strrchr (const uint8_t *str, ucs4_t uc)
656
       _UC_ATTRIBUTE_PURE;
657
extern uint16_t *
658
       u16_strrchr (const uint16_t *str, ucs4_t uc)
659
       _UC_ATTRIBUTE_PURE;
660
extern uint32_t *
661
       u32_strrchr (const uint32_t *str, ucs4_t uc)
662
       _UC_ATTRIBUTE_PURE;
663
664
/* Return the length of the initial segment of STR which consists entirely
665
   of Unicode characters not in REJECT.  */
666
/* Similar to strcspn(), wcscspn().  */
667
extern size_t
668
       u8_strcspn (const uint8_t *str, const uint8_t *reject)
669
       _UC_ATTRIBUTE_PURE;
670
extern size_t
671
       u16_strcspn (const uint16_t *str, const uint16_t *reject)
672
       _UC_ATTRIBUTE_PURE;
673
extern size_t
674
       u32_strcspn (const uint32_t *str, const uint32_t *reject)
675
       _UC_ATTRIBUTE_PURE;
676
677
/* Return the length of the initial segment of STR which consists entirely
678
   of Unicode characters in ACCEPT.  */
679
/* Similar to strspn(), wcsspn().  */
680
extern size_t
681
       u8_strspn (const uint8_t *str, const uint8_t *accept)
682
       _UC_ATTRIBUTE_PURE;
683
extern size_t
684
       u16_strspn (const uint16_t *str, const uint16_t *accept)
685
       _UC_ATTRIBUTE_PURE;
686
extern size_t
687
       u32_strspn (const uint32_t *str, const uint32_t *accept)
688
       _UC_ATTRIBUTE_PURE;
689
690
/* Find the first occurrence in STR of any character in ACCEPT.  */
691
/* Similar to strpbrk(), wcspbrk().  */
692
extern uint8_t *
693
       u8_strpbrk (const uint8_t *str, const uint8_t *accept)
694
       _UC_ATTRIBUTE_PURE;
695
extern uint16_t *
696
       u16_strpbrk (const uint16_t *str, const uint16_t *accept)
697
       _UC_ATTRIBUTE_PURE;
698
extern uint32_t *
699
       u32_strpbrk (const uint32_t *str, const uint32_t *accept)
700
       _UC_ATTRIBUTE_PURE;
701
702
/* Find the first occurrence of NEEDLE in HAYSTACK.  */
703
/* Similar to strstr(), wcsstr().  */
704
extern uint8_t *
705
       u8_strstr (const uint8_t *haystack, const uint8_t *needle)
706
       _UC_ATTRIBUTE_PURE;
707
extern uint16_t *
708
       u16_strstr (const uint16_t *haystack, const uint16_t *needle)
709
       _UC_ATTRIBUTE_PURE;
710
extern uint32_t *
711
       u32_strstr (const uint32_t *haystack, const uint32_t *needle)
712
       _UC_ATTRIBUTE_PURE;
713
714
/* Test whether STR starts with PREFIX.  */
715
extern bool
716
       u8_startswith (const uint8_t *str, const uint8_t *prefix)
717
       _UC_ATTRIBUTE_PURE;
718
extern bool
719
       u16_startswith (const uint16_t *str, const uint16_t *prefix)
720
       _UC_ATTRIBUTE_PURE;
721
extern bool
722
       u32_startswith (const uint32_t *str, const uint32_t *prefix)
723
       _UC_ATTRIBUTE_PURE;
724
725
/* Test whether STR ends with SUFFIX.  */
726
extern bool
727
       u8_endswith (const uint8_t *str, const uint8_t *suffix)
728
       _UC_ATTRIBUTE_PURE;
729
extern bool
730
       u16_endswith (const uint16_t *str, const uint16_t *suffix)
731
       _UC_ATTRIBUTE_PURE;
732
extern bool
733
       u32_endswith (const uint32_t *str, const uint32_t *suffix)
734
       _UC_ATTRIBUTE_PURE;
735
736
/* Divide STR into tokens separated by characters in DELIM.
737
   This interface is actually more similar to wcstok than to strtok.  */
738
/* Similar to strtok_r(), wcstok().  */
739
extern uint8_t *
740
       u8_strtok (uint8_t *_UC_RESTRICT str, const uint8_t *delim,
741
                  uint8_t **ptr);
742
extern uint16_t *
743
       u16_strtok (uint16_t *_UC_RESTRICT str, const uint16_t *delim,
744
                   uint16_t **ptr);
745
extern uint32_t *
746
       u32_strtok (uint32_t *_UC_RESTRICT str, const uint32_t *delim,
747
                   uint32_t **ptr);
748
749
750
#ifdef __cplusplus
751
}
752
#endif
753
754
#endif /* _UNISTR_H */