Annotation of embedaddon/libiconv/srclib/string.in.h, revision 1.1.1.1

1.1       misho       1: /* A GNU-like <string.h>.
                      2: 
                      3:    Copyright (C) 1995-1996, 2001-2009 Free Software Foundation, Inc.
                      4: 
                      5:    This program is free software; you can redistribute it and/or modify
                      6:    it under the terms of the GNU General Public License as published by
                      7:    the Free Software Foundation; either version 3, or (at your option)
                      8:    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
                     13:    GNU 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, write to the Free Software Foundation,
                     17:    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
                     18: 
                     19: #ifndef _GL_STRING_H
                     20: 
                     21: #if __GNUC__ >= 3
                     22: @PRAGMA_SYSTEM_HEADER@
                     23: #endif
                     24: 
                     25: /* The include_next requires a split double-inclusion guard.  */
                     26: #@INCLUDE_NEXT@ @NEXT_STRING_H@
                     27: 
                     28: #ifndef _GL_STRING_H
                     29: #define _GL_STRING_H
                     30: 
                     31: 
                     32: #ifndef __attribute__
                     33: /* This feature is available in gcc versions 2.5 and later.  */
                     34: # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
                     35: #  define __attribute__(Spec) /* empty */
                     36: # endif
                     37: /* The attribute __pure__ was added in gcc 2.96.  */
                     38: # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 96)
                     39: #  define __pure__ /* empty */
                     40: # endif
                     41: #endif
                     42: 
                     43: 
                     44: /* The definition of GL_LINK_WARNING is copied here.  */
                     45: 
                     46: 
                     47: #ifdef __cplusplus
                     48: extern "C" {
                     49: #endif
                     50: 
                     51: 
                     52: /* Return the first instance of C within N bytes of S, or NULL.  */
                     53: #if @GNULIB_MEMCHR@
                     54: # if @REPLACE_MEMCHR@
                     55: #  define memchr rpl_memchr
                     56: extern void *memchr (void const *__s, int __c, size_t __n)
                     57:   __attribute__ ((__pure__));
                     58: # endif
                     59: #elif defined GNULIB_POSIXCHECK
                     60: # undef memchr
                     61: # define memchr(s,c,n) \
                     62:     (GL_LINK_WARNING ("memchr has platform-specific bugs - " \
                     63:                       "use gnulib module memchr for portability" ), \
                     64:      memchr (s, c, n))
                     65: #endif
                     66: 
                     67: /* Return the first occurrence of NEEDLE in HAYSTACK.  */
                     68: #if @GNULIB_MEMMEM@
                     69: # if @REPLACE_MEMMEM@
                     70: #  define memmem rpl_memmem
                     71: # endif
                     72: # if ! @HAVE_DECL_MEMMEM@ || @REPLACE_MEMMEM@
                     73: extern void *memmem (void const *__haystack, size_t __haystack_len,
                     74:                     void const *__needle, size_t __needle_len)
                     75:   __attribute__ ((__pure__));
                     76: # endif
                     77: #elif defined GNULIB_POSIXCHECK
                     78: # undef memmem
                     79: # define memmem(a,al,b,bl) \
                     80:     (GL_LINK_WARNING ("memmem is unportable and often quadratic - " \
                     81:                       "use gnulib module memmem-simple for portability, " \
                     82:                       "and module memmem for speed" ), \
                     83:      memmem (a, al, b, bl))
                     84: #endif
                     85: 
                     86: /* Copy N bytes of SRC to DEST, return pointer to bytes after the
                     87:    last written byte.  */
                     88: #if @GNULIB_MEMPCPY@
                     89: # if ! @HAVE_MEMPCPY@
                     90: extern void *mempcpy (void *restrict __dest, void const *restrict __src,
                     91:                      size_t __n);
                     92: # endif
                     93: #elif defined GNULIB_POSIXCHECK
                     94: # undef mempcpy
                     95: # define mempcpy(a,b,n) \
                     96:     (GL_LINK_WARNING ("mempcpy is unportable - " \
                     97:                       "use gnulib module mempcpy for portability"), \
                     98:      mempcpy (a, b, n))
                     99: #endif
                    100: 
                    101: /* Search backwards through a block for a byte (specified as an int).  */
                    102: #if @GNULIB_MEMRCHR@
                    103: # if ! @HAVE_DECL_MEMRCHR@
                    104: extern void *memrchr (void const *, int, size_t)
                    105:   __attribute__ ((__pure__));
                    106: # endif
                    107: #elif defined GNULIB_POSIXCHECK
                    108: # undef memrchr
                    109: # define memrchr(a,b,c) \
                    110:     (GL_LINK_WARNING ("memrchr is unportable - " \
                    111:                       "use gnulib module memrchr for portability"), \
                    112:      memrchr (a, b, c))
                    113: #endif
                    114: 
                    115: /* Find the first occurrence of C in S.  More efficient than
                    116:    memchr(S,C,N), at the expense of undefined behavior if C does not
                    117:    occur within N bytes.  */
                    118: #if @GNULIB_RAWMEMCHR@
                    119: # if ! @HAVE_RAWMEMCHR@
                    120: extern void *rawmemchr (void const *__s, int __c_in)
                    121:   __attribute__ ((__pure__));
                    122: # endif
                    123: #elif defined GNULIB_POSIXCHECK
                    124: # undef rawmemchr
                    125: # define rawmemchr(a,b) \
                    126:     (GL_LINK_WARNING ("rawmemchr is unportable - " \
                    127:                       "use gnulib module rawmemchr for portability"), \
                    128:      rawmemchr (a, b))
                    129: #endif
                    130: 
                    131: /* Copy SRC to DST, returning the address of the terminating '\0' in DST.  */
                    132: #if @GNULIB_STPCPY@
                    133: # if ! @HAVE_STPCPY@
                    134: extern char *stpcpy (char *restrict __dst, char const *restrict __src);
                    135: # endif
                    136: #elif defined GNULIB_POSIXCHECK
                    137: # undef stpcpy
                    138: # define stpcpy(a,b) \
                    139:     (GL_LINK_WARNING ("stpcpy is unportable - " \
                    140:                       "use gnulib module stpcpy for portability"), \
                    141:      stpcpy (a, b))
                    142: #endif
                    143: 
                    144: /* Copy no more than N bytes of SRC to DST, returning a pointer past the
                    145:    last non-NUL byte written into DST.  */
                    146: #if @GNULIB_STPNCPY@
                    147: # if ! @HAVE_STPNCPY@
                    148: #  define stpncpy gnu_stpncpy
                    149: extern char *stpncpy (char *restrict __dst, char const *restrict __src,
                    150:                      size_t __n);
                    151: # endif
                    152: #elif defined GNULIB_POSIXCHECK
                    153: # undef stpncpy
                    154: # define stpncpy(a,b,n) \
                    155:     (GL_LINK_WARNING ("stpncpy is unportable - " \
                    156:                       "use gnulib module stpncpy for portability"), \
                    157:      stpncpy (a, b, n))
                    158: #endif
                    159: 
                    160: #if defined GNULIB_POSIXCHECK
                    161: /* strchr() does not work with multibyte strings if the locale encoding is
                    162:    GB18030 and the character to be searched is a digit.  */
                    163: # undef strchr
                    164: # define strchr(s,c) \
                    165:     (GL_LINK_WARNING ("strchr cannot work correctly on character strings " \
                    166:                       "in some multibyte locales - " \
                    167:                       "use mbschr if you care about internationalization"), \
                    168:      strchr (s, c))
                    169: #endif
                    170: 
                    171: /* Find the first occurrence of C in S or the final NUL byte.  */
                    172: #if @GNULIB_STRCHRNUL@
                    173: # if ! @HAVE_STRCHRNUL@
                    174: extern char *strchrnul (char const *__s, int __c_in)
                    175:   __attribute__ ((__pure__));
                    176: # endif
                    177: #elif defined GNULIB_POSIXCHECK
                    178: # undef strchrnul
                    179: # define strchrnul(a,b) \
                    180:     (GL_LINK_WARNING ("strchrnul is unportable - " \
                    181:                       "use gnulib module strchrnul for portability"), \
                    182:      strchrnul (a, b))
                    183: #endif
                    184: 
                    185: /* Duplicate S, returning an identical malloc'd string.  */
                    186: #if @GNULIB_STRDUP@
                    187: # if @REPLACE_STRDUP@
                    188: #  undef strdup
                    189: #  define strdup rpl_strdup
                    190: # endif
                    191: # if !(@HAVE_DECL_STRDUP@ || defined strdup) || @REPLACE_STRDUP@
                    192: extern char *strdup (char const *__s);
                    193: # endif
                    194: #elif defined GNULIB_POSIXCHECK
                    195: # undef strdup
                    196: # define strdup(a) \
                    197:     (GL_LINK_WARNING ("strdup is unportable - " \
                    198:                       "use gnulib module strdup for portability"), \
                    199:      strdup (a))
                    200: #endif
                    201: 
                    202: /* Return a newly allocated copy of at most N bytes of STRING.  */
                    203: #if @GNULIB_STRNDUP@
                    204: # if ! @HAVE_STRNDUP@
                    205: #  undef strndup
                    206: #  define strndup rpl_strndup
                    207: # endif
                    208: # if ! @HAVE_STRNDUP@ || ! @HAVE_DECL_STRNDUP@
                    209: extern char *strndup (char const *__string, size_t __n);
                    210: # endif
                    211: #elif defined GNULIB_POSIXCHECK
                    212: # undef strndup
                    213: # define strndup(a,n) \
                    214:     (GL_LINK_WARNING ("strndup is unportable - " \
                    215:                       "use gnulib module strndup for portability"), \
                    216:      strndup (a, n))
                    217: #endif
                    218: 
                    219: /* Find the length (number of bytes) of STRING, but scan at most
                    220:    MAXLEN bytes.  If no '\0' terminator is found in that many bytes,
                    221:    return MAXLEN.  */
                    222: #if @GNULIB_STRNLEN@
                    223: # if ! @HAVE_DECL_STRNLEN@
                    224: extern size_t strnlen (char const *__string, size_t __maxlen)
                    225:   __attribute__ ((__pure__));
                    226: # endif
                    227: #elif defined GNULIB_POSIXCHECK
                    228: # undef strnlen
                    229: # define strnlen(a,n) \
                    230:     (GL_LINK_WARNING ("strnlen is unportable - " \
                    231:                       "use gnulib module strnlen for portability"), \
                    232:      strnlen (a, n))
                    233: #endif
                    234: 
                    235: #if defined GNULIB_POSIXCHECK
                    236: /* strcspn() assumes the second argument is a list of single-byte characters.
                    237:    Even in this simple case, it does not work with multibyte strings if the
                    238:    locale encoding is GB18030 and one of the characters to be searched is a
                    239:    digit.  */
                    240: # undef strcspn
                    241: # define strcspn(s,a) \
                    242:     (GL_LINK_WARNING ("strcspn cannot work correctly on character strings " \
                    243:                       "in multibyte locales - " \
                    244:                       "use mbscspn if you care about internationalization"), \
                    245:      strcspn (s, a))
                    246: #endif
                    247: 
                    248: /* Find the first occurrence in S of any character in ACCEPT.  */
                    249: #if @GNULIB_STRPBRK@
                    250: # if ! @HAVE_STRPBRK@
                    251: extern char *strpbrk (char const *__s, char const *__accept)
                    252:   __attribute__ ((__pure__));
                    253: # endif
                    254: # if defined GNULIB_POSIXCHECK
                    255: /* strpbrk() assumes the second argument is a list of single-byte characters.
                    256:    Even in this simple case, it does not work with multibyte strings if the
                    257:    locale encoding is GB18030 and one of the characters to be searched is a
                    258:    digit.  */
                    259: #  undef strpbrk
                    260: #  define strpbrk(s,a) \
                    261:      (GL_LINK_WARNING ("strpbrk cannot work correctly on character strings " \
                    262:                        "in multibyte locales - " \
                    263:                        "use mbspbrk if you care about internationalization"), \
                    264:       strpbrk (s, a))
                    265: # endif
                    266: #elif defined GNULIB_POSIXCHECK
                    267: # undef strpbrk
                    268: # define strpbrk(s,a) \
                    269:     (GL_LINK_WARNING ("strpbrk is unportable - " \
                    270:                       "use gnulib module strpbrk for portability"), \
                    271:      strpbrk (s, a))
                    272: #endif
                    273: 
                    274: #if defined GNULIB_POSIXCHECK
                    275: /* strspn() assumes the second argument is a list of single-byte characters.
                    276:    Even in this simple case, it cannot work with multibyte strings.  */
                    277: # undef strspn
                    278: # define strspn(s,a) \
                    279:     (GL_LINK_WARNING ("strspn cannot work correctly on character strings " \
                    280:                       "in multibyte locales - " \
                    281:                       "use mbsspn if you care about internationalization"), \
                    282:      strspn (s, a))
                    283: #endif
                    284: 
                    285: #if defined GNULIB_POSIXCHECK
                    286: /* strrchr() does not work with multibyte strings if the locale encoding is
                    287:    GB18030 and the character to be searched is a digit.  */
                    288: # undef strrchr
                    289: # define strrchr(s,c) \
                    290:     (GL_LINK_WARNING ("strrchr cannot work correctly on character strings " \
                    291:                       "in some multibyte locales - " \
                    292:                       "use mbsrchr if you care about internationalization"), \
                    293:      strrchr (s, c))
                    294: #endif
                    295: 
                    296: /* Search the next delimiter (char listed in DELIM) starting at *STRINGP.
                    297:    If one is found, overwrite it with a NUL, and advance *STRINGP
                    298:    to point to the next char after it.  Otherwise, set *STRINGP to NULL.
                    299:    If *STRINGP was already NULL, nothing happens.
                    300:    Return the old value of *STRINGP.
                    301: 
                    302:    This is a variant of strtok() that is multithread-safe and supports
                    303:    empty fields.
                    304: 
                    305:    Caveat: It modifies the original string.
                    306:    Caveat: These functions cannot be used on constant strings.
                    307:    Caveat: The identity of the delimiting character is lost.
                    308:    Caveat: It doesn't work with multibyte strings unless all of the delimiter
                    309:            characters are ASCII characters < 0x30.
                    310: 
                    311:    See also strtok_r().  */
                    312: #if @GNULIB_STRSEP@
                    313: # if ! @HAVE_STRSEP@
                    314: extern char *strsep (char **restrict __stringp, char const *restrict __delim);
                    315: # endif
                    316: # if defined GNULIB_POSIXCHECK
                    317: #  undef strsep
                    318: #  define strsep(s,d) \
                    319:      (GL_LINK_WARNING ("strsep cannot work correctly on character strings " \
                    320:                        "in multibyte locales - " \
                    321:                        "use mbssep if you care about internationalization"), \
                    322:       strsep (s, d))
                    323: # endif
                    324: #elif defined GNULIB_POSIXCHECK
                    325: # undef strsep
                    326: # define strsep(s,d) \
                    327:     (GL_LINK_WARNING ("strsep is unportable - " \
                    328:                       "use gnulib module strsep for portability"), \
                    329:      strsep (s, d))
                    330: #endif
                    331: 
                    332: #if @GNULIB_STRSTR@
                    333: # if @REPLACE_STRSTR@
                    334: #  define strstr rpl_strstr
                    335: char *strstr (const char *haystack, const char *needle)
                    336:   __attribute__ ((__pure__));
                    337: # endif
                    338: #elif defined GNULIB_POSIXCHECK
                    339: /* strstr() does not work with multibyte strings if the locale encoding is
                    340:    different from UTF-8:
                    341:    POSIX says that it operates on "strings", and "string" in POSIX is defined
                    342:    as a sequence of bytes, not of characters.  */
                    343: # undef strstr
                    344: # define strstr(a,b) \
                    345:     (GL_LINK_WARNING ("strstr is quadratic on many systems, and cannot " \
                    346:                       "work correctly on character strings in most "    \
                    347:                       "multibyte locales - " \
                    348:                       "use mbsstr if you care about internationalization, " \
                    349:                       "or use strstr if you care about speed"), \
                    350:      strstr (a, b))
                    351: #endif
                    352: 
                    353: /* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
                    354:    comparison.  */
                    355: #if @GNULIB_STRCASESTR@
                    356: # if @REPLACE_STRCASESTR@
                    357: #  define strcasestr rpl_strcasestr
                    358: # endif
                    359: # if ! @HAVE_STRCASESTR@ || @REPLACE_STRCASESTR@
                    360: extern char *strcasestr (const char *haystack, const char *needle)
                    361:   __attribute__ ((__pure__));
                    362: # endif
                    363: #elif defined GNULIB_POSIXCHECK
                    364: /* strcasestr() does not work with multibyte strings:
                    365:    It is a glibc extension, and glibc implements it only for unibyte
                    366:    locales.  */
                    367: # undef strcasestr
                    368: # define strcasestr(a,b) \
                    369:     (GL_LINK_WARNING ("strcasestr does work correctly on character strings " \
                    370:                       "in multibyte locales - " \
                    371:                       "use mbscasestr if you care about " \
                    372:                       "internationalization, or use c-strcasestr if you want " \
                    373:                       "a locale independent function"), \
                    374:      strcasestr (a, b))
                    375: #endif
                    376: 
                    377: /* Parse S into tokens separated by characters in DELIM.
                    378:    If S is NULL, the saved pointer in SAVE_PTR is used as
                    379:    the next starting point.  For example:
                    380:        char s[] = "-abc-=-def";
                    381:        char *sp;
                    382:        x = strtok_r(s, "-", &sp);      // x = "abc", sp = "=-def"
                    383:        x = strtok_r(NULL, "-=", &sp);  // x = "def", sp = NULL
                    384:        x = strtok_r(NULL, "=", &sp);   // x = NULL
                    385:                // s = "abc\0-def\0"
                    386: 
                    387:    This is a variant of strtok() that is multithread-safe.
                    388: 
                    389:    For the POSIX documentation for this function, see:
                    390:    http://www.opengroup.org/susv3xsh/strtok.html
                    391: 
                    392:    Caveat: It modifies the original string.
                    393:    Caveat: These functions cannot be used on constant strings.
                    394:    Caveat: The identity of the delimiting character is lost.
                    395:    Caveat: It doesn't work with multibyte strings unless all of the delimiter
                    396:            characters are ASCII characters < 0x30.
                    397: 
                    398:    See also strsep().  */
                    399: #if @GNULIB_STRTOK_R@
                    400: # if ! @HAVE_DECL_STRTOK_R@
                    401: extern char *strtok_r (char *restrict s, char const *restrict delim,
                    402:                       char **restrict save_ptr);
                    403: # endif
                    404: # if defined GNULIB_POSIXCHECK
                    405: #  undef strtok_r
                    406: #  define strtok_r(s,d,p) \
                    407:      (GL_LINK_WARNING ("strtok_r cannot work correctly on character strings " \
                    408:                        "in multibyte locales - " \
                    409:                        "use mbstok_r if you care about internationalization"), \
                    410:       strtok_r (s, d, p))
                    411: # endif
                    412: #elif defined GNULIB_POSIXCHECK
                    413: # undef strtok_r
                    414: # define strtok_r(s,d,p) \
                    415:     (GL_LINK_WARNING ("strtok_r is unportable - " \
                    416:                       "use gnulib module strtok_r for portability"), \
                    417:      strtok_r (s, d, p))
                    418: #endif
                    419: 
                    420: 
                    421: /* The following functions are not specified by POSIX.  They are gnulib
                    422:    extensions.  */
                    423: 
                    424: #if @GNULIB_MBSLEN@
                    425: /* Return the number of multibyte characters in the character string STRING.
                    426:    This considers multibyte characters, unlike strlen, which counts bytes.  */
                    427: extern size_t mbslen (const char *string);
                    428: #endif
                    429: 
                    430: #if @GNULIB_MBSNLEN@
                    431: /* Return the number of multibyte characters in the character string starting
                    432:    at STRING and ending at STRING + LEN.  */
                    433: extern size_t mbsnlen (const char *string, size_t len);
                    434: #endif
                    435: 
                    436: #if @GNULIB_MBSCHR@
                    437: /* Locate the first single-byte character C in the character string STRING,
                    438:    and return a pointer to it.  Return NULL if C is not found in STRING.
                    439:    Unlike strchr(), this function works correctly in multibyte locales with
                    440:    encodings such as GB18030.  */
                    441: # define mbschr rpl_mbschr /* avoid collision with HP-UX function */
                    442: extern char * mbschr (const char *string, int c);
                    443: #endif
                    444: 
                    445: #if @GNULIB_MBSRCHR@
                    446: /* Locate the last single-byte character C in the character string STRING,
                    447:    and return a pointer to it.  Return NULL if C is not found in STRING.
                    448:    Unlike strrchr(), this function works correctly in multibyte locales with
                    449:    encodings such as GB18030.  */
                    450: # define mbsrchr rpl_mbsrchr /* avoid collision with HP-UX function */
                    451: extern char * mbsrchr (const char *string, int c);
                    452: #endif
                    453: 
                    454: #if @GNULIB_MBSSTR@
                    455: /* Find the first occurrence of the character string NEEDLE in the character
                    456:    string HAYSTACK.  Return NULL if NEEDLE is not found in HAYSTACK.
                    457:    Unlike strstr(), this function works correctly in multibyte locales with
                    458:    encodings different from UTF-8.  */
                    459: extern char * mbsstr (const char *haystack, const char *needle);
                    460: #endif
                    461: 
                    462: #if @GNULIB_MBSCASECMP@
                    463: /* Compare the character strings S1 and S2, ignoring case, returning less than,
                    464:    equal to or greater than zero if S1 is lexicographically less than, equal to
                    465:    or greater than S2.
                    466:    Note: This function may, in multibyte locales, return 0 for strings of
                    467:    different lengths!
                    468:    Unlike strcasecmp(), this function works correctly in multibyte locales.  */
                    469: extern int mbscasecmp (const char *s1, const char *s2);
                    470: #endif
                    471: 
                    472: #if @GNULIB_MBSNCASECMP@
                    473: /* Compare the initial segment of the character string S1 consisting of at most
                    474:    N characters with the initial segment of the character string S2 consisting
                    475:    of at most N characters, ignoring case, returning less than, equal to or
                    476:    greater than zero if the initial segment of S1 is lexicographically less
                    477:    than, equal to or greater than the initial segment of S2.
                    478:    Note: This function may, in multibyte locales, return 0 for initial segments
                    479:    of different lengths!
                    480:    Unlike strncasecmp(), this function works correctly in multibyte locales.
                    481:    But beware that N is not a byte count but a character count!  */
                    482: extern int mbsncasecmp (const char *s1, const char *s2, size_t n);
                    483: #endif
                    484: 
                    485: #if @GNULIB_MBSPCASECMP@
                    486: /* Compare the initial segment of the character string STRING consisting of
                    487:    at most mbslen (PREFIX) characters with the character string PREFIX,
                    488:    ignoring case, returning less than, equal to or greater than zero if this
                    489:    initial segment is lexicographically less than, equal to or greater than
                    490:    PREFIX.
                    491:    Note: This function may, in multibyte locales, return 0 if STRING is of
                    492:    smaller length than PREFIX!
                    493:    Unlike strncasecmp(), this function works correctly in multibyte
                    494:    locales.  */
                    495: extern char * mbspcasecmp (const char *string, const char *prefix);
                    496: #endif
                    497: 
                    498: #if @GNULIB_MBSCASESTR@
                    499: /* Find the first occurrence of the character string NEEDLE in the character
                    500:    string HAYSTACK, using case-insensitive comparison.
                    501:    Note: This function may, in multibyte locales, return success even if
                    502:    strlen (haystack) < strlen (needle) !
                    503:    Unlike strcasestr(), this function works correctly in multibyte locales.  */
                    504: extern char * mbscasestr (const char *haystack, const char *needle);
                    505: #endif
                    506: 
                    507: #if @GNULIB_MBSCSPN@
                    508: /* Find the first occurrence in the character string STRING of any character
                    509:    in the character string ACCEPT.  Return the number of bytes from the
                    510:    beginning of the string to this occurrence, or to the end of the string
                    511:    if none exists.
                    512:    Unlike strcspn(), this function works correctly in multibyte locales.  */
                    513: extern size_t mbscspn (const char *string, const char *accept);
                    514: #endif
                    515: 
                    516: #if @GNULIB_MBSPBRK@
                    517: /* Find the first occurrence in the character string STRING of any character
                    518:    in the character string ACCEPT.  Return the pointer to it, or NULL if none
                    519:    exists.
                    520:    Unlike strpbrk(), this function works correctly in multibyte locales.  */
                    521: # define mbspbrk rpl_mbspbrk /* avoid collision with HP-UX function */
                    522: extern char * mbspbrk (const char *string, const char *accept);
                    523: #endif
                    524: 
                    525: #if @GNULIB_MBSSPN@
                    526: /* Find the first occurrence in the character string STRING of any character
                    527:    not in the character string REJECT.  Return the number of bytes from the
                    528:    beginning of the string to this occurrence, or to the end of the string
                    529:    if none exists.
                    530:    Unlike strspn(), this function works correctly in multibyte locales.  */
                    531: extern size_t mbsspn (const char *string, const char *reject);
                    532: #endif
                    533: 
                    534: #if @GNULIB_MBSSEP@
                    535: /* Search the next delimiter (multibyte character listed in the character
                    536:    string DELIM) starting at the character string *STRINGP.
                    537:    If one is found, overwrite it with a NUL, and advance *STRINGP to point
                    538:    to the next multibyte character after it.  Otherwise, set *STRINGP to NULL.
                    539:    If *STRINGP was already NULL, nothing happens.
                    540:    Return the old value of *STRINGP.
                    541: 
                    542:    This is a variant of mbstok_r() that supports empty fields.
                    543: 
                    544:    Caveat: It modifies the original string.
                    545:    Caveat: These functions cannot be used on constant strings.
                    546:    Caveat: The identity of the delimiting character is lost.
                    547: 
                    548:    See also mbstok_r().  */
                    549: extern char * mbssep (char **stringp, const char *delim);
                    550: #endif
                    551: 
                    552: #if @GNULIB_MBSTOK_R@
                    553: /* Parse the character string STRING into tokens separated by characters in
                    554:    the character string DELIM.
                    555:    If STRING is NULL, the saved pointer in SAVE_PTR is used as
                    556:    the next starting point.  For example:
                    557:        char s[] = "-abc-=-def";
                    558:        char *sp;
                    559:        x = mbstok_r(s, "-", &sp);      // x = "abc", sp = "=-def"
                    560:        x = mbstok_r(NULL, "-=", &sp);  // x = "def", sp = NULL
                    561:        x = mbstok_r(NULL, "=", &sp);   // x = NULL
                    562:                // s = "abc\0-def\0"
                    563: 
                    564:    Caveat: It modifies the original string.
                    565:    Caveat: These functions cannot be used on constant strings.
                    566:    Caveat: The identity of the delimiting character is lost.
                    567: 
                    568:    See also mbssep().  */
                    569: extern char * mbstok_r (char *string, const char *delim, char **save_ptr);
                    570: #endif
                    571: 
                    572: /* Map any int, typically from errno, into an error message.  */
                    573: #if @GNULIB_STRERROR@
                    574: # if @REPLACE_STRERROR@
                    575: #  undef strerror
                    576: #  define strerror rpl_strerror
                    577: extern char *strerror (int);
                    578: # endif
                    579: #elif defined GNULIB_POSIXCHECK
                    580: # undef strerror
                    581: # define strerror(e) \
                    582:     (GL_LINK_WARNING ("strerror is unportable - " \
                    583:                       "use gnulib module strerror to guarantee non-NULL result"), \
                    584:      strerror (e))
                    585: #endif
                    586: 
                    587: #if @GNULIB_STRSIGNAL@
                    588: # if @REPLACE_STRSIGNAL@
                    589: #  define strsignal rpl_strsignal
                    590: # endif
                    591: # if ! @HAVE_DECL_STRSIGNAL@ || @REPLACE_STRSIGNAL@
                    592: extern char *strsignal (int __sig);
                    593: # endif
                    594: #elif defined GNULIB_POSIXCHECK
                    595: # undef strsignal
                    596: # define strsignal(a) \
                    597:     (GL_LINK_WARNING ("strsignal is unportable - " \
                    598:                       "use gnulib module strsignal for portability"), \
                    599:      strsignal (a))
                    600: #endif
                    601: 
                    602: #if @GNULIB_STRVERSCMP@
                    603: # if !@HAVE_STRVERSCMP@
                    604: extern int strverscmp (const char *, const char *);
                    605: # endif
                    606: #elif defined GNULIB_POSIXCHECK
                    607: # undef strverscmp
                    608: # define strverscmp(a, b) \
                    609:     (GL_LINK_WARNING ("strverscmp is unportable - " \
                    610:                       "use gnulib module strverscmp for portability"), \
                    611:      strverscmp (a, b))
                    612: #endif
                    613: 
                    614: 
                    615: #ifdef __cplusplus
                    616: }
                    617: #endif
                    618: 
                    619: #endif /* _GL_STRING_H */
                    620: #endif /* _GL_STRING_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>