LCOV - GNU Libidn - lib/gl/unistr.h

LCOV - code coverage report
Current view: top level - lib/gl - unistr.h (source / functions) Hit Total Coverage
Test: GNU Libidn Lines: 5 5 100.0 %
Date: 2020年07月22日 17:53:13 Functions: 1 1 100.0 %
Legend: Lines: hit not hit

 Line data Source code
 1  : /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
 2  : /* Elementary Unicode string functions.
 3  : Copyright (C) 2001-2002, 2005-2020 Free Software Foundation, Inc.
 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 2.1 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 <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 "unused-parameter.h"
 25  : 
 26  : /* Get bool. */
 27  : #include <stdbool.h>
 28  : 
 29  : /* Get size_t. */
 30  : #include <stddef.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  : {
 154  : uint8_t c = *s;
 155  : 
 156  : if (c < 0x80)
 157  : {
 158  : *puc = c;
 159  : return 1;
 160  : }
 161  : else
 162  : return u8_mbtouc_unsafe_aux (puc, s, n);
 163  : }
 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  : {
 177  : uint16_t c = *s;
 178  : 
 179  : if (c < 0xd800 || c >= 0xe000)
 180  : {
 181  : *puc = c;
 182  : return 1;
 183  : }
 184  : else
 185  : return u16_mbtouc_unsafe_aux (puc, s, n);
 186  : }
 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, size_t n _GL_UNUSED_PARAMETER)
 198  : {
 199  : uint32_t c = *s;
 200  : 
 201  : if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
 202  : *puc = c;
 203  : else
 204  : /* invalid multibyte character */
 205  : *puc = 0xfffd;
 206  : return 1;
 207  : }
 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, size_t n _GL_UNUSED_PARAMETER)
 264  : {
 265  : uint32_t c = *s;
 266  : 
 267  : if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
 268  : *puc = c;
 269  : else
 270  : /* invalid multibyte character */
 271  : *puc = 0xfffd;
 272  : return 1;
 273  : }
 274  : # endif
 275  : #endif
 276  : 
 277  : /* Return the length (number of units) of the first character in S, putting
 278  : its 'ucs4_t' representation in *PUC. Upon failure, *PUC is set to 0xfffd,
 279  : and -1 is returned for an invalid sequence of units, -2 is returned for an
 280  : incomplete sequence of units.
 281  : The number of available units, N, must be > 0. */
 282  : /* Similar to u*_mbtouc(), except that the return value gives more details
 283  : about the failure, similar to mbrtowc(). */
 284  : 
 285  : #if GNULIB_UNISTR_U8_MBTOUCR || HAVE_LIBUNISTRING
 286  : extern int
 287  : u8_mbtoucr (ucs4_t *puc, const uint8_t *s, size_t n);
 288  : #endif
 289  : 
 290  : #if GNULIB_UNISTR_U16_MBTOUCR || HAVE_LIBUNISTRING
 291  : extern int
 292  : u16_mbtoucr (ucs4_t *puc, const uint16_t *s, size_t n);
 293  : #endif
 294  : 
 295  : #if GNULIB_UNISTR_U32_MBTOUCR || HAVE_LIBUNISTRING
 296  : extern int
 297  : u32_mbtoucr (ucs4_t *puc, const uint32_t *s, size_t n);
 298  : #endif
 299  : 
 300  : /* Put the multibyte character represented by UC in S, returning its
 301  : length. Return -1 upon failure, -2 if the number of available units, N,
 302  : is too small. The latter case cannot occur if N >= 6/2/1, respectively. */
 303  : /* Similar to wctomb(), except that s must not be NULL, and the argument n
 304  : must be specified. */
 305  : 
 306  : #if GNULIB_UNISTR_U8_UCTOMB || HAVE_LIBUNISTRING
 307  : /* Auxiliary function, also used by u8_chr, u8_strchr, u8_strrchr. */
 308  : extern int
 309  : u8_uctomb_aux (uint8_t *s, ucs4_t uc, int n);
 310  : # if !HAVE_INLINE
 311  : extern int
 312  : u8_uctomb (uint8_t *s, ucs4_t uc, int n);
 313  : # else
 314  : static inline int
 315  293 : u8_uctomb (uint8_t *s, ucs4_t uc, int n)
 316  : {
 317  293 : if (uc < 0x80 && n > 0)
 318  : {
 319  128 : s[0] = uc;
 320  128 : return 1;
 321  : }
 322  : else
 323  165 : return u8_uctomb_aux (s, uc, n);
 324  : }
 325  : # endif
 326  : #endif
 327  : 
 328  : #if GNULIB_UNISTR_U16_UCTOMB || HAVE_LIBUNISTRING
 329  : /* Auxiliary function, also used by u16_chr, u16_strchr, u16_strrchr. */
 330  : extern int
 331  : u16_uctomb_aux (uint16_t *s, ucs4_t uc, int n);
 332  : # if !HAVE_INLINE
 333  : extern int
 334  : u16_uctomb (uint16_t *s, ucs4_t uc, int n);
 335  : # else
 336  : static inline int
 337  : u16_uctomb (uint16_t *s, ucs4_t uc, int n)
 338  : {
 339  : if (uc < 0xd800 && n > 0)
 340  : {
 341  : s[0] = uc;
 342  : return 1;
 343  : }
 344  : else
 345  : return u16_uctomb_aux (s, uc, n);
 346  : }
 347  : # endif
 348  : #endif
 349  : 
 350  : #if GNULIB_UNISTR_U32_UCTOMB || HAVE_LIBUNISTRING
 351  : # if !HAVE_INLINE
 352  : extern int
 353  : u32_uctomb (uint32_t *s, ucs4_t uc, int n);
 354  : # else
 355  : static inline int
 356  : u32_uctomb (uint32_t *s, ucs4_t uc, int n)
 357  : {
 358  : if (uc < 0xd800 || (uc >= 0xe000 && uc < 0x110000))
 359  : {
 360  : if (n > 0)
 361  : {
 362  : *s = uc;
 363  : return 1;
 364  : }
 365  : else
 366  : return -2;
 367  : }
 368  : else
 369  : return -1;
 370  : }
 371  : # endif
 372  : #endif
 373  : 
 374  : /* Copy N units from SRC to DEST. */
 375  : /* Similar to memcpy(). */
 376  : extern uint8_t *
 377  : u8_cpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
 378  : extern uint16_t *
 379  : u16_cpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
 380  : extern uint32_t *
 381  : u32_cpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
 382  : 
 383  : /* Copy N units from SRC to DEST, guaranteeing correct behavior for
 384  : overlapping memory areas. */
 385  : /* Similar to memmove(). */
 386  : extern uint8_t *
 387  : u8_move (uint8_t *dest, const uint8_t *src, size_t n);
 388  : extern uint16_t *
 389  : u16_move (uint16_t *dest, const uint16_t *src, size_t n);
 390  : extern uint32_t *
 391  : u32_move (uint32_t *dest, const uint32_t *src, size_t n);
 392  : 
 393  : /* Set the first N characters of S to UC. UC should be a character that
 394  : occupies only 1 unit. */
 395  : /* Similar to memset(). */
 396  : extern uint8_t *
 397  : u8_set (uint8_t *s, ucs4_t uc, size_t n);
 398  : extern uint16_t *
 399  : u16_set (uint16_t *s, ucs4_t uc, size_t n);
 400  : extern uint32_t *
 401  : u32_set (uint32_t *s, ucs4_t uc, size_t n);
 402  : 
 403  : /* Compare S1 and S2, each of length N. */
 404  : /* Similar to memcmp(). */
 405  : extern int
 406  : u8_cmp (const uint8_t *s1, const uint8_t *s2, size_t n)
 407  : _UC_ATTRIBUTE_PURE;
 408  : extern int
 409  : u16_cmp (const uint16_t *s1, const uint16_t *s2, size_t n)
 410  : _UC_ATTRIBUTE_PURE;
 411  : extern int
 412  : u32_cmp (const uint32_t *s1, const uint32_t *s2, size_t n)
 413  : _UC_ATTRIBUTE_PURE;
 414  : 
 415  : /* Compare S1 and S2. */
 416  : /* Similar to the gnulib function memcmp2(). */
 417  : extern int
 418  : u8_cmp2 (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2)
 419  : _UC_ATTRIBUTE_PURE;
 420  : extern int
 421  : u16_cmp2 (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2)
 422  : _UC_ATTRIBUTE_PURE;
 423  : extern int
 424  : u32_cmp2 (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2)
 425  : _UC_ATTRIBUTE_PURE;
 426  : 
 427  : /* Search the string at S for UC. */
 428  : /* Similar to memchr(). */
 429  : extern uint8_t *
 430  : u8_chr (const uint8_t *s, size_t n, ucs4_t uc)
 431  : _UC_ATTRIBUTE_PURE;
 432  : extern uint16_t *
 433  : u16_chr (const uint16_t *s, size_t n, ucs4_t uc)
 434  : _UC_ATTRIBUTE_PURE;
 435  : extern uint32_t *
 436  : u32_chr (const uint32_t *s, size_t n, ucs4_t uc)
 437  : _UC_ATTRIBUTE_PURE;
 438  : 
 439  : /* Count the number of Unicode characters in the N units from S. */
 440  : /* Similar to mbsnlen(). */
 441  : extern size_t
 442  : u8_mbsnlen (const uint8_t *s, size_t n)
 443  : _UC_ATTRIBUTE_PURE;
 444  : extern size_t
 445  : u16_mbsnlen (const uint16_t *s, size_t n)
 446  : _UC_ATTRIBUTE_PURE;
 447  : extern size_t
 448  : u32_mbsnlen (const uint32_t *s, size_t n)
 449  : _UC_ATTRIBUTE_PURE;
 450  : 
 451  : /* Elementary string functions with memory allocation. */
 452  : 
 453  : /* Make a freshly allocated copy of S, of length N. */
 454  : extern uint8_t *
 455  : u8_cpy_alloc (const uint8_t *s, size_t n);
 456  : extern uint16_t *
 457  : u16_cpy_alloc (const uint16_t *s, size_t n);
 458  : extern uint32_t *
 459  : u32_cpy_alloc (const uint32_t *s, size_t n);
 460  : 
 461  : /* Elementary string functions on NUL terminated strings. */
 462  : 
 463  : /* Return the length (number of units) of the first character in S.
 464  : Return 0 if it is the NUL character. Return -1 upon failure. */
 465  : extern int
 466  : u8_strmblen (const uint8_t *s)
 467  : _UC_ATTRIBUTE_PURE;
 468  : extern int
 469  : u16_strmblen (const uint16_t *s)
 470  : _UC_ATTRIBUTE_PURE;
 471  : extern int
 472  : u32_strmblen (const uint32_t *s)
 473  : _UC_ATTRIBUTE_PURE;
 474  : 
 475  : /* Return the length (number of units) of the first character in S, putting
 476  : its 'ucs4_t' representation in *PUC. Return 0 if it is the NUL
 477  : character. Return -1 upon failure. */
 478  : extern int
 479  : u8_strmbtouc (ucs4_t *puc, const uint8_t *s);
 480  : extern int
 481  : u16_strmbtouc (ucs4_t *puc, const uint16_t *s);
 482  : extern int
 483  : u32_strmbtouc (ucs4_t *puc, const uint32_t *s);
 484  : 
 485  : /* Forward iteration step. Advances the pointer past the next character,
 486  : or returns NULL if the end of the string has been reached. Puts the
 487  : character's 'ucs4_t' representation in *PUC. */
 488  : extern const uint8_t *
 489  : u8_next (ucs4_t *puc, const uint8_t *s);
 490  : extern const uint16_t *
 491  : u16_next (ucs4_t *puc, const uint16_t *s);
 492  : extern const uint32_t *
 493  : u32_next (ucs4_t *puc, const uint32_t *s);
 494  : 
 495  : /* Backward iteration step. Advances the pointer to point to the previous
 496  : character, or returns NULL if the beginning of the string had been reached.
 497  : Puts the character's 'ucs4_t' representation in *PUC. */
 498  : extern const uint8_t *
 499  : u8_prev (ucs4_t *puc, const uint8_t *s, const uint8_t *start);
 500  : extern const uint16_t *
 501  : u16_prev (ucs4_t *puc, const uint16_t *s, const uint16_t *start);
 502  : extern const uint32_t *
 503  : u32_prev (ucs4_t *puc, const uint32_t *s, const uint32_t *start);
 504  : 
 505  : /* Return the number of units in S. */
 506  : /* Similar to strlen(), wcslen(). */
 507  : extern size_t
 508  : u8_strlen (const uint8_t *s)
 509  : _UC_ATTRIBUTE_PURE;
 510  : extern size_t
 511  : u16_strlen (const uint16_t *s)
 512  : _UC_ATTRIBUTE_PURE;
 513  : extern size_t
 514  : u32_strlen (const uint32_t *s)
 515  : _UC_ATTRIBUTE_PURE;
 516  : 
 517  : /* Return the number of units in S, but at most MAXLEN. */
 518  : /* Similar to strnlen(), wcsnlen(). */
 519  : extern size_t
 520  : u8_strnlen (const uint8_t *s, size_t maxlen)
 521  : _UC_ATTRIBUTE_PURE;
 522  : extern size_t
 523  : u16_strnlen (const uint16_t *s, size_t maxlen)
 524  : _UC_ATTRIBUTE_PURE;
 525  : extern size_t
 526  : u32_strnlen (const uint32_t *s, size_t maxlen)
 527  : _UC_ATTRIBUTE_PURE;
 528  : 
 529  : /* Copy SRC to DEST. */
 530  : /* Similar to strcpy(), wcscpy(). */
 531  : extern uint8_t *
 532  : u8_strcpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src);
 533  : extern uint16_t *
 534  : u16_strcpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src);
 535  : extern uint32_t *
 536  : u32_strcpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src);
 537  : 
 538  : /* Copy SRC to DEST, returning the address of the terminating NUL in DEST. */
 539  : /* Similar to stpcpy(). */
 540  : extern uint8_t *
 541  : u8_stpcpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src);
 542  : extern uint16_t *
 543  : u16_stpcpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src);
 544  : extern uint32_t *
 545  : u32_stpcpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src);
 546  : 
 547  : /* Copy no more than N units of SRC to DEST. */
 548  : /* Similar to strncpy(), wcsncpy(). */
 549  : extern uint8_t *
 550  : u8_strncpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
 551  : extern uint16_t *
 552  : u16_strncpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
 553  : extern uint32_t *
 554  : u32_strncpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
 555  : 
 556  : /* Copy no more than N units of SRC to DEST. Return a pointer past the last
 557  : non-NUL unit written into DEST. */
 558  : /* Similar to stpncpy(). */
 559  : extern uint8_t *
 560  : u8_stpncpy (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
 561  : extern uint16_t *
 562  : u16_stpncpy (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
 563  : extern uint32_t *
 564  : u32_stpncpy (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
 565  : 
 566  : /* Append SRC onto DEST. */
 567  : /* Similar to strcat(), wcscat(). */
 568  : extern uint8_t *
 569  : u8_strcat (uint8_t *_UC_RESTRICT dest, const uint8_t *src);
 570  : extern uint16_t *
 571  : u16_strcat (uint16_t *_UC_RESTRICT dest, const uint16_t *src);
 572  : extern uint32_t *
 573  : u32_strcat (uint32_t *_UC_RESTRICT dest, const uint32_t *src);
 574  : 
 575  : /* Append no more than N units of SRC onto DEST. */
 576  : /* Similar to strncat(), wcsncat(). */
 577  : extern uint8_t *
 578  : u8_strncat (uint8_t *_UC_RESTRICT dest, const uint8_t *src, size_t n);
 579  : extern uint16_t *
 580  : u16_strncat (uint16_t *_UC_RESTRICT dest, const uint16_t *src, size_t n);
 581  : extern uint32_t *
 582  : u32_strncat (uint32_t *_UC_RESTRICT dest, const uint32_t *src, size_t n);
 583  : 
 584  : /* Compare S1 and S2. */
 585  : /* Similar to strcmp(), wcscmp(). */
 586  : #ifdef __sun
 587  : /* Avoid a collision with the u8_strcmp() function in Solaris 11 libc. */
 588  : extern int
 589  : u8_strcmp_gnu (const uint8_t *s1, const uint8_t *s2)
 590  : _UC_ATTRIBUTE_PURE;
 591  : # define u8_strcmp u8_strcmp_gnu
 592  : #else
 593  : extern int
 594  : u8_strcmp (const uint8_t *s1, const uint8_t *s2)
 595  : _UC_ATTRIBUTE_PURE;
 596  : #endif
 597  : extern int
 598  : u16_strcmp (const uint16_t *s1, const uint16_t *s2)
 599  : _UC_ATTRIBUTE_PURE;
 600  : extern int
 601  : u32_strcmp (const uint32_t *s1, const uint32_t *s2)
 602  : _UC_ATTRIBUTE_PURE;
 603  : 
 604  : /* Compare S1 and S2 using the collation rules of the current locale.
 605  : Return -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2.
 606  : Upon failure, set errno and return any value. */
 607  : /* Similar to strcoll(), wcscoll(). */
 608  : extern int
 609  : u8_strcoll (const uint8_t *s1, const uint8_t *s2);
 610  : extern int
 611  : u16_strcoll (const uint16_t *s1, const uint16_t *s2);
 612  : extern int
 613  : u32_strcoll (const uint32_t *s1, const uint32_t *s2);
 614  : 
 615  : /* Compare no more than N units of S1 and S2. */
 616  : /* Similar to strncmp(), wcsncmp(). */
 617  : extern int
 618  : u8_strncmp (const uint8_t *s1, const uint8_t *s2, size_t n)
 619  : _UC_ATTRIBUTE_PURE;
 620  : extern int
 621  : u16_strncmp (const uint16_t *s1, const uint16_t *s2, size_t n)
 622  : _UC_ATTRIBUTE_PURE;
 623  : extern int
 624  : u32_strncmp (const uint32_t *s1, const uint32_t *s2, size_t n)
 625  : _UC_ATTRIBUTE_PURE;
 626  : 
 627  : /* Duplicate S, returning an identical malloc'd string. */
 628  : /* Similar to strdup(), wcsdup(). */
 629  : extern uint8_t *
 630  : u8_strdup (const uint8_t *s);
 631  : extern uint16_t *
 632  : u16_strdup (const uint16_t *s);
 633  : extern uint32_t *
 634  : u32_strdup (const uint32_t *s);
 635  : 
 636  : /* Find the first occurrence of UC in STR. */
 637  : /* Similar to strchr(), wcschr(). */
 638  : extern uint8_t *
 639  : u8_strchr (const uint8_t *str, ucs4_t uc)
 640  : _UC_ATTRIBUTE_PURE;
 641  : extern uint16_t *
 642  : u16_strchr (const uint16_t *str, ucs4_t uc)
 643  : _UC_ATTRIBUTE_PURE;
 644  : extern uint32_t *
 645  : u32_strchr (const uint32_t *str, ucs4_t uc)
 646  : _UC_ATTRIBUTE_PURE;
 647  : 
 648  : /* Find the last occurrence of UC in STR. */
 649  : /* Similar to strrchr(), wcsrchr(). */
 650  : extern uint8_t *
 651  : u8_strrchr (const uint8_t *str, ucs4_t uc)
 652  : _UC_ATTRIBUTE_PURE;
 653  : extern uint16_t *
 654  : u16_strrchr (const uint16_t *str, ucs4_t uc)
 655  : _UC_ATTRIBUTE_PURE;
 656  : extern uint32_t *
 657  : u32_strrchr (const uint32_t *str, ucs4_t uc)
 658  : _UC_ATTRIBUTE_PURE;
 659  : 
 660  : /* Return the length of the initial segment of STR which consists entirely
 661  : of Unicode characters not in REJECT. */
 662  : /* Similar to strcspn(), wcscspn(). */
 663  : extern size_t
 664  : u8_strcspn (const uint8_t *str, const uint8_t *reject)
 665  : _UC_ATTRIBUTE_PURE;
 666  : extern size_t
 667  : u16_strcspn (const uint16_t *str, const uint16_t *reject)
 668  : _UC_ATTRIBUTE_PURE;
 669  : extern size_t
 670  : u32_strcspn (const uint32_t *str, const uint32_t *reject)
 671  : _UC_ATTRIBUTE_PURE;
 672  : 
 673  : /* Return the length of the initial segment of STR which consists entirely
 674  : of Unicode characters in ACCEPT. */
 675  : /* Similar to strspn(), wcsspn(). */
 676  : extern size_t
 677  : u8_strspn (const uint8_t *str, const uint8_t *accept)
 678  : _UC_ATTRIBUTE_PURE;
 679  : extern size_t
 680  : u16_strspn (const uint16_t *str, const uint16_t *accept)
 681  : _UC_ATTRIBUTE_PURE;
 682  : extern size_t
 683  : u32_strspn (const uint32_t *str, const uint32_t *accept)
 684  : _UC_ATTRIBUTE_PURE;
 685  : 
 686  : /* Find the first occurrence in STR of any character in ACCEPT. */
 687  : /* Similar to strpbrk(), wcspbrk(). */
 688  : extern uint8_t *
 689  : u8_strpbrk (const uint8_t *str, const uint8_t *accept)
 690  : _UC_ATTRIBUTE_PURE;
 691  : extern uint16_t *
 692  : u16_strpbrk (const uint16_t *str, const uint16_t *accept)
 693  : _UC_ATTRIBUTE_PURE;
 694  : extern uint32_t *
 695  : u32_strpbrk (const uint32_t *str, const uint32_t *accept)
 696  : _UC_ATTRIBUTE_PURE;
 697  : 
 698  : /* Find the first occurrence of NEEDLE in HAYSTACK. */
 699  : /* Similar to strstr(), wcsstr(). */
 700  : extern uint8_t *
 701  : u8_strstr (const uint8_t *haystack, const uint8_t *needle)
 702  : _UC_ATTRIBUTE_PURE;
 703  : extern uint16_t *
 704  : u16_strstr (const uint16_t *haystack, const uint16_t *needle)
 705  : _UC_ATTRIBUTE_PURE;
 706  : extern uint32_t *
 707  : u32_strstr (const uint32_t *haystack, const uint32_t *needle)
 708  : _UC_ATTRIBUTE_PURE;
 709  : 
 710  : /* Test whether STR starts with PREFIX. */
 711  : extern bool
 712  : u8_startswith (const uint8_t *str, const uint8_t *prefix)
 713  : _UC_ATTRIBUTE_PURE;
 714  : extern bool
 715  : u16_startswith (const uint16_t *str, const uint16_t *prefix)
 716  : _UC_ATTRIBUTE_PURE;
 717  : extern bool
 718  : u32_startswith (const uint32_t *str, const uint32_t *prefix)
 719  : _UC_ATTRIBUTE_PURE;
 720  : 
 721  : /* Test whether STR ends with SUFFIX. */
 722  : extern bool
 723  : u8_endswith (const uint8_t *str, const uint8_t *suffix)
 724  : _UC_ATTRIBUTE_PURE;
 725  : extern bool
 726  : u16_endswith (const uint16_t *str, const uint16_t *suffix)
 727  : _UC_ATTRIBUTE_PURE;
 728  : extern bool
 729  : u32_endswith (const uint32_t *str, const uint32_t *suffix)
 730  : _UC_ATTRIBUTE_PURE;
 731  : 
 732  : /* Divide STR into tokens separated by characters in DELIM.
 733  : This interface is actually more similar to wcstok than to strtok. */
 734  : /* Similar to strtok_r(), wcstok(). */
 735  : extern uint8_t *
 736  : u8_strtok (uint8_t *_UC_RESTRICT str, const uint8_t *delim,
 737  : uint8_t **ptr);
 738  : extern uint16_t *
 739  : u16_strtok (uint16_t *_UC_RESTRICT str, const uint16_t *delim,
 740  : uint16_t **ptr);
 741  : extern uint32_t *
 742  : u32_strtok (uint32_t *_UC_RESTRICT str, const uint32_t *delim,
 743  : uint32_t **ptr);
 744  : 
 745  : 
 746  : #ifdef __cplusplus
 747  : }
 748  : #endif
 749  : 
 750  : #endif /* _UNISTR_H */

Generated by: LCOV version 1.13

AltStyle によって変換されたページ (->オリジナル) /