date and time created 90/05/15 14:01:13 by bostic
[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)
e6b5cdc0 19static char sccsid[] = "@(#)strtok.c 5.5 (Berkeley) %G%";
317e5946 20#endif /* LIBC_SCCS and not lint */
5afa231a 21
e6b5cdc0
KB
22#include <stdio.h>
23
5afa231a 24char *
e6b5cdc0
KB
25strtok(s, delim)
26 register char *s, *delim;
5afa231a 27{
e6b5cdc0
KB
28 register char *spanp;
29 register int c, sc;
30 char *tok;
31 static char *last;
32
5afa231a 33
e6b5cdc0
KB
34 if (s == NULL && (s = last) == NULL)
35 return (NULL);
36
37 /*
38 * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
39 */
40cont:
41 c = *s++;
42 for (spanp = delim; (sc = *spanp++) != 0;) {
43 if (c == sc)
44 goto cont;
5afa231a
RE
45 }
46
e6b5cdc0
KB
47 if (c == 0) { /* no non-delimiter characters */
48 last = NULL;
49 return (NULL);
50 }
51 tok = s - 1;
5afa231a 52
e6b5cdc0
KB
53 /*
54 * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
55 * Note that delim must have one NUL; we stop if we see that, too.
56 */
57 for (;;) {
58 c = *s++;
59 spanp = delim;
60 do {
61 if ((sc = *spanp++) == c) {
62 if (c == 0)
63 s = NULL;
64 else
65 s[-1] = 0;
66 last = s;
67 return (tok);
68 }
69 } while (sc != 0);
5afa231a 70 }
e6b5cdc0 71 /* NOTREACHED */
5afa231a 72}