+
+EXPORT size_t strcspn(const char *haystack, const char *reject)
+{
+ size_t ret = 0;
+ int i;
+ while( *haystack )
+ {
+ for( i = 0; reject[i] && reject[i] == *haystack; i ++ );
+
+ if( reject[i] ) return ret;
+ ret ++;
+ }
+ return ret;
+}
+
+EXPORT size_t strspn(const char *haystack, const char *accept)
+{
+ size_t ret = 0;
+ int i;
+ while( *haystack )
+ {
+ for( i = 0; accept[i] && accept[i] == *haystack; i ++ );
+
+ if( !accept[i] ) return ret;
+ ret ++;
+ }
+ return ret;
+}
+
+EXPORT char *strpbrk(const char *haystack, const char *accept)
+{
+ while( *haystack )
+ {
+ for( int i = 0; accept[i]; i ++ )
+ {
+ if( accept[i] == *haystack )
+ return (char*)haystack;
+ }
+ }
+ return NULL;
+}
+
+char *strtok(char *str, const char *delim)
+{
+ static char *__saveptr;
+ return strtok_r(str, delim, &__saveptr);
+}
+char *strtok_r(char *str, const char *delim, char **saveptr)
+{
+ char *pos = (str ? str : *saveptr);
+
+ while( strchr(delim, *pos) )
+ pos ++;
+
+ if( *pos == '\0' )
+ return NULL;
+
+ char *ret = pos;
+ while( !strchr(delim, *pos) )
+ pos ++;
+
+ // Cap the returned string
+ // - If we're at the end of the original string, don't shift pos
+ if( *pos != '\0' ) {
+ *pos = '\0';
+ pos ++;
+ }
+
+ *saveptr = pos;
+
+ return ret;
+}
+