gnunet-android

GNUnet for Android
Log | Files | Refs | README

unistr.h (23820B)


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