summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bx/src/string.cpp
diff options
context:
space:
mode:
author Miodrag Milanović <mmicko@gmail.com>2023-01-05 15:32:40 +0100
committer GitHub <noreply@github.com>2023-01-05 09:32:40 -0500
commit812e6094f47bb8d1da5a6b421aa4c724cf2035c0 (patch)
tree0f5bab2fe9393d1f629e9bf63e76cecca74ec0c9 /3rdparty/bx/src/string.cpp
parent4a1b41854bba8fc2567906b88bab8ca81e75d187 (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.cpp148
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;