]> pd.if.org Git - pdclib/blobdiff - functions/string/strtok.c
Re-import from Subversion.
[pdclib] / functions / string / strtok.c
index 1828f3949a6fab297e27f0cf6d7b354168ec6fcc..70d2cd702fe196b7bf8d2a68a078312bdadc3681 100644 (file)
@@ -1,31 +1,39 @@
-// ----------------------------------------------------------------------------
-// $Id$
-// ----------------------------------------------------------------------------
-// Public Domain C Library - http://pdclib.sourceforge.net
-// This code is Public Domain. Use, modify, and redistribute at will.
-// ----------------------------------------------------------------------------
+/* ----------------------------------------------------------------------------
+ * $Id$
+ * ----------------------------------------------------------------------------
+ * Public Domain C Library - http://pdclib.sourceforge.net
+ * This code is Public Domain. Use, modify, and redistribute at will.
+ * --------------------------------------------------------------------------*/
 
-char * strtok( char * restrict s1, const char * restrict s2 ) { /* TODO */ };
-
-/* PDPC code - unreviewed
+char * strtok( char * restrict src, const char * restrict seperators )
 {
-    static char *old = NULL;
-    char *p;
-    size_t len;
-    size_t remain;
-    
-    if (s1 != NULL) old = s1;
-    if (old == NULL) return (NULL);
-    p = old;
-    len = strspn(p, s2);
-    remain = strlen(p);
-    if (remain <= len) { old = NULL; return (NULL); }
-    p += len;
-    len = strcspn(p, s2);
-    remain = strlen(p);
-    if (remain <= len) { old = NULL; return (p); }
-    *(p + len) = '\0';
-    old = p + len + 1;
-    return (p);
+    static char * store = NULL;
+    size_t token_length;
+
+    if ( src != NULL )
+    {
+        /* new string */
+        store = src;
+    }
+    if ( store == NULL )
+    {
+        /* no old string, no new string, nothing to do */
+        return NULL;
+    }
+    src += strspn( src, seperators ); /* skipping leading seperators */
+    if ( strlen( src ) == 0 )
+    {
+        /* no more to parse */
+        return ( store = NULL );
+    }
+    token_length = strcspn( src, seperators );
+    if ( src[ token_length ] == '\0' )
+    {
+        /* parsed to end of string */
+        store = NULL;
+        return src;
+    }
+    src[ token_length ] = '\0';
+    store = src + token_length + 1;
+    return src;
 }
-*/