rev |
line source |
yuuji@0
|
1 /* ========================================================================
|
yuuji@0
|
2 * Copyright 1988-2007 University of Washington
|
yuuji@0
|
3 *
|
yuuji@0
|
4 * Licensed under the Apache License, Version 2.0 (the "License");
|
yuuji@0
|
5 * you may not use this file except in compliance with the License.
|
yuuji@0
|
6 * You may obtain a copy of the License at
|
yuuji@0
|
7 *
|
yuuji@0
|
8 * http://www.apache.org/licenses/LICENSE-2.0
|
yuuji@0
|
9 *
|
yuuji@0
|
10 *
|
yuuji@0
|
11 * ========================================================================
|
yuuji@0
|
12 */
|
yuuji@0
|
13
|
yuuji@0
|
14 /*
|
yuuji@0
|
15 * Program: String return successive tokens
|
yuuji@0
|
16 *
|
yuuji@0
|
17 * Author: Mark Crispin
|
yuuji@0
|
18 * Networks and Distributed Computing
|
yuuji@0
|
19 * Computing & Communications
|
yuuji@0
|
20 * University of Washington
|
yuuji@0
|
21 * Administration Building, AG-44
|
yuuji@0
|
22 * Seattle, WA 98195
|
yuuji@0
|
23 *
|
yuuji@0
|
24 * Date: 11 May 1989
|
yuuji@0
|
25 * Last Edited: 30 January 2007
|
yuuji@0
|
26 */
|
yuuji@0
|
27
|
yuuji@0
|
28 /* Find token in string
|
yuuji@0
|
29 * Accepts: source pointer or NIL to use previous source
|
yuuji@0
|
30 * vector of token delimiters pointer
|
yuuji@0
|
31 * Returns: pointer to next token
|
yuuji@0
|
32 */
|
yuuji@0
|
33
|
yuuji@0
|
34 static char *state = NIL; /* string to locate tokens */
|
yuuji@0
|
35
|
yuuji@0
|
36 char *strtok (char *s,char *ct)
|
yuuji@0
|
37 {
|
yuuji@0
|
38 return strtok_r (s,ct,&state);/* jacket into reentrant routine */
|
yuuji@0
|
39 }
|
yuuji@0
|
40
|
yuuji@0
|
41
|
yuuji@0
|
42 /* Find token in string (reentrant)
|
yuuji@0
|
43 * Accepts: source pointer or NIL to use previous source
|
yuuji@0
|
44 * vector of token delimiters pointer
|
yuuji@0
|
45 * returned state pointer
|
yuuji@0
|
46 * Returns: pointer to next token
|
yuuji@0
|
47 */
|
yuuji@0
|
48
|
yuuji@0
|
49 char *strtok_r (char *s,char *ct,char **r)
|
yuuji@0
|
50 {
|
yuuji@0
|
51 char *t,*ts;
|
yuuji@0
|
52 if (!s) s = *r; /* use previous token if none specified */
|
yuuji@0
|
53 *r = NIL; /* default to no returned state */
|
yuuji@0
|
54 if (!(s && *s)) return NIL; /* no tokens left */
|
yuuji@0
|
55 /* find any leading delimiters */
|
yuuji@0
|
56 do for (t = ct, ts = NIL; *t; t++) if (*t == *s) {
|
yuuji@0
|
57 if (*(ts = ++s)) break; /* yes, restart search if more in string */
|
yuuji@0
|
58 return NIL; /* else no more tokens */
|
yuuji@0
|
59 } while (ts); /* continue until no more leading delimiters */
|
yuuji@0
|
60 /* can we find a new delimiter? */
|
yuuji@0
|
61 for (ts = s; *ts; ts++) for (t = ct; *t; t++) if (*t == *ts) {
|
yuuji@0
|
62 *ts++ = '\0'; /* yes, tie off token at that point */
|
yuuji@0
|
63 *r = ts; /* save subsequent tokens for future call */
|
yuuji@0
|
64 return s; /* return our token */
|
yuuji@0
|
65 }
|
yuuji@0
|
66 return s; /* return final token */
|
yuuji@0
|
67 }
|