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