summaryrefslogtreecommitdiff
path: root/klibc/klibc/strspn.c
diff options
context:
space:
mode:
authorgreg@kroah.com <greg@kroah.com>2003-10-22 18:37:40 -0700
committerGreg KH <gregkh@suse.de>2005-04-26 21:05:23 -0700
commita41a0e28c2ba0abf99b5e7ea17645ae0e4f05758 (patch)
treef800d7d565c294adb15f88d4f14064f93054da70 /klibc/klibc/strspn.c
parent6c0eae77a1443c51a0c089f4d4053ffff13666f5 (diff)
downloadsystemd-a41a0e28c2ba0abf99b5e7ea17645ae0e4f05758.tar.gz
[PATCH] added klibc version 0.82 (cvs tree) to the udev tree.
Not hooked up to the build yet.
Diffstat (limited to 'klibc/klibc/strspn.c')
-rw-r--r--klibc/klibc/strspn.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/klibc/klibc/strspn.c b/klibc/klibc/strspn.c
new file mode 100644
index 0000000000..856a964197
--- /dev/null
+++ b/klibc/klibc/strspn.c
@@ -0,0 +1,67 @@
+/*
+ * strspn, strcspn
+ */
+
+#include <string.h>
+#include <stddef.h>
+#include <inttypes.h>
+#include <limits.h>
+
+#ifndef LONG_BIT
+#define LONG_BIT (CHAR_BIT*sizeof(long))
+#endif
+
+static inline void
+set_bit(unsigned long *bitmap, unsigned int bit)
+{
+ bitmap[bit/LONG_BIT] |= 1UL << (bit%LONG_BIT);
+}
+
+static inline int
+test_bit(unsigned long *bitmap, unsigned int bit)
+{
+ return (int)(bitmap[bit/LONG_BIT] >> (bit%LONG_BIT)) & 1;
+}
+
+static size_t
+strxspn(const char *s, const char *map, int parity)
+{
+ unsigned long matchmap[((1 << CHAR_BIT)+LONG_BIT-1)/LONG_BIT];
+ size_t n = 0;
+
+ /* Create bitmap */
+ memset(matchmap, 0, sizeof matchmap);
+ while ( *map )
+ set_bit(matchmap, (unsigned char) *map++);
+
+ /* Make sure the null character never matches */
+ if ( parity )
+ set_bit(matchmap, 0);
+
+ /* Calculate span length */
+ while ( test_bit(matchmap, (unsigned char) *s++)^parity )
+ n++;
+
+ return n;
+}
+
+size_t
+strspn(const char *s, const char *accept)
+{
+ return strxspn(s, accept, 0);
+}
+
+size_t
+strcspn(const char *s, const char *reject)
+{
+ return strxspn(s, reject, 1);
+}
+
+char *
+strpbrk(const char *s, const char *accept)
+{
+ const char *ss = s+strxspn(s, accept, 1);
+
+ return *ss ? (char *)ss : NULL;
+}
+