diff --git a/libmaxsi/c/hsrc/string.h b/libmaxsi/c/hsrc/string.h index a65b6e54..25b26c47 100644 --- a/libmaxsi/c/hsrc/string.h +++ b/libmaxsi/c/hsrc/string.h @@ -37,12 +37,14 @@ int memcmp(const void*, const void*, size_t); void* memcpy(void* restrict, const void* restrict, size_t); void* memset(void*, int, size_t); char* strcat(char* restrict, const char* restrict); +char* strchr(const char*, int); int strcmp(const char*, const char*); size_t strcspn(const char*, const char*); char* strcpy(char* restrict, const char* restrict); char* strerror(int); size_t strlen(const char*); int strncmp(const char*, const char*, size_t); +char* strrchr(const char*, int); size_t strspn(const char*, const char*); char* strtok(char* restrict, const char* restrict); char* strtok_r(char* restrict, const char* restrict, char** restrict); @@ -54,7 +56,6 @@ void* memchr(const void*, int, size_t); void* memmove(void*, const void*, size_t); char* stpcpy(char* restrict, const char* restrict); char* stpncpy(char* restrict, const char* restrict, size_t); -char* strchr(const char*, int); int strcoll(const char*, const char*); int strcoll_l(const char*, const char*, locale_t); char* strdup(const char*); @@ -65,13 +66,16 @@ char* strncpy(char* restrict, const char* restrict, size_t); char* strndup(const char*, size_t); size_t strnlen(const char*, size_t); char* strpbrk(const char*, const char*); -char* strrchr(const char*, int); char* strsignal(int); char* strstr(const char*, const char*); size_t strxfrm(char* restrict, const char* restrict, size_t); size_t strxfrm_l(char* restrict, const char* restrict, size_t, locale_t); #endif +#ifdef SORTIX_EXTENSIONS +char* strchrnul(const char* str, int c); +#endif + __END_DECLS #endif diff --git a/libmaxsi/hsrc/string.h b/libmaxsi/hsrc/string.h index c00bb4d6..1a0cee91 100644 --- a/libmaxsi/hsrc/string.h +++ b/libmaxsi/hsrc/string.h @@ -41,6 +41,9 @@ namespace Maxsi char* Cat(char* Dest, const char* Src); char* Tokenize(char* str, const char* delim); char* TokenizeR(char* str, const char* delim, char** saveptr); + char* Seek(const char* str, int c); + char* SeekNul(const char* str, int c); + char* SeekReverse(const char* str, int c); int Compare(const char* A, const char* B); int CompareN(const char* A, const char* B, size_t MaxLength); bool StartsWith(const char* Haystack, const char* Needle); diff --git a/libmaxsi/string.cpp b/libmaxsi/string.cpp index 550c6470..8803b193 100644 --- a/libmaxsi/string.cpp +++ b/libmaxsi/string.cpp @@ -155,6 +155,34 @@ namespace Maxsi return TokenizeR(str, delim, &lasttokensaveptr); } + DUAL_FUNCTION(char*, strchrnul, SeekNul, (const char* str, int c)) + { + while ( *str ) + { + if ( *str == c ) { return (char*) str; } + str++; + } + return (char*) str; + } + + DUAL_FUNCTION(char*, strrchr, SeekReverse, (const char* str, int c)) + { + const char* last = NULL; + while ( *str ) + { + if ( *str == c ) { last = str; } + str++; + } + return (char*) last; + } + + DUAL_FUNCTION(char*, strchr, Seek, (const char* str, int c)) + { + char* result = SeekNul(str, c); + if ( !*result ) { return NULL; } + return result; + } + bool StartsWith(const char* haystack, const char* needle) { return CompareN(haystack, needle, Length(needle)) == 0;