diff options
author | 2023-01-05 15:32:40 +0100 | |
---|---|---|
committer | 2023-01-05 09:32:40 -0500 | |
commit | 812e6094f47bb8d1da5a6b421aa4c724cf2035c0 (patch) | |
tree | 0f5bab2fe9393d1f629e9bf63e76cecca74ec0c9 /3rdparty/bx/src/string.cpp | |
parent | 4a1b41854bba8fc2567906b88bab8ca81e75d187 (diff) |
Update BGFX, BX and BIMG (#10789)
* Update to bgfx a93a714632b79b5ddbf5c86ac323fa9b76ed3433
Co-authored-by: Бранимир Караџић <branimirkaradzic@gmail.com>
Diffstat (limited to '3rdparty/bx/src/string.cpp')
-rw-r--r-- | 3rdparty/bx/src/string.cpp | 148 |
1 files changed, 100 insertions, 48 deletions
diff --git a/3rdparty/bx/src/string.cpp b/3rdparty/bx/src/string.cpp index 0c5f06d0301..94429ebd21d 100644 --- a/3rdparty/bx/src/string.cpp +++ b/3rdparty/bx/src/string.cpp @@ -1,9 +1,8 @@ /* - * Copyright 2010-2021 Branimir Karadzic. All rights reserved. - * License: https://github.com/bkaradzic/bx#license-bsd-2-clause + * Copyright 2010-2022 Branimir Karadzic. All rights reserved. + * License: https://github.com/bkaradzic/bx/blob/master/LICENSE */ -#include "bx_p.h" #include <bx/allocator.h> #include <bx/file.h> #include <bx/hash.h> @@ -135,7 +134,7 @@ namespace bx { for (int32_t ii = 0; ii < _len; ++ii) { - *_inOutStr = toLower(*_inOutStr); + _inOutStr[ii] = toLower(_inOutStr[ii]); } } @@ -154,7 +153,7 @@ namespace bx { for (int32_t ii = 0; ii < _len; ++ii) { - *_inOutStr = toUpper(*_inOutStr); + _inOutStr[ii] = toUpper(_inOutStr[ii]); } } @@ -413,7 +412,7 @@ namespace bx ++ptr; --stringLen; - // Search pattern lenght can't be longer than the string. + // Search pattern length can't be longer than the string. if (findLen > stringLen) { return NULL; @@ -481,7 +480,7 @@ namespace bx } } - return _str; + return StringView(_str.getTerm(), _str.getTerm() ); } StringView strLTrimSpace(const StringView& _str) @@ -524,7 +523,9 @@ namespace bx { return StringView(ptr, ii + 1); } - } + } + + return StringView(_str.getPtr(), _str.getPtr()); } return _str; @@ -543,6 +544,8 @@ namespace bx return StringView(ptr, ii + 1); } } + + return StringView(_str.getPtr(), _str.getPtr()); } return _str; @@ -813,6 +816,11 @@ namespace bx return write(_writer, _str, _param.prec, _param, _err); } + static int32_t write(WriterI* _writer, const StringView& _str, const Param& _param, Error* _err) + { + return write(_writer, _str.getPtr(), min(_param.prec, _str.getLength() ), _param, _err); + } + static int32_t write(WriterI* _writer, int32_t _i, const Param& _param, Error* _err) { char str[33]; @@ -875,30 +883,39 @@ namespace bx return 0; } - if (_param.upper) - { - toUpperUnsafe(str, len); - } - const char* dot = strFind(str, INT32_MAX, '.'); if (NULL != dot) { - const int32_t prec = INT32_MAX == _param.prec ? 6 : _param.prec; - const int32_t precLen = int32_t( - dot - + uint32_min(prec + _param.spec, 1) - + prec - - str - ); - if (precLen > len) + const int32_t prec = INT32_MAX == _param.prec ? 6 : _param.prec; + const char* strEnd = str + len; + const char* exponent = strFind(str, INT32_MAX, 'e'); + const char* fracEnd = NULL != exponent ? exponent : strEnd; + + char* fracBegin = &str[dot - str + min(prec + _param.spec, 1)]; + const int32_t curPrec = int32_t(fracEnd - fracBegin); + + // Move exponent to its final location after trimming or adding extra 0s. + if (fracEnd != strEnd) + { + const int32_t exponentLen = int32_t(strEnd - fracEnd); + char* finalExponentPtr = &fracBegin[prec]; + memMove(finalExponentPtr, fracEnd, exponentLen); + + finalExponentPtr[exponentLen] = '\0'; + len = int32_t(&finalExponentPtr[exponentLen] - str); + } + else { - for (int32_t ii = len; ii < precLen; ++ii) + len = (int32_t)(fracBegin + prec - str); + } + + if (curPrec < prec) + { + for (int32_t ii = curPrec; ii < prec; ++ii) { - str[ii] = '0'; + fracBegin[ii] = '0'; } - str[precLen] = '\0'; } - len = precLen; } return write(_writer, str, len, _param, _err); @@ -939,17 +956,22 @@ namespace bx } else if ('%' == ch) { - // %[flags][width][.precision][length sub-specifier]specifier - read(&reader, ch); + // %[Flags][Width][.Precision][Leegth]Type + read(&reader, ch, &err); Param param; - // flags - while (' ' == ch + // Reference(s): + // - Flags field + // https://en.wikipedia.org/wiki/Printf_format_string#Flags_field + // + while (err.isOk() + && ( ' ' == ch || '-' == ch || '+' == ch || '0' == ch || '#' == ch) + ) { switch (ch) { @@ -961,7 +983,7 @@ namespace bx case '#': param.spec = true; break; } - read(&reader, ch); + read(&reader, ch, &err); } if (param.left) @@ -969,10 +991,13 @@ namespace bx param.fill = ' '; } - // width + // Reference(s): + // - Width field + // https://en.wikipedia.org/wiki/Printf_format_string#Width_field + // if ('*' == ch) { - read(&reader, ch); + read(&reader, ch, &err); param.width = va_arg(_argList, int32_t); if (0 > param.width) @@ -984,49 +1009,57 @@ namespace bx } else { - while (isNumeric(ch) ) + while (err.isOk() + && isNumeric(ch) ) { param.width = param.width * 10 + ch - '0'; - read(&reader, ch); + read(&reader, ch, &err); } } - // .precision + // Reference(s): + // - Precision field + // https://en.wikipedia.org/wiki/Printf_format_string#Precision_field if ('.' == ch) { - read(&reader, ch); + read(&reader, ch, &err); if ('*' == ch) { - read(&reader, ch); + read(&reader, ch, &err); param.prec = va_arg(_argList, int32_t); } else { param.prec = 0; - while (isNumeric(ch) ) + while (err.isOk() + && isNumeric(ch) ) { param.prec = param.prec * 10 + ch - '0'; - read(&reader, ch); + read(&reader, ch, &err); } } } - // length sub-specifier - while ('h' == ch + // Reference(s): + // - Length field + // https://en.wikipedia.org/wiki/Printf_format_string#Length_field + while (err.isOk() + && ( 'h' == ch || 'I' == ch || 'l' == ch || 'j' == ch || 't' == ch || 'z' == ch) + ) { switch (ch) { default: break; case 'j': param.bits = sizeof(intmax_t )*8; break; - case 't': param.bits = sizeof(size_t )*8; break; - case 'z': param.bits = sizeof(ptrdiff_t)*8; break; + case 't': param.bits = sizeof(ptrdiff_t)*8; break; + case 'z': param.bits = sizeof(size_t )*8; break; case 'h': case 'I': case 'l': switch (ch) @@ -1036,14 +1069,14 @@ namespace bx default: break; } - read(&reader, ch); + read(&reader, ch, &err); switch (ch) { case 'h': param.bits = sizeof(signed char )*8; break; case 'l': param.bits = sizeof(long long int)*8; break; case '3': case '6': - read(&reader, ch); + read(&reader, ch, &err); switch (ch) { case '2': param.bits = sizeof(int32_t)*8; break; @@ -1057,11 +1090,18 @@ namespace bx break; } - read(&reader, ch); + read(&reader, ch, &err); + } + + if (!err.isOk() ) + { + break; } - // specifier - switch (toLower(ch) ) + // Reference(s): + // - Type field + // https://en.wikipedia.org/wiki/Printf_format_string#Type_field + switch (ch) { case 'c': size += write(_writer, char(va_arg(_argList, int32_t) ), param, _err); @@ -1071,6 +1111,10 @@ namespace bx size += write(_writer, va_arg(_argList, const char*), param, _err); break; + case 'S': + size += write(_writer, *va_arg(_argList, const StringView*), param, _err); + break; + case 'o': param.base = 8; switch (param.bits) @@ -1091,8 +1135,11 @@ namespace bx break; case 'e': + case 'E': case 'f': + case 'F': case 'g': + case 'G': param.upper = isUpper(ch); size += write(_writer, va_arg(_argList, double), param, _err); break; @@ -1102,6 +1149,7 @@ namespace bx break; case 'x': + case 'X': param.base = 16; param.upper = isUpper(ch); switch (param.bits) @@ -1120,6 +1168,10 @@ namespace bx } break; + case 'n': + *va_arg(_argList, int32_t*) = size; + break; + default: size += write(_writer, ch, _err); break; |