~ubuntu-branches/ubuntu/saucy/emscripten/saucy-proposed

« back to all changes in this revision

Viewing changes to src/library_strtok_r.c

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2013-05-02 13:11:51 UTC
  • Revision ID: package-import@ubuntu.com-20130502131151-q8dvteqr1ef2x7xz
Tags: upstream-1.4.1~20130504~adb56cb
ImportĀ upstreamĀ versionĀ 1.4.1~20130504~adb56cb

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) 1988 Regents of the University of California.
 
3
 * All rights reserved.
 
4
 *
 
5
 * Redistribution and use in source and binary forms, with or without
 
6
 * modification, are permitted provided that the following conditions
 
7
 * are met:
 
8
 * 1. Redistributions of source code must retain the above copyright
 
9
 *    notice, this list of conditions and the following disclaimer.
 
10
 * 2. Redistributions in binary form must reproduce the above copyright
 
11
 *    notice, this list of conditions and the following disclaimer in the
 
12
 *    documentation and/or other materials provided with the distribution.
 
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
 
15
 *    without specific prior written permission.
 
16
 *
 
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
 
19
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 
20
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 
21
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 
22
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 
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
 
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
 
27
 * SUCH DAMAGE.
 
28
 */
 
29
 
 
30
/*
 
31
 * Minor modifications made for Emscripten to get this to compile
 
32
 * standalone. All changes under the same license as above.
 
33
 */
 
34
 
 
35
#include <string.h>
 
36
 
 
37
char *
 
38
strtok_r(
 
39
        register char *s ,
 
40
        register const char *delim ,
 
41
        char **lasts
 
42
)
 
43
{
 
44
        int skip_leading_delim = 1;
 
45
        register char *spanp;
 
46
        register int c, sc;
 
47
        char *tok;
 
48
 
 
49
 
 
50
        if (s == NULL && (s = *lasts) == NULL)
 
51
                return (NULL);
 
52
 
 
53
        /*
 
54
         * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
 
55
         */
 
56
cont:
 
57
        c = *s++;
 
58
        for (spanp = (char *)delim; (sc = *spanp++) != 0;) {
 
59
                if (c == sc) {
 
60
                        if (skip_leading_delim) {
 
61
                                goto cont;
 
62
                        }
 
63
                        else {
 
64
                                *lasts = s;
 
65
                                s[-1] = 0;
 
66
                                return (s - 1);
 
67
                        }
 
68
                }
 
69
        }
 
70
 
 
71
        if (c == 0) {           /* no non-delimiter characters */
 
72
                *lasts = NULL;
 
73
                return (NULL);
 
74
        }
 
75
        tok = s - 1;
 
76
 
 
77
        /*
 
78
         * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
 
79
         * Note that delim must have one NUL; we stop if we see that, too.
 
80
         */
 
81
        for (;;) {
 
82
                c = *s++;
 
83
                spanp = (char *)delim;
 
84
                do {
 
85
                        if ((sc = *spanp++) == c) {
 
86
                                if (c == 0)
 
87
                                        s = NULL;
 
88
                                else
 
89
                                        s[-1] = 0;
 
90
                                *lasts = s;
 
91
                                return (tok);
 
92
                        }
 
93
                } while (sc != 0);
 
94
        }
 
95
        /* NOTREACHED */
 
96
}
 
97