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