[PATCH] strtok() -> strsep() Part 2.1

Ingo Oeser (ingo.oeser@informatik.tu-chemnitz.de)
Mon, 12 Jul 1999 19:57:39 +0200 (CEST)


Hi all,
Dear Linus,

thanks for including my first patch of this issue. But we are not
finished, yet.

Part 2.1 of a patch (against 2.3.10) that is going to remove
strtok() entirely.

Modifications done:

* Fixed an typo, that breaks the bevavior and causes Oopses/core dumps

* changed strsep() behave like the one in libc (which accepts empty tokens,
and returns them)

* implemented strsepe, that skips empty tokens (as strtok() does)

* exported strsep() and strsepe() for every architecture, that exports
strtok()

PS: Linus: Part 2.2 will go to linux-kernel only, because it affects
more than your code.

Thanks and regards

Ingo Oeser

diff -ru linux-2.3.10.vanilla/arch/alpha/kernel/alpha_ksyms.c linux/arch/alpha/kernel/alpha_ksyms.c
--- linux-2.3.10.vanilla/arch/alpha/kernel/alpha_ksyms.c Tue Jun 22 19:46:52 1999
+++ linux/arch/alpha/kernel/alpha_ksyms.c Sun Jul 11 19:48:08 1999
@@ -88,6 +88,8 @@
EXPORT_SYMBOL(strncat);
EXPORT_SYMBOL(strstr);
EXPORT_SYMBOL(strtok);
+EXPORT_SYMBOL(strsep);
+EXPORT_SYMBOL(strsepe);
EXPORT_SYMBOL(strpbrk);
EXPORT_SYMBOL(strchr);
EXPORT_SYMBOL(strrchr);
diff -ru linux-2.3.10.vanilla/arch/arm/kernel/armksyms.c linux/arch/arm/kernel/armksyms.c
--- linux-2.3.10.vanilla/arch/arm/kernel/armksyms.c Thu Jun 17 10:11:35 1999
+++ linux/arch/arm/kernel/armksyms.c Sun Jul 11 19:51:20 1999
@@ -153,6 +153,8 @@
EXPORT_SYMBOL_NOVERS(strspn);
EXPORT_SYMBOL_NOVERS(strpbrk);
EXPORT_SYMBOL_NOVERS(strtok);
+EXPORT_SYMBOL_NOVERS(strsep);
+EXPORT_SYMBOL_NOVERS(strsepe);
EXPORT_SYMBOL_NOVERS(strrchr);
EXPORT_SYMBOL_NOVERS(memset);
EXPORT_SYMBOL_NOVERS(memcpy);
diff -ru linux-2.3.10.vanilla/arch/i386/kernel/i386_ksyms.c linux/arch/i386/kernel/i386_ksyms.c
--- linux-2.3.10.vanilla/arch/i386/kernel/i386_ksyms.c Tue Jun 29 18:59:26 1999
+++ linux/arch/i386/kernel/i386_ksyms.c Sun Jul 11 19:47:22 1999
@@ -62,6 +62,8 @@
EXPORT_SYMBOL_NOVERS(__put_user_4);

EXPORT_SYMBOL(strtok);
+EXPORT_SYMBOL(strsep);
+EXPORT_SYMBOL(strsepe);
EXPORT_SYMBOL(strpbrk);
EXPORT_SYMBOL(strstr);

diff -ru linux-2.3.10.vanilla/arch/mips/kernel/mips_ksyms.c linux/arch/mips/kernel/mips_ksyms.c
--- linux-2.3.10.vanilla/arch/mips/kernel/mips_ksyms.c Sat Jun 26 02:40:12 1999
+++ linux/arch/mips/kernel/mips_ksyms.c Sun Jul 11 19:49:41 1999
@@ -51,6 +51,8 @@
EXPORT_SYMBOL_NOVERS(strnlen);
EXPORT_SYMBOL_NOVERS(strrchr);
EXPORT_SYMBOL_NOVERS(strtok);
+EXPORT_SYMBOL_NOVERS(strsep);
+EXPORT_SYMBOL_NOVERS(strsepe);
EXPORT_SYMBOL_NOVERS(strpbrk);

EXPORT_SYMBOL(clear_page);
diff -ru linux-2.3.10.vanilla/arch/ppc/kernel/ppc_ksyms.c linux/arch/ppc/kernel/ppc_ksyms.c
--- linux-2.3.10.vanilla/arch/ppc/kernel/ppc_ksyms.c Mon Jun 28 22:40:39 1999
+++ linux/arch/ppc/kernel/ppc_ksyms.c Sun Jul 11 19:50:09 1999
@@ -106,6 +106,8 @@
EXPORT_SYMBOL(strrchr);
EXPORT_SYMBOL(strpbrk);
EXPORT_SYMBOL(strtok);
+EXPORT_SYMBOL(strsep);
+EXPORT_SYMBOL(strsepe);
EXPORT_SYMBOL(strstr);
EXPORT_SYMBOL(strlen);
EXPORT_SYMBOL(strnlen);
diff -ru linux-2.3.10.vanilla/arch/sparc/kernel/sparc_ksyms.c linux/arch/sparc/kernel/sparc_ksyms.c
--- linux-2.3.10.vanilla/arch/sparc/kernel/sparc_ksyms.c Tue Jul 6 05:35:17 1999
+++ linux/arch/sparc/kernel/sparc_ksyms.c Sun Jul 11 19:48:50 1999
@@ -236,6 +236,8 @@
EXPORT_SYMBOL(strchr);
EXPORT_SYMBOL(strrchr);
EXPORT_SYMBOL(strpbrk);
+EXPORT_SYMBOL(strsep);
+EXPORT_SYMBOL(strsepe);
EXPORT_SYMBOL(strtok);
EXPORT_SYMBOL(strstr);
EXPORT_SYMBOL(strspn);
diff -ru linux-2.3.10.vanilla/arch/sparc64/kernel/sparc64_ksyms.c linux/arch/sparc64/kernel/sparc64_ksyms.c
--- linux-2.3.10.vanilla/arch/sparc64/kernel/sparc64_ksyms.c Tue Jul 6 05:35:18 1999
+++ linux/arch/sparc64/kernel/sparc64_ksyms.c Sun Jul 11 19:50:24 1999
@@ -256,6 +256,8 @@
EXPORT_SYMBOL(strrchr);
EXPORT_SYMBOL(strpbrk);
EXPORT_SYMBOL(strtok);
+EXPORT_SYMBOL(strsep);
+EXPORT_SYMBOL(strsepe);
EXPORT_SYMBOL(strstr);
EXPORT_SYMBOL(strspn);

diff -ru linux-2.3.10.vanilla/include/linux/string.h linux/include/linux/string.h
--- linux-2.3.10.vanilla/include/linux/string.h Fri Jun 25 23:35:42 1999
+++ linux/include/linux/string.h Sun Jul 11 19:04:05 1999
@@ -21,6 +21,10 @@
extern char * strpbrk(const char *,const char *);
extern char * strtok(char *,const char *);
extern char * strsep(char **,const char *);
+#ifdef __KERNEL__
+/* temporary strtok() replacement, please don't use it in new code! -ioe */
+extern char * strsepe(char **,const char *);
+#endif /* __KERNEL__ */
extern char * strstr(const char *,const char *);
extern __kernel_size_t strlen(const char *);
extern __kernel_size_t strnlen(const char *,__kernel_size_t);
diff -ru linux-2.3.10.vanilla/lib/string.c linux/lib/string.c
--- linux-2.3.10.vanilla/lib/string.c Tue Jul 6 05:02:10 1999
+++ linux/lib/string.c Sun Jul 11 18:55:48 1999
@@ -240,17 +240,40 @@

char * strsep(char **s, const char * ct)
{
- char *sbegin=*s;
- if (!sbegin)
+ char *sbegin;
+ if (!s || !(*s))
+ return NULL;
+
+ sbegin=*s;
+
+ if (*sbegin == '\0')
return NULL;

+ *s = strpbrk( sbegin, ct);
+ if (*s && **s != '\0')
+ *(*s)++ = '\0';
+ return (sbegin);
+}
+#endif
+
+#ifndef __HAVE_ARCH_STRSEPE
+
+/* Same as strsep, but skips empty tokens. */
+char * strsepe(char **s, const char * ct)
+{
+ char *sbegin;
+ if (!s || !(*s))
+ return NULL;
+
+ sbegin=*s;
+
sbegin += strspn(sbegin,ct);
if (*sbegin == '\0')
return NULL;

*s = strpbrk( sbegin, ct);
if (*s && **s != '\0')
- **s++ = '\0';
+ *(*s)++ = '\0';
return (sbegin);
}
#endif

-- 
Feel the power of the penguin - run linux@your.pc
<esc>:x

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/