* sysdeps/alpha/__longjmp.c (__longjmp): Take out const.
[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
5 modify it under the terms of the GNU Library General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) 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 GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public
15 License along with the GNU C Library; see the file COPYING.LIB.  If
16 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
17 Cambridge, MA 02139, USA.  */
18
19 #include <ansidecl.h>
20 #include <errno.h>
21 #include <string.h>
22
23
24 static char *olds = NULL;
25
26 /* Parse S into tokens separated by characters in DELIM.
27    If S is NULL, the last string strtok() was called with is
28    used.  For example:
29         char s[] = "-abc=-def";
30         x = strtok(s, "-");             // x = "abc"
31         x = strtok(NULL, "=-");         // x = "def"
32         x = strtok(NULL, "=");          // x = NULL
33                 // s = "abc\0-def\0"
34 */
35 char *
36 DEFUN(strtok, (s, delim),
37       register char *s AND register CONST char *delim)
38 {
39   char *token;
40
41   if (s == NULL)
42     {
43       if (olds == NULL)
44         {
45           errno = EINVAL;
46           return NULL;
47         }
48       else
49         s = olds;
50     }
51
52   /* Scan leading delimiters.  */
53   s += strspn(s, delim);
54   if (*s == '\0')
55     {
56       olds = NULL;
57       return NULL;
58     }
59
60   /* Find the end of the token.  */
61   token = s;
62   s = strpbrk(token, delim);
63   if (s == NULL)
64     /* This token finishes the string.  */
65     olds = NULL;
66   else
67     {
68       /* Terminate the token and make OLDS point past it.  */
69       *s = '\0';
70       olds = s + 1;
71     }
72   return token;
73 }