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