X-Git-Url: https://pd.if.org/git/?p=pdclib;a=blobdiff_plain;f=functions%2Fstring%2Fstrtok.c;h=4d371afe29b0a6f392f4d5540b65a09e74c58e05;hp=70d2cd702fe196b7bf8d2a68a078312bdadc3681;hb=bdaff7ee88189505e6b66699571034aed015a3bd;hpb=1d9d92ba957a0b8307c9a65c35867fde68e6533b diff --git a/functions/string/strtok.c b/functions/string/strtok.c index 70d2cd7..4d371af 100644 --- a/functions/string/strtok.c +++ b/functions/string/strtok.c @@ -1,39 +1,75 @@ -/* ---------------------------------------------------------------------------- - * $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 ) +/* $Id$ */ + +/* Release $Name$ */ + +/* 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 + +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; + size_t len; - if ( src != NULL ) + if ( s1 != NULL ) { /* new string */ - store = src; + tmp = s1; + } + else + { + /* old string continued */ + if ( tmp == NULL ) + { + /* No old string, no new string, nothing to do */ + return NULL; + } + s1 = tmp; } - if ( store == NULL ) + + /* skipping leading s2 characters */ + while ( *p && *s1 ) { - /* no old string, no new string, nothing to do */ - return NULL; + if ( *s1 == *p ) + { + /* found seperator; skip and start over */ + ++s1; + p = s2; + continue; + } + ++p; } - src += strspn( src, seperators ); /* skipping leading seperators */ - if ( strlen( src ) == 0 ) + + 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 */ + return ( tmp = NULL ); } + +#warning Test driver missing.