]> pd.if.org Git - pdclib/blobdiff - functions/wchar/wcstok.c
PDCLIB-2: Pure wide character functions
[pdclib] / functions / wchar / wcstok.c
diff --git a/functions/wchar/wcstok.c b/functions/wchar/wcstok.c
new file mode 100644 (file)
index 0000000..62f8dd8
--- /dev/null
@@ -0,0 +1,109 @@
+/* wcstok( wchar_t *, const wchar_t * )\r
+\r
+   This file is part of the Public Domain C Library (PDCLib).\r
+   Permission is granted to use, modify, and / or redistribute at will.\r
+*/\r
+\r
+#include <wchar.h>\r
+\r
+#ifndef REGTEST\r
+\r
+wchar_t * wcstok( wchar_t * _PDCLIB_restrict s1, \r
+                  const wchar_t * _PDCLIB_restrict s2,\r
+                  wchar_t ** _PDCLIB_restrict ptr )\r
+{\r
+    const wchar_t * p = s2;\r
+\r
+    if ( s1 != NULL )\r
+    {\r
+        /* new string */\r
+        *ptr = s1;\r
+    }\r
+    else\r
+    {\r
+        /* old string continued */\r
+        if ( *ptr == NULL )\r
+        {\r
+            /* No old string, no new string, nothing to do */\r
+            return NULL;\r
+        }\r
+        s1 = *ptr;\r
+    }\r
+\r
+    /* skipping leading s2 characters */\r
+    while ( *p && *s1 )\r
+    {\r
+        if ( *s1 == *p )\r
+        {\r
+            /* found seperator; skip and start over */\r
+            ++s1;\r
+            p = s2;\r
+            continue;\r
+        }\r
+        ++p;\r
+    }\r
+\r
+    if ( ! *s1 )\r
+    {\r
+        /* no more to parse */\r
+        return ( *ptr = NULL );\r
+    }\r
+\r
+    /* skipping non-s2 characters */\r
+    *ptr = s1;\r
+    while ( **ptr )\r
+    {\r
+        p = s2;\r
+        while ( *p )\r
+        {\r
+            if ( **ptr == *p++ )\r
+            {\r
+                /* found seperator; overwrite with '\0', position *ptr, return */\r
+                *(*ptr)++ = L'\0';\r
+                return s1;\r
+            }\r
+        }\r
+        ++(*ptr);\r
+    }\r
+\r
+    /* parsed to end of string */\r
+    *ptr = NULL;\r
+    return s1;\r
+}\r
+\r
+#endif\r
+\r
+#ifdef TEST\r
+#include <_PDCLIB_test.h>\r
+\r
+int main( void )\r
+{\r
+    wchar_t s[] = L"_a_bc__d_";\r
+    wchar_t* state  = NULL;\r
+    wchar_t* tokres;\r
+\r
+    TESTCASE( ( tokres = wcstok( s, L"_", &state ) ) == &s[1] );\r
+    TESTCASE( s[1] == L'a' );\r
+    TESTCASE( s[2] == L'\0' );\r
+    TESTCASE( ( tokres = wcstok( NULL, L"_", &state ) ) == &s[3] );\r
+    TESTCASE( s[3] == L'b' );\r
+    TESTCASE( s[4] == L'c' );\r
+    TESTCASE( s[5] == L'\0' );\r
+    TESTCASE( ( tokres = wcstok( NULL, L"_", &state ) ) == &s[7] );\r
+    TESTCASE( s[6] == L'_' );\r
+    TESTCASE( s[7] == L'd' );\r
+    TESTCASE( s[8] == L'\0' );\r
+    TESTCASE( ( tokres = wcstok( NULL, L"_", &state ) ) == NULL );\r
+    wcscpy( s, L"ab_cd" );\r
+    TESTCASE( ( tokres = wcstok( s, L"_", &state ) ) == &s[0] );\r
+    TESTCASE( s[0] == L'a' );\r
+    TESTCASE( s[1] == L'b' );\r
+    TESTCASE( s[2] == L'\0' );\r
+    TESTCASE( ( tokres = wcstok( NULL, L"_", &state ) ) == &s[3] );\r
+    TESTCASE( s[3] == L'c' );\r
+    TESTCASE( s[4] == L'd' );\r
+    TESTCASE( s[5] == L'\0' );\r
+    TESTCASE( ( tokres = wcstok( NULL, L"_", &state ) ) == NULL );\r
+    return TEST_RESULTS;\r
+}\r
+#endif\r