Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4973 | right-hear | 1 | /* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ |
2 | #include |
||
3 | |||
4 | char * |
||
5 | strtok(char *s, const char *delim) |
||
6 | { |
||
7 | const char *spanp; |
||
8 | int c, sc; |
||
9 | char *tok; |
||
10 | static char *last; |
||
11 | |||
12 | |||
13 | if (s == NULL && (s = last) == NULL) |
||
14 | return (NULL); |
||
15 | |||
16 | /* |
||
17 | * Skip (span) leading delimiters (s += strspn(s, delim), sort of). |
||
18 | */ |
||
19 | cont: |
||
20 | c = *s++; |
||
21 | for (spanp = delim; (sc = *spanp++) != 0;) { |
||
22 | if (c == sc) |
||
23 | goto cont; |
||
24 | } |
||
25 | |||
26 | if (c == 0) { /* no non-delimiter characters */ |
||
27 | last = NULL; |
||
28 | return (NULL); |
||
29 | } |
||
30 | tok = s - 1; |
||
31 | |||
32 | /* |
||
33 | * Scan token (scan for delimiters: s += strcspn(s, delim), sort of). |
||
34 | * Note that delim must have one NUL; we stop if we see that, too. |
||
35 | */ |
||
36 | for (;;) { |
||
37 | c = *s++; |
||
38 | spanp = delim; |
||
39 | do { |
||
40 | if ((sc = *spanp++) == c) { |
||
41 | if (c == 0) |
||
42 | s = NULL; |
||
43 | else |
||
44 | s[-1] = 0; |
||
45 | last = s; |
||
46 | return (tok); |
||
47 | } |
||
48 | } while (sc != 0); |
||
49 | } |
||
50 | /* NOTREACHED */ |
||
51 | } |