bsd-strsep.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib/*
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * Copyright (c) 2001 by Sun Microsystems, Inc.
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * All rights reserved.
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib */
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib#pragma ident "%Z%%M% %I% %E% SMI"
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib/* $OpenBSD: strsep.c,v 1.3 1997/08/20 04:28:14 millert Exp $ */
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib/*
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * Copyright (c) 1990, 1993
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * The Regents of the University of California. All rights reserved.
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib *
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * Redistribution and use in source and binary forms, with or without
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * modification, are permitted provided that the following conditions
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * are met:
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * 1. Redistributions of source code must retain the above copyright
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * notice, this list of conditions and the following disclaimer.
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * 2. Redistributions in binary form must reproduce the above copyright
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * notice, this list of conditions and the following disclaimer in the
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * documentation and/or other materials provided with the distribution.
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * 3. All advertising materials mentioning features or use of this software
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * must display the following acknowledgement:
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * This product includes software developed by the University of
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * California, Berkeley and its contributors.
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * 4. Neither the name of the University nor the names of its contributors
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * may be used to endorse or promote products derived from this software
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * without specific prior written permission.
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib *
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * SUCH DAMAGE.
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib */
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib#include <string.h>
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib#include <stdio.h>
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib#if defined(LIBC_SCCS) && !defined(lint)
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib#if 0
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaibstatic char sccsid[] = "@(#)strsep.c 8.1 (Berkeley) 6/4/93";
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib#else
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaibstatic char *rcsid =
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib "$OpenBSD: strsep.c,v 1.3 1997/08/20 04:28:14 millert Exp $";
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib#endif
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib#endif /* LIBC_SCCS and not lint */
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib/*
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * Get next token from string *stringp, where tokens are possibly-empty
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * strings separated by characters from delim.
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib *
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * Writes NULs into the string at *stringp to end tokens.
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * delim need not remain constant from call to call.
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * On return, *stringp points past the last NUL written (if there might
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * be further tokens), or is NULL (if there are definitely no more tokens).
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib *
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib * If *stringp is NULL, strsep returns NULL.
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib */
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaibchar *
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaibstrsep(char **stringp, const char *delim)
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib{
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib register char *s;
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib register const char *spanp;
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib register int c, sc;
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib char *tok;
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib if ((s = *stringp) == NULL)
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib return (NULL);
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib for (tok = s; ; ) {
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib c = *s++;
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib spanp = delim;
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib do {
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib if ((sc = *spanp++) == c) {
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib if (c == 0)
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib s = NULL;
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib else
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib s[-1] = 0;
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib *stringp = s;
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib return (tok);
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib }
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib } while (sc != 0);
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib }
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib /* NOTREACHED */
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib}
9525b14bcdeb5b5f6f95ab27c2f48f18bd2ec829Rao Shoaib