Commit 32b62035ce9d5d07f7396cc50a0c38215f19c906
1 parent
9f159465
Replace many calls to sprintf with QUtil::hex_encode
Add QUtil::hex_encode to encode binary data has a hexadecimal string, and use it in place of sprintf where possible.
Showing
9 changed files
with
34 additions
and
50 deletions
ChangeLog
| @@ -16,6 +16,9 @@ | @@ -16,6 +16,9 @@ | ||
| 16 | 16 | ||
| 17 | 2013-01-25 Jay Berkenbilt <ejb@ql.org> | 17 | 2013-01-25 Jay Berkenbilt <ejb@ql.org> |
| 18 | 18 | ||
| 19 | + * New method QUtil::hex_encode to encode binary data as a | ||
| 20 | + hexadecimal string | ||
| 21 | + | ||
| 19 | * qpdf --check was exiting with status 0 in some rare cases even | 22 | * qpdf --check was exiting with status 0 in some rare cases even |
| 20 | when errors were found. It now always exits with one of the | 23 | when errors were found. It now always exits with one of the |
| 21 | document error codes (0 for success, 2 for errors, 3 or warnings). | 24 | document error codes (0 for success, 2 for errors, 3 or warnings). |
examples/pdf-parse-content.cc
| @@ -33,15 +33,7 @@ ParserCallbacks::handleObject(QPDFObjectHandle obj) | @@ -33,15 +33,7 @@ ParserCallbacks::handleObject(QPDFObjectHandle obj) | ||
| 33 | std::cout << obj.getTypeName() << ": "; | 33 | std::cout << obj.getTypeName() << ": "; |
| 34 | if (obj.isInlineImage()) | 34 | if (obj.isInlineImage()) |
| 35 | { | 35 | { |
| 36 | - std::string val = obj.getInlineImageValue(); | ||
| 37 | - char buf[3]; | ||
| 38 | - buf[2] = '\0'; | ||
| 39 | - for (size_t i = 0; i < val.length(); ++i) | ||
| 40 | - { | ||
| 41 | - sprintf(buf, "%02x", (unsigned char)(val[i])); | ||
| 42 | - std::cout << buf; | ||
| 43 | - } | ||
| 44 | - std::cout << std::endl; | 36 | + std::cout << QUtil::hex_encode(obj.getInlineImageValue()) << std::endl; |
| 45 | } | 37 | } |
| 46 | else | 38 | else |
| 47 | { | 39 | { |
include/qpdf/QUtil.hh
| @@ -56,6 +56,12 @@ namespace QUtil | @@ -56,6 +56,12 @@ namespace QUtil | ||
| 56 | QPDF_DLL | 56 | QPDF_DLL |
| 57 | char* copy_string(std::string const&); | 57 | char* copy_string(std::string const&); |
| 58 | 58 | ||
| 59 | + // Returns lower-case hex-encoded version of the string, treating | ||
| 60 | + // each character in the input string as unsigned. The output | ||
| 61 | + // string will be twice as long as the input string. | ||
| 62 | + QPDF_DLL | ||
| 63 | + std::string hex_encode(std::string const&); | ||
| 64 | + | ||
| 59 | // Set stdin, stdout to binary mode | 65 | // Set stdin, stdout to binary mode |
| 60 | QPDF_DLL | 66 | QPDF_DLL |
| 61 | void binary_stdout(); | 67 | void binary_stdout(); |
libqpdf/MD5.cc
| @@ -386,16 +386,7 @@ void MD5::print() | @@ -386,16 +386,7 @@ void MD5::print() | ||
| 386 | std::string MD5::unparse() | 386 | std::string MD5::unparse() |
| 387 | { | 387 | { |
| 388 | final(); | 388 | final(); |
| 389 | - | ||
| 390 | - char result[33]; | ||
| 391 | - char* p = result; | ||
| 392 | - unsigned int i; | ||
| 393 | - for (i = 0; i < 16; ++i) | ||
| 394 | - { | ||
| 395 | - sprintf(p, "%02x", digest_val[i]); | ||
| 396 | - p += 2; | ||
| 397 | - } | ||
| 398 | - return result; | 389 | + return QUtil::hex_encode(std::string((char*)digest_val, 16)); |
| 399 | } | 390 | } |
| 400 | 391 | ||
| 401 | std::string | 392 | std::string |
libqpdf/Pl_SHA2.cc
| @@ -2,6 +2,7 @@ | @@ -2,6 +2,7 @@ | ||
| 2 | #include <stdexcept> | 2 | #include <stdexcept> |
| 3 | #include <cstdio> | 3 | #include <cstdio> |
| 4 | #include <qpdf/PointerHolder.hh> | 4 | #include <qpdf/PointerHolder.hh> |
| 5 | +#include <qpdf/QUtil.hh> | ||
| 5 | 6 | ||
| 6 | Pl_SHA2::Pl_SHA2(int bits, Pipeline* next) : | 7 | Pl_SHA2::Pl_SHA2(int bits, Pipeline* next) : |
| 7 | Pipeline("sha2", next), | 8 | Pipeline("sha2", next), |
| @@ -150,15 +151,5 @@ Pl_SHA2::getHexDigest() | @@ -150,15 +151,5 @@ Pl_SHA2::getHexDigest() | ||
| 150 | throw std::logic_error( | 151 | throw std::logic_error( |
| 151 | "digest requested for in-progress SHA2 Pipeline"); | 152 | "digest requested for in-progress SHA2 Pipeline"); |
| 152 | } | 153 | } |
| 153 | - std::string raw = getRawDigest(); | ||
| 154 | - size_t raw_size = raw.length(); | ||
| 155 | - size_t hex_size = 1 + (2 * raw_size); | ||
| 156 | - PointerHolder<char> bufp(true, new char[hex_size]); | ||
| 157 | - char* buf = bufp.getPointer(); | ||
| 158 | - buf[hex_size - 1] = '\0'; | ||
| 159 | - for (unsigned int i = 0; i < raw_size; ++i) | ||
| 160 | - { | ||
| 161 | - std::sprintf(buf + i * 2, "%02x", (unsigned char)raw[i]); | ||
| 162 | - } | ||
| 163 | - return buf; | 154 | + return QUtil::hex_encode(getRawDigest()); |
| 164 | } | 155 | } |
libqpdf/QPDF_Name.cc
| @@ -2,6 +2,7 @@ | @@ -2,6 +2,7 @@ | ||
| 2 | 2 | ||
| 3 | #include <string.h> | 3 | #include <string.h> |
| 4 | #include <stdio.h> | 4 | #include <stdio.h> |
| 5 | +#include <qpdf/QUtil.hh> | ||
| 5 | 6 | ||
| 6 | QPDF_Name::QPDF_Name(std::string const& name) : | 7 | QPDF_Name::QPDF_Name(std::string const& name) : |
| 7 | name(name) | 8 | name(name) |
| @@ -16,7 +17,6 @@ std::string | @@ -16,7 +17,6 @@ std::string | ||
| 16 | QPDF_Name::normalizeName(std::string const& name) | 17 | QPDF_Name::normalizeName(std::string const& name) |
| 17 | { | 18 | { |
| 18 | std::string result; | 19 | std::string result; |
| 19 | - char num[4]; | ||
| 20 | result += name[0]; | 20 | result += name[0]; |
| 21 | for (unsigned int i = 1; i < name.length(); ++i) | 21 | for (unsigned int i = 1; i < name.length(); ++i) |
| 22 | { | 22 | { |
| @@ -24,8 +24,7 @@ QPDF_Name::normalizeName(std::string const& name) | @@ -24,8 +24,7 @@ QPDF_Name::normalizeName(std::string const& name) | ||
| 24 | // Don't use locale/ctype here; follow PDF spec guidelines. | 24 | // Don't use locale/ctype here; follow PDF spec guidelines. |
| 25 | if (strchr("#()<>[]{}/%", ch) || (ch < 33) || (ch > 126)) | 25 | if (strchr("#()<>[]{}/%", ch) || (ch < 33) || (ch > 126)) |
| 26 | { | 26 | { |
| 27 | - sprintf(num, "#%02x", (unsigned char) ch); | ||
| 28 | - result += num; | 27 | + result += "#" + QUtil::hex_encode(std::string(&ch, 1)); |
| 29 | } | 28 | } |
| 30 | else | 29 | else |
| 31 | { | 30 | { |
libqpdf/QPDF_String.cc
| @@ -90,14 +90,7 @@ QPDF_String::unparse(bool force_binary) | @@ -90,14 +90,7 @@ QPDF_String::unparse(bool force_binary) | ||
| 90 | std::string result; | 90 | std::string result; |
| 91 | if (use_hexstring) | 91 | if (use_hexstring) |
| 92 | { | 92 | { |
| 93 | - result += "<"; | ||
| 94 | - char num[3]; | ||
| 95 | - for (unsigned int i = 0; i < this->val.length(); ++i) | ||
| 96 | - { | ||
| 97 | - sprintf(num, "%02x", (unsigned char) this->val[i]); | ||
| 98 | - result += num; | ||
| 99 | - } | ||
| 100 | - result += ">"; | 93 | + result += "<" + QUtil::hex_encode(this->val) + ">"; |
| 101 | } | 94 | } |
| 102 | else | 95 | else |
| 103 | { | 96 | { |
libqpdf/QUtil.cc
| @@ -2,6 +2,7 @@ | @@ -2,6 +2,7 @@ | ||
| 2 | #include <qpdf/qpdf-config.h> | 2 | #include <qpdf/qpdf-config.h> |
| 3 | 3 | ||
| 4 | #include <qpdf/QUtil.hh> | 4 | #include <qpdf/QUtil.hh> |
| 5 | +#include <qpdf/PointerHolder.hh> | ||
| 5 | 6 | ||
| 6 | #include <stdio.h> | 7 | #include <stdio.h> |
| 7 | #include <errno.h> | 8 | #include <errno.h> |
| @@ -163,6 +164,21 @@ QUtil::copy_string(std::string const& str) | @@ -163,6 +164,21 @@ QUtil::copy_string(std::string const& str) | ||
| 163 | return result; | 164 | return result; |
| 164 | } | 165 | } |
| 165 | 166 | ||
| 167 | +std::string | ||
| 168 | +QUtil::hex_encode(std::string const& input) | ||
| 169 | +{ | ||
| 170 | + size_t input_size = input.length(); | ||
| 171 | + size_t hex_size = 1 + (2 * input_size); | ||
| 172 | + PointerHolder<char> bufp(true, new char[hex_size]); | ||
| 173 | + char* buf = bufp.getPointer(); | ||
| 174 | + buf[hex_size - 1] = '\0'; | ||
| 175 | + for (unsigned int i = 0; i < input_size; ++i) | ||
| 176 | + { | ||
| 177 | + sprintf(buf + i * 2, "%02x", (unsigned char)input[i]); | ||
| 178 | + } | ||
| 179 | + return buf; | ||
| 180 | +} | ||
| 181 | + | ||
| 166 | void | 182 | void |
| 167 | QUtil::binary_stdout() | 183 | QUtil::binary_stdout() |
| 168 | { | 184 | { |
qpdf/test_driver.cc
| @@ -75,16 +75,9 @@ ParserCallbacks::handleObject(QPDFObjectHandle obj) | @@ -75,16 +75,9 @@ ParserCallbacks::handleObject(QPDFObjectHandle obj) | ||
| 75 | std::cout << obj.getTypeName() << ": "; | 75 | std::cout << obj.getTypeName() << ": "; |
| 76 | if (obj.isInlineImage()) | 76 | if (obj.isInlineImage()) |
| 77 | { | 77 | { |
| 78 | + // Exercise getTypeCode | ||
| 78 | assert(obj.getTypeCode() == QPDFObject::ot_inlineimage); | 79 | assert(obj.getTypeCode() == QPDFObject::ot_inlineimage); |
| 79 | - std::string val = obj.getInlineImageValue(); | ||
| 80 | - char buf[3]; | ||
| 81 | - buf[2] = '\0'; | ||
| 82 | - for (size_t i = 0; i < val.length(); ++i) | ||
| 83 | - { | ||
| 84 | - sprintf(buf, "%02x", (unsigned char)(val[i])); | ||
| 85 | - std::cout << buf; | ||
| 86 | - } | ||
| 87 | - std::cout << std::endl; | 80 | + std::cout << QUtil::hex_encode(obj.getInlineImageValue()) << std::endl; |
| 88 | } | 81 | } |
| 89 | else | 82 | else |
| 90 | { | 83 | { |