diff options
Diffstat (limited to 'source/core/slang-string-util.cpp')
| -rw-r--r-- | source/core/slang-string-util.cpp | 39 |
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, ...) |
