diff options
author | greg@kroah.com <greg@kroah.com> | 2003-10-22 18:37:40 -0700 |
---|---|---|
committer | Greg KH <gregkh@suse.de> | 2005-04-26 21:05:23 -0700 |
commit | a41a0e28c2ba0abf99b5e7ea17645ae0e4f05758 (patch) | |
tree | f800d7d565c294adb15f88d4f14064f93054da70 /klibc/klibc/strspn.c | |
parent | 6c0eae77a1443c51a0c089f4d4053ffff13666f5 (diff) | |
download | systemd-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.c | 67 |
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; +} + |