diff --git a/src/common/FFstrbuf.h b/src/common/FFstrbuf.h index 2c9a09b9b..2279152db 100644 --- a/src/common/FFstrbuf.h +++ b/src/common/FFstrbuf.h @@ -9,6 +9,7 @@ #include #include #include +#include "common/memrchr.h" #ifdef FF_USE_SYSTEM_YYJSON #include @@ -71,11 +72,6 @@ bool ffStrbufRemoveSubstr(FFstrbuf* strbuf, uint32_t startIndex, uint32_t endInd void ffStrbufRemoveS(FFstrbuf* strbuf, const char* str); void ffStrbufRemoveStrings(FFstrbuf* strbuf, uint32_t numStrings, const char* strings[]); -FF_A_NODISCARD uint32_t ffStrbufNextIndexC(const FFstrbuf* strbuf, uint32_t start, char c); -FF_A_NODISCARD uint32_t ffStrbufNextIndexS(const FFstrbuf* strbuf, uint32_t start, const char* str); - -FF_A_NODISCARD uint32_t ffStrbufPreviousIndexC(const FFstrbuf* strbuf, uint32_t start, char c); - void ffStrbufReplaceAllC(FFstrbuf* strbuf, char find, char replace); // Returns true if the strbuf is modified @@ -417,6 +413,27 @@ static inline FF_A_NODISCARD bool ffStrbufContainIgnCase(const FFstrbuf* strbuf, return ffStrbufContainIgnCaseS(strbuf, str->chars); } +FF_A_NODISCARD static inline uint32_t ffStrbufNextIndexC(const FFstrbuf* strbuf, uint32_t start, char c) { + assert(start <= strbuf->length); + + const char* ptr = (const char*) memchr(strbuf->chars + start, c, strbuf->length - start); + return ptr ? (uint32_t) (ptr - strbuf->chars) : strbuf->length; +} + +FF_A_NODISCARD static inline uint32_t ffStrbufNextIndexS(const FFstrbuf* strbuf, uint32_t start, const char* str) { + assert(start <= strbuf->length); + + const char* ptr = strstr(strbuf->chars + start, str); + return ptr ? (uint32_t) (ptr - strbuf->chars) : strbuf->length; +} + +FF_A_NODISCARD static inline uint32_t ffStrbufPreviousIndexC(const FFstrbuf* strbuf, uint32_t start, char c) { + assert(start <= strbuf->length); + + const char* ptr = (const char*) memrchr(strbuf->chars, c, start + 1); + return ptr ? (uint32_t) (ptr - strbuf->chars) : strbuf->length; +} + static inline FF_A_NODISCARD uint32_t ffStrbufFirstIndexC(const FFstrbuf* strbuf, char c) { return ffStrbufNextIndexC(strbuf, 0, c); } diff --git a/src/common/impl/FFstrbuf.c b/src/common/impl/FFstrbuf.c index a349e08df..1f6477ba7 100644 --- a/src/common/impl/FFstrbuf.c +++ b/src/common/impl/FFstrbuf.c @@ -411,32 +411,6 @@ void ffStrbufRemoveStrings(FFstrbuf* strbuf, uint32_t numStrings, const char* st } } -uint32_t ffStrbufNextIndexC(const FFstrbuf* strbuf, uint32_t start, char c) { - assert(start <= strbuf->length); - - const char* ptr = (const char*) memchr(strbuf->chars + start, c, strbuf->length - start); - return ptr ? (uint32_t) (ptr - strbuf->chars) : strbuf->length; -} - -uint32_t ffStrbufNextIndexS(const FFstrbuf* strbuf, uint32_t start, const char* str) { - assert(start <= strbuf->length); - - const char* ptr = strstr(strbuf->chars + start, str); - return ptr ? (uint32_t) (ptr - strbuf->chars) : strbuf->length; -} - -uint32_t ffStrbufPreviousIndexC(const FFstrbuf* strbuf, uint32_t start, char c) { - assert(start <= strbuf->length); - - // We need to loop one higher than the actual index, because uint32_t is guaranteed to be >= 0, so this statement would always be true - for (uint32_t i = start + 1; i > 0; i--) { - if (strbuf->chars[i - 1] == c) { - return i - 1; - } - } - return strbuf->length; -} - void ffStrbufReplaceAllC(FFstrbuf* strbuf, char find, char replace) { if (strbuf->length == 0) { return;