Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(136)

Unified Diff: src/core/SkString.cpp

Issue 1403803002: SkStringPrintf and SkString::printf now are no longer limted by a static buffer (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: 2015-10-12 (Monday) 15:52:58 EDT Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/pdf/SkPDFMetadata.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
« no previous file with comments | « no previous file | src/pdf/SkPDFMetadata.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698