Annotation of embedaddon/libiconv/srclib/string.in.h, revision 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>