diff options
author | halcanary <halcanary@google.com> | 2016-04-25 09:25:35 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-04-25 09:25:35 -0700 |
commit | d51bdae4e145bfede693f97cf0d54a56d33d3c9e (patch) | |
tree | b6a689a187202aebed343865904bae6b680a69ce /src/core | |
parent | 96a04f329926099f0002f97883242793ff04f61c (diff) |
SkStringPrintf and SkString::printf now are no longer limted by a static buffer
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1403803002
Committed: https://skia.googlesource.com/skia/+/606cadd5aac62299ef2e277709b3684cae2bf96c
Review URL: https://codereview.chromium.org/1403803002
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/SkString.cpp | 63 |
1 files changed, 54 insertions, 9 deletions
diff --git a/src/core/SkString.cpp b/src/core/SkString.cpp index 24b1b8fb62..528c602abb 100644 --- a/src/core/SkString.cpp +++ b/src/core/SkString.cpp @@ -33,6 +33,58 @@ static const size_t kBufferSize = 1024; va_end(args); \ } while (0) +#ifdef SK_BUILD_FOR_WIN +#define V_SKSTRING_PRINTF(output, format) \ + do { \ + va_list args; \ + va_start(args, format); \ + char buffer[kBufferSize]; \ + int length = _vsnprintf_s(buffer, sizeof(buffer), \ + _TRUNCATE, format, args); \ + va_end(args); \ + if (length >= 0 && length < (int)sizeof(buffer)) { \ + output.set(buffer, length); \ + break; \ + } \ + va_start(args, format); \ + length = _vscprintf(format, args); \ + va_end(args); \ + SkAutoTMalloc<char> autoTMalloc((size_t)length + 1); \ + va_start(args, format); \ + SkDEBUGCODE(int check = ) _vsnprintf_s(autoTMalloc.get(), \ + length + 1, _TRUNCATE, \ + format, args); \ + va_end(args); \ + SkASSERT(check == length); \ + output.set(autoTMalloc.get(), length); \ + SkASSERT(output[length] == '\0'); \ + } while (false) +#else +#define V_SKSTRING_PRINTF(output, format) \ + do { \ + va_list args; \ + va_start(args, format); \ + char buffer[kBufferSize]; \ + int length = vsnprintf(buffer, sizeof(buffer), format, args); \ + va_end(args); \ + if (length < 0) { \ + break; \ + } \ + if (length < (int)sizeof(buffer)) { \ + output.set(buffer, length); \ + break; \ + } \ + SkAutoTMalloc<char> autoTMalloc((size_t)length + 1); \ + va_start(args, format); \ + SkDEBUGCODE(int check = ) vsnprintf(autoTMalloc.get(), \ + length + 1, format, args); \ + va_end(args); \ + SkASSERT(check == length); \ + output.set(autoTMalloc.get(), length); \ + SkASSERT(output[length] == '\0'); \ + } while (false) +#endif + /////////////////////////////////////////////////////////////////////////////// bool SkStrEndsWith(const char string[], const char suffixStr[]) { @@ -513,11 +565,7 @@ 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); + V_SKSTRING_PRINTF((*this), format); } void SkString::appendf(const char format[], ...) { @@ -593,10 +641,7 @@ void SkString::swap(SkString& other) { SkString SkStringPrintf(const char* format, ...) { SkString formattedOutput; - char buffer[kBufferSize]; - SK_UNUSED int length; - ARGS_TO_BUFFER(format, buffer, kBufferSize, length); - formattedOutput.set(buffer); + V_SKSTRING_PRINTF(formattedOutput, format); return formattedOutput; } |