aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/pdf/SkPDFMetadata.cpp
diff options
context:
space:
mode:
authorGravatar halcanary <halcanary@google.com>2016-04-22 08:19:04 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-04-22 08:19:04 -0700
commit3361e6248b415bb3054b5af6462666f1608e0765 (patch)
treedc4edd54d4d7c8ad273be7246a2216f0f8dafe64 /src/pdf/SkPDFMetadata.cpp
parent606cadd5aac62299ef2e277709b3684cae2bf96c (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.cpp56
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(),