1 1.3 christos /* $NetBSD: strsep.c,v 1.3 2007/06/04 18:19:28 christos Exp $ */ 2 1.1 dyoung 3 1.1 dyoung /*- 4 1.1 dyoung * Copyright (c) 1990, 1993 5 1.1 dyoung * The Regents of the University of California. All rights reserved. 6 1.1 dyoung * 7 1.1 dyoung * Redistribution and use in source and binary forms, with or without 8 1.1 dyoung * modification, are permitted provided that the following conditions 9 1.1 dyoung * are met: 10 1.1 dyoung * 1. Redistributions of source code must retain the above copyright 11 1.1 dyoung * notice, this list of conditions and the following disclaimer. 12 1.1 dyoung * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 dyoung * notice, this list of conditions and the following disclaimer in the 14 1.1 dyoung * documentation and/or other materials provided with the distribution. 15 1.1 dyoung * 3. Neither the name of the University nor the names of its contributors 16 1.1 dyoung * may be used to endorse or promote products derived from this software 17 1.1 dyoung * without specific prior written permission. 18 1.1 dyoung * 19 1.1 dyoung * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 1.1 dyoung * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.1 dyoung * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.1 dyoung * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 1.1 dyoung * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.1 dyoung * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.1 dyoung * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.1 dyoung * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.1 dyoung * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.1 dyoung * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.1 dyoung * SUCH DAMAGE. 30 1.1 dyoung */ 31 1.1 dyoung 32 1.1 dyoung #include <sys/cdefs.h> 33 1.1 dyoung #if defined(LIBC_SCCS) && !defined(lint) 34 1.1 dyoung #if 0 35 1.1 dyoung static char sccsid[] = "@(#)strsep.c 8.1 (Berkeley) 6/4/93"; 36 1.1 dyoung #else 37 1.3 christos __RCSID("$NetBSD: strsep.c,v 1.3 2007/06/04 18:19:28 christos Exp $"); 38 1.1 dyoung #endif 39 1.1 dyoung #endif /* LIBC_SCCS and not lint */ 40 1.1 dyoung 41 1.1 dyoung #if !defined(_KERNEL) && !defined(_STANDALONE) 42 1.1 dyoung #include "namespace.h" 43 1.1 dyoung 44 1.1 dyoung #include <assert.h> 45 1.1 dyoung #include <string.h> 46 1.1 dyoung 47 1.1 dyoung #ifdef __weak_alias 48 1.1 dyoung __weak_alias(strsep,_strsep) 49 1.1 dyoung #endif 50 1.1 dyoung 51 1.2 chs #else 52 1.2 chs #include <sys/param.h> 53 1.2 chs #include <lib/libkern/libkern.h> 54 1.2 chs #endif /* !_KERNEL && !_STANDALONE */ 55 1.2 chs 56 1.1 dyoung #if !HAVE_STRSEP 57 1.1 dyoung /* 58 1.1 dyoung * Get next token from string *stringp, where tokens are possibly-empty 59 1.1 dyoung * strings separated by characters from delim. 60 1.1 dyoung * 61 1.1 dyoung * Writes NULs into the string at *stringp to end tokens. 62 1.1 dyoung * delim need not remain constant from call to call. 63 1.1 dyoung * On return, *stringp points past the last NUL written (if there might 64 1.1 dyoung * be further tokens), or is NULL (if there are definitely no more tokens). 65 1.1 dyoung * 66 1.1 dyoung * If *stringp is NULL, strsep returns NULL. 67 1.1 dyoung */ 68 1.1 dyoung char * 69 1.3 christos strsep(char **stringp, const char *delim) 70 1.1 dyoung { 71 1.1 dyoung char *s; 72 1.1 dyoung const char *spanp; 73 1.1 dyoung int c, sc; 74 1.1 dyoung char *tok; 75 1.1 dyoung 76 1.1 dyoung _DIAGASSERT(stringp != NULL); 77 1.1 dyoung _DIAGASSERT(delim != NULL); 78 1.1 dyoung 79 1.1 dyoung if ((s = *stringp) == NULL) 80 1.1 dyoung return (NULL); 81 1.1 dyoung for (tok = s;;) { 82 1.1 dyoung c = *s++; 83 1.1 dyoung spanp = delim; 84 1.1 dyoung do { 85 1.1 dyoung if ((sc = *spanp++) == c) { 86 1.1 dyoung if (c == 0) 87 1.1 dyoung s = NULL; 88 1.1 dyoung else 89 1.1 dyoung s[-1] = 0; 90 1.1 dyoung *stringp = s; 91 1.1 dyoung return (tok); 92 1.1 dyoung } 93 1.1 dyoung } while (sc != 0); 94 1.1 dyoung } 95 1.1 dyoung /* NOTREACHED */ 96 1.1 dyoung } 97 1.1 dyoung #endif 98