diff options
author | Norbert Preining <norbert@preining.info> | 2019-10-29 03:00:39 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-10-29 03:00:39 +0000 |
commit | 97f5151099967e6c823d640a90d87bca92c44035 (patch) | |
tree | 685caa49488599f87d0caa4e972833b2263d8567 /dviware/dvisvgm/src/CMapReader.cpp | |
parent | 25a647b97ef526aefcc75269dd19c46dbe3ae4c1 (diff) |
CTAN sync 201910290300
Diffstat (limited to 'dviware/dvisvgm/src/CMapReader.cpp')
-rw-r--r-- | dviware/dvisvgm/src/CMapReader.cpp | 23 |
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; } } |