summaryrefslogtreecommitdiff
path: root/dviware/dvisvgm/src/CMapReader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dviware/dvisvgm/src/CMapReader.cpp')
-rw-r--r--dviware/dvisvgm/src/CMapReader.cpp23
1 files changed, 19 insertions, 4 deletions
diff --git a/dviware/dvisvgm/src/CMapReader.cpp b/dviware/dvisvgm/src/CMapReader.cpp
index 08450cf17f..f873bded0a 100644
--- a/dviware/dvisvgm/src/CMapReader.cpp
+++ b/dviware/dvisvgm/src/CMapReader.cpp
@@ -89,9 +89,10 @@ void CMapReader::executeOperator (const string &opname, InputReader &ir) {
const char *name;
void (CMapReader::*handler)(InputReader&);
};
- constexpr array<Operator, 6> operators {{
+ constexpr array<Operator, 7> operators {{
{"beginbfchar", &CMapReader::op_beginbfchar},
{"beginbfrange", &CMapReader::op_beginbfrange},
+ {"begincidchar", &CMapReader::op_begincidchar},
{"begincidrange", &CMapReader::op_begincidrange},
{"def", &CMapReader::op_def},
{"endcmap", &CMapReader::op_endcmap},
@@ -154,6 +155,22 @@ static uint32_t parse_hexentry (InputReader &ir) {
}
+void CMapReader::op_begincidchar (InputReader &ir) {
+ if (!_tokens.empty() && _tokens.back().type() == Token::Type::NUMBER) {
+ ir.skipSpace();
+ int num_entries = static_cast<int>(popToken().numvalue());
+ while (num_entries > 0 && ir.peek() == '<') {
+ uint32_t first = parse_hexentry(ir);
+ uint32_t cid;
+ ir.skipSpace();
+ if (!ir.parseUInt(cid))
+ throw CMapReaderException("invalid char entry (decimal value expected)");
+ _cmap->addCIDRange(first, first, cid);
+ ir.skipSpace();
+ }
+ }
+}
+
void CMapReader::op_begincidrange (InputReader &ir) {
if (!_tokens.empty() && _tokens.back().type() == Token::Type::NUMBER) {
ir.skipSpace();
@@ -249,9 +266,7 @@ void CMapReader::Token::scan (InputReader &ir) {
else if (isdigit(ir.peek())) { // number?
double val;
if (ir.parseDouble(val)) {
- ostringstream oss;
- oss << val;
- _value = oss.str();
+ _value = util::to_string(val);
_type = Type::NUMBER;
}
}