1*e906cbe7SJorge Ramirez-Ortiz /*
2*e906cbe7SJorge Ramirez-Ortiz * Copyright (c) 1988 Regents of the University of California.
3*e906cbe7SJorge Ramirez-Ortiz * All rights reserved.
4*e906cbe7SJorge Ramirez-Ortiz *
5*e906cbe7SJorge Ramirez-Ortiz * Redistribution and use in source and binary forms, with or without
6*e906cbe7SJorge Ramirez-Ortiz * modification, are permitted provided that the following conditions
7*e906cbe7SJorge Ramirez-Ortiz * are met:
8*e906cbe7SJorge Ramirez-Ortiz * 1. Redistributions of source code must retain the above copyright
9*e906cbe7SJorge Ramirez-Ortiz * notice, this list of conditions and the following disclaimer.
10*e906cbe7SJorge Ramirez-Ortiz * 2. Redistributions in binary form must reproduce the above copyright
11*e906cbe7SJorge Ramirez-Ortiz * notice, this list of conditions and the following disclaimer in the
12*e906cbe7SJorge Ramirez-Ortiz * documentation and/or other materials provided with the distribution.
13*e906cbe7SJorge Ramirez-Ortiz * 3. Neither the name of the University nor the names of its contributors
14*e906cbe7SJorge Ramirez-Ortiz * may be used to endorse or promote products derived from this software
15*e906cbe7SJorge Ramirez-Ortiz * without specific prior written permission.
16*e906cbe7SJorge Ramirez-Ortiz *
17*e906cbe7SJorge Ramirez-Ortiz * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18*e906cbe7SJorge Ramirez-Ortiz * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19*e906cbe7SJorge Ramirez-Ortiz * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20*e906cbe7SJorge Ramirez-Ortiz * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21*e906cbe7SJorge Ramirez-Ortiz * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*e906cbe7SJorge Ramirez-Ortiz * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23*e906cbe7SJorge Ramirez-Ortiz * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24*e906cbe7SJorge Ramirez-Ortiz * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25*e906cbe7SJorge Ramirez-Ortiz * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26*e906cbe7SJorge Ramirez-Ortiz * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27*e906cbe7SJorge Ramirez-Ortiz * SUCH DAMAGE.
28*e906cbe7SJorge Ramirez-Ortiz */
29*e906cbe7SJorge Ramirez-Ortiz
30*e906cbe7SJorge Ramirez-Ortiz #include <string.h>
31*e906cbe7SJorge Ramirez-Ortiz
32*e906cbe7SJorge Ramirez-Ortiz static char *
__strtok_r(register char * s,register const char * delim,char ** lasts,int skip_leading_delim)33*e906cbe7SJorge Ramirez-Ortiz __strtok_r (register char *s,
34*e906cbe7SJorge Ramirez-Ortiz register const char *delim,
35*e906cbe7SJorge Ramirez-Ortiz char **lasts,
36*e906cbe7SJorge Ramirez-Ortiz int skip_leading_delim)
37*e906cbe7SJorge Ramirez-Ortiz {
38*e906cbe7SJorge Ramirez-Ortiz register char *spanp;
39*e906cbe7SJorge Ramirez-Ortiz register int c, sc;
40*e906cbe7SJorge Ramirez-Ortiz char *tok;
41*e906cbe7SJorge Ramirez-Ortiz
42*e906cbe7SJorge Ramirez-Ortiz
43*e906cbe7SJorge Ramirez-Ortiz if (s == NULL && (s = *lasts) == NULL)
44*e906cbe7SJorge Ramirez-Ortiz return (NULL);
45*e906cbe7SJorge Ramirez-Ortiz
46*e906cbe7SJorge Ramirez-Ortiz /*
47*e906cbe7SJorge Ramirez-Ortiz * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
48*e906cbe7SJorge Ramirez-Ortiz */
49*e906cbe7SJorge Ramirez-Ortiz cont:
50*e906cbe7SJorge Ramirez-Ortiz c = *s++;
51*e906cbe7SJorge Ramirez-Ortiz for (spanp = (char *)delim; (sc = *spanp++) != 0;) {
52*e906cbe7SJorge Ramirez-Ortiz if (c == sc) {
53*e906cbe7SJorge Ramirez-Ortiz if (skip_leading_delim) {
54*e906cbe7SJorge Ramirez-Ortiz goto cont;
55*e906cbe7SJorge Ramirez-Ortiz }
56*e906cbe7SJorge Ramirez-Ortiz else {
57*e906cbe7SJorge Ramirez-Ortiz *lasts = s;
58*e906cbe7SJorge Ramirez-Ortiz s[-1] = 0;
59*e906cbe7SJorge Ramirez-Ortiz return (s - 1);
60*e906cbe7SJorge Ramirez-Ortiz }
61*e906cbe7SJorge Ramirez-Ortiz }
62*e906cbe7SJorge Ramirez-Ortiz }
63*e906cbe7SJorge Ramirez-Ortiz
64*e906cbe7SJorge Ramirez-Ortiz if (c == 0) { /* no non-delimiter characters */
65*e906cbe7SJorge Ramirez-Ortiz *lasts = NULL;
66*e906cbe7SJorge Ramirez-Ortiz return (NULL);
67*e906cbe7SJorge Ramirez-Ortiz }
68*e906cbe7SJorge Ramirez-Ortiz tok = s - 1;
69*e906cbe7SJorge Ramirez-Ortiz
70*e906cbe7SJorge Ramirez-Ortiz /*
71*e906cbe7SJorge Ramirez-Ortiz * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
72*e906cbe7SJorge Ramirez-Ortiz * Note that delim must have one NUL; we stop if we see that, too.
73*e906cbe7SJorge Ramirez-Ortiz */
74*e906cbe7SJorge Ramirez-Ortiz for (;;) {
75*e906cbe7SJorge Ramirez-Ortiz c = *s++;
76*e906cbe7SJorge Ramirez-Ortiz spanp = (char *)delim;
77*e906cbe7SJorge Ramirez-Ortiz do {
78*e906cbe7SJorge Ramirez-Ortiz if ((sc = *spanp++) == c) {
79*e906cbe7SJorge Ramirez-Ortiz if (c == 0)
80*e906cbe7SJorge Ramirez-Ortiz s = NULL;
81*e906cbe7SJorge Ramirez-Ortiz else
82*e906cbe7SJorge Ramirez-Ortiz s[-1] = 0;
83*e906cbe7SJorge Ramirez-Ortiz *lasts = s;
84*e906cbe7SJorge Ramirez-Ortiz return (tok);
85*e906cbe7SJorge Ramirez-Ortiz }
86*e906cbe7SJorge Ramirez-Ortiz } while (sc != 0);
87*e906cbe7SJorge Ramirez-Ortiz }
88*e906cbe7SJorge Ramirez-Ortiz /* NOTREACHED */
89*e906cbe7SJorge Ramirez-Ortiz }
90*e906cbe7SJorge Ramirez-Ortiz
91*e906cbe7SJorge Ramirez-Ortiz char *
strtok_r(register char * __restrict s,register const char * __restrict delim,char ** __restrict lasts)92*e906cbe7SJorge Ramirez-Ortiz strtok_r (register char *__restrict s,
93*e906cbe7SJorge Ramirez-Ortiz register const char *__restrict delim,
94*e906cbe7SJorge Ramirez-Ortiz char **__restrict lasts)
95*e906cbe7SJorge Ramirez-Ortiz {
96*e906cbe7SJorge Ramirez-Ortiz return __strtok_r (s, delim, lasts, 1);
97*e906cbe7SJorge Ramirez-Ortiz }
98