aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/qpdf/QUtil.hh13
-rw-r--r--libqpdf/QPDF_Name.cc2
2 files changed, 14 insertions, 1 deletions
diff --git a/include/qpdf/QUtil.hh b/include/qpdf/QUtil.hh
index 6d9d18ae..27521a70 100644
--- a/include/qpdf/QUtil.hh
+++ b/include/qpdf/QUtil.hh
@@ -210,6 +210,11 @@ namespace QUtil
QPDF_DLL
std::string hex_encode(std::string const&);
+ // Returns lower-case hex-encoded version of the char including a leading
+ // "#".
+ QPDF_DLL
+ inline std::string hex_encode_char(char);
+
// Returns a string that is the result of decoding the input
// string. The input string may consist of mixed case hexadecimal
// digits. Any characters that are not hexadecimal digits will be
@@ -583,4 +588,12 @@ QUtil::is_number(char const* p)
return found_digit;
}
+inline std::string
+QUtil::hex_encode_char(char c)
+{
+ static auto constexpr hexchars = "0123456789abcdef";
+ return {
+ '#', hexchars[static_cast<unsigned char>(c) >> 4], hexchars[c & 0x0f]};
+}
+
#endif // QUTIL_HH
diff --git a/libqpdf/QPDF_Name.cc b/libqpdf/QPDF_Name.cc
index 353cf311..1587bcf4 100644
--- a/libqpdf/QPDF_Name.cc
+++ b/libqpdf/QPDF_Name.cc
@@ -38,7 +38,7 @@ QPDF_Name::normalizeName(std::string const& name)
// invalid #.
result += "#";
} else if (strchr("#()<>[]{}/%", ch) || (ch < 33) || (ch > 126)) {
- result += "#" + QUtil::hex_encode(std::string(&ch, 1));
+ result += QUtil::hex_encode_char(ch);
} else {
result += ch;
}