summaryrefslogtreecommitdiffstats
path: root/source/core/slang-string-util.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/core/slang-string-util.cpp')
-rw-r--r--source/core/slang-string-util.cpp39
1 files changed, 23 insertions, 16 deletions
diff --git a/source/core/slang-string-util.cpp b/source/core/slang-string-util.cpp
index 6d0d896a1..cb5709759 100644
--- a/source/core/slang-string-util.cpp
+++ b/source/core/slang-string-util.cpp
@@ -39,32 +39,39 @@ static const Guid IID_ISlangBlob = SLANG_UUID_ISlangBlob;
}
}
-
-/* static */void StringUtil::append(const char* format, va_list args, StringBuilder& buf)
+/* static */size_t StringUtil::calcFormattedSize(const char* format, va_list args)
{
- int numChars = 0;
+#if SLANG_WINDOWS_FAMILY
+ return _vscprintf(format, args);
+#else
+ return vsnprintf(nullptr, 0, format, args);
+#endif
+}
+/* static */void StringUtil::calcFormatted(const char* format, va_list args, size_t numChars, char* dst)
+{
#if SLANG_WINDOWS_FAMILY
- numChars = _vscprintf(format, args);
+ vsnprintf_s(dst, numChars + 1, _TRUNCATE, format, args);
#else
+ vsnprintf(dst, numChars + 1, format, args);
+#endif
+}
+
+/* static */void StringUtil::append(const char* format, va_list args, StringBuilder& buf)
+{
+ // Calculate the size
+ size_t numChars;
{
+ // Create a copy of args, as will be consumed by calcFormattedSize
va_list argsCopy;
va_copy(argsCopy, args);
- numChars = vsnprintf(nullptr, 0, format, argsCopy);
+ numChars = calcFormattedSize(format, argsCopy);
va_end(argsCopy);
}
-#endif
-
- List<char> chars;
- chars.SetSize(numChars + 1);
-
-#if SLANG_WINDOWS_FAMILY
- vsnprintf_s(chars.Buffer(), numChars + 1, _TRUNCATE, format, args);
-#else
- vsnprintf(chars.Buffer(), numChars + 1, format, args);
-#endif
- buf.Append(chars.Buffer(), numChars);
+ char* dst = buf.prepareForAppend(numChars + 1);
+ calcFormatted(format, args, numChars, dst);
+ buf.appendInPlace(dst, numChars);
}
/* static */void StringUtil::appendFormat(StringBuilder& buf, const char* format, ...)