File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libiconv / srclib / string.in.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 22:57:48 2012 UTC (12 years, 4 months ago) by misho
Branches: libiconv, MAIN
CVS tags: v1_13_1, HEAD
libiconv

    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>