:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[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 *strtok(char *s, const char *delim)
6 {
7   const char *spanp;
8   int c, sc;
9   char *tok;
10   PTHREADDATA ThreadData = GetThreadData();
11
12   if (s == NULL && (s = ThreadData->lasttoken) == NULL)
13     return (NULL);
14
15   /*
16    * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
17    */
18  cont:
19   c = *s++;
20   for (spanp = delim; (sc = *spanp++) != 0;) {
21     if (c == sc)
22       goto cont;
23   }
24
25   if (c == 0) {                 /* no non-delimiter characters */
26     ThreadData->lasttoken = NULL;
27     return (NULL);
28   }
29   tok = s - 1;
30
31   /*
32    * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
33    * Note that delim must have one NUL; we stop if we see that, too.
34    */
35   for (;;) {
36     c = *s++;
37     spanp = delim;
38     do {
39       if ((sc = *spanp++) == c) {
40         if (c == 0)
41           s = NULL;
42         else
43           s[-1] = 0;
44         ThreadData->lasttoken = s;
45         return (tok);
46       }
47     } while (sc != 0);
48   }
49   /* NOTREACHED */
50 }