keep string.h and source in sync
[unix-history] / usr / src / lib / libc / string / strtok.c
CommitLineData
5afa231a 1/*
e6b5cdc0 2 * Copyright (c) 1988 Regents of the University of California.
317e5946
KB
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are permitted
50c7758a
KB
6 * provided that the above copyright notice and this paragraph are
7 * duplicated in all such forms and that any documentation,
8 * advertising materials, and other materials related to such
9 * distribution and use acknowledge that the software was developed
10 * by the University of California, Berkeley. The name of the
11 * University may not be used to endorse or promote products derived
12 * from this software without specific prior written permission.
13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
5afa231a
RE
16 */
17
2ce81398 18#if defined(LIBC_SCCS) && !defined(lint)
336401ac 19static char sccsid[] = "@(#)strtok.c 5.6 (Berkeley) %G%";
317e5946 20#endif /* LIBC_SCCS and not lint */
5afa231a 21
336401ac
KB
22#include <stddef.h>
23#include <string.h>
e6b5cdc0 24
5afa231a 25char *
e6b5cdc0
KB
26strtok(s, delim)
27 register char *s, *delim;
5afa231a 28{
e6b5cdc0
KB
29 register char *spanp;
30 register int c, sc;
31 char *tok;
32 static char *last;
33
5afa231a 34
e6b5cdc0
KB
35 if (s == NULL && (s = last) == NULL)
36 return (NULL);
37
38 /*
39 * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
40 */
41cont:
42 c = *s++;
43 for (spanp = delim; (sc = *spanp++) != 0;) {
44 if (c == sc)
45 goto cont;
5afa231a
RE
46 }
47
e6b5cdc0
KB
48 if (c == 0) { /* no non-delimiter characters */
49 last = NULL;
50 return (NULL);
51 }
52 tok = s - 1;
5afa231a 53
e6b5cdc0
KB
54 /*
55 * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
56 * Note that delim must have one NUL; we stop if we see that, too.
57 */
58 for (;;) {
59 c = *s++;
60 spanp = delim;
61 do {
62 if ((sc = *spanp++) == c) {
63 if (c == 0)
64 s = NULL;
65 else
66 s[-1] = 0;
67 last = s;
68 return (tok);
69 }
70 } while (sc != 0);
5afa231a 71 }
e6b5cdc0 72 /* NOTREACHED */
5afa231a 73}