diff options
author | Jay Berkenbilt <ejb@ql.org> | 2024-01-02 00:55:45 +0100 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2024-01-02 00:57:32 +0100 |
commit | d8d70ecca264fa5c681dca992a03cfa4c46b3f43 (patch) | |
tree | f9960a48f4550f6a9fc2d09cef27fba66852bdd5 /libqpdf/QPDFJob_config.cc | |
parent | 9db5d75b2b40083f339525f7a59b4408cb1b5d2c (diff) | |
download | qpdf-d8d70ecca264fa5c681dca992a03cfa4c46b3f43.tar.zst |
Support comma-separated numeric values with --collate (fixes #505)
Diffstat (limited to 'libqpdf/QPDFJob_config.cc')
-rw-r--r-- | libqpdf/QPDFJob_config.cc | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/libqpdf/QPDFJob_config.cc b/libqpdf/QPDFJob_config.cc index 4798ce9b..a0dc10f6 100644 --- a/libqpdf/QPDFJob_config.cc +++ b/libqpdf/QPDFJob_config.cc @@ -98,8 +98,27 @@ QPDFJob::Config::collate() QPDFJob::Config* QPDFJob::Config::collate(std::string const& parameter) { - auto n = (parameter.empty() ? 1 : QUtil::string_to_uint(parameter.c_str())); - o.m->collate = QIntC::to_size(n); + if (parameter.empty()) { + o.m->collate.push_back(1); + return this; + } + size_t pos = 0; + // Parse a,b,c + while (true) { + auto end = parameter.find(',', pos); + auto n = parameter.substr(pos, end); + if (n.empty()) { + usage("--collate: trailing comma"); + } + o.m->collate.push_back(QIntC::to_size(QUtil::string_to_uint(n.c_str()))); + if (end == std::string::npos) { + break; + } + pos = end + 1; + } + if (o.m->collate.empty()) { + o.m->collate.push_back(1); + } return this; } @@ -932,9 +951,15 @@ QPDFJob::Config::pages() QPDFJob::Config* QPDFJob::PagesConfig::endPages() { - if (this->config->o.m->page_specs.empty()) { + auto n_specs = config->o.m->page_specs.size(); + if (n_specs == 0) { usage("--pages: no page specifications given"); } + auto n_collate = config->o.m->collate.size(); + if (!(n_collate == 0 || n_collate == 1 || n_collate == n_specs)) { + usage("--pages: if --collate has more than one value, it must have one value per page " + "specification"); + } return this->config; } |