Chromium Code Reviews| Index: src/core/SkString.cpp |
| diff --git a/src/core/SkString.cpp b/src/core/SkString.cpp |
| index d93f662da3d8bc0a80ca96903752bbcc3977ba1e..99b14162f4d8d2744c0ad3e5761fc8ef327118eb 100644 |
| --- a/src/core/SkString.cpp |
| +++ b/src/core/SkString.cpp |
| @@ -35,6 +35,48 @@ static const size_t kBufferSize = 1024; |
| va_end(args); \ |
| } while (0) |
| +static SkString v_skstring_printf(const char* format, va_list args) { |
| +#ifdef SK_BUILD_FOR_WIN |
| + va_list args_copy; |
| + va_copy(args_copy, args); |
| + char buffer[1024]; |
| + int length = _vsnprintf_s(buffer, sizeof(buffer), _TRUNCATE, format, args_copy); |
| + va_end(args_copy); |
| + if (length >= 0 && length < (int)sizeof(buffer)) { |
| + return SkString(buffer, length); |
| + } |
| + va_copy(args_copy, args); |
| + length = _vscprintf(format, args); |
| + va_end(args_copy); |
| + |
| + SkString formattedOutput((size_t)length); |
| + SkDEBUGCODE(int check = ) _vsnprintf_s(formattedOutput.writable_str(), |
| + length + 1, _TRUNCATE, format, args); |
| + SkASSERT(check == length); |
| + SkASSERT(formattedOutput[length] == '\0'); |
| + return skstd::move(formattedOutput); |
| +#else // C99/C++11 standard vsnprintf |
| + // TODO: When all compilers support this, remove windows-specific code. |
| + va_list args_copy; |
| + va_copy(args_copy, args); |
| + char buffer[1024]; |
| + int length = vsnprintf(buffer, sizeof(buffer), format, args); |
| + va_end(args_copy); |
| + if (length < 0) { |
| + return SkString(); |
| + } |
| + if (length < (int)sizeof(buffer)) { |
| + return SkString(buffer, length); |
| + } |
| + SkString formattedOutput((size_t)length); |
| + SkDEBUGCODE(int check = ) |
| + vsnprintf(formattedOutput.writable_str(), length + 1, format, args); |
| + SkASSERT(check == length); |
| + SkASSERT(formattedOutput[length] == '\0'); |
| + return skstd::move(formattedOutput); |
| +#endif |
| +} |
| + |
| /////////////////////////////////////////////////////////////////////////////// |
| bool SkStrEndsWith(const char string[], const char suffixStr[]) { |
| @@ -537,11 +579,10 @@ void SkString::insertScalar(size_t offset, SkScalar value) { |
| } |
| void SkString::printf(const char format[], ...) { |
| - char buffer[kBufferSize]; |
| - int length; |
| - ARGS_TO_BUFFER(format, buffer, kBufferSize, length); |
| - |
| - this->set(buffer, length); |
| + va_list args; |
| + va_start(args, format); |
| + *this = v_skstring_printf(format, args); |
| + va_end(args); |
| } |
| void SkString::appendf(const char format[], ...) { |
| @@ -615,13 +656,14 @@ void SkString::swap(SkString& other) { |
| /////////////////////////////////////////////////////////////////////////////// |
| +// Improvement on SkStringPrintf to allow for arbitrarily long output. |
|
tomhudson
2015/10/12 20:21:01
This feels like a comment that belongs in the comm
hal.canary
2015/10/12 21:38:24
Done.
|
| +// TODO: replace SkStringPrintf. |
| SkString SkStringPrintf(const char* format, ...) { |
| - SkString formattedOutput; |
| - char buffer[kBufferSize]; |
| - SK_UNUSED int length; |
| - ARGS_TO_BUFFER(format, buffer, kBufferSize, length); |
| - formattedOutput.set(buffer); |
| - return formattedOutput; |
| + va_list args; |
| + va_start(args, format); |
| + SkString formattedOutput(v_skstring_printf(format, args)); |
| + va_end(args); |
| + return skstd::move(formattedOutput); |
| } |
| void SkStrSplit(const char* str, const char* delimiters, SkTArray<SkString>* out) { |