From da7c2c0ee90104524ed98a2370af0ea70a0f6d0d Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Mon, 11 Mar 2019 16:21:27 -0400 Subject: [PATCH] Fix json serialization for {x | -1 < x < 1} (fixes #308) JSON serialization was preserving the value as presented, but JSON doesn't accept decimal values without a 0 before the decimal point. --- ChangeLog | 5 +++++ libqpdf/QPDF_Real.cc | 25 ++++++++++++++++++++++++- libtests/json.cc | 6 +++++- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 62c20948..9f33d4cf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2019-03-11 Jay Berkenbilt + + * JSON serialization: add missing leading 0 to decimal values + between -1 and 1. Fixes #308. + 2019-02-01 Jay Berkenbilt * 8.4.0: release diff --git a/libqpdf/QPDF_Real.cc b/libqpdf/QPDF_Real.cc index b28c2f70..b4c8283f 100644 --- a/libqpdf/QPDF_Real.cc +++ b/libqpdf/QPDF_Real.cc @@ -25,7 +25,30 @@ QPDF_Real::unparse() JSON QPDF_Real::getJSON() { - return JSON::makeNumber(this->val); + // While PDF allows .x or -.x, JSON does not. Rather than + // convering from string to double and back, just handle this as a + // special case for JSON. + std::string result; + if (this->val.length() == 0) + { + // Can't really happen... + result = "0"; + } + else if (this->val.at(0) == '.') + { + result = "0" + this->val; + } + else if ((this->val.length() >= 2) && + (this->val.at(0) == '-') && + (this->val.at(1) == '.')) + { + result = "-0." + this->val.substr(2); + } + else + { + result = this->val; + } + return JSON::makeNumber(result); } QPDFObject::object_type_e diff --git a/libtests/json.cc b/libtests/json.cc index 1a9123ad..e3086c18 100644 --- a/libtests/json.cc +++ b/libtests/json.cc @@ -3,7 +3,7 @@ #include #include -static void check(JSON& j, std::string const& exp) +static void check(JSON const& j, std::string const& exp) { if (exp != j.unparse()) { @@ -69,6 +69,10 @@ static void test_main() " ],\n" " \"yes\": false\n" "}"); + check(QPDFObjectHandle::newReal("0.12").getJSON(), "0.12"); + check(QPDFObjectHandle::newReal(".34").getJSON(), "0.34"); + check(QPDFObjectHandle::newReal("-0.56").getJSON(), "-0.56"); + check(QPDFObjectHandle::newReal("-.78").getJSON(), "-0.78"); } static void check_schema(JSON& obj, JSON& schema, bool exp,