X-Git-Url: https://pd.if.org/git/?p=pdclib;a=blobdiff_plain;f=functions%2Fstring%2Fstrtok.c;h=3c427c549c9ea0b87e6851a7862f3c77a78b7e8d;hp=70d2cd702fe196b7bf8d2a68a078312bdadc3681;hb=da0f3f353d417fed71f358a48d5d5394145e460d;hpb=1d9d92ba957a0b8307c9a65c35867fde68e6533b diff --git a/functions/string/strtok.c b/functions/string/strtok.c index 70d2cd7..3c427c5 100644 --- a/functions/string/strtok.c +++ b/functions/string/strtok.c @@ -1,39 +1,105 @@ -/* ---------------------------------------------------------------------------- - * $Id$ - * ---------------------------------------------------------------------------- - * Public Domain C Library - http://pdclib.sourceforge.net - * This code is Public Domain. Use, modify, and redistribute at will. - * --------------------------------------------------------------------------*/ - -char * strtok( char * restrict src, const char * restrict seperators ) +/* strtok( char *, const char * ) + + This file is part of the Public Domain C Library (PDCLib). + Permission is granted to use, modify, and / or redistribute at will. +*/ + +#include + +#ifndef REGTEST + +char * strtok( char * _PDCLIB_restrict s1, const char * _PDCLIB_restrict s2 ) { - static char * store = NULL; - size_t token_length; + static char * tmp = NULL; + const char * p = s2; - if ( src != NULL ) + if ( s1 != NULL ) { /* new string */ - store = src; + tmp = s1; } - if ( store == NULL ) + else { - /* no old string, no new string, nothing to do */ - return NULL; + /* old string continued */ + if ( tmp == NULL ) + { + /* No old string, no new string, nothing to do */ + return NULL; + } + s1 = tmp; } - src += strspn( src, seperators ); /* skipping leading seperators */ - if ( strlen( src ) == 0 ) + + /* skipping leading s2 characters */ + while ( *p && *s1 ) + { + if ( *s1 == *p ) + { + /* found seperator; skip and start over */ + ++s1; + p = s2; + continue; + } + ++p; + } + + if ( ! *s1 ) { /* no more to parse */ - return ( store = NULL ); + return ( tmp = NULL ); } - token_length = strcspn( src, seperators ); - if ( src[ token_length ] == '\0' ) + + /* skipping non-s2 characters */ + tmp = s1; + while ( *tmp ) { - /* parsed to end of string */ - store = NULL; - return src; + p = s2; + while ( *p ) + { + if ( *tmp == *p++ ) + { + /* found seperator; overwrite with '\0', position tmp, return */ + *tmp++ = '\0'; + return s1; + } + } + ++tmp; } - src[ token_length ] = '\0'; - store = src + token_length + 1; - return src; + + /* parsed to end of string */ + tmp = NULL; + return s1; +} + +#endif + +#ifdef TEST +#include "_PDCLIB_test.h" + +int main( void ) +{ + char s[] = "_a_bc__d_"; + TESTCASE( strtok( s, "_" ) == &s[1] ); + TESTCASE( s[1] == 'a' ); + TESTCASE( s[2] == '\0' ); + TESTCASE( strtok( NULL, "_" ) == &s[3] ); + TESTCASE( s[3] == 'b' ); + TESTCASE( s[4] == 'c' ); + TESTCASE( s[5] == '\0' ); + TESTCASE( strtok( NULL, "_" ) == &s[7] ); + TESTCASE( s[6] == '_' ); + TESTCASE( s[7] == 'd' ); + TESTCASE( s[8] == '\0' ); + TESTCASE( strtok( NULL, "_" ) == NULL ); + strcpy( s, "ab_cd" ); + TESTCASE( strtok( s, "_" ) == &s[0] ); + TESTCASE( s[0] == 'a' ); + TESTCASE( s[1] == 'b' ); + TESTCASE( s[2] == '\0' ); + TESTCASE( strtok( NULL, "_" ) == &s[3] ); + TESTCASE( s[3] == 'c' ); + TESTCASE( s[4] == 'd' ); + TESTCASE( s[5] == '\0' ); + TESTCASE( strtok( NULL, "_" ) == NULL ); + return TEST_RESULTS; } +#endif