diff options
author | halcanary <halcanary@google.com> | 2016-04-22 08:19:04 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-04-22 08:19:04 -0700 |
commit | 3361e6248b415bb3054b5af6462666f1608e0765 (patch) | |
tree | dc4edd54d4d7c8ad273be7246a2216f0f8dafe64 /src/pdf/SkPDFMetadata.cpp | |
parent | 606cadd5aac62299ef2e277709b3684cae2bf96c (diff) |
Revert of SkStringPrintf and SkString::printf now are no longer limted by a static buffer (patchset #5 id:80001 of https://codereview.chromium.org/1403803002/ )
Reason for revert:
breaking something
Original issue's description:
> 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
TBR=tomhudson@google.com,reed@google.com
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
Review URL: https://codereview.chromium.org/1908423002
Diffstat (limited to 'src/pdf/SkPDFMetadata.cpp')
-rw-r--r-- | src/pdf/SkPDFMetadata.cpp | 56 |
1 files changed, 52 insertions, 4 deletions
diff --git a/src/pdf/SkPDFMetadata.cpp b/src/pdf/SkPDFMetadata.cpp index d3abd78312..2765d4d189 100644 --- a/src/pdf/SkPDFMetadata.cpp +++ b/src/pdf/SkPDFMetadata.cpp @@ -95,6 +95,54 @@ SkPDFObject* SkPDFMetadata::CreatePdfId(const UUID& doc, const UUID& instance) { return array.release(); } +// Improvement on SkStringPrintf to allow for arbitrarily long output. +// TODO: replace SkStringPrintf. +static SkString sk_string_printf(const char* format, ...) { +#ifdef SK_BUILD_FOR_WIN + va_list args; + va_start(args, format); + char buffer[1024]; + int length = _vsnprintf_s(buffer, sizeof(buffer), _TRUNCATE, format, args); + va_end(args); + if (length >= 0 && length < (int)sizeof(buffer)) { + return SkString(buffer, length); + } + va_start(args, format); + length = _vscprintf(format, args); + va_end(args); + + SkString string((size_t)length); + va_start(args, format); + SkDEBUGCODE(int check = ) _vsnprintf_s(string.writable_str(), length + 1, + _TRUNCATE, format, args); + va_end(args); + SkASSERT(check == length); + SkASSERT(string[length] == '\0'); + return string; +#else // C99/C++11 standard vsnprintf + // TODO: When all compilers support this, remove windows-specific code. + va_list args; + va_start(args, format); + char buffer[1024]; + int length = vsnprintf(buffer, sizeof(buffer), format, args); + va_end(args); + if (length < 0) { + return SkString(); + } + if (length < (int)sizeof(buffer)) { + return SkString(buffer, length); + } + SkString string((size_t)length); + va_start(args, format); + SkDEBUGCODE(int check = ) + vsnprintf(string.writable_str(), length + 1, format, args); + va_end(args); + SkASSERT(check == length); + SkASSERT(string[length] == '\0'); + return string; +#endif +} + static const SkString get(const SkTArray<SkDocument::Attribute>& info, const char* key) { for (const auto& keyValue : info) { @@ -255,14 +303,14 @@ SkPDFObject* SkPDFMetadata::createXMPObject(const UUID& doc, fCreation->toISO8601(&tmp); SkASSERT(0 == count_xml_escape_size(tmp)); // YYYY-mm-ddTHH:MM:SS[+|-]ZZ:ZZ; no need to escape - creationDate = SkStringPrintf("<xmp:CreateDate>%s</xmp:CreateDate>\n", - tmp.c_str()); + creationDate = sk_string_printf("<xmp:CreateDate>%s</xmp:CreateDate>\n", + tmp.c_str()); } if (fModified) { SkString tmp; fModified->toISO8601(&tmp); SkASSERT(0 == count_xml_escape_size(tmp)); - modificationDate = SkStringPrintf( + modificationDate = sk_string_printf( "<xmp:ModifyDate>%s</xmp:ModifyDate>\n", tmp.c_str()); } SkString title = escape_xml( @@ -291,7 +339,7 @@ SkPDFObject* SkPDFMetadata::createXMPObject(const UUID& doc, SkASSERT(0 == count_xml_escape_size(documentID)); SkString instanceID = uuid_to_string(instance); SkASSERT(0 == count_xml_escape_size(instanceID)); - return new PDFXMLObject(SkStringPrintf( + return new PDFXMLObject(sk_string_printf( templateString, modificationDate.c_str(), creationDate.c_str(), creator.c_str(), title.c_str(), subject.c_str(), author.c_str(), keywords1.c_str(), |