]> pd.if.org Git - pdclib.old/blob - functions/wchar/wcstok.c
PDCLIB-2 c16rtomb never cleared _Surrogate
[pdclib.old] / functions / wchar / wcstok.c
1 /* wcstok( wchar_t *, const wchar_t * )\r
2 \r
3    This file is part of the Public Domain C Library (PDCLib).\r
4    Permission is granted to use, modify, and / or redistribute at will.\r
5 */\r
6 \r
7 #include <wchar.h>\r
8 \r
9 #ifndef REGTEST\r
10 \r
11 wchar_t * wcstok( wchar_t * _PDCLIB_restrict s1, \r
12                   const wchar_t * _PDCLIB_restrict s2,\r
13                   wchar_t ** _PDCLIB_restrict ptr )\r
14 {\r
15     const wchar_t * p = s2;\r
16 \r
17     if ( s1 != NULL )\r
18     {\r
19         /* new string */\r
20         *ptr = s1;\r
21     }\r
22     else\r
23     {\r
24         /* old string continued */\r
25         if ( *ptr == NULL )\r
26         {\r
27             /* No old string, no new string, nothing to do */\r
28             return NULL;\r
29         }\r
30         s1 = *ptr;\r
31     }\r
32 \r
33     /* skipping leading s2 characters */\r
34     while ( *p && *s1 )\r
35     {\r
36         if ( *s1 == *p )\r
37         {\r
38             /* found seperator; skip and start over */\r
39             ++s1;\r
40             p = s2;\r
41             continue;\r
42         }\r
43         ++p;\r
44     }\r
45 \r
46     if ( ! *s1 )\r
47     {\r
48         /* no more to parse */\r
49         return ( *ptr = NULL );\r
50     }\r
51 \r
52     /* skipping non-s2 characters */\r
53     *ptr = s1;\r
54     while ( **ptr )\r
55     {\r
56         p = s2;\r
57         while ( *p )\r
58         {\r
59             if ( **ptr == *p++ )\r
60             {\r
61                 /* found seperator; overwrite with '\0', position *ptr, return */\r
62                 *(*ptr)++ = L'\0';\r
63                 return s1;\r
64             }\r
65         }\r
66         ++(*ptr);\r
67     }\r
68 \r
69     /* parsed to end of string */\r
70     *ptr = NULL;\r
71     return s1;\r
72 }\r
73 \r
74 #endif\r
75 \r
76 #ifdef TEST\r
77 #include <_PDCLIB_test.h>\r
78 \r
79 int main( void )\r
80 {\r
81     // MinGW at least has a very nonconforming (different signature!) variety\r
82     // of wcstok\r
83 #ifndef REGTEST\r
84     wchar_t s[] = L"_a_bc__d_";\r
85     wchar_t* state  = NULL;\r
86     wchar_t* tokres;\r
87 \r
88     TESTCASE( ( tokres = wcstok( s, L"_", &state ) ) == &s[1] );\r
89     TESTCASE( s[1] == L'a' );\r
90     TESTCASE( s[2] == L'\0' );\r
91     TESTCASE( ( tokres = wcstok( NULL, L"_", &state ) ) == &s[3] );\r
92     TESTCASE( s[3] == L'b' );\r
93     TESTCASE( s[4] == L'c' );\r
94     TESTCASE( s[5] == L'\0' );\r
95     TESTCASE( ( tokres = wcstok( NULL, L"_", &state ) ) == &s[7] );\r
96     TESTCASE( s[6] == L'_' );\r
97     TESTCASE( s[7] == L'd' );\r
98     TESTCASE( s[8] == L'\0' );\r
99     TESTCASE( ( tokres = wcstok( NULL, L"_", &state ) ) == NULL );\r
100     wcscpy( s, L"ab_cd" );\r
101     TESTCASE( ( tokres = wcstok( s, L"_", &state ) ) == &s[0] );\r
102     TESTCASE( s[0] == L'a' );\r
103     TESTCASE( s[1] == L'b' );\r
104     TESTCASE( s[2] == L'\0' );\r
105     TESTCASE( ( tokres = wcstok( NULL, L"_", &state ) ) == &s[3] );\r
106     TESTCASE( s[3] == L'c' );\r
107     TESTCASE( s[4] == L'd' );\r
108     TESTCASE( s[5] == L'\0' );\r
109     TESTCASE( ( tokres = wcstok( NULL, L"_", &state ) ) == NULL );\r
110 #endif\r
111     return TEST_RESULTS;\r
112 }\r
113 #endif\r