? strspn.c.diff Index: strspn.c =================================================================== RCS file: /cvsroot/src/lib/libc/string/strspn.c,v retrieving revision 1.17 diff -u -p -u -r1.17 strspn.c --- strspn.c 30 Jul 2009 21:42:06 -0000 1.17 +++ strspn.c 22 Nov 2011 21:48:19 -0000 @@ -30,13 +30,14 @@ __RCSID("$NetBSD: strspn.c,v 1.17 2009/0 #include #include +#include #include #include #if ULONG_MAX != 0xffffffffffffffffull -size_t -strspn(const char *s, const char *charset) +static size_t +strspn_x(const char *s, const char *charset, bool_t complement) { static const size_t idx[8] = { 1, 2, 4, 8, 16, 32, 64, 128 }; uint8_t set[32]; @@ -47,10 +48,10 @@ strspn(const char *s, const char *charse _DIAGASSERT(charset != NULL); if (charset[0] == '\0') - return 0; + return complement ? strlen(s) : 0; if (charset[1] == '\0') { for (t = s; *t != '\0'; ++t) { - if (*t != *charset) + if ((*t == *charset) == complement) break; } return t - s; @@ -62,11 +63,23 @@ strspn(const char *s, const char *charse set[UC(*charset) >> 3] |= idx[UC(*charset) & 7]; for (t = s; *t != '\0'; ++t) - if ((set[UC(*t) >> 3] & idx[UC(*t) & 7]) == 0) + if ((set[UC(*t) >> 3] & idx[UC(*t) & 7]) == complement) break; return t - s; } +size_t +strspn(const char *s, const char *charset) +{ + return strspn_x(s, charset, false); +} + +size_t +strcspn(const char *s, const char *charset) +{ + return strspn_x(s, charset, true); +} + #else /* 64 bit system, use four 64 bits registers for bitmask */