Commit a51ae10b8ddada900c1abacd6284d35f6e65aa08

Authored by Jay Berkenbilt
1 parent 66c3c8fd

Remove all calls to sprintf

ChangeLog
  1 +2013-02-28 Jay Berkenbilt <ejb@ql.org>
  2 +
  3 + * Remove all calls to sprintf
  4 +
  5 + * New method QUtil::int_to_string_base to convert to octal or
  6 + hexademical (or decimal) strings without using sprintf
  7 +
1 8 2013-02-26 Jay Berkenbilt <ejb@ql.org>
2 9  
3 10 * Rewrite QUtil::int_to_string and QUtil::double_to_string to
... ...
include/qpdf/QUtil.hh
... ... @@ -22,6 +22,8 @@ namespace QUtil
22 22 QPDF_DLL
23 23 std::string int_to_string(long long, int length = 0);
24 24 QPDF_DLL
  25 + std::string int_to_string_base(long long, int base, int length = 0);
  26 + QPDF_DLL
25 27 std::string double_to_string(double, int decimal_places = 0);
26 28  
27 29 QPDF_DLL
... ...
libqpdf/QPDF_String.cc
... ... @@ -95,7 +95,6 @@ QPDF_String::unparse(bool force_binary)
95 95 else
96 96 {
97 97 result += "(";
98   - char num[5];
99 98 for (unsigned int i = 0; i < this->val.length(); ++i)
100 99 {
101 100 char ch = this->val[i];
... ... @@ -140,8 +139,9 @@ QPDF_String::unparse(bool force_binary)
140 139 }
141 140 else
142 141 {
143   - sprintf(num, "\\%03o", static_cast<unsigned char>(ch)); // XXXX
144   - result += num;
  142 + result += "\\" + QUtil::int_to_string_base(
  143 + static_cast<int>(static_cast<unsigned char>(ch)),
  144 + 8, 3);
145 145 }
146 146 break;
147 147 }
... ...
libqpdf/QUtil.cc
... ... @@ -24,11 +24,23 @@
24 24 std::string
25 25 QUtil::int_to_string(long long num, int length)
26 26 {
27   - // Backward compatibility -- this function used to use sprintf
28   - // with %0*d, so we interpret length such that a negative value
29   - // appends spaces and a positive value prepends zeroes.
  27 + return int_to_string_base(num, 10, length);
  28 +}
  29 +
  30 +std::string
  31 +QUtil::int_to_string_base(long long num, int base, int length)
  32 +{
  33 + // Backward compatibility -- int_to_string, which calls this
  34 + // function, used to use sprintf with %0*d, so we interpret length
  35 + // such that a negative value appends spaces and a positive value
  36 + // prepends zeroes.
  37 + if (! ((base == 8) || (base == 10) || (base == 16)))
  38 + {
  39 + throw std::logic_error(
  40 + "int_to_string_base called with unsupported base");
  41 + }
30 42 std::ostringstream buf;
31   - buf << num;
  43 + buf << std::setbase(base) << std::nouppercase << num;
32 44 std::string result;
33 45 if ((length > 0) &&
34 46 (buf.str().length() < static_cast<size_t>(length)))
... ... @@ -152,16 +164,13 @@ QUtil::copy_string(std::string const&amp; str)
152 164 std::string
153 165 QUtil::hex_encode(std::string const& input)
154 166 {
155   - size_t input_size = input.length();
156   - size_t hex_size = 1 + (2 * input_size);
157   - PointerHolder<char> bufp(true, new char[hex_size]);
158   - char* buf = bufp.getPointer();
159   - buf[hex_size - 1] = '\0';
160   - for (unsigned int i = 0; i < input_size; ++i)
  167 + std::string result;
  168 + for (unsigned int i = 0; i < input.length(); ++i)
161 169 {
162   - sprintf(buf + i * 2, "%02x", static_cast<unsigned char>(input[i])); // XXXX
  170 + result += QUtil::int_to_string_base(
  171 + static_cast<int>(static_cast<unsigned char>(input[i])), 16, 2);
163 172 }
164   - return buf;
  173 + return result;
165 174 }
166 175  
167 176 void
... ...
libtests/qtest/qutil/qutil.out
... ... @@ -8,6 +8,9 @@
8 8 0.00012
9 9 0.12346
10 10 0.00012
  11 +16059
  12 +37273
  13 +3ebb
11 14 one
12 15 7
13 16 compare okay
... ...
libtests/qutil.cc
... ... @@ -23,7 +23,10 @@ void string_conversion_test()
23 23 << QUtil::double_to_string(.1234, 5) << std::endl
24 24 << QUtil::double_to_string(.0001234, 5) << std::endl
25 25 << QUtil::double_to_string(.123456, 5) << std::endl
26   - << QUtil::double_to_string(.000123456, 5) << std::endl;
  26 + << QUtil::double_to_string(.000123456, 5) << std::endl
  27 + << QUtil::int_to_string_base(16059, 10) << std::endl
  28 + << QUtil::int_to_string_base(16059, 8) << std::endl
  29 + << QUtil::int_to_string_base(16059, 16) << std::endl;
27 30  
28 31 std::string embedded_null = "one";
29 32 embedded_null += '\0';
... ... @@ -86,10 +89,8 @@ void getenv_test()
86 89  
87 90 static void print_utf8(unsigned long val)
88 91 {
89   - char t[20];
90   - sprintf(t, "%lx", val); // XXXX
91 92 std::string result = QUtil::toUTF8(val);
92   - std::cout << "0x" << t << " ->";
  93 + std::cout << "0x" << QUtil::int_to_string_base(val, 16) << " ->";
93 94 if (val < 0xfffe)
94 95 {
95 96 std::cout << " " << result;
... ... @@ -102,9 +103,8 @@ static void print_utf8(unsigned long val)
102 103 for (std::string::iterator iter = result.begin();
103 104 iter != result.end(); ++iter)
104 105 {
105   - char t[3];
106   - sprintf(t, "%02x", static_cast<unsigned char>(*iter)); // XXXX
107   - std::cout << " " << t;
  106 + std::cout << " " << QUtil::int_to_string_base(
  107 + static_cast<int>(static_cast<unsigned char>(*iter)), 16, 2);
108 108 }
109 109 }
110 110 std::cout << std::endl;
... ...