diff --git a/core/src/strutil.c b/core/src/strutil.c index d133af3..ef74370 100644 --- a/core/src/strutil.c +++ b/core/src/strutil.c @@ -13,3 +13,35 @@ uintptr_t strnhash(const char* s, size_t n) { uintptr_t strhash(const char* s) { return strnhash(s, strlen(s)); } + +long strlast(const char* rbegin, const char* rend, char search) { + const char* itr = rbegin; + while(itr != rend) + if(*itr == search) return itr - rend; + else itr--; + return -1; +} + +long strfirst(const char* begin, const char* end, char search) { + const char* itr = begin; + while(itr != end) + if(*itr == search) return itr - begin; + else itr++; + return -1; +} + +long strfirst_pred(const char* begin, const char* end, CharPredFn pred) { + const char* itr = begin; + while(itr != end) + if(pred(*itr)) return itr - begin; + else itr++; + return -1; +} + +long strlast_pred(const char* rbegin, const char* rend, CharPredFn pred) { + const char* itr = rbegin; + while(itr != rend) + if(pred(*itr)) return itr - rend; + else itr--; + return -1; +} diff --git a/core/src/strutil.h b/core/src/strutil.h index 55e36af..1c43021 100644 --- a/core/src/strutil.h +++ b/core/src/strutil.h @@ -4,7 +4,13 @@ #include "stdlib.h" #include "stdint.h" +typedef int(*CharPredFn)(int); + extern uintptr_t strnhash(const char* s, size_t n); extern uintptr_t strhash(const char* s); +extern long strlast(const char* rbegin, const char* rend, char search); +extern long strfirst(const char* begin, const char* end, char search); +extern long strfirst_pred(const char* begin, const char* end, CharPredFn pred); +extern long strlast_pred(const char* rbegin, const char* rend, CharPredFn pred); #endif // !_fencer_strutil_h