This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] Reduce strpbrk to strcspn
- From: OndÅej BÃlka <neleai at seznam dot cz>
- To: libc-alpha at sourceware dot org
- Date: Wed, 16 Jan 2013 13:50:22 +0100
- Subject: [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