OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [tags/] [gnu-src/] [newlib-1.18.0/] [newlib-1.18.0-or32-1.0rc1/] [newlib/] [libc/] [string/] [wcstok.c] - Diff between revs 207 and 345

Only display areas with differences | Details | Blame | View Log

Rev 207 Rev 345
/*
/*
FUNCTION
FUNCTION
        <<wcstok>>---get next token from a string
        <<wcstok>>---get next token from a string
 
 
INDEX
INDEX
        wcstok
        wcstok
 
 
 
 
ANSI_SYNOPSIS
ANSI_SYNOPSIS
        #include <wchar.h>
        #include <wchar.h>
        wchar_t *wcstok(wchar_t *<[source]>, const wchar_t *<[delimiters]>,
        wchar_t *wcstok(wchar_t *<[source]>, const wchar_t *<[delimiters]>,
                        wchar_t **<[lasts]>)
                        wchar_t **<[lasts]>)
 
 
TRAD_SYNOPSIS
TRAD_SYNOPSIS
        #include <wchar.h>
        #include <wchar.h>
        wchar_t *wcstok(<[source]>, <[delimiters]>, <[lasts]>)
        wchar_t *wcstok(<[source]>, <[delimiters]>, <[lasts]>)
        wchar_t *<[source]>;
        wchar_t *<[source]>;
        wchar_t *<[delimiters]>;
        wchar_t *<[delimiters]>;
        wchar_t **<[lasts]>;
        wchar_t **<[lasts]>;
 
 
DESCRIPTION
DESCRIPTION
        The <<wcstok>> function is the wide-character equivalent of the
        The <<wcstok>> function is the wide-character equivalent of the
        <<strtok_r>> function (which in turn is the same as the <<strtok>>
        <<strtok_r>> function (which in turn is the same as the <<strtok>>
        function with an added argument to make it thread-safe).
        function with an added argument to make it thread-safe).
 
 
        The <<wcstok>> function is used to isolate (one at a time)
        The <<wcstok>> function is used to isolate (one at a time)
        sequential tokens in a null-terminated wide-character string,
        sequential tokens in a null-terminated wide-character string,
        <<*<[source]>>>.  A token is defined as a substring not containing
        <<*<[source]>>>.  A token is defined as a substring not containing
        any wide-characters from <<*<[delimiters]>>>.
        any wide-characters from <<*<[delimiters]>>>.
 
 
        The first time that <<wcstok>> is called, <<*<[source]>>> should
        The first time that <<wcstok>> is called, <<*<[source]>>> should
        be specified with the wide-character string to be searched, and
        be specified with the wide-character string to be searched, and
        <<*<[lasts]>>>--but not <<lasts>>, which must be non-NULL--may be
        <<*<[lasts]>>>--but not <<lasts>>, which must be non-NULL--may be
        random; subsequent calls, wishing to obtain further tokens from
        random; subsequent calls, wishing to obtain further tokens from
        the same string, should pass a null pointer for <<*<[source]>>>
        the same string, should pass a null pointer for <<*<[source]>>>
        instead but must supply <<*<[lasts]>>> unchanged from the last
        instead but must supply <<*<[lasts]>>> unchanged from the last
        call.  The separator wide-character string, <<*<[delimiters]>>>,
        call.  The separator wide-character string, <<*<[delimiters]>>>,
        must be supplied each time and may change between calls.
        must be supplied each time and may change between calls.
        A pointer to placeholder <<*<[lasts]>>> must be supplied by
        A pointer to placeholder <<*<[lasts]>>> must be supplied by
        the caller, and is set each time as needed to save the state
        the caller, and is set each time as needed to save the state
        by <<wcstok>>.  Every call to <<wcstok>> with <<*<[source]>>>
        by <<wcstok>>.  Every call to <<wcstok>> with <<*<[source]>>>
        == <<NULL>> must pass the value of <<*<[lasts]>>> as last set
        == <<NULL>> must pass the value of <<*<[lasts]>>> as last set
        by <<wcstok>>.
        by <<wcstok>>.
 
 
        The <<wcstok>> function returns a pointer to the beginning of each
        The <<wcstok>> function returns a pointer to the beginning of each
        subsequent token in the string, after replacing the separator
        subsequent token in the string, after replacing the separator
        wide-character itself with a null wide-character.  When no more tokens
        wide-character itself with a null wide-character.  When no more tokens
        remain, a null pointer is returned.
        remain, a null pointer is returned.
 
 
RETURNS
RETURNS
        <<wcstok>> returns a pointer to the first wide character of a token, or
        <<wcstok>> returns a pointer to the first wide character of a token, or
        <<NULL>> if there is no token.
        <<NULL>> if there is no token.
 
 
NOTES
NOTES
        <<wcstok>> is thread-safe (unlike <<strtok>>, but like <<strtok_r>>).
        <<wcstok>> is thread-safe (unlike <<strtok>>, but like <<strtok_r>>).
        <<wcstok>> writes into the string being searched.
        <<wcstok>> writes into the string being searched.
 
 
PORTABILITY
PORTABILITY
<<wcstok>> is C99 and POSIX.1-2001.
<<wcstok>> is C99 and POSIX.1-2001.
 
 
<<wcstok>> requires no supporting OS subroutines.
<<wcstok>> requires no supporting OS subroutines.
 
 
QUICKREF
QUICKREF
        strtok ansi pure
        strtok ansi pure
*/
*/
/* wcstok for Newlib created by adapting strtok_r, 2008.  */
/* wcstok for Newlib created by adapting strtok_r, 2008.  */
/*
/*
 * Copyright (c) 1988 Regents of the University of California.
 * Copyright (c) 1988 Regents of the University of California.
 * All rights reserved.
 * All rights reserved.
 *
 *
 * Redistribution and use in source and binary forms, with or without
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * modification, are permitted provided that the following conditions
 * are met:
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the University nor the names of its contributors
 * 3. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *    without specific prior written permission.
 *
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * SUCH DAMAGE.
 */
 */
 
 
#include <wchar.h>
#include <wchar.h>
 
 
wchar_t *
wchar_t *
_DEFUN (wcstok, (s, delim, lasts),
_DEFUN (wcstok, (s, delim, lasts),
        register wchar_t *s _AND
        register wchar_t *s _AND
        register const wchar_t *delim _AND
        register const wchar_t *delim _AND
        wchar_t **lasts)
        wchar_t **lasts)
{
{
        register const wchar_t *spanp;
        register const wchar_t *spanp;
        register int c, sc;
        register int c, sc;
        wchar_t *tok;
        wchar_t *tok;
 
 
 
 
        if (s == NULL && (s = *lasts) == NULL)
        if (s == NULL && (s = *lasts) == NULL)
                return (NULL);
                return (NULL);
 
 
        /*
        /*
         * Skip (span) leading delimiters (s += wcsspn(s, delim), sort of).
         * Skip (span) leading delimiters (s += wcsspn(s, delim), sort of).
         */
         */
cont:
cont:
        c = *s++;
        c = *s++;
        for (spanp = delim; (sc = *spanp++) != L'\0';) {
        for (spanp = delim; (sc = *spanp++) != L'\0';) {
                if (c == sc)  goto cont;
                if (c == sc)  goto cont;
        }
        }
 
 
        if (c == L'\0') {               /* no non-delimiter characters */
        if (c == L'\0') {               /* no non-delimiter characters */
                *lasts = NULL;
                *lasts = NULL;
                return (NULL);
                return (NULL);
        }
        }
        tok = s - 1;
        tok = s - 1;
 
 
        /*
        /*
         * Scan token (scan for delimiters: s += wcscspn(s, delim), sort of).
         * Scan token (scan for delimiters: s += wcscspn(s, delim), sort of).
         * Note that delim must have one NUL; we stop if we see that, too.
         * Note that delim must have one NUL; we stop if we see that, too.
         */
         */
        for (;;) {
        for (;;) {
                c = *s++;
                c = *s++;
                spanp = delim;
                spanp = delim;
                do {
                do {
                        if ((sc = *spanp++) == c) {
                        if ((sc = *spanp++) == c) {
                                if (c == L'\0')
                                if (c == L'\0')
                                        s = NULL;
                                        s = NULL;
                                else
                                else
                                        s[-1] = L'\0';
                                        s[-1] = L'\0';
                                *lasts = s;
                                *lasts = s;
                                return (tok);
                                return (tok);
                        }
                        }
                } while (sc != L'\0');
                } while (sc != L'\0');
        }
        }
        /* NOTREACHED */
        /* NOTREACHED */
}
}
 
 
/* The remainder of this file can serve as a regression test.  Compile
/* The remainder of this file can serve as a regression test.  Compile
 *  with -D_REGRESSION_TEST.  */
 *  with -D_REGRESSION_TEST.  */
#if defined(_REGRESSION_TEST)   /* [Test code:  example from C99 standard */
#if defined(_REGRESSION_TEST)   /* [Test code:  example from C99 standard */
#include <stdio.h>
#include <stdio.h>
#include <wchar.h>
#include <wchar.h>
 
 
/* example from C99 standard with minor additions to be a test */
/* example from C99 standard with minor additions to be a test */
int
int
main(void)
main(void)
{
{
int  errs=0;
int  errs=0;
static wchar_t str1[] = L"?a???b,,,#c";
static wchar_t str1[] = L"?a???b,,,#c";
static wchar_t str2[] = L"\t \t";
static wchar_t str2[] = L"\t \t";
wchar_t *t, *ptr1, *ptr2;
wchar_t *t, *ptr1, *ptr2;
 
 
t = wcstok(str1, L"?", &ptr1); // t points to the token L"a"
t = wcstok(str1, L"?", &ptr1); // t points to the token L"a"
if(wcscmp(t,L"a")) errs++;
if(wcscmp(t,L"a")) errs++;
t = wcstok(NULL, L",", &ptr1); // t points to the token L"??b"
t = wcstok(NULL, L",", &ptr1); // t points to the token L"??b"
if(wcscmp(t,L"??b")) errs++;
if(wcscmp(t,L"??b")) errs++;
t = wcstok(str2, L" \t", &ptr2); // t is a null pointer
t = wcstok(str2, L" \t", &ptr2); // t is a null pointer
if(t != NULL) errs++;
if(t != NULL) errs++;
t = wcstok(NULL, L"#,", &ptr1); // t points to the token L"c"
t = wcstok(NULL, L"#,", &ptr1); // t points to the token L"c"
if(wcscmp(t,L"c")) errs++;
if(wcscmp(t,L"c")) errs++;
t = wcstok(NULL, L"?", &ptr1); // t is a null pointer
t = wcstok(NULL, L"?", &ptr1); // t is a null pointer
if(t != NULL) errs++;
if(t != NULL) errs++;
 
 
printf("wcstok() test ");
printf("wcstok() test ");
if(errs)  printf("FAILED %d test cases", errs);
if(errs)  printf("FAILED %d test cases", errs);
  else    printf("passed");
  else    printf("passed");
printf(".\n");
printf(".\n");
 
 
return(errs);
return(errs);
}
}
#endif /* defined(_REGRESSION_TEST) ] */
#endif /* defined(_REGRESSION_TEST) ] */
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.