]> Zhao Yanbai Git Server - minix.git/commitdiff
Import strsep() from NetBSD's libnbcompat
authorArun Thomas <arun@minix3.org>
Mon, 12 Jul 2010 17:41:31 +0000 (17:41 +0000)
committerArun Thomas <arun@minix3.org>
Mon, 12 Jul 2010 17:41:31 +0000 (17:41 +0000)
Ported by Gautam Tirumala

include/string.h
lib/libc/other/Makefile.inc
lib/libc/other/strsep.c [new file with mode: 0644]

index a3268c5a790056dc02e56b8535d97c13432a9691..f71d4cb73df3a8c02645f8aea80904b9adb2a526 100644 (file)
@@ -68,6 +68,7 @@ _PROTOTYPE( int strncasecmp, (const char *_s1, const char *_s2,
 _PROTOTYPE( size_t strnlen, (const char *_s, size_t _n)                        );
 _PROTOTYPE( size_t strlcat, (char *_dst, const char *_src, size_t _siz) );
 _PROTOTYPE( size_t strlcpy, (char *_dst, const char *_src, size_t _siz) );
+_PROTOTYPE( char * strsep, (char **stringp, const char *delim) );
 #endif
 
 #endif /* _STRING_H */
index 77efc55b41b6bbbbbc017d46758bfd62cc1cb2e5..5a96b398363984564bcf938c614146f35b1826d6 100644 (file)
@@ -100,6 +100,7 @@ SRCS+=  \
        strmode.c \
        strtok_r.c \
        strtoll.c \
+       strsep.c \
        swab.c \
        syscall.c \
        sysconf.c \
diff --git a/lib/libc/other/strsep.c b/lib/libc/other/strsep.c
new file mode 100644 (file)
index 0000000..b6a75eb
--- /dev/null
@@ -0,0 +1,101 @@
+/*     $NetBSD: strsep.c,v 1.4 2004/08/23 03:32:12 jlam Exp $  */
+
+/*-
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#if defined(LIBC_SCCS) && !defined(lint)
+#if 0
+static char sccsid[] = "@(#)strsep.c   8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: strsep.c,v 1.4 2004/08/23 03:32:12 jlam Exp $");
+#endif
+#endif /* LIBC_SCCS and not lint */
+
+#if 0
+#include "namespace.h"
+#endif
+
+#include <assert.h>
+#include <string.h>
+
+#if 0
+#ifdef __weak_alias
+__weak_alias(strsep,_strsep)
+#endif
+#endif
+
+#ifndef _DIAGASSERT
+#define _DIAGASSERT assert
+#endif
+
+#if !HAVE_STRSEP
+/*
+ * Get next token from string *stringp, where tokens are possibly-empty
+ * strings separated by characters from delim.  
+ *
+ * Writes NULs into the string at *stringp to end tokens.
+ * delim need not remain constant from call to call.
+ * On return, *stringp points past the last NUL written (if there might
+ * be further tokens), or is NULL (if there are definitely no more tokens).
+ *
+ * If *stringp is NULL, strsep returns NULL.
+ */
+char *
+strsep(stringp, delim)
+       char **stringp;
+       const char *delim;
+{
+       char *s;
+       const char *spanp;
+       int c, sc;
+       char *tok;
+
+       _DIAGASSERT(stringp != NULL);
+       _DIAGASSERT(delim != NULL);
+
+       if ((s = *stringp) == NULL)
+               return (NULL);
+       for (tok = s;;) {
+               c = *s++;
+               spanp = delim;
+               do {
+                       if ((sc = *spanp++) == c) {
+                               if (c == 0)
+                                       s = NULL;
+                               else
+                                       s[-1] = 0;
+                               *stringp = s;
+                               return (tok);
+                       }
+               } while (sc != 0);
+       }
+       /* NOTREACHED */
+}
+#endif