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