update for HEAD-2003091401
[reactos.git] / lib / msvcrt / string / strtok.c
1 /* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
2 #include <msvcrt/string.h>
3 #include <msvcrt/internal/tls.h>
4
5 char** _lasttoken(); /* lasttok.c */
6
7 /*
8  * @implemented
9  */
10 char* strtok(char* s, const char* delim)
11 {
12   const char *spanp;
13   int c, sc;
14   char *tok;
15 #if 1
16   char ** lasttoken = _lasttoken();
17 #else
18   PTHREADDATA ThreadData = GetThreadData();
19   char ** lasttoken = &ThreadData->lasttoken;
20 #endif
21
22   if (s == NULL && (s = *lasttoken) == NULL)
23     return (NULL);
24
25   /*
26    * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
27    */
28  cont:
29   c = *s++;
30   for (spanp = delim; (sc = *spanp++) != 0;) {
31     if (c == sc)
32       goto cont;
33   }
34
35   if (c == 0) {                 /* no non-delimiter characters */
36     *lasttoken = NULL;
37     return (NULL);
38   }
39   tok = s - 1;
40
41   /*
42    * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
43    * Note that delim must have one NUL; we stop if we see that, too.
44    */
45   for (;;) {
46     c = *s++;
47     spanp = delim;
48     do {
49       if ((sc = *spanp++) == c) {
50         if (c == 0)
51           s = NULL;
52         else
53           s[-1] = 0;
54         *lasttoken = s;
55         return (tok);
56       }
57     } while (sc != 0);
58   }
59   /* NOTREACHED */
60 }