Browse Source

Added __strtok_r function. Change strtok to a wrapper around __strtok_r and
add a weak alias of __strtok_r for strtok_r since optional. Also reduced
code size.

Manuel Novoa III 24 years ago
parent
commit
9aed53cc26
3 changed files with 68 additions and 58 deletions
  1. 10 0
      include/string.h
  2. 3 58
      libc/string/strtok.c
  3. 55 0
      libc/string/strtok_r.c

+ 10 - 0
include/string.h

@@ -92,6 +92,16 @@ extern char *strstr __P ((__const char *__haystack, __const char *__needle));
 /* Divide S into tokens separated by characters in DELIM.  */
 extern char *strtok __P ((char *__restrict __s,
 			  __const char *__restrict __delim));
+/* Divide S into tokens separated by characters in DELIM.  Information
+   passed between calls are stored in SAVE_PTR.  */
+extern char *__strtok_r __P ((char *__restrict __s,
+                              __const char *__restrict __delim,
+                              char **__restrict __save_ptr));
+#if defined __USE_POSIX || defined __USE_MISC
+extern char *strtok_r __P ((char *__restrict __s,
+                            __const char *__restrict __delim,
+                            char **__restrict __save_ptr));
+#endif
 /* Return the length of the initial segment of S which
    consists entirely of characters not in REJECT.  */
 extern size_t strcspn __P ((__const char *__s, __const char *__reject));

+ 3 - 58
libc/string/strtok.c

@@ -1,63 +1,8 @@
-/* Copyright (C) 1991 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
-
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA.  */
-
 #include <string.h>
 
+static char *save = 0;
 
-static char *olds = 0;
-
-/* Parse S into tokens separated by characters in DELIM.
-   If S is NULL, the last string strtok() was called with is
-   used.  For example:
-	char s[] = "-abc=-def";
-	x = strtok(s, "-");		// x = "abc"
-	x = strtok(NULL, "=-");		// x = "def"
-	x = strtok(NULL, "=");		// x = NULL
-		// s = "abc\0-def\0"
-*/
-char *strtok( register char *s, register const char *delim)
+char *strtok(char *s, const char *delim)
 {
-	char *token;
-
-	if (s == 0) {
-		if (olds == 0) {
-			return 0;
-		} else
-			s = olds;
-	}
-
-	/* Scan leading delimiters.  */
-	s += strspn(s, delim);
-	if (*s == '\0') {
-		olds = 0;
-		return 0;
-	}
-
-	/* Find the end of the token.  */
-	token = s;
-	s = strpbrk(token, delim);
-	if (s == 0)
-		/* This token finishes the string.  */
-		olds = 0;
-	else {
-		/* Terminate the token and make OLDS point past it.  */
-		*s = '\0';
-		olds = s + 1;
-	}
-	return token;
+	return __strtok_r(s, delim, &save);
 }

+ 55 - 0
libc/string/strtok_r.c

@@ -0,0 +1,55 @@
+/* Copyright (C) 1991 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+/*
+ * Modified by Manuel Novoa III     Mar 1, 2001
+ *
+ * Converted original strtok.c code of strtok to __strtok_r.
+ * Cleaned up logic and reduced code size.
+ */
+
+#include <string.h>
+
+char *__strtok_r(char *s, const char *delim, char **save_ptr)
+{
+	char *token;
+
+	token = 0;					/* Initialize to no token. */
+
+	if (s == 0) {				/* If not first time called... */
+		s = *save_ptr;			/* restart from where we left off. */
+	}
+	
+	if (s != 0) {				/* If not finished... */
+		*save_ptr = 0;
+
+		s += strspn(s, delim);	/* Skip past any leading delimiters. */
+		if (*s != '\0') {		/* We have a token. */
+			token = s;
+			*save_ptr = strpbrk(token, delim); /* Find token's end. */
+			if (*save_ptr != 0) {
+				/* Terminate the token and make SAVE_PTR point past it.  */
+				*(*save_ptr)++ = '\0';
+			}
+		}
+	}
+
+	return token;
+}
+
+__asm__(".weak strtok_r; strtok_r = __strtok_r");