From 4c7853c951eeab3d27be09e93dde321216a49287 Mon Sep 17 00:00:00 2001
From: Přemysl Janouch
Date: Wed, 3 Oct 2018 22:46:38 +0200
Subject: Try to return the innermost error message
Improving debugging experience.
---
pdf-simple-sign.cpp | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/pdf-simple-sign.cpp b/pdf-simple-sign.cpp
index 89b29a4..e18c058 100644
--- a/pdf-simple-sign.cpp
+++ b/pdf-simple-sign.cpp
@@ -353,6 +353,12 @@ public:
// -------------------------------------------------------------------------------------------------
+/// If the object is an error, forward its message, otherwise return err.
+static std::string pdf_error(const pdf_object& o, const char* err) {
+ if (o.type != pdf_object::END || o.string.empty()) return err;
+ return o.string;
+}
+
pdf_object pdf_updater::parse_obj(pdf_lexer& lex, std::vector& stack) const {
if (stack.size() < 2)
return {pdf_object::END, "missing object ID pair"};
@@ -370,7 +376,7 @@ pdf_object pdf_updater::parse_obj(pdf_lexer& lex, std::vector& stack
while (1) {
auto object = parse(lex, obj.array);
if (object.type == pdf_object::END)
- return {pdf_object::END, "object doesn't end"};
+ return {pdf_object::END, pdf_error(object, "object doesn't end")};
if (object.type == pdf_object::KEYWORD && object.string == "endobj")
break;
obj.array.push_back(std::move(object));
@@ -408,7 +414,7 @@ pdf_object pdf_updater::parse(pdf_lexer& lex, std::vector& stack) co
while (1) {
auto object = parse(lex, array);
if (object.type == pdf_object::END)
- return {pdf_object::END, "array doesn't end"};
+ return {pdf_object::END, pdf_error(object, "array doesn't end")};
if (object.type == pdf_object::E_ARRAY)
break;
array.push_back(std::move(object));
@@ -421,7 +427,7 @@ pdf_object pdf_updater::parse(pdf_lexer& lex, std::vector& stack) co
while (1) {
auto object = parse(lex, array);
if (object.type == pdf_object::END)
- return {pdf_object::END, "dictionary doesn't end"};
+ return {pdf_object::END, pdf_error(object, "dictionary doesn't end")};
if (object.type == pdf_object::E_DICT)
break;
array.push_back(std::move(object));
@@ -459,7 +465,7 @@ std::string pdf_updater::load_xref(pdf_lexer& lex, std::set& loaded_entrie
while (1) {
auto object = parse(lex, throwaway_stack);
if (object.type == pdf_object::END)
- return "unexpected EOF while looking for the trailer";
+ return pdf_error(object, "unexpected EOF while looking for the trailer");
if (object.type == pdf_object::KEYWORD && object.string == "trailer")
break;
@@ -529,7 +535,7 @@ std::string pdf_updater::initialize() {
auto trailer = parse(lex, throwaway_stack);
if (trailer.type != pdf_object::DICT)
- return "invalid trailer dictionary";
+ return pdf_error(trailer, "invalid trailer dictionary");
if (loaded_xrefs.empty())
this->trailer = trailer.dict;
loaded_xrefs.insert(xref_offset);
--
cgit v1.2.3-70-g09d2