From 1cc532dc9121d02d92ac6ce5abb9376b4842c05f Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Wed, 26 Jan 2022 09:09:29 -0500 Subject: [PATCH] QPDFJob: move some helpers from ArgParser to QPDFJob --- include/qpdf/QPDFJob.hh | 8 ++++ libqpdf/QPDFJob.cc | 96 ++++++++++++++++++++++++++++++++++++-- libqpdf/QPDFJob_argv.cc | 100 ++-------------------------------------- 3 files changed, 105 insertions(+), 99 deletions(-) diff --git a/include/qpdf/QPDFJob.hh b/include/qpdf/QPDFJob.hh index 5d29e34e..6445665a 100644 --- a/include/qpdf/QPDFJob.hh +++ b/include/qpdf/QPDFJob.hh @@ -422,9 +422,17 @@ class QPDFJob bool check_requires_password; std::shared_ptr infilename; std::shared_ptr outfilename; + + // Helper functions + void parseRotationParameter(std::string const&); + std::vector parseNumrange(char const* range, int max, + bool throw_error = false); + + // QXXXQ END-PUBLIC private: + // Basic file processing std::shared_ptr processFile( char const* filename, char const* password); diff --git a/libqpdf/QPDFJob.cc b/libqpdf/QPDFJob.cc index eb06e076..85df861b 100644 --- a/libqpdf/QPDFJob.cc +++ b/libqpdf/QPDFJob.cc @@ -464,6 +464,94 @@ QPDFJob::config() return std::shared_ptr(new Config(*this)); } +void +QPDFJob::parseRotationParameter(std::string const& parameter) +{ + QPDFJob& o = *this; // QXXXQ + std::string angle_str; + std::string range; + size_t colon = parameter.find(':'); + int relative = 0; + if (colon != std::string::npos) + { + if (colon > 0) + { + angle_str = parameter.substr(0, colon); + } + if (colon + 1 < parameter.length()) + { + range = parameter.substr(colon + 1); + } + } + else + { + angle_str = parameter; + } + if (angle_str.length() > 0) + { + char first = angle_str.at(0); + if ((first == '+') || (first == '-')) + { + relative = ((first == '+') ? 1 : -1); + angle_str = angle_str.substr(1); + } + else if (! QUtil::is_digit(angle_str.at(0))) + { + angle_str = ""; + } + } + if (range.empty()) + { + range = "1-z"; + } + bool range_valid = false; + try + { + parseNumrange(range.c_str(), 0, true); + range_valid = true; + } + catch (std::runtime_error const&) + { + // ignore + } + if (range_valid && + ((angle_str == "0") ||(angle_str == "90") || + (angle_str == "180") || (angle_str == "270"))) + { + int angle = QUtil::string_to_int(angle_str.c_str()); + if (relative == -1) + { + angle = -angle; + } + o.rotations[range] = RotationSpec(angle, (relative != 0)); + } + else + { + throw ConfigError("invalid parameter to rotate: " + parameter); + } +} + +std::vector +QPDFJob::parseNumrange(char const* range, int max, bool throw_error) +{ + try + { + return QUtil::parse_numrange(range, max); + } + catch (std::runtime_error& e) + { + if (throw_error) + { + throw(e); + } + else + { + throw ConfigError(e.what()); + } + } + return std::vector(); +} + void QPDFJob::run() { @@ -1072,7 +1160,7 @@ QPDFJob::getWantedJSONObjects() bool trailer; int obj = 0; int gen = 0; - QPDFJob::parse_object_id(iter, trailer, obj, gen); + parse_object_id(iter, trailer, obj, gen); if (obj) { wanted_og.insert(QPDFObjGen(obj, gen)); @@ -1806,7 +1894,7 @@ QPDFJob::doJSON(QPDF& pdf) // Check against schema - JSON schema = QPDFJob::json_schema(&o.json_keys); + JSON schema = json_schema(&o.json_keys); std::list errors; if (! j.checkSchema(schema, errors)) { @@ -2029,7 +2117,7 @@ QPDFJob::processInputSource( } void -QPDFJob::validateUnderOverlay(QPDF& pdf, QPDFJob::UnderOverlay* uo) +QPDFJob::validateUnderOverlay(QPDF& pdf, UnderOverlay* uo) { if (uo->filename.empty()) { @@ -2089,7 +2177,7 @@ static QPDFAcroFormDocumentHelper* get_afdh_for_qpdf( void QPDFJob::doUnderOverlayForPage( QPDF& pdf, - QPDFJob::UnderOverlay& uo, + UnderOverlay& uo, std::map >& pagenos, size_t page_idx, std::map& fo, diff --git a/libqpdf/QPDFJob_argv.cc b/libqpdf/QPDFJob_argv.cc index a11eca9f..7cd8e22e 100644 --- a/libqpdf/QPDFJob_argv.cc +++ b/libqpdf/QPDFJob_argv.cc @@ -37,9 +37,6 @@ namespace void initOptionTables(); void doFinalChecks(); void parseUnderOverlayOptions(QPDFJob::UnderOverlay*); - void parseRotationParameter(std::string const&); - std::vector parseNumrange(char const* range, int max, - bool throw_error = false); QPDFArgParser ap; QPDFJob& o; @@ -324,7 +321,7 @@ ArgParser::argPagesPositional(char* arg) { try { - parseNumrange(range, 0, true); + o.parseNumrange(range, 0, true); } catch (std::runtime_error& e1) { @@ -384,7 +381,7 @@ ArgParser::argOverlay() void ArgParser::argRotate(char* parameter) { - parseRotationParameter(parameter); + o.parseRotationParameter(parameter); } void @@ -592,7 +589,7 @@ ArgParser::argUOPositional(char* arg) void ArgParser::argUOTo(char* parameter) { - parseNumrange(parameter, 0); + o.parseNumrange(parameter, 0); o.under_overlay->to_nr = parameter; } @@ -601,7 +598,7 @@ ArgParser::argUOFrom(char* parameter) { if (strlen(parameter)) { - parseNumrange(parameter, 0); + o.parseNumrange(parameter, 0); } o.under_overlay->from_nr = parameter; } @@ -611,7 +608,7 @@ ArgParser::argUORepeat(char* parameter) { if (strlen(parameter)) { - parseNumrange(parameter, 0); + o.parseNumrange(parameter, 0); } o.under_overlay->repeat_nr = parameter; } @@ -670,27 +667,6 @@ ArgParser::usage(std::string const& message) this->ap.usage(message); } -std::vector -ArgParser::parseNumrange(char const* range, int max, bool throw_error) -{ - try - { - return QUtil::parse_numrange(range, max); - } - catch (std::runtime_error& e) - { - if (throw_error) - { - throw(e); - } - else - { - usage(e.what()); - } - } - return std::vector(); -} - void ArgParser::parseUnderOverlayOptions(QPDFJob::UnderOverlay* uo) { @@ -698,72 +674,6 @@ ArgParser::parseUnderOverlayOptions(QPDFJob::UnderOverlay* uo) this->ap.selectOptionTable(O_UNDERLAY_OVERLAY); } -void -ArgParser::parseRotationParameter(std::string const& parameter) -{ - std::string angle_str; - std::string range; - size_t colon = parameter.find(':'); - int relative = 0; - if (colon != std::string::npos) - { - if (colon > 0) - { - angle_str = parameter.substr(0, colon); - } - if (colon + 1 < parameter.length()) - { - range = parameter.substr(colon + 1); - } - } - else - { - angle_str = parameter; - } - if (angle_str.length() > 0) - { - char first = angle_str.at(0); - if ((first == '+') || (first == '-')) - { - relative = ((first == '+') ? 1 : -1); - angle_str = angle_str.substr(1); - } - else if (! QUtil::is_digit(angle_str.at(0))) - { - angle_str = ""; - } - } - if (range.empty()) - { - range = "1-z"; - } - bool range_valid = false; - try - { - parseNumrange(range.c_str(), 0, true); - range_valid = true; - } - catch (std::runtime_error const&) - { - // ignore - } - if (range_valid && - ((angle_str == "0") ||(angle_str == "90") || - (angle_str == "180") || (angle_str == "270"))) - { - int angle = QUtil::string_to_int(angle_str.c_str()); - if (relative == -1) - { - angle = -angle; - } - o.rotations[range] = QPDFJob::RotationSpec(angle, (relative != 0)); - } - else - { - usage("invalid parameter to rotate: " + parameter); - } -} - void ArgParser::parseOptions() {