]> pd.if.org Git - pdclib/blobdiff - functions/string/strtok.c
PDCLib includes with quotes, not <>.
[pdclib] / functions / string / strtok.c
index 70d2cd702fe196b7bf8d2a68a078312bdadc3681..3c427c549c9ea0b87e6851a7862f3c77a78b7e8d 100644 (file)
-/* ----------------------------------------------------------------------------
- * $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 <string.h>
+
+#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