1 /*
2 * Copyright 1993 OpenVision Technologies, Inc., All Rights Reserved
3 *
4 */
5
6 /*
7 * Copyright (c) 1988 Regents of the University of California.
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms are permitted
11 * provided that: (1) source distributions retain this entire copyright
12 * notice and comment, and (2) distributions including binaries display
13 * the following acknowledgement: ``This product includes software
14 * developed by the University of California, Berkeley and its contributors''
15 * in the documentation or other materials provided with the distribution
16 * and in all advertising materials mentioning features or use of this
17 * software. Neither the name of the University nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
21 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
22 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
23 */
24
25 #include <stddef.h>
26 #include <string.h>
27 #include "nstrtok.h"
28
29 /*
30 * Function: nstrtok
31 *
32 * Purpose: the same as strtok ... just different. does not deal with
33 * multiple tokens in row.
34 *
35 * Arguments:
36 * s (input) string to scan
37 * delim (input) list of delimiters
38 * <return value> string or null on error.
39 *
40 * Requires:
41 * nuttin
42 *
43 * Effects:
44 * sets last to string
45 *
46 * Modifies:
47 * last
48 *
49 */
50
51 char *
nstrtok(s,delim)52 nstrtok(s, delim)
53 register char *s;
54 register const char *delim;
55 {
56 register const char *spanp;
57 register int c, sc;
58 char *tok;
59 static char *last;
60
61
62 if (s == NULL && (s = last) == NULL)
63 return (NULL);
64
65 /*
66 * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
67 */
68 #ifdef OLD
69 cont:
70 c = *s++;
71 for (spanp = delim; (sc = *spanp++) != 0;) {
72 if (c == sc)
73 goto cont;
74 }
75
76 if (c == 0) { /* no non-delimiter characters */
77 last = NULL;
78 return (NULL);
79 }
80 tok = s - 1;
81 #else
82 tok = s;
83 #endif
84
85 /*
86 * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
87 * Note that delim must have one NUL; we stop if we see that, too.
88 */
89 for (;;) {
90 c = *s++;
91 spanp = delim;
92 do {
93 if ((sc = *spanp++) == c) {
94 if (c == 0)
95 s = NULL;
96 else
97 s[-1] = 0;
98 last = s;
99 return (tok);
100 }
101 } while (sc != 0);
102 }
103 /* NOTREACHED */
104 }
105
106