This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Reduce strpbrk to strcspn


Hello, as part of improving strspn I decided to cleanup headers first.
strpbrk could be derived from strcspn so reducing to strcspn avoids 
duplicating macros. Runtime cost is small given how slow strpbrk is now.

---
 string/bits/string2.h |   41 ++++-------------------------------------
 string/strpbrk.c      |   12 ++----------
 2 files changed, 6 insertions(+), 47 deletions(-)

diff --git a/string/bits/string2.h b/string/bits/string2.h
index 8b6a36f..ef1fca3 100644
--- a/string/bits/string2.h
+++ b/string/bits/string2.h
@@ -1080,42 +1080,10 @@ __strspn_c3 (const char *__s, int __accept1, int __accept2, int __accept3)
 
 
 /* Find the first occurrence in S of any character in ACCEPT.  */
-#if !defined _HAVE_STRING_ARCH_strpbrk || defined _FORCE_INLINES
-# ifndef _HAVE_STRING_ARCH_strpbrk
-#  if __GNUC_PREREQ (3, 2)
-#   define strpbrk(s, accept) \
-  __extension__								      \
-  ({ char __a0, __a1, __a2;						      \
-     (__builtin_constant_p (accept) && __string2_1bptr_p (accept)	      \
-      ? ((__builtin_constant_p (s) && __string2_1bptr_p (s))		      \
-	 ? __builtin_strpbrk (s, accept)				      \
-	 : ((__a0 = ((const char  *) (accept))[0], __a0 == '\0')	      \
-	    ? ((void) (s), (char *) NULL)				      \
-	    : ((__a1 = ((const char *) (accept))[1], __a1 == '\0')	      \
-	       ? __builtin_strchr (s, __a0)				      \
-	       : ((__a2 = ((const char *) (accept))[2], __a2 == '\0')	      \
-		  ? __strpbrk_c2 (s, __a0, __a1)			      \
-		  : (((const char *) (accept))[3] == '\0'		      \
-		     ? __strpbrk_c3 (s, __a0, __a1, __a2)		      \
-		     : __builtin_strpbrk (s, accept))))))		      \
-      : __builtin_strpbrk (s, accept)); })
-#  else
-#   define strpbrk(s, accept) \
-  __extension__								      \
-  ({ char __a0, __a1, __a2;						      \
-     (__builtin_constant_p (accept) && __string2_1bptr_p (accept)	      \
-      ? ((__a0 = ((const char  *) (accept))[0], __a0 == '\0')		      \
-	 ? ((void) (s), (char *) NULL)					      \
-	 : ((__a1 = ((const char *) (accept))[1], __a1 == '\0')		      \
-	    ? strchr (s, __a0)						      \
-	    : ((__a2 = ((const char *) (accept))[2], __a2 == '\0')	      \
-	       ? __strpbrk_c2 (s, __a0, __a1)				      \
-	       : (((const char *) (accept))[3] == '\0'			      \
-		  ? __strpbrk_c3 (s, __a0, __a1, __a2)			      \
-		  : strpbrk (s, accept)))))				      \
-      : strpbrk (s, accept)); })
-#  endif
-# endif
+#define strpbrk(s, accept)                          \
+  __extension__                                     \
+  ({ const char *__s =  (s);                        \
+     const char *__r = __s + strcspn (__s, accept); \
+     *__r ? r : NULL; })
 
 __STRING_INLINE char *__strpbrk_c2 (const char *__s, int __accept1,
 				    int __accept2);
@@ -1139,7 +1107,6 @@ __strpbrk_c3 (const char *__s, int __accept1, int __accept2, int __accept3)
     ++__s;
   return *__s == '\0' ? NULL : (char *) (size_t) __s;
 }
-#endif
 
 
 /* Find the first occurrence of NEEDLE in HAYSTACK.  Newer gcc versions
diff --git a/string/strpbrk.c b/string/strpbrk.c
index 1069094..3df77d2 100644
--- a/string/strpbrk.c
+++ b/string/strpbrk.c
@@ -31,15 +31,7 @@ strpbrk (s, accept)
      const char *s;
      const char *accept;
 {
-  while (*s != '\0')
-    {
-      const char *a = accept;
-      while (*a != '\0')
-	if (*a++ == *s)
-	  return (char *) s;
-      ++s;
-    }
-
-  return NULL;
+  char *r = s + strcspn (s, accept);
+  return *r ? r : NULL;
 }
 libc_hidden_builtin_def (strpbrk)
-- 
1.7.4.4


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]