|
@@ -37,23 +37,36 @@
|
|
|
|
|
|
|
|
namespace Rml {
|
|
namespace Rml {
|
|
|
|
|
|
|
|
-static int FormatString(String& string, size_t max_size, const char* format, va_list argument_list)
|
|
|
|
|
|
|
+static int FormatString(String& string, const char* format, va_list argument_list)
|
|
|
{
|
|
{
|
|
|
- const int INTERNAL_BUFFER_SIZE = 1024;
|
|
|
|
|
- static char buffer[INTERNAL_BUFFER_SIZE];
|
|
|
|
|
|
|
+ constexpr size_t InternalBufferSize = 256;
|
|
|
|
|
+ char buffer[InternalBufferSize];
|
|
|
char* buffer_ptr = buffer;
|
|
char* buffer_ptr = buffer;
|
|
|
|
|
|
|
|
- if (max_size + 1 > INTERNAL_BUFFER_SIZE)
|
|
|
|
|
- buffer_ptr = new char[max_size + 1];
|
|
|
|
|
|
|
+ size_t max_size = InternalBufferSize;
|
|
|
|
|
+ int length = 0;
|
|
|
|
|
|
|
|
- int length = vsnprintf(buffer_ptr, max_size, format, argument_list);
|
|
|
|
|
- buffer_ptr[length >= 0 ? length : max_size] = '\0';
|
|
|
|
|
-#ifdef RMLUI_DEBUG
|
|
|
|
|
- if (length == -1)
|
|
|
|
|
|
|
+ for (int i = 0; i < 2; i++)
|
|
|
{
|
|
{
|
|
|
- Log::Message(Log::LT_WARNING, "FormatString: String truncated to %zu bytes when processing %s", max_size, format);
|
|
|
|
|
|
|
+ va_list argument_list_copy;
|
|
|
|
|
+ va_copy(argument_list_copy, argument_list);
|
|
|
|
|
+
|
|
|
|
|
+ length = vsnprintf(buffer_ptr, max_size, format, argument_list_copy);
|
|
|
|
|
+
|
|
|
|
|
+ va_end(argument_list_copy);
|
|
|
|
|
+
|
|
|
|
|
+ if (length < 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ RMLUI_ERRORMSG("Error while formatting string");
|
|
|
|
|
+ return 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if ((size_t)length < max_size || i > 0)
|
|
|
|
|
+ break;
|
|
|
|
|
+
|
|
|
|
|
+ max_size = (size_t)length + 1;
|
|
|
|
|
+ buffer_ptr = new char[max_size];
|
|
|
}
|
|
}
|
|
|
-#endif
|
|
|
|
|
|
|
|
|
|
string = buffer_ptr;
|
|
string = buffer_ptr;
|
|
|
|
|
|
|
@@ -63,21 +76,20 @@ static int FormatString(String& string, size_t max_size, const char* format, va_
|
|
|
return length;
|
|
return length;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-int FormatString(String& string, size_t max_size, const char* format, ...)
|
|
|
|
|
|
|
+int FormatString(String& string, size_t /*max_size*/, const char* format, ...)
|
|
|
{
|
|
{
|
|
|
va_list argument_list;
|
|
va_list argument_list;
|
|
|
va_start(argument_list, format);
|
|
va_start(argument_list, format);
|
|
|
- int result = FormatString(string, (int)max_size, format, argument_list);
|
|
|
|
|
|
|
+ int result = FormatString(string, format, argument_list);
|
|
|
va_end(argument_list);
|
|
va_end(argument_list);
|
|
|
return result;
|
|
return result;
|
|
|
}
|
|
}
|
|
|
-String CreateString(size_t max_size, const char* format, ...)
|
|
|
|
|
|
|
+String CreateString(size_t /*max_size*/, const char* format, ...)
|
|
|
{
|
|
{
|
|
|
String result;
|
|
String result;
|
|
|
- result.reserve(max_size);
|
|
|
|
|
va_list argument_list;
|
|
va_list argument_list;
|
|
|
va_start(argument_list, format);
|
|
va_start(argument_list, format);
|
|
|
- FormatString(result, max_size, format, argument_list);
|
|
|
|
|
|
|
+ FormatString(result, format, argument_list);
|
|
|
va_end(argument_list);
|
|
va_end(argument_list);
|
|
|
return result;
|
|
return result;
|
|
|
}
|
|
}
|
|
@@ -164,7 +176,7 @@ String StringUtilities::DecodeRml(const String& s)
|
|
|
size_t j = 0;
|
|
size_t j = 0;
|
|
|
for (; j < 8; j++)
|
|
for (; j < 8; j++)
|
|
|
{
|
|
{
|
|
|
- auto const& c = s[start + j];
|
|
|
|
|
|
|
+ const auto& c = s[start + j];
|
|
|
if (!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')))
|
|
if (!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')))
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
@@ -188,7 +200,7 @@ String StringUtilities::DecodeRml(const String& s)
|
|
|
size_t j = 0;
|
|
size_t j = 0;
|
|
|
for (; j < 8; j++)
|
|
for (; j < 8; j++)
|
|
|
{
|
|
{
|
|
|
- auto const& c = s[start + j];
|
|
|
|
|
|
|
+ const auto& c = s[start + j];
|
|
|
if (!(c >= '0' && c <= '9'))
|
|
if (!(c >= '0' && c <= '9'))
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|