Initial revision
[kopensolaris-gnu/glibc.git] / string / strtok.c
1 /* Copyright (C) 1991 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 1, or (at your option)
7 any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with the GNU C Library; see the file COPYING.  If not, write to
16 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
17
18 #include <ansidecl.h>
19 #include <errno.h>
20 #include <string.h>
21
22
23 static char *olds = NULL;
24
25 /* Parse S into tokens separated by characters in DELIM.
26    If S is NULL, the last string strtok() was called with is
27    used.  For example:
28         char s[] = "-abc=-def";
29         x = strtok(s, "-");             // x = "abc"
30         x = strtok(NULL, "=-");         // x = "def"
31         x = strtok(NULL, "=");          // x = NULL
32                 // s = "abc\0-def\0"
33 */
34 char *
35 DEFUN(strtok, (s, delim),
36       register char *s AND register CONST char *delim)
37 {
38   char *token;
39
40   if (s == NULL)
41     {
42       if (olds == NULL)
43         {
44           errno = EINVAL;
45           return NULL;
46         }
47       else
48         s = olds;
49     }
50
51   /* Scan leading delimiters.  */
52   s += strspn(s, delim);
53   if (*s == '\0')
54     {
55       olds = NULL;
56       return NULL;
57     }
58
59   /* Find the end of the token.  */
60   token = s;
61   s = strpbrk(token, delim);
62   if (s == NULL)
63     /* This token finishes the string.  */
64     olds = NULL;
65   else
66     {
67       /* Terminate the token and make OLDS point past it.  */
68       *s = '\0';
69       olds = s + 1;
70     }
71   return token;
72 }