1 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */ 2 /* Elementary Unicode string functions. 3 Copyright (C) 2001-2002, 2005-2014 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 General Public License as published 7 by the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://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 _safe suffix are safe, even if the library is compiled 142 without --enable-safety. */ 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 CONFIG_UNICODE_SAFETY 202 if (c < 0xd800 || (c >= 0xe000 && c < 0x110000)) 203 # endif 204 *puc = c; 205 # if CONFIG_UNICODE_SAFETY 206 else 207 /* invalid multibyte character */ 208 *puc = 0xfffd; 209 # endif 210 return 1; 211 } 212 # endif 213 #endif 214 215 #if GNULIB_UNISTR_U8_MBTOUC || HAVE_LIBUNISTRING 216 # if !HAVE_INLINE 217 extern int 218 u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n); 219 # else 220 extern int 221 u8_mbtouc_aux (ucs4_t *puc, const uint8_t *s, size_t n); 222 static inline int 223 u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n) 224 { 225 uint8_t c = *s; 226 227 if (c < 0x80) 228 { 229 *puc = c; 230 return 1; 231 } 232 else 233 return u8_mbtouc_aux (puc, s, n); 234 } 235 # endif 236 #endif 237 238 #if GNULIB_UNISTR_U16_MBTOUC || HAVE_LIBUNISTRING 239 # if !HAVE_INLINE 240 extern int 241 u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n); 242 # else 243 extern int 244 u16_mbtouc_aux (ucs4_t *puc, const uint16_t *s, size_t n); 245 static inline int 246 u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n) 247 { 248 uint16_t c = *s; 249 250 if (c < 0xd800 || c >= 0xe000) 251 { 252 *puc = c; 253 return 1; 254 } 255 else 256 return u16_mbtouc_aux (puc, s, n); 257 } 258 # endif 259 #endif 260 261 #if GNULIB_UNISTR_U32_MBTOUC || HAVE_LIBUNISTRING 262 # if !HAVE_INLINE 263 extern int 264 u32_mbtouc (ucs4_t *puc, const uint32_t *s, size_t n); 265 # else 266 static inline int 267 u32_mbtouc (ucs4_t *puc, const uint32_t *s, size_t n _GL_UNUSED_PARAMETER) 268 { 269 uint32_t c = *s; 270 271 if (c < 0xd800 || (c >= 0xe000 && c < 0x110000)) 272 *puc = c; 273 else 274 /* invalid multibyte character */ 275 *puc = 0xfffd; 276 return 1; 277 } 278 # endif 279 #endif 280 281 /* Return the length (number of units) of the first character in S, putting 282 its 'ucs4_t' representation in *PUC. Upon failure, *PUC is set to 0xfffd, 283 and -1 is returned for an invalid sequence of units, -2 is returned for an 284 incomplete sequence of units. 285 The number of available units, N, must be > 0. */ 286 /* Similar to u*_mbtouc(), except that the return value gives more details 287 about the failure, similar to mbrtowc(). */ 288 289 #if GNULIB_UNISTR_U8_MBTOUCR || HAVE_LIBUNISTRING 290 extern int 291 u8_mbtoucr (ucs4_t *puc, const uint8_t *s, size_t n); 292 #endif 293 294 #if GNULIB_UNISTR_U16_MBTOUCR || HAVE_LIBUNISTRING 295 extern int 296 u16_mbtoucr (ucs4_t *puc, const uint16_t *s, size_t n); 297 #endif 298 299 #if GNULIB_UNISTR_U32_MBTOUCR || HAVE_LIBUNISTRING 300 extern int 301 u32_mbtoucr (ucs4_t *puc, const uint32_t *s, size_t n); 302 #endif 303 304 /* Put the multibyte character represented by UC in S, returning its 305 length. Return -1 upon failure, -2 if the number of available units, N, 306 is too small. The latter case cannot occur if N >= 6/2/1, respectively. */ 307 /* Similar to wctomb(), except that s must not be NULL, and the argument n 308 must be specified. */ 309 310 #if GNULIB_UNISTR_U8_UCTOMB || HAVE_LIBUNISTRING 311 /* Auxiliary function, also used by u8_chr, u8_strchr, u8_strrchr. */ 312 extern int 313 u8_uctomb_aux (uint8_t *s, ucs4_t uc, int n); 314 # if !HAVE_INLINE 315 extern int 316 u8_uctomb (uint8_t *s, ucs4_t uc, int n); 317 # else 318 static inline int 319 u8_uctomb (uint8_t *s, ucs4_t uc, int n) 320 { 321 if (uc < 0x80 && n > 0) 322 { 323 s[0] = uc; 324 return 1; 325 } 326 else 327 return u8_uctomb_aux (s, uc, n); 328 } 329 # endif 330 #endif 331 332 #if GNULIB_UNISTR_U16_UCTOMB || HAVE_LIBUNISTRING 333 /* Auxiliary function, also used by u16_chr, u16_strchr, u16_strrchr. */ 334 extern int 335 u16_uctomb_aux (uint16_t *s, ucs4_t uc, int n); 336 # if !HAVE_INLINE 337 extern int 338 u16_uctomb (uint16_t *s, ucs4_t uc, int n); 339 # else 340 static inline int 341 u16_uctomb (uint16_t *s, ucs4_t uc, int n) 342 { 343 if (uc < 0xd800 && n > 0) 344 { 345 s[0] = uc; 346 return 1; 347 } 348 else 349 return u16_uctomb_aux (s, uc, n); 350 } 351 # endif 352 #endif 353 354 #if GNULIB_UNISTR_U32_UCTOMB || HAVE_LIBUNISTRING 355 # if !HAVE_INLINE 356 extern int 357 u32_uctomb (uint32_t *s, ucs4_t uc, int n); 358 # else 359 static inline int 360 u32_uctomb (uint32_t *s, ucs4_t uc, int n) 361 { 362 if (uc < 0xd800 || (uc >= 0xe000 && uc < 0x110000)) 363 { 364 if (n > 0) 365 { 366 *s = uc; 367 return 1; 368 } 369 else 370 return -2; 371 } 372 else 373 return -1; 374 } 375 # endif 376 #endif 377 378 /* Copy N units from SRC to DEST. */ 379 /* Similar to memcpy(). */ 380 extern uint8_t * 381 u8_cpy (uint8_t *dest, const uint8_t *src, size_t n); 382 extern uint16_t * 383 u16_cpy (uint16_t *dest, const uint16_t *src, size_t n); 384 extern uint32_t * 385 u32_cpy (uint32_t *dest, const uint32_t *src, size_t n); 386 387 /* Copy N units from SRC to DEST, guaranteeing correct behavior for 388 overlapping memory areas. */ 389 /* Similar to memmove(). */ 390 extern uint8_t * 391 u8_move (uint8_t *dest, const uint8_t *src, size_t n); 392 extern uint16_t * 393 u16_move (uint16_t *dest, const uint16_t *src, size_t n); 394 extern uint32_t * 395 u32_move (uint32_t *dest, const uint32_t *src, size_t n); 396 397 /* Set the first N characters of S to UC. UC should be a character that 398 occupies only 1 unit. */ 399 /* Similar to memset(). */ 400 extern uint8_t * 401 u8_set (uint8_t *s, ucs4_t uc, size_t n); 402 extern uint16_t * 403 u16_set (uint16_t *s, ucs4_t uc, size_t n); 404 extern uint32_t * 405 u32_set (uint32_t *s, ucs4_t uc, size_t n); 406 407 /* Compare S1 and S2, each of length N. */ 408 /* Similar to memcmp(). */ 409 extern int 410 u8_cmp (const uint8_t *s1, const uint8_t *s2, size_t n) 411 _UC_ATTRIBUTE_PURE; 412 extern int 413 u16_cmp (const uint16_t *s1, const uint16_t *s2, size_t n) 414 _UC_ATTRIBUTE_PURE; 415 extern int 416 u32_cmp (const uint32_t *s1, const uint32_t *s2, size_t n) 417 _UC_ATTRIBUTE_PURE; 418 419 /* Compare S1 and S2. */ 420 /* Similar to the gnulib function memcmp2(). */ 421 extern int 422 u8_cmp2 (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2) 423 _UC_ATTRIBUTE_PURE; 424 extern int 425 u16_cmp2 (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2) 426 _UC_ATTRIBUTE_PURE; 427 extern int 428 u32_cmp2 (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2) 429 _UC_ATTRIBUTE_PURE; 430 431 /* Search the string at S for UC. */ 432 /* Similar to memchr(). */ 433 extern uint8_t * 434 u8_chr (const uint8_t *s, size_t n, ucs4_t uc) 435 _UC_ATTRIBUTE_PURE; 436 extern uint16_t * 437 u16_chr (const uint16_t *s, size_t n, ucs4_t uc) 438 _UC_ATTRIBUTE_PURE; 439 extern uint32_t * 440 u32_chr (const uint32_t *s, size_t n, ucs4_t uc) 441 _UC_ATTRIBUTE_PURE; 442 443 /* Count the number of Unicode characters in the N units from S. */ 444 /* Similar to mbsnlen(). */ 445 extern size_t 446 u8_mbsnlen (const uint8_t *s, size_t n) 447 _UC_ATTRIBUTE_PURE; 448 extern size_t 449 u16_mbsnlen (const uint16_t *s, size_t n) 450 _UC_ATTRIBUTE_PURE; 451 extern size_t 452 u32_mbsnlen (const uint32_t *s, size_t n) 453 _UC_ATTRIBUTE_PURE; 454 455 /* Elementary string functions with memory allocation. */ 456 457 /* Make a freshly allocated copy of S, of length N. */ 458 extern uint8_t * 459 u8_cpy_alloc (const uint8_t *s, size_t n); 460 extern uint16_t * 461 u16_cpy_alloc (const uint16_t *s, size_t n); 462 extern uint32_t * 463 u32_cpy_alloc (const uint32_t *s, size_t n); 464 465 /* Elementary string functions on NUL terminated strings. */ 466 467 /* Return the length (number of units) of the first character in S. 468 Return 0 if it is the NUL character. Return -1 upon failure. */ 469 extern int 470 u8_strmblen (const uint8_t *s) 471 _UC_ATTRIBUTE_PURE; 472 extern int 473 u16_strmblen (const uint16_t *s) 474 _UC_ATTRIBUTE_PURE; 475 extern int 476 u32_strmblen (const uint32_t *s) 477 _UC_ATTRIBUTE_PURE; 478 479 /* Return the length (number of units) of the first character in S, putting 480 its 'ucs4_t' representation in *PUC. Return 0 if it is the NUL 481 character. Return -1 upon failure. */ 482 extern int 483 u8_strmbtouc (ucs4_t *puc, const uint8_t *s); 484 extern int 485 u16_strmbtouc (ucs4_t *puc, const uint16_t *s); 486 extern int 487 u32_strmbtouc (ucs4_t *puc, const uint32_t *s); 488 489 /* Forward iteration step. Advances the pointer past the next character, 490 or returns NULL if the end of the string has been reached. Puts the 491 character's 'ucs4_t' representation in *PUC. */ 492 extern const uint8_t * 493 u8_next (ucs4_t *puc, const uint8_t *s); 494 extern const uint16_t * 495 u16_next (ucs4_t *puc, const uint16_t *s); 496 extern const uint32_t * 497 u32_next (ucs4_t *puc, const uint32_t *s); 498 499 /* Backward iteration step. Advances the pointer to point to the previous 500 character, or returns NULL if the beginning of the string had been reached. 501 Puts the character's 'ucs4_t' representation in *PUC. */ 502 extern const uint8_t * 503 u8_prev (ucs4_t *puc, const uint8_t *s, const uint8_t *start); 504 extern const uint16_t * 505 u16_prev (ucs4_t *puc, const uint16_t *s, const uint16_t *start); 506 extern const uint32_t * 507 u32_prev (ucs4_t *puc, const uint32_t *s, const uint32_t *start); 508 509 /* Return the number of units in S. */ 510 /* Similar to strlen(), wcslen(). */ 511 extern size_t 512 u8_strlen (const uint8_t *s) 513 _UC_ATTRIBUTE_PURE; 514 extern size_t 515 u16_strlen (const uint16_t *s) 516 _UC_ATTRIBUTE_PURE; 517 extern size_t 518 u32_strlen (const uint32_t *s) 519 _UC_ATTRIBUTE_PURE; 520 521 /* Return the number of units in S, but at most MAXLEN. */ 522 /* Similar to strnlen(), wcsnlen(). */ 523 extern size_t 524 u8_strnlen (const uint8_t *s, size_t maxlen) 525 _UC_ATTRIBUTE_PURE; 526 extern size_t 527 u16_strnlen (const uint16_t *s, size_t maxlen) 528 _UC_ATTRIBUTE_PURE; 529 extern size_t 530 u32_strnlen (const uint32_t *s, size_t maxlen) 531 _UC_ATTRIBUTE_PURE; 532 533 /* Copy SRC to DEST. */ 534 /* Similar to strcpy(), wcscpy(). */ 535 extern uint8_t * 536 u8_strcpy (uint8_t *dest, const uint8_t *src); 537 extern uint16_t * 538 u16_strcpy (uint16_t *dest, const uint16_t *src); 539 extern uint32_t * 540 u32_strcpy (uint32_t *dest, const uint32_t *src); 541 542 /* Copy SRC to DEST, returning the address of the terminating NUL in DEST. */ 543 /* Similar to stpcpy(). */ 544 extern uint8_t * 545 u8_stpcpy (uint8_t *dest, const uint8_t *src); 546 extern uint16_t * 547 u16_stpcpy (uint16_t *dest, const uint16_t *src); 548 extern uint32_t * 549 u32_stpcpy (uint32_t *dest, const uint32_t *src); 550 551 /* Copy no more than N units of SRC to DEST. */ 552 /* Similar to strncpy(), wcsncpy(). */ 553 extern uint8_t * 554 u8_strncpy (uint8_t *dest, const uint8_t *src, size_t n); 555 extern uint16_t * 556 u16_strncpy (uint16_t *dest, const uint16_t *src, size_t n); 557 extern uint32_t * 558 u32_strncpy (uint32_t *dest, const uint32_t *src, size_t n); 559 560 /* Copy no more than N units of SRC to DEST. Return a pointer past the last 561 non-NUL unit written into DEST. */ 562 /* Similar to stpncpy(). */ 563 extern uint8_t * 564 u8_stpncpy (uint8_t *dest, const uint8_t *src, size_t n); 565 extern uint16_t * 566 u16_stpncpy (uint16_t *dest, const uint16_t *src, size_t n); 567 extern uint32_t * 568 u32_stpncpy (uint32_t *dest, const uint32_t *src, size_t n); 569 570 /* Append SRC onto DEST. */ 571 /* Similar to strcat(), wcscat(). */ 572 extern uint8_t * 573 u8_strcat (uint8_t *dest, const uint8_t *src); 574 extern uint16_t * 575 u16_strcat (uint16_t *dest, const uint16_t *src); 576 extern uint32_t * 577 u32_strcat (uint32_t *dest, const uint32_t *src); 578 579 /* Append no more than N units of SRC onto DEST. */ 580 /* Similar to strncat(), wcsncat(). */ 581 extern uint8_t * 582 u8_strncat (uint8_t *dest, const uint8_t *src, size_t n); 583 extern uint16_t * 584 u16_strncat (uint16_t *dest, const uint16_t *src, size_t n); 585 extern uint32_t * 586 u32_strncat (uint32_t *dest, const uint32_t *src, size_t n); 587 588 /* Compare S1 and S2. */ 589 /* Similar to strcmp(), wcscmp(). */ 590 #ifdef __sun 591 /* Avoid a collision with the u8_strcmp() function in Solaris 11 libc. */ 592 extern int 593 u8_strcmp_gnu (const uint8_t *s1, const uint8_t *s2) 594 _UC_ATTRIBUTE_PURE; 595 # define u8_strcmp u8_strcmp_gnu 596 #else 597 extern int 598 u8_strcmp (const uint8_t *s1, const uint8_t *s2) 599 _UC_ATTRIBUTE_PURE; 600 #endif 601 extern int 602 u16_strcmp (const uint16_t *s1, const uint16_t *s2) 603 _UC_ATTRIBUTE_PURE; 604 extern int 605 u32_strcmp (const uint32_t *s1, const uint32_t *s2) 606 _UC_ATTRIBUTE_PURE; 607 608 /* Compare S1 and S2 using the collation rules of the current locale. 609 Return -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2. 610 Upon failure, set errno and return any value. */ 611 /* Similar to strcoll(), wcscoll(). */ 612 extern int 613 u8_strcoll (const uint8_t *s1, const uint8_t *s2); 614 extern int 615 u16_strcoll (const uint16_t *s1, const uint16_t *s2); 616 extern int 617 u32_strcoll (const uint32_t *s1, const uint32_t *s2); 618 619 /* Compare no more than N units of S1 and S2. */ 620 /* Similar to strncmp(), wcsncmp(). */ 621 extern int 622 u8_strncmp (const uint8_t *s1, const uint8_t *s2, size_t n) 623 _UC_ATTRIBUTE_PURE; 624 extern int 625 u16_strncmp (const uint16_t *s1, const uint16_t *s2, size_t n) 626 _UC_ATTRIBUTE_PURE; 627 extern int 628 u32_strncmp (const uint32_t *s1, const uint32_t *s2, size_t n) 629 _UC_ATTRIBUTE_PURE; 630 631 /* Duplicate S, returning an identical malloc'd string. */ 632 /* Similar to strdup(), wcsdup(). */ 633 extern uint8_t * 634 u8_strdup (const uint8_t *s); 635 extern uint16_t * 636 u16_strdup (const uint16_t *s); 637 extern uint32_t * 638 u32_strdup (const uint32_t *s); 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 *str, const uint8_t *delim, uint8_t **ptr); 741 extern uint16_t * 742 u16_strtok (uint16_t *str, const uint16_t *delim, uint16_t **ptr); 743 extern uint32_t * 744 u32_strtok (uint32_t *str, const uint32_t *delim, uint32_t **ptr); 745 746 747 #ifdef __cplusplus 748 } 749 #endif 750 751 #endif /* _UNISTR_H */ 752