1*4a5d661aSToomas Soome /*- 2*4a5d661aSToomas Soome * Copyright (c) 1998 Softweyr LLC. All rights reserved. 3*4a5d661aSToomas Soome * 4*4a5d661aSToomas Soome * strtok_r, from Berkeley strtok 5*4a5d661aSToomas Soome * Oct 13, 1998 by Wes Peters <wes@softweyr.com> 6*4a5d661aSToomas Soome * 7*4a5d661aSToomas Soome * Copyright (c) 1988, 1993 8*4a5d661aSToomas Soome * The Regents of the University of California. All rights reserved. 9*4a5d661aSToomas Soome * 10*4a5d661aSToomas Soome * Redistribution and use in source and binary forms, with or without 11*4a5d661aSToomas Soome * modification, are permitted provided that the following conditions 12*4a5d661aSToomas Soome * are met: 13*4a5d661aSToomas Soome * 1. Redistributions of source code must retain the above copyright 14*4a5d661aSToomas Soome * notices, this list of conditions and the following disclaimer. 15*4a5d661aSToomas Soome * 2. Redistributions in binary form must reproduce the above copyright 16*4a5d661aSToomas Soome * notices, this list of conditions and the following disclaimer in the 17*4a5d661aSToomas Soome * documentation and/or other materials provided with the distribution. 18*4a5d661aSToomas Soome * 3. Neither the name of the University nor the names of its contributors 19*4a5d661aSToomas Soome * may be used to endorse or promote products derived from this software 20*4a5d661aSToomas Soome * without specific prior written permission. 21*4a5d661aSToomas Soome * 22*4a5d661aSToomas Soome * THIS SOFTWARE IS PROVIDED BY SOFTWEYR LLC, THE REGENTS AND CONTRIBUTORS 23*4a5d661aSToomas Soome * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 24*4a5d661aSToomas Soome * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 25*4a5d661aSToomas Soome * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SOFTWEYR LLC, THE 26*4a5d661aSToomas Soome * REGENTS, OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 27*4a5d661aSToomas Soome * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 28*4a5d661aSToomas Soome * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 29*4a5d661aSToomas Soome * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 30*4a5d661aSToomas Soome * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 31*4a5d661aSToomas Soome * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 32*4a5d661aSToomas Soome * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33*4a5d661aSToomas Soome */ 34*4a5d661aSToomas Soome 35*4a5d661aSToomas Soome #if defined(LIBC_SCCS) && !defined(lint) 36*4a5d661aSToomas Soome static char sccsid[] = "@(#)strtok.c 8.1 (Berkeley) 6/4/93"; 37*4a5d661aSToomas Soome #endif /* LIBC_SCCS and not lint */ 38*4a5d661aSToomas Soome #include <sys/cdefs.h> 39*4a5d661aSToomas Soome __FBSDID("$FreeBSD$"); 40*4a5d661aSToomas Soome 41*4a5d661aSToomas Soome #include <stddef.h> 42*4a5d661aSToomas Soome #ifdef DEBUG_STRTOK 43*4a5d661aSToomas Soome #include <stdio.h> 44*4a5d661aSToomas Soome #endif 45*4a5d661aSToomas Soome #include <string.h> 46*4a5d661aSToomas Soome 47*4a5d661aSToomas Soome char *__strtok_r(char *, const char *, char **); 48*4a5d661aSToomas Soome 49*4a5d661aSToomas Soome __weak_reference(__strtok_r, strtok_r); 50*4a5d661aSToomas Soome 51*4a5d661aSToomas Soome char * 52*4a5d661aSToomas Soome __strtok_r(char *s, const char *delim, char **last) 53*4a5d661aSToomas Soome { 54*4a5d661aSToomas Soome char *spanp, *tok; 55*4a5d661aSToomas Soome int c, sc; 56*4a5d661aSToomas Soome 57*4a5d661aSToomas Soome if (s == NULL && (s = *last) == NULL) 58*4a5d661aSToomas Soome return (NULL); 59*4a5d661aSToomas Soome 60*4a5d661aSToomas Soome /* 61*4a5d661aSToomas Soome * Skip (span) leading delimiters (s += strspn(s, delim), sort of). 62*4a5d661aSToomas Soome */ 63*4a5d661aSToomas Soome cont: 64*4a5d661aSToomas Soome c = *s++; 65*4a5d661aSToomas Soome for (spanp = (char *)delim; (sc = *spanp++) != 0;) { 66*4a5d661aSToomas Soome if (c == sc) 67*4a5d661aSToomas Soome goto cont; 68*4a5d661aSToomas Soome } 69*4a5d661aSToomas Soome 70*4a5d661aSToomas Soome if (c == 0) { /* no non-delimiter characters */ 71*4a5d661aSToomas Soome *last = NULL; 72*4a5d661aSToomas Soome return (NULL); 73*4a5d661aSToomas Soome } 74*4a5d661aSToomas Soome tok = s - 1; 75*4a5d661aSToomas Soome 76*4a5d661aSToomas Soome /* 77*4a5d661aSToomas Soome * Scan token (scan for delimiters: s += strcspn(s, delim), sort of). 78*4a5d661aSToomas Soome * Note that delim must have one NUL; we stop if we see that, too. 79*4a5d661aSToomas Soome */ 80*4a5d661aSToomas Soome for (;;) { 81*4a5d661aSToomas Soome c = *s++; 82*4a5d661aSToomas Soome spanp = (char *)delim; 83*4a5d661aSToomas Soome do { 84*4a5d661aSToomas Soome if ((sc = *spanp++) == c) { 85*4a5d661aSToomas Soome if (c == 0) 86*4a5d661aSToomas Soome s = NULL; 87*4a5d661aSToomas Soome else 88*4a5d661aSToomas Soome s[-1] = '\0'; 89*4a5d661aSToomas Soome *last = s; 90*4a5d661aSToomas Soome return (tok); 91*4a5d661aSToomas Soome } 92*4a5d661aSToomas Soome } while (sc != 0); 93*4a5d661aSToomas Soome } 94*4a5d661aSToomas Soome /* NOTREACHED */ 95*4a5d661aSToomas Soome } 96*4a5d661aSToomas Soome 97*4a5d661aSToomas Soome char * 98*4a5d661aSToomas Soome strtok(char *s, const char *delim) 99*4a5d661aSToomas Soome { 100*4a5d661aSToomas Soome static char *last; 101*4a5d661aSToomas Soome 102*4a5d661aSToomas Soome return (__strtok_r(s, delim, &last)); 103*4a5d661aSToomas Soome } 104*4a5d661aSToomas Soome 105*4a5d661aSToomas Soome #ifdef DEBUG_STRTOK 106*4a5d661aSToomas Soome /* 107*4a5d661aSToomas Soome * Test the tokenizer. 108*4a5d661aSToomas Soome */ 109*4a5d661aSToomas Soome int 110*4a5d661aSToomas Soome main(void) 111*4a5d661aSToomas Soome { 112*4a5d661aSToomas Soome char blah[80], test[80]; 113*4a5d661aSToomas Soome char *brkb, *brkt, *phrase, *sep, *word; 114*4a5d661aSToomas Soome 115*4a5d661aSToomas Soome sep = "\\/:;=-"; 116*4a5d661aSToomas Soome phrase = "foo"; 117*4a5d661aSToomas Soome 118*4a5d661aSToomas Soome printf("String tokenizer test:\n"); 119*4a5d661aSToomas Soome strcpy(test, "This;is.a:test:of=the/string\\tokenizer-function."); 120*4a5d661aSToomas Soome for (word = strtok(test, sep); word; word = strtok(NULL, sep)) 121*4a5d661aSToomas Soome printf("Next word is \"%s\".\n", word); 122*4a5d661aSToomas Soome strcpy(test, "This;is.a:test:of=the/string\\tokenizer-function."); 123*4a5d661aSToomas Soome 124*4a5d661aSToomas Soome for (word = strtok_r(test, sep, &brkt); word; 125*4a5d661aSToomas Soome word = strtok_r(NULL, sep, &brkt)) { 126*4a5d661aSToomas Soome strcpy(blah, "blah:blat:blab:blag"); 127*4a5d661aSToomas Soome 128*4a5d661aSToomas Soome for (phrase = strtok_r(blah, sep, &brkb); phrase; 129*4a5d661aSToomas Soome phrase = strtok_r(NULL, sep, &brkb)) 130*4a5d661aSToomas Soome printf("So far we're at %s:%s\n", word, phrase); 131*4a5d661aSToomas Soome } 132*4a5d661aSToomas Soome 133*4a5d661aSToomas Soome return (0); 134*4a5d661aSToomas Soome } 135*4a5d661aSToomas Soome 136*4a5d661aSToomas Soome #endif /* DEBUG_STRTOK */ 137