diff --git a/include/bx/string.h b/include/bx/string.h index 585cb82..0094fee 100644 --- a/include/bx/string.h +++ b/include/bx/string.h @@ -224,12 +224,21 @@ namespace bx /// Find end of line. Retuns pointer to new line terminator. const char* streol(const char* _str); + /// Find end of line. Retuns pointer to new line terminator. + const StringView strFindEol(const StringView& _str) + /// Skip whitespace. const char* strws(const char* _str); + /// Skip whitespace. + const StringView strSkipSpace(const StringView& _str); + /// Skip non-whitespace. const char* strnws(const char* _str); + /// Skip non-whitespace. + const StringView strSkipNonSpace(const StringView& _str); + /// Returns pointer to first character after word. const char* strSkipWord(const char* _str, int32_t _max = INT32_MAX); diff --git a/src/string.cpp b/src/string.cpp index f84f4b5..7283cf2 100644 --- a/src/string.cpp +++ b/src/string.cpp @@ -534,18 +534,68 @@ namespace bx return _str; } + const StringView strFindEol(const StringView& _str) + { + StringView str(_str); + + for (; str.getPtr() != _str.getTerm() + ; str = StringView(str.getPtr()+1024, min(str.getPtr()+1024, _str.getTerm() ) ) + ) + { + const char* eol = strFind(str, "\r\n"); + if (NULL != eol) + { + return StringView(eol, _str.getTerm() ); + } + + eol = strFind(str, "\n"); + if (NULL != eol) + { + return StringView(eol, _str.getTerm() ); + } + } + + return StringView(_str.getTerm(), _str.getTerm() ); + } + const char* strws(const char* _str) { for (; isSpace(*_str); ++_str) {}; return _str; } + const StringView strSkipSpace(const StringView& _str) + { + for (const char* ptr = _str.getPtr(), *term = _str.getTerm(); ptr != term; ++ptr) + { + if (!isSpace(*ptr) ) + { + return StringView(ptr, term); + } + } + + return StringView(_str.getTerm(), _str.getTerm() ); + } + const char* strnws(const char* _str) { for (; !isSpace(*_str); ++_str) {}; return _str; } + const StringView strSkipNonSpace(const StringView& _str) + { + for (const char* ptr = _str.getPtr(), *term = _str.getTerm(); ptr != term; ++ptr) + { + if (isSpace(*ptr) ) + { + return StringView(ptr, term); + } + } + + return StringView(_str.getTerm(), _str.getTerm() ); + } + const char* strSkipWord(const char* _str, int32_t _max) { for (char ch = *_str++; 0 < _max && (isAlphaNum(ch) || '_' == ch); ch = *_str++, --_max) {};