Commit b02d37bc0ae0b7af6077637f855be8579c768c22
1 parent
bc4e2320
Make QPDFArgParser accept const argv
This makes it much more convention to use the initializeFromArgv functions since you can use string literals.
Showing
23 changed files
with
556 additions
and
501 deletions
generate_auto_job
| ... | ... | @@ -111,13 +111,14 @@ from contextlib import contextmanager |
| 111 | 111 | # Every command-line option in the main option table has a |
| 112 | 112 | # corresponding method in Config whose name is the option converted to |
| 113 | 113 | # camel case. For bare options and options with optional parameters, a |
| 114 | -# version exists that takes no arguments. For others, a version exists | |
| 115 | -# that takes a char const*. For example, the --qdf flag implies a | |
| 116 | -# qdf() method in Config, and the --object-streams flag implies an | |
| 117 | -# objectStreams(char const*) method in Config. For flags in option | |
| 118 | -# tables, the method is declared inside a config class specific to the | |
| 119 | -# option table. The mapping between option tables and config classes | |
| 120 | -# is explicit in job.yml. Positional arguments are handled | |
| 114 | +# version exists that takes no arguments. For other than bare options, | |
| 115 | +# a version exist, possibly in addition, that takes a std::string | |
| 116 | +# const&. For example, the --qdf flag implies a qdf() method in | |
| 117 | +# Config, and the --object-streams flag implies an | |
| 118 | +# objectStreams(std::string const&) method in Config. For flags in | |
| 119 | +# option tables, the method is declared inside a config class specific | |
| 120 | +# to the option table. The mapping between option tables and config | |
| 121 | +# classes is explicit in job.yml. Positional arguments are handled | |
| 121 | 122 | # individually and manually -- see QPDFJob.hh in the CONFIGURATION |
| 122 | 123 | # section for details. See examples/qpdf-job.cc for an example. |
| 123 | 124 | # |
| ... | ... | @@ -460,29 +461,33 @@ class Main: |
| 460 | 461 | self.init.append(f'this->ap.addBare("{i}", ' |
| 461 | 462 | f'[this](){{{cfg}->{identifier}();}});') |
| 462 | 463 | elif kind == 'required_parameter': |
| 463 | - self.init.append(f'this->ap.addRequiredParameter("{i}", ' | |
| 464 | - f'[this](char *x){{{cfg}->{identifier}(x);}}' | |
| 465 | - f', "{v}");') | |
| 464 | + self.init.append( | |
| 465 | + f'this->ap.addRequiredParameter("{i}", ' | |
| 466 | + f'[this](std::string const& x){{{cfg}->{identifier}(x);}}' | |
| 467 | + f', "{v}");') | |
| 466 | 468 | elif kind == 'optional_parameter': |
| 467 | 469 | decl_arg_optional = True |
| 468 | - self.init.append(f'this->ap.addOptionalParameter("{i}", ' | |
| 469 | - f'[this](char *x){{{cfg}->{identifier}(x);}});') | |
| 470 | + self.init.append( | |
| 471 | + f'this->ap.addOptionalParameter("{i}", ' | |
| 472 | + f'[this](std::string const& x){{{cfg}->{identifier}(x);}});') | |
| 470 | 473 | elif kind == 'required_choices': |
| 471 | - self.init.append(f'this->ap.addChoices("{i}", ' | |
| 472 | - f'[this](char *x){{{cfg}->{identifier}(x);}}' | |
| 473 | - f', true, {v}_choices);') | |
| 474 | + self.init.append( | |
| 475 | + f'this->ap.addChoices("{i}", ' | |
| 476 | + f'[this](std::string const& x){{{cfg}->{identifier}(x);}}' | |
| 477 | + f', true, {v}_choices);') | |
| 474 | 478 | elif kind == 'optional_choices': |
| 475 | 479 | decl_arg_optional = True |
| 476 | - self.init.append(f'this->ap.addChoices("{i}", ' | |
| 477 | - f'[this](char *x){{{cfg}->{identifier}(x);}}' | |
| 478 | - f', false, {v}_choices);') | |
| 480 | + self.init.append( | |
| 481 | + f'this->ap.addChoices("{i}", ' | |
| 482 | + f'[this](std::string const& x){{{cfg}->{identifier}(x);}}' | |
| 483 | + f', false, {v}_choices);') | |
| 479 | 484 | |
| 480 | 485 | # Generate declarations for config methods separately by |
| 481 | 486 | # config object. |
| 482 | 487 | config_prefix = prefix + 'Config' |
| 483 | 488 | arg = '' |
| 484 | 489 | if decl_arg: |
| 485 | - arg = 'char const* parameter' | |
| 490 | + arg = 'std::string const& parameter' | |
| 486 | 491 | fn = f'{config_prefix}* {identifier}({arg})' |
| 487 | 492 | if fn not in self.declared_configs: |
| 488 | 493 | self.declared_configs.add(fn) |
| ... | ... | @@ -510,21 +515,21 @@ class Main: |
| 510 | 515 | self.init.append(f'this->ap.addBare("{i}", ' |
| 511 | 516 | f'b(&ArgParser::{identifier}));') |
| 512 | 517 | elif kind == 'required_parameter': |
| 513 | - self.decls.append(f'void {identifier}(char *);') | |
| 518 | + self.decls.append(f'void {identifier}(std::string const&);') | |
| 514 | 519 | self.init.append(f'this->ap.addRequiredParameter("{i}", ' |
| 515 | 520 | f'p(&ArgParser::{identifier})' |
| 516 | 521 | f', "{v}");') |
| 517 | 522 | elif kind == 'optional_parameter': |
| 518 | - self.decls.append(f'void {identifier}(char *);') | |
| 523 | + self.decls.append(f'void {identifier}(std::string const&);') | |
| 519 | 524 | self.init.append(f'this->ap.addOptionalParameter("{i}", ' |
| 520 | 525 | f'p(&ArgParser::{identifier}));') |
| 521 | 526 | elif kind == 'required_choices': |
| 522 | - self.decls.append(f'void {identifier}(char *);') | |
| 527 | + self.decls.append(f'void {identifier}(std::string const&);') | |
| 523 | 528 | self.init.append(f'this->ap.addChoices("{i}", ' |
| 524 | 529 | f'p(&ArgParser::{identifier})' |
| 525 | 530 | f', true, {v}_choices);') |
| 526 | 531 | elif kind == 'optional_choices': |
| 527 | - self.decls.append(f'void {identifier}(char *);') | |
| 532 | + self.decls.append(f'void {identifier}(std::string const&);') | |
| 528 | 533 | self.init.append(f'this->ap.addChoices("{i}", ' |
| 529 | 534 | f'p(&ArgParser::{identifier})' |
| 530 | 535 | f', false, {v}_choices);') |
| ... | ... | @@ -555,7 +560,8 @@ class Main: |
| 555 | 560 | self.init.append('auto b = [this](void (ArgParser::*f)()) {') |
| 556 | 561 | self.init.append(' return QPDFArgParser::bindBare(f, this);') |
| 557 | 562 | self.init.append('};') |
| 558 | - self.init.append('auto p = [this](void (ArgParser::*f)(char *)) {') | |
| 563 | + self.init.append( | |
| 564 | + 'auto p = [this](void (ArgParser::*f)(std::string const&)) {') | |
| 559 | 565 | self.init.append(' return QPDFArgParser::bindParam(f, this);') |
| 560 | 566 | self.init.append('};') |
| 561 | 567 | self.init.append('') |
| ... | ... | @@ -615,7 +621,8 @@ class Main: |
| 615 | 621 | self.init.append(f'this->ap.registerOptionTable("{table}",' |
| 616 | 622 | f' b(&ArgParser::{identifier}));') |
| 617 | 623 | if o.get('positional', False): |
| 618 | - self.decls.append(f'void {arg_prefix}Positional(char*);') | |
| 624 | + self.decls.append( | |
| 625 | + f'void {arg_prefix}Positional(std::string const&);') | |
| 619 | 626 | self.init.append('this->ap.addPositional(' |
| 620 | 627 | f'p(&ArgParser::{arg_prefix}Positional));') |
| 621 | 628 | |
| ... | ... | @@ -667,16 +674,18 @@ class Main: |
| 667 | 674 | # so the handler has to deal with it. The empty string is |
| 668 | 675 | # also allowed for non-optional. |
| 669 | 676 | self.json_init.append( |
| 670 | - f'addParameter([this](char const* p)' | |
| 677 | + f'addParameter([this](std::string const& p)' | |
| 671 | 678 | f' {{ {config}->{flag_key}(p); }});') |
| 672 | 679 | elif kind == 'required_choices': |
| 673 | 680 | self.json_init.append( |
| 674 | 681 | f'addChoices({v}_choices, true,' |
| 675 | - f' [this](char const* p) {{ {config}->{flag_key}(p); }});') | |
| 682 | + f' [this](std::string const& p)' | |
| 683 | + f' {{ {config}->{flag_key}(p); }});') | |
| 676 | 684 | elif kind == 'optional_choices': |
| 677 | 685 | self.json_init.append( |
| 678 | 686 | f'addChoices({v}_choices, false,' |
| 679 | - f' [this](char const* p) {{ {config}->{flag_key}(p); }});') | |
| 687 | + f' [this](std::string const& p)' | |
| 688 | + f' {{ {config}->{flag_key}(p); }});') | |
| 680 | 689 | |
| 681 | 690 | def handle_json_manual(self, path): |
| 682 | 691 | method = re.sub(r'\.([a-zA-Z0-9])', | ... | ... |
include/qpdf/QPDFJob.hh
| ... | ... | @@ -77,7 +77,7 @@ class QPDFJob |
| 77 | 77 | // arguments to UTF-8. This method will mutate arguments that are |
| 78 | 78 | // passed to it. |
| 79 | 79 | QPDF_DLL |
| 80 | - void initializeFromArgv(int argc, char* argv[], | |
| 80 | + void initializeFromArgv(int argc, char const* const argv[], | |
| 81 | 81 | char const* progname_env = nullptr); |
| 82 | 82 | |
| 83 | 83 | // Initialize a QPDFJob from json. Passing partial = true prevents |
| ... | ... | @@ -205,7 +205,7 @@ class QPDFJob |
| 205 | 205 | QPDF_DLL |
| 206 | 206 | Config* endAddAttachment(); |
| 207 | 207 | QPDF_DLL |
| 208 | - AttConfig* file(char const* parameter); | |
| 208 | + AttConfig* file(std::string const& parameter); | |
| 209 | 209 | |
| 210 | 210 | # include <qpdf/auto_job_c_att.hh> |
| 211 | 211 | |
| ... | ... | @@ -225,7 +225,7 @@ class QPDFJob |
| 225 | 225 | QPDF_DLL |
| 226 | 226 | Config* endCopyAttachmentsFrom(); |
| 227 | 227 | QPDF_DLL |
| 228 | - CopyAttConfig* file(char const* parameter); | |
| 228 | + CopyAttConfig* file(std::string const& parameter); | |
| 229 | 229 | |
| 230 | 230 | # include <qpdf/auto_job_c_copy_att.hh> |
| 231 | 231 | |
| ... | ... | @@ -266,7 +266,7 @@ class QPDFJob |
| 266 | 266 | QPDF_DLL |
| 267 | 267 | Config* endUnderlayOverlay(); |
| 268 | 268 | QPDF_DLL |
| 269 | - UOConfig* file(char const* parameter); | |
| 269 | + UOConfig* file(std::string const& parameter); | |
| 270 | 270 | |
| 271 | 271 | # include <qpdf/auto_job_c_uo.hh> |
| 272 | 272 | |
| ... | ... | @@ -285,7 +285,7 @@ class QPDFJob |
| 285 | 285 | QPDF_DLL |
| 286 | 286 | Config* endEncrypt(); |
| 287 | 287 | QPDF_DLL |
| 288 | - EncConfig* file(char const* parameter); | |
| 288 | + EncConfig* file(std::string const& parameter); | |
| 289 | 289 | |
| 290 | 290 | # include <qpdf/auto_job_c_enc.hh> |
| 291 | 291 | |
| ... | ... | @@ -305,11 +305,11 @@ class QPDFJob |
| 305 | 305 | void checkConfiguration(); |
| 306 | 306 | |
| 307 | 307 | QPDF_DLL |
| 308 | - Config* inputFile(char const* filename); | |
| 308 | + Config* inputFile(std::string const& filename); | |
| 309 | 309 | QPDF_DLL |
| 310 | 310 | Config* emptyInput(); |
| 311 | 311 | QPDF_DLL |
| 312 | - Config* outputFile(char const* filename); | |
| 312 | + Config* outputFile(std::string const& filename); | |
| 313 | 313 | QPDF_DLL |
| 314 | 314 | Config* replaceInput(); |
| 315 | 315 | ... | ... |
include/qpdf/QUtil.hh
| ... | ... | @@ -435,8 +435,13 @@ namespace QUtil |
| 435 | 435 | // invoked, convert all UTF-16 encoded strings to UTF-8, and call |
| 436 | 436 | // another main. |
| 437 | 437 | QPDF_DLL |
| 438 | - int call_main_from_wmain(int argc, wchar_t* argv[], | |
| 439 | - std::function<int(int, char*[])> realmain); | |
| 438 | + int call_main_from_wmain( | |
| 439 | + int argc, wchar_t* argv[], | |
| 440 | + std::function<int(int, char*[])> realmain); | |
| 441 | + QPDF_DLL | |
| 442 | + int call_main_from_wmain( | |
| 443 | + int argc, wchar_t const* const argv[], | |
| 444 | + std::function<int(int, char const* const[])> realmain); | |
| 440 | 445 | #endif // QPDF_NO_WCHAR_T |
| 441 | 446 | }; |
| 442 | 447 | ... | ... |
include/qpdf/auto_job_c_att.hh
| ... | ... | @@ -4,9 +4,9 @@ |
| 4 | 4 | // run in maintainer mode. |
| 5 | 5 | // |
| 6 | 6 | QPDF_DLL AttConfig* replace(); |
| 7 | -QPDF_DLL AttConfig* key(char const* parameter); | |
| 8 | -QPDF_DLL AttConfig* filename(char const* parameter); | |
| 9 | -QPDF_DLL AttConfig* creationdate(char const* parameter); | |
| 10 | -QPDF_DLL AttConfig* moddate(char const* parameter); | |
| 11 | -QPDF_DLL AttConfig* mimetype(char const* parameter); | |
| 12 | -QPDF_DLL AttConfig* description(char const* parameter); | |
| 7 | +QPDF_DLL AttConfig* key(std::string const& parameter); | |
| 8 | +QPDF_DLL AttConfig* filename(std::string const& parameter); | |
| 9 | +QPDF_DLL AttConfig* creationdate(std::string const& parameter); | |
| 10 | +QPDF_DLL AttConfig* moddate(std::string const& parameter); | |
| 11 | +QPDF_DLL AttConfig* mimetype(std::string const& parameter); | |
| 12 | +QPDF_DLL AttConfig* description(std::string const& parameter); | ... | ... |
include/qpdf/auto_job_c_copy_att.hh
| ... | ... | @@ -3,5 +3,5 @@ |
| 3 | 3 | // Edits will be automatically overwritten if the build is |
| 4 | 4 | // run in maintainer mode. |
| 5 | 5 | // |
| 6 | -QPDF_DLL CopyAttConfig* prefix(char const* parameter); | |
| 7 | -QPDF_DLL CopyAttConfig* password(char const* parameter); | |
| 6 | +QPDF_DLL CopyAttConfig* prefix(std::string const& parameter); | |
| 7 | +QPDF_DLL CopyAttConfig* password(std::string const& parameter); | ... | ... |
include/qpdf/auto_job_c_enc.hh
| ... | ... | @@ -3,16 +3,16 @@ |
| 3 | 3 | // Edits will be automatically overwritten if the build is |
| 4 | 4 | // run in maintainer mode. |
| 5 | 5 | // |
| 6 | -QPDF_DLL EncConfig* extract(char const* parameter); | |
| 7 | -QPDF_DLL EncConfig* annotate(char const* parameter); | |
| 8 | -QPDF_DLL EncConfig* print(char const* parameter); | |
| 9 | -QPDF_DLL EncConfig* modify(char const* parameter); | |
| 6 | +QPDF_DLL EncConfig* extract(std::string const& parameter); | |
| 7 | +QPDF_DLL EncConfig* annotate(std::string const& parameter); | |
| 8 | +QPDF_DLL EncConfig* print(std::string const& parameter); | |
| 9 | +QPDF_DLL EncConfig* modify(std::string const& parameter); | |
| 10 | 10 | QPDF_DLL EncConfig* cleartextMetadata(); |
| 11 | 11 | QPDF_DLL EncConfig* forceV4(); |
| 12 | -QPDF_DLL EncConfig* accessibility(char const* parameter); | |
| 13 | -QPDF_DLL EncConfig* assemble(char const* parameter); | |
| 14 | -QPDF_DLL EncConfig* form(char const* parameter); | |
| 15 | -QPDF_DLL EncConfig* modifyOther(char const* parameter); | |
| 16 | -QPDF_DLL EncConfig* useAes(char const* parameter); | |
| 12 | +QPDF_DLL EncConfig* accessibility(std::string const& parameter); | |
| 13 | +QPDF_DLL EncConfig* assemble(std::string const& parameter); | |
| 14 | +QPDF_DLL EncConfig* form(std::string const& parameter); | |
| 15 | +QPDF_DLL EncConfig* modifyOther(std::string const& parameter); | |
| 16 | +QPDF_DLL EncConfig* useAes(std::string const& parameter); | |
| 17 | 17 | QPDF_DLL EncConfig* forceR5(); |
| 18 | 18 | QPDF_DLL EncConfig* allowInsecure(); | ... | ... |
include/qpdf/auto_job_c_main.hh
| ... | ... | @@ -44,38 +44,38 @@ QPDF_DLL Config* suppressRecovery(); |
| 44 | 44 | QPDF_DLL Config* verbose(); |
| 45 | 45 | QPDF_DLL Config* warningExit0(); |
| 46 | 46 | QPDF_DLL Config* withImages(); |
| 47 | -QPDF_DLL Config* compressionLevel(char const* parameter); | |
| 48 | -QPDF_DLL Config* copyEncryption(char const* parameter); | |
| 49 | -QPDF_DLL Config* encryptionFilePassword(char const* parameter); | |
| 50 | -QPDF_DLL Config* forceVersion(char const* parameter); | |
| 51 | -QPDF_DLL Config* iiMinBytes(char const* parameter); | |
| 52 | -QPDF_DLL Config* jobJsonFile(char const* parameter); | |
| 53 | -QPDF_DLL Config* jsonObject(char const* parameter); | |
| 54 | -QPDF_DLL Config* keepFilesOpenThreshold(char const* parameter); | |
| 55 | -QPDF_DLL Config* linearizePass1(char const* parameter); | |
| 56 | -QPDF_DLL Config* minVersion(char const* parameter); | |
| 57 | -QPDF_DLL Config* oiMinArea(char const* parameter); | |
| 58 | -QPDF_DLL Config* oiMinHeight(char const* parameter); | |
| 59 | -QPDF_DLL Config* oiMinWidth(char const* parameter); | |
| 60 | -QPDF_DLL Config* password(char const* parameter); | |
| 61 | -QPDF_DLL Config* passwordFile(char const* parameter); | |
| 62 | -QPDF_DLL Config* removeAttachment(char const* parameter); | |
| 63 | -QPDF_DLL Config* rotate(char const* parameter); | |
| 64 | -QPDF_DLL Config* showAttachment(char const* parameter); | |
| 65 | -QPDF_DLL Config* showObject(char const* parameter); | |
| 66 | -QPDF_DLL Config* collate(char const* parameter); | |
| 47 | +QPDF_DLL Config* compressionLevel(std::string const& parameter); | |
| 48 | +QPDF_DLL Config* copyEncryption(std::string const& parameter); | |
| 49 | +QPDF_DLL Config* encryptionFilePassword(std::string const& parameter); | |
| 50 | +QPDF_DLL Config* forceVersion(std::string const& parameter); | |
| 51 | +QPDF_DLL Config* iiMinBytes(std::string const& parameter); | |
| 52 | +QPDF_DLL Config* jobJsonFile(std::string const& parameter); | |
| 53 | +QPDF_DLL Config* jsonObject(std::string const& parameter); | |
| 54 | +QPDF_DLL Config* keepFilesOpenThreshold(std::string const& parameter); | |
| 55 | +QPDF_DLL Config* linearizePass1(std::string const& parameter); | |
| 56 | +QPDF_DLL Config* minVersion(std::string const& parameter); | |
| 57 | +QPDF_DLL Config* oiMinArea(std::string const& parameter); | |
| 58 | +QPDF_DLL Config* oiMinHeight(std::string const& parameter); | |
| 59 | +QPDF_DLL Config* oiMinWidth(std::string const& parameter); | |
| 60 | +QPDF_DLL Config* password(std::string const& parameter); | |
| 61 | +QPDF_DLL Config* passwordFile(std::string const& parameter); | |
| 62 | +QPDF_DLL Config* removeAttachment(std::string const& parameter); | |
| 63 | +QPDF_DLL Config* rotate(std::string const& parameter); | |
| 64 | +QPDF_DLL Config* showAttachment(std::string const& parameter); | |
| 65 | +QPDF_DLL Config* showObject(std::string const& parameter); | |
| 66 | +QPDF_DLL Config* collate(std::string const& parameter); | |
| 67 | 67 | QPDF_DLL Config* collate(); |
| 68 | -QPDF_DLL Config* splitPages(char const* parameter); | |
| 68 | +QPDF_DLL Config* splitPages(std::string const& parameter); | |
| 69 | 69 | QPDF_DLL Config* splitPages(); |
| 70 | -QPDF_DLL Config* compressStreams(char const* parameter); | |
| 71 | -QPDF_DLL Config* decodeLevel(char const* parameter); | |
| 72 | -QPDF_DLL Config* flattenAnnotations(char const* parameter); | |
| 73 | -QPDF_DLL Config* jsonKey(char const* parameter); | |
| 74 | -QPDF_DLL Config* keepFilesOpen(char const* parameter); | |
| 75 | -QPDF_DLL Config* normalizeContent(char const* parameter); | |
| 76 | -QPDF_DLL Config* objectStreams(char const* parameter); | |
| 77 | -QPDF_DLL Config* passwordMode(char const* parameter); | |
| 78 | -QPDF_DLL Config* removeUnreferencedResources(char const* parameter); | |
| 79 | -QPDF_DLL Config* streamData(char const* parameter); | |
| 80 | -QPDF_DLL Config* json(char const* parameter); | |
| 70 | +QPDF_DLL Config* compressStreams(std::string const& parameter); | |
| 71 | +QPDF_DLL Config* decodeLevel(std::string const& parameter); | |
| 72 | +QPDF_DLL Config* flattenAnnotations(std::string const& parameter); | |
| 73 | +QPDF_DLL Config* jsonKey(std::string const& parameter); | |
| 74 | +QPDF_DLL Config* keepFilesOpen(std::string const& parameter); | |
| 75 | +QPDF_DLL Config* normalizeContent(std::string const& parameter); | |
| 76 | +QPDF_DLL Config* objectStreams(std::string const& parameter); | |
| 77 | +QPDF_DLL Config* passwordMode(std::string const& parameter); | |
| 78 | +QPDF_DLL Config* removeUnreferencedResources(std::string const& parameter); | |
| 79 | +QPDF_DLL Config* streamData(std::string const& parameter); | |
| 80 | +QPDF_DLL Config* json(std::string const& parameter); | |
| 81 | 81 | QPDF_DLL Config* json(); | ... | ... |
include/qpdf/auto_job_c_uo.hh
| ... | ... | @@ -3,7 +3,7 @@ |
| 3 | 3 | // Edits will be automatically overwritten if the build is |
| 4 | 4 | // run in maintainer mode. |
| 5 | 5 | // |
| 6 | -QPDF_DLL UOConfig* to(char const* parameter); | |
| 7 | -QPDF_DLL UOConfig* from(char const* parameter); | |
| 8 | -QPDF_DLL UOConfig* repeat(char const* parameter); | |
| 9 | -QPDF_DLL UOConfig* password(char const* parameter); | |
| 6 | +QPDF_DLL UOConfig* to(std::string const& parameter); | |
| 7 | +QPDF_DLL UOConfig* from(std::string const& parameter); | |
| 8 | +QPDF_DLL UOConfig* repeat(std::string const& parameter); | |
| 9 | +QPDF_DLL UOConfig* password(std::string const& parameter); | ... | ... |
include/qpdf/qpdfjob-c.h
| ... | ... | @@ -52,7 +52,7 @@ extern "C" { |
| 52 | 52 | * qpdfjob_run_from_wide_argv instead. |
| 53 | 53 | */ |
| 54 | 54 | QPDF_DLL |
| 55 | - int qpdfjob_run_from_argv(int argc, char* argv[]); | |
| 55 | + int qpdfjob_run_from_argv(int argc, char const* const argv[]); | |
| 56 | 56 | |
| 57 | 57 | #ifndef QPDF_NO_WCHAR_T |
| 58 | 58 | /* This function is the same as qpdfjob_run_from_argv except argv |
| ... | ... | @@ -60,7 +60,7 @@ extern "C" { |
| 60 | 60 | * calling from a Windows wmain function. |
| 61 | 61 | */ |
| 62 | 62 | QPDF_DLL |
| 63 | - int qpdfjob_run_from_wide_argv(int argc, wchar_t* argv[]); | |
| 63 | + int qpdfjob_run_from_wide_argv(int argc, wchar_t const* const argv[]); | |
| 64 | 64 | #endif /* QPDF_NO_WCHAR_T */ |
| 65 | 65 | |
| 66 | 66 | /* This function runs QPDFJob from a job JSON file. See the "QPDF | ... | ... |
job.sums
| 1 | 1 | # Generated by generate_auto_job |
| 2 | -generate_auto_job 5d6ec1e4f0b94d8f73df665061d8a2188cbbe8f25ea42be78ec576547261d5ac | |
| 3 | -include/qpdf/auto_job_c_att.hh 7ad43bb374c1370ef32ebdcdcb7b73a61d281f7f4e3f12755585872ab30fb60e | |
| 4 | -include/qpdf/auto_job_c_copy_att.hh 32275d03cdc69b703dd7e02ba0bbe15756e714e9ad185484773a6178dc09e1ee | |
| 5 | -include/qpdf/auto_job_c_enc.hh 72e138c7b96ed5aacdce78c1dec04b1c20d361faec4f8faf52f64c1d6be99265 | |
| 6 | -include/qpdf/auto_job_c_main.hh 69d5ea26098bcb6ec5b5e37ba0bca9e7d16a784d2618e0c05d635046848d5123 | |
| 2 | +generate_auto_job e7c7b33330d398552de77b369abbda5299f1a6aa66034bbeef47be61e2363091 | |
| 3 | +include/qpdf/auto_job_c_att.hh 1f5d589ccf6684b09a203da261c31fc90a866e6eefe906b673e2d6d5a08ef753 | |
| 4 | +include/qpdf/auto_job_c_copy_att.hh 65bdce5382a60f1815214297cf005072f17556ec4a15317b600f9ecc9cb89ea4 | |
| 5 | +include/qpdf/auto_job_c_enc.hh 37ca99a124a34bb613f154c6c8934761bd7e7cc5a2719798ccec7edf05b4aeb9 | |
| 6 | +include/qpdf/auto_job_c_main.hh 1130a203a513659fbfdd3ab8e435779e402d4f519a11f572ab421b8e937f1d7a | |
| 7 | 7 | include/qpdf/auto_job_c_pages.hh 931840b329a36ca0e41401190e04537b47f2867671a6643bfd8da74014202671 |
| 8 | -include/qpdf/auto_job_c_uo.hh 0585b7de459fa479d9e51a45fa92de0ff6dee748efc9ec1cedd0dde6cee1ad50 | |
| 8 | +include/qpdf/auto_job_c_uo.hh 4a1148f815a5d0833d2c519dac940be34825294c8c26f77da65e48fdc75f178e | |
| 9 | 9 | job.yml 9544c6e046b25d3274731fbcd07ba25b300fd67055021ac4364ad8a91f77c6b6 |
| 10 | -libqpdf/qpdf/auto_job_decl.hh 9f79396ec459f191be4c5fe34cf88c265cf47355a1a945fa39169d1c94cf04f6 | |
| 10 | +libqpdf/qpdf/auto_job_decl.hh c15c5c4f25f32a8086d579fc40d64326467a74a08209b8fbccf9f996ca2970ab | |
| 11 | 11 | libqpdf/qpdf/auto_job_help.hh 43184f01816b5210bbc981de8de48446546fb94f4fd6e63cfc7f2fbac3578e6b |
| 12 | -libqpdf/qpdf/auto_job_init.hh fd13b9f730e6275a39a15d193bd9af19cf37f4495699ec1886c2b208d7811ab1 | |
| 12 | +libqpdf/qpdf/auto_job_init.hh 4d6c4641347e9ee9ea8d057a37d008c9f0f73484c6a04eb879b7a2f8889828bd | |
| 13 | 13 | libqpdf/qpdf/auto_job_json_decl.hh c5e3fd38a3b0c569eb0c6b4c60953a09cd6bc7d3361a357a81f64fe36af2b0cf |
| 14 | -libqpdf/qpdf/auto_job_json_init.hh 3f86ce40931ca8f417d050fcd49104d73c1fa4e977ad19d54b372831a8ea17ed | |
| 14 | +libqpdf/qpdf/auto_job_json_init.hh b070350d304d137ba594c1ba40b373137e8459735f04b8ca0f8a2ffd1908c69e | |
| 15 | 15 | libqpdf/qpdf/auto_job_schema.hh 18a3780671d95224cb9a27dcac627c421cae509d59f33a63e6bda0ab53cce923 |
| 16 | 16 | manual/_ext/qpdf.py e9ac9d6c70642a3d29281ee5ad92ae2422dee8be9306fb8a0bc9dba0ed5e28f3 |
| 17 | 17 | manual/cli.rst 3746df6c4f115387cca0d921f25619a6b8407fc10b0e4c9dcf40b0b1656c6f8a | ... | ... |
libqpdf/QPDFArgParser.cc
| ... | ... | @@ -8,11 +8,10 @@ |
| 8 | 8 | #include <cstdlib> |
| 9 | 9 | |
| 10 | 10 | QPDFArgParser::Members::Members( |
| 11 | - int argc, char* argv[], char const* progname_env) : | |
| 11 | + int argc, char const* const argv[], char const* progname_env) : | |
| 12 | 12 | |
| 13 | 13 | argc(argc), |
| 14 | 14 | argv(argv), |
| 15 | - whoami(QUtil::getWhoami(argv[0])), | |
| 16 | 15 | progname_env(progname_env), |
| 17 | 16 | cur_arg(0), |
| 18 | 17 | bash_completion(false), |
| ... | ... | @@ -20,14 +19,18 @@ QPDFArgParser::Members::Members( |
| 20 | 19 | option_table(nullptr), |
| 21 | 20 | final_check_handler(nullptr) |
| 22 | 21 | { |
| 22 | + auto tmp = QUtil::make_shared_cstr(argv[0]); | |
| 23 | + char* p = QUtil::getWhoami(tmp.get()); | |
| 23 | 24 | // Remove prefix added by libtool for consistency during testing. |
| 24 | - if (strncmp(whoami, "lt-", 3) == 0) | |
| 25 | + if (strncmp(p, "lt-", 3) == 0) | |
| 25 | 26 | { |
| 26 | - whoami += 3; | |
| 27 | + p += 3; | |
| 27 | 28 | } |
| 29 | + whoami = p; | |
| 28 | 30 | } |
| 29 | 31 | |
| 30 | -QPDFArgParser::QPDFArgParser(int argc, char* argv[], char const* progname_env) : | |
| 32 | +QPDFArgParser::QPDFArgParser(int argc, char const* const argv[], | |
| 33 | + char const* progname_env) : | |
| 31 | 34 | m(new Members(argc, argv, progname_env)) |
| 32 | 35 | { |
| 33 | 36 | selectHelpOptionTable(); |
| ... | ... | @@ -250,17 +253,17 @@ QPDFArgParser::argCompletionZsh() |
| 250 | 253 | } |
| 251 | 254 | |
| 252 | 255 | void |
| 253 | -QPDFArgParser::argHelp(char* p) | |
| 256 | +QPDFArgParser::argHelp(std::string const& p) | |
| 254 | 257 | { |
| 255 | 258 | std::cout << getHelp(p); |
| 256 | 259 | exit(0); |
| 257 | 260 | } |
| 258 | 261 | |
| 259 | 262 | void |
| 260 | -QPDFArgParser::invalidHelpArg(char* p) | |
| 263 | +QPDFArgParser::invalidHelpArg(std::string const& p) | |
| 261 | 264 | { |
| 262 | 265 | usage(std::string("unknown help option") + |
| 263 | - (p ? (std::string(" ") + p) : "")); | |
| 266 | + (p.empty() ? "" : (" " + p))); | |
| 264 | 267 | } |
| 265 | 268 | |
| 266 | 269 | void |
| ... | ... | @@ -272,7 +275,7 @@ QPDFArgParser::handleArgFileArguments() |
| 272 | 275 | this->m->new_argv.push_back(QUtil::make_shared_cstr(this->m->argv[0])); |
| 273 | 276 | for (int i = 1; i < this->m->argc; ++i) |
| 274 | 277 | { |
| 275 | - char* argfile = 0; | |
| 278 | + char const* argfile = 0; | |
| 276 | 279 | if ((strlen(this->m->argv[i]) > 1) && (this->m->argv[i][0] == '@')) |
| 277 | 280 | { |
| 278 | 281 | argfile = 1 + this->m->argv[i]; |
| ... | ... | @@ -295,16 +298,16 @@ QPDFArgParser::handleArgFileArguments() |
| 295 | 298 | QUtil::make_shared_cstr(this->m->argv[i])); |
| 296 | 299 | } |
| 297 | 300 | } |
| 298 | - this->m->argv_ph = std::shared_ptr<char*>( | |
| 299 | - new char*[1 + this->m->new_argv.size()], | |
| 300 | - std::default_delete<char*[]>()); | |
| 301 | - this->m->argv = this->m->argv_ph.get(); | |
| 301 | + this->m->argv_ph = std::shared_ptr<char const*>( | |
| 302 | + new char const*[1 + this->m->new_argv.size()], | |
| 303 | + std::default_delete<char const*[]>()); | |
| 302 | 304 | for (size_t i = 0; i < this->m->new_argv.size(); ++i) |
| 303 | 305 | { |
| 304 | - this->m->argv[i] = this->m->new_argv.at(i).get(); | |
| 306 | + this->m->argv_ph.get()[i] = this->m->new_argv.at(i).get(); | |
| 305 | 307 | } |
| 306 | 308 | this->m->argc = QIntC::to_int(this->m->new_argv.size()); |
| 307 | - this->m->argv[this->m->argc] = 0; | |
| 309 | + this->m->argv_ph.get()[this->m->argc] = nullptr; | |
| 310 | + this->m->argv = this->m->argv_ph.get(); | |
| 308 | 311 | } |
| 309 | 312 | |
| 310 | 313 | void |
| ... | ... | @@ -400,16 +403,16 @@ QPDFArgParser::handleBashArguments() |
| 400 | 403 | } |
| 401 | 404 | // Explicitly discard any non-space-terminated word. The "current |
| 402 | 405 | // word" is handled specially. |
| 403 | - this->m->bash_argv_ph = std::shared_ptr<char*>( | |
| 404 | - new char*[1 + this->m->bash_argv.size()], | |
| 405 | - std::default_delete<char*[]>()); | |
| 406 | - this->m->argv = this->m->bash_argv_ph.get(); | |
| 406 | + this->m->bash_argv_ph = std::shared_ptr<char const*>( | |
| 407 | + new char const*[1 + this->m->bash_argv.size()], | |
| 408 | + std::default_delete<char const*[]>()); | |
| 407 | 409 | for (size_t i = 0; i < this->m->bash_argv.size(); ++i) |
| 408 | 410 | { |
| 409 | - this->m->argv[i] = this->m->bash_argv.at(i).get(); | |
| 411 | + this->m->bash_argv_ph.get()[i] = this->m->bash_argv.at(i).get(); | |
| 410 | 412 | } |
| 411 | 413 | this->m->argc = QIntC::to_int(this->m->bash_argv.size()); |
| 412 | - this->m->argv[this->m->argc] = 0; | |
| 414 | + this->m->bash_argv_ph.get()[this->m->argc] = nullptr; | |
| 415 | + this->m->argv = this->m->bash_argv_ph.get(); | |
| 413 | 416 | } |
| 414 | 417 | |
| 415 | 418 | void |
| ... | ... | @@ -424,10 +427,10 @@ QPDFArgParser::usage(std::string const& message) |
| 424 | 427 | } |
| 425 | 428 | |
| 426 | 429 | void |
| 427 | -QPDFArgParser::readArgsFromFile(char const* filename) | |
| 430 | +QPDFArgParser::readArgsFromFile(std::string const& filename) | |
| 428 | 431 | { |
| 429 | 432 | std::list<std::string> lines; |
| 430 | - if (strcmp(filename, "-") == 0) | |
| 433 | + if (filename == "-") | |
| 431 | 434 | { |
| 432 | 435 | QTC::TC("libtests", "QPDFArgParser read args from stdin"); |
| 433 | 436 | lines = QUtil::read_lines_from_file(std::cin); |
| ... | ... | @@ -435,7 +438,7 @@ QPDFArgParser::readArgsFromFile(char const* filename) |
| 435 | 438 | else |
| 436 | 439 | { |
| 437 | 440 | QTC::TC("libtests", "QPDFArgParser read args from file"); |
| 438 | - lines = QUtil::read_lines_from_file(filename); | |
| 441 | + lines = QUtil::read_lines_from_file(filename.c_str()); | |
| 439 | 442 | } |
| 440 | 443 | for (auto const& line: lines) |
| 441 | 444 | { |
| ... | ... | @@ -547,8 +550,9 @@ QPDFArgParser::parseArgs() |
| 547 | 550 | bool help_option = false; |
| 548 | 551 | bool end_option = false; |
| 549 | 552 | auto oep = this->m->option_table->end(); |
| 550 | - char* arg = this->m->argv[this->m->cur_arg]; | |
| 551 | - char* parameter = nullptr; | |
| 553 | + char const* arg = this->m->argv[this->m->cur_arg]; | |
| 554 | + std::string parameter; | |
| 555 | + bool have_parameter = false; | |
| 552 | 556 | std::string o_arg(arg); |
| 553 | 557 | std::string arg_s(arg); |
| 554 | 558 | if ((strcmp(arg, "--") == 0) && |
| ... | ... | @@ -577,20 +581,25 @@ QPDFArgParser::parseArgs() |
| 577 | 581 | { |
| 578 | 582 | QTC::TC("libtests", "QPDFArgParser single dash"); |
| 579 | 583 | } |
| 580 | - if (strlen(arg) > 0) | |
| 584 | + | |
| 585 | + // Prevent --=something from being treated as an empty arg | |
| 586 | + // by searching for = from after the first character. We | |
| 587 | + // do this since the empty string in the option table is | |
| 588 | + // for positional arguments. Besides, it doesn't make | |
| 589 | + // sense to have an empty option. | |
| 590 | + arg_s = arg; | |
| 591 | + size_t equal_pos = std::string::npos; | |
| 592 | + if (arg_s.length() > 0) | |
| 581 | 593 | { |
| 582 | - // Prevent --=something from being treated as an empty | |
| 583 | - // arg since the empty string in the option table is | |
| 584 | - // for positional arguments. | |
| 585 | - parameter = const_cast<char*>(strchr(1 + arg, '=')); | |
| 594 | + equal_pos = arg_s.find('=', 1); | |
| 586 | 595 | } |
| 587 | - if (parameter) | |
| 596 | + if (equal_pos != std::string::npos) | |
| 588 | 597 | { |
| 589 | - *parameter++ = 0; | |
| 598 | + have_parameter = true; | |
| 599 | + parameter = arg_s.substr(equal_pos + 1); | |
| 600 | + arg_s = arg_s.substr(0, equal_pos); | |
| 590 | 601 | } |
| 591 | 602 | |
| 592 | - arg_s = arg; | |
| 593 | - | |
| 594 | 603 | if ((! this->m->bash_completion) && |
| 595 | 604 | (this->m->argc == 2) && (this->m->cur_arg == 1) && |
| 596 | 605 | this->m->help_option_table.count(arg_s)) |
| ... | ... | @@ -629,8 +638,8 @@ QPDFArgParser::parseArgs() |
| 629 | 638 | } |
| 630 | 639 | |
| 631 | 640 | OptionEntry& oe = oep->second; |
| 632 | - if ((oe.parameter_needed && (nullptr == parameter)) || | |
| 633 | - ((! oe.choices.empty() && (nullptr != parameter) && | |
| 641 | + if ((oe.parameter_needed && (! have_parameter)) || | |
| 642 | + ((! oe.choices.empty() && have_parameter && | |
| 634 | 643 | (0 == oe.choices.count(parameter))))) |
| 635 | 644 | { |
| 636 | 645 | std::string message = |
| ... | ... | @@ -977,16 +986,15 @@ QPDFArgParser::getTopicHelp(std::string const& name, |
| 977 | 986 | } |
| 978 | 987 | |
| 979 | 988 | std::string |
| 980 | -QPDFArgParser::getHelp(char const* topic_or_option) | |
| 989 | +QPDFArgParser::getHelp(std::string const& arg) | |
| 981 | 990 | { |
| 982 | 991 | std::ostringstream msg; |
| 983 | - if ((topic_or_option == nullptr) || (strlen(topic_or_option) == 0)) | |
| 992 | + if (arg.empty()) | |
| 984 | 993 | { |
| 985 | 994 | getTopHelp(msg); |
| 986 | 995 | } |
| 987 | 996 | else |
| 988 | 997 | { |
| 989 | - std::string arg(topic_or_option); | |
| 990 | 998 | if (arg == "all") |
| 991 | 999 | { |
| 992 | 1000 | getAllHelp(msg); | ... | ... |
libqpdf/QPDFJob_argv.cc
| ... | ... | @@ -39,8 +39,8 @@ namespace |
| 39 | 39 | std::shared_ptr<QPDFJob::PagesConfig> c_pages; |
| 40 | 40 | std::shared_ptr<QPDFJob::UOConfig> c_uo; |
| 41 | 41 | std::shared_ptr<QPDFJob::EncConfig> c_enc; |
| 42 | - std::vector<char*> accumulated_args; // points to member in ap | |
| 43 | - char* pages_password; | |
| 42 | + std::vector<std::string> accumulated_args; | |
| 43 | + std::shared_ptr<char> pages_password; | |
| 44 | 44 | bool gave_input; |
| 45 | 45 | bool gave_output; |
| 46 | 46 | }; |
| ... | ... | @@ -70,7 +70,7 @@ ArgParser::initOptionTables() |
| 70 | 70 | } |
| 71 | 71 | |
| 72 | 72 | void |
| 73 | -ArgParser::argPositional(char* arg) | |
| 73 | +ArgParser::argPositional(std::string const& arg) | |
| 74 | 74 | { |
| 75 | 75 | if (! this->gave_input) |
| 76 | 76 | { |
| ... | ... | @@ -84,7 +84,7 @@ ArgParser::argPositional(char* arg) |
| 84 | 84 | } |
| 85 | 85 | else |
| 86 | 86 | { |
| 87 | - usage(std::string("unknown argument ") + arg); | |
| 87 | + usage("unknown argument " + arg); | |
| 88 | 88 | } |
| 89 | 89 | } |
| 90 | 90 | |
| ... | ... | @@ -188,7 +188,7 @@ ArgParser::argEncrypt() |
| 188 | 188 | } |
| 189 | 189 | |
| 190 | 190 | void |
| 191 | -ArgParser::argEncPositional(char* arg) | |
| 191 | +ArgParser::argEncPositional(std::string const& arg) | |
| 192 | 192 | { |
| 193 | 193 | this->accumulated_args.push_back(arg); |
| 194 | 194 | size_t n_args = this->accumulated_args.size(); |
| ... | ... | @@ -244,9 +244,9 @@ ArgParser::argPages() |
| 244 | 244 | } |
| 245 | 245 | |
| 246 | 246 | void |
| 247 | -ArgParser::argPagesPassword(char* parameter) | |
| 247 | +ArgParser::argPagesPassword(std::string const& parameter) | |
| 248 | 248 | { |
| 249 | - if (this->pages_password != nullptr) | |
| 249 | + if (this->pages_password) | |
| 250 | 250 | { |
| 251 | 251 | QTC::TC("qpdf", "QPDFJob duplicated pages password"); |
| 252 | 252 | usage("--password already specified for this file"); |
| ... | ... | @@ -256,13 +256,13 @@ ArgParser::argPagesPassword(char* parameter) |
| 256 | 256 | QTC::TC("qpdf", "QPDFJob misplaced pages password"); |
| 257 | 257 | usage("in --pages, --password must immediately follow a file name"); |
| 258 | 258 | } |
| 259 | - this->pages_password = parameter; | |
| 259 | + this->pages_password = QUtil::make_shared_cstr(parameter); | |
| 260 | 260 | } |
| 261 | 261 | |
| 262 | 262 | void |
| 263 | -ArgParser::argPagesPositional(char* arg) | |
| 263 | +ArgParser::argPagesPositional(std::string const& arg) | |
| 264 | 264 | { |
| 265 | - if (arg == nullptr) | |
| 265 | + if (arg.empty()) | |
| 266 | 266 | { |
| 267 | 267 | if (this->accumulated_args.empty()) |
| 268 | 268 | { |
| ... | ... | @@ -274,25 +274,26 @@ ArgParser::argPagesPositional(char* arg) |
| 274 | 274 | this->accumulated_args.push_back(arg); |
| 275 | 275 | } |
| 276 | 276 | |
| 277 | - char const* file = this->accumulated_args.at(0); | |
| 278 | - char const* range = nullptr; | |
| 277 | + std::string file = this->accumulated_args.at(0); | |
| 278 | + char const* range_p = nullptr; | |
| 279 | 279 | |
| 280 | 280 | size_t n_args = this->accumulated_args.size(); |
| 281 | 281 | if (n_args >= 2) |
| 282 | 282 | { |
| 283 | - range = this->accumulated_args.at(1); | |
| 283 | + // will be copied before accumulated_args is cleared | |
| 284 | + range_p = this->accumulated_args.at(1).c_str(); | |
| 284 | 285 | } |
| 285 | 286 | |
| 286 | 287 | // See if the user omitted the range entirely, in which case we |
| 287 | 288 | // assume "1-z". |
| 288 | - char* next_file = nullptr; | |
| 289 | - if (range == nullptr) | |
| 289 | + std::string next_file; | |
| 290 | + if (range_p == nullptr) | |
| 290 | 291 | { |
| 291 | - if (arg == nullptr) | |
| 292 | + if (arg.empty()) | |
| 292 | 293 | { |
| 293 | 294 | // The filename or password was the last argument |
| 294 | 295 | QTC::TC("qpdf", "QPDFJob pages range omitted at end", |
| 295 | - this->pages_password == nullptr ? 0 : 1); | |
| 296 | + this->pages_password ? 0 : 1); | |
| 296 | 297 | } |
| 297 | 298 | else |
| 298 | 299 | { |
| ... | ... | @@ -304,17 +305,17 @@ ArgParser::argPagesPositional(char* arg) |
| 304 | 305 | { |
| 305 | 306 | try |
| 306 | 307 | { |
| 307 | - QUtil::parse_numrange(range, 0); | |
| 308 | + QUtil::parse_numrange(range_p, 0); | |
| 308 | 309 | } |
| 309 | 310 | catch (std::runtime_error& e1) |
| 310 | 311 | { |
| 311 | 312 | // The range is invalid. Let's see if it's a file. |
| 312 | - if (strcmp(range, ".") == 0) | |
| 313 | + if (strcmp(range_p, ".") == 0) | |
| 313 | 314 | { |
| 314 | 315 | // "." means the input file. |
| 315 | 316 | QTC::TC("qpdf", "QPDFJob pages range omitted with ."); |
| 316 | 317 | } |
| 317 | - else if (QUtil::file_can_be_opened(range)) | |
| 318 | + else if (QUtil::file_can_be_opened(range_p)) | |
| 318 | 319 | { |
| 319 | 320 | QTC::TC("qpdf", "QPDFJob pages range omitted in middle"); |
| 320 | 321 | // Yup, it's a file. |
| ... | ... | @@ -324,18 +325,15 @@ ArgParser::argPagesPositional(char* arg) |
| 324 | 325 | // Give the range error |
| 325 | 326 | usage(e1.what()); |
| 326 | 327 | } |
| 327 | - next_file = const_cast<char*>(range); | |
| 328 | - range = nullptr; | |
| 328 | + next_file = range_p; | |
| 329 | + range_p = nullptr; | |
| 329 | 330 | } |
| 330 | 331 | } |
| 331 | - if (range == nullptr) | |
| 332 | - { | |
| 333 | - range = "1-z"; | |
| 334 | - } | |
| 335 | - this->c_pages->pageSpec(file, range, this->pages_password); | |
| 332 | + std::string range(range_p ? range_p : "1-z"); | |
| 333 | + this->c_pages->pageSpec(file, range, this->pages_password.get()); | |
| 336 | 334 | this->accumulated_args.clear(); |
| 337 | 335 | this->pages_password = nullptr; |
| 338 | - if (next_file != nullptr) | |
| 336 | + if (! next_file.empty()) | |
| 339 | 337 | { |
| 340 | 338 | this->accumulated_args.push_back(next_file); |
| 341 | 339 | } |
| ... | ... | @@ -344,7 +342,7 @@ ArgParser::argPagesPositional(char* arg) |
| 344 | 342 | void |
| 345 | 343 | ArgParser::argEndPages() |
| 346 | 344 | { |
| 347 | - argPagesPositional(nullptr); | |
| 345 | + argPagesPositional(""); | |
| 348 | 346 | c_pages->endPages(); |
| 349 | 347 | c_pages = nullptr; |
| 350 | 348 | } |
| ... | ... | @@ -403,7 +401,7 @@ ArgParser::argEnd256BitEncryption() |
| 403 | 401 | } |
| 404 | 402 | |
| 405 | 403 | void |
| 406 | -ArgParser::argUOPositional(char* arg) | |
| 404 | +ArgParser::argUOPositional(std::string const& arg) | |
| 407 | 405 | { |
| 408 | 406 | c_uo->file(arg); |
| 409 | 407 | } |
| ... | ... | @@ -416,7 +414,7 @@ ArgParser::argEndUnderlayOverlay() |
| 416 | 414 | } |
| 417 | 415 | |
| 418 | 416 | void |
| 419 | -ArgParser::argAttPositional(char* arg) | |
| 417 | +ArgParser::argAttPositional(std::string const& arg) | |
| 420 | 418 | { |
| 421 | 419 | c_att->file(arg); |
| 422 | 420 | } |
| ... | ... | @@ -429,7 +427,7 @@ ArgParser::argEndAttachment() |
| 429 | 427 | } |
| 430 | 428 | |
| 431 | 429 | void |
| 432 | -ArgParser::argCopyAttPositional(char* arg) | |
| 430 | +ArgParser::argCopyAttPositional(std::string const& arg) | |
| 433 | 431 | { |
| 434 | 432 | c_copy_att->file(arg); |
| 435 | 433 | } |
| ... | ... | @@ -467,7 +465,8 @@ ArgParser::parseOptions() |
| 467 | 465 | } |
| 468 | 466 | |
| 469 | 467 | void |
| 470 | -QPDFJob::initializeFromArgv(int argc, char* argv[], char const* progname_env) | |
| 468 | +QPDFJob::initializeFromArgv(int argc, char const* const argv[], | |
| 469 | + char const* progname_env) | |
| 471 | 470 | { |
| 472 | 471 | if (progname_env == nullptr) |
| 473 | 472 | { | ... | ... |
libqpdf/QPDFJob_config.cc
| 1 | 1 | #include <qpdf/QPDFJob.hh> |
| 2 | 2 | #include <qpdf/QUtil.hh> |
| 3 | 3 | #include <qpdf/QTC.hh> |
| 4 | -#include <cstring> | |
| 5 | 4 | |
| 6 | 5 | void |
| 7 | 6 | QPDFJob::Config::checkConfiguration() |
| ... | ... | @@ -10,7 +9,7 @@ QPDFJob::Config::checkConfiguration() |
| 10 | 9 | } |
| 11 | 10 | |
| 12 | 11 | QPDFJob::Config* |
| 13 | -QPDFJob::Config::inputFile(char const* filename) | |
| 12 | +QPDFJob::Config::inputFile(std::string const& filename) | |
| 14 | 13 | { |
| 15 | 14 | if (o.m->infilename == 0) |
| 16 | 15 | { |
| ... | ... | @@ -46,7 +45,7 @@ QPDFJob::Config::emptyInput() |
| 46 | 45 | } |
| 47 | 46 | |
| 48 | 47 | QPDFJob::Config* |
| 49 | -QPDFJob::Config::outputFile(char const* filename) | |
| 48 | +QPDFJob::Config::outputFile(std::string const& filename) | |
| 50 | 49 | { |
| 51 | 50 | if ((o.m->outfilename == 0) && (! o.m->replace_input)) |
| 52 | 51 | { |
| ... | ... | @@ -107,35 +106,34 @@ QPDFJob::Config::coalesceContents() |
| 107 | 106 | QPDFJob::Config* |
| 108 | 107 | QPDFJob::Config::collate() |
| 109 | 108 | { |
| 110 | - return collate(nullptr); | |
| 109 | + return collate(""); | |
| 111 | 110 | } |
| 112 | 111 | |
| 113 | 112 | QPDFJob::Config* |
| 114 | -QPDFJob::Config::collate(char const* parameter) | |
| 113 | +QPDFJob::Config::collate(std::string const& parameter) | |
| 115 | 114 | { |
| 116 | - auto n = (((parameter == 0) || (strlen(parameter) == 0)) ? 1 : | |
| 117 | - QUtil::string_to_uint(parameter)); | |
| 115 | + auto n = (parameter.empty() ? 1 : QUtil::string_to_uint(parameter.c_str())); | |
| 118 | 116 | o.m->collate = QIntC::to_size(n); |
| 119 | 117 | return this; |
| 120 | 118 | } |
| 121 | 119 | |
| 122 | 120 | QPDFJob::Config* |
| 123 | -QPDFJob::Config::compressStreams(char const* parameter) | |
| 121 | +QPDFJob::Config::compressStreams(std::string const& parameter) | |
| 124 | 122 | { |
| 125 | 123 | o.m->compress_streams_set = true; |
| 126 | - o.m->compress_streams = (strcmp(parameter, "y") == 0); | |
| 124 | + o.m->compress_streams = (parameter == "y"); | |
| 127 | 125 | return this; |
| 128 | 126 | } |
| 129 | 127 | |
| 130 | 128 | QPDFJob::Config* |
| 131 | -QPDFJob::Config::compressionLevel(char const* parameter) | |
| 129 | +QPDFJob::Config::compressionLevel(std::string const& parameter) | |
| 132 | 130 | { |
| 133 | - o.m->compression_level = QUtil::string_to_int(parameter); | |
| 131 | + o.m->compression_level = QUtil::string_to_int(parameter.c_str()); | |
| 134 | 132 | return this; |
| 135 | 133 | } |
| 136 | 134 | |
| 137 | 135 | QPDFJob::Config* |
| 138 | -QPDFJob::Config::copyEncryption(char const* parameter) | |
| 136 | +QPDFJob::Config::copyEncryption(std::string const& parameter) | |
| 139 | 137 | { |
| 140 | 138 | o.m->encryption_file = parameter; |
| 141 | 139 | o.m->copy_encryption = true; |
| ... | ... | @@ -161,7 +159,7 @@ QPDFJob::Config::deterministicId() |
| 161 | 159 | } |
| 162 | 160 | |
| 163 | 161 | QPDFJob::Config* |
| 164 | -QPDFJob::Config::encryptionFilePassword(char const* parameter) | |
| 162 | +QPDFJob::Config::encryptionFilePassword(std::string const& parameter) | |
| 165 | 163 | { |
| 166 | 164 | o.m->encryption_file_password = QUtil::make_shared_cstr(parameter); |
| 167 | 165 | return this; |
| ... | ... | @@ -182,17 +180,21 @@ QPDFJob::Config::filteredStreamData() |
| 182 | 180 | } |
| 183 | 181 | |
| 184 | 182 | QPDFJob::Config* |
| 185 | -QPDFJob::Config::flattenAnnotations(char const* parameter) | |
| 183 | +QPDFJob::Config::flattenAnnotations(std::string const& parameter) | |
| 186 | 184 | { |
| 187 | 185 | o.m->flatten_annotations = true; |
| 188 | - if (strcmp(parameter, "screen") == 0) | |
| 186 | + if (parameter == "screen") | |
| 189 | 187 | { |
| 190 | 188 | o.m->flatten_annotations_forbidden |= an_no_view; |
| 191 | 189 | } |
| 192 | - else if (strcmp(parameter, "print") == 0) | |
| 190 | + else if (parameter == "print") | |
| 193 | 191 | { |
| 194 | 192 | o.m->flatten_annotations_required |= an_print; |
| 195 | 193 | } |
| 194 | + else if (parameter != "all") | |
| 195 | + { | |
| 196 | + usage("invalid flatten-annotations option"); | |
| 197 | + } | |
| 196 | 198 | return this; |
| 197 | 199 | } |
| 198 | 200 | |
| ... | ... | @@ -204,7 +206,7 @@ QPDFJob::Config::flattenRotation() |
| 204 | 206 | } |
| 205 | 207 | |
| 206 | 208 | QPDFJob::Config* |
| 207 | -QPDFJob::Config::forceVersion(char const* parameter) | |
| 209 | +QPDFJob::Config::forceVersion(std::string const& parameter) | |
| 208 | 210 | { |
| 209 | 211 | o.m->force_version = parameter; |
| 210 | 212 | return this; |
| ... | ... | @@ -225,9 +227,9 @@ QPDFJob::Config::ignoreXrefStreams() |
| 225 | 227 | } |
| 226 | 228 | |
| 227 | 229 | QPDFJob::Config* |
| 228 | -QPDFJob::Config::iiMinBytes(char const* parameter) | |
| 230 | +QPDFJob::Config::iiMinBytes(std::string const& parameter) | |
| 229 | 231 | { |
| 230 | - o.m->ii_min_bytes = QUtil::string_to_uint(parameter); | |
| 232 | + o.m->ii_min_bytes = QUtil::string_to_uint(parameter.c_str()); | |
| 231 | 233 | return this; |
| 232 | 234 | } |
| 233 | 235 | |
| ... | ... | @@ -242,27 +244,25 @@ QPDFJob::Config::isEncrypted() |
| 242 | 244 | QPDFJob::Config* |
| 243 | 245 | QPDFJob::Config::json() |
| 244 | 246 | { |
| 245 | - return json(nullptr); | |
| 247 | + return json(""); | |
| 246 | 248 | } |
| 247 | 249 | |
| 248 | 250 | QPDFJob::Config* |
| 249 | -QPDFJob::Config::json(char const* parameter) | |
| 251 | +QPDFJob::Config::json(std::string const& parameter) | |
| 250 | 252 | { |
| 251 | - if (parameter && strlen(parameter)) | |
| 253 | + if (parameter.empty()) | |
| 252 | 254 | { |
| 253 | - if (strcmp(parameter, "latest") == 0) | |
| 254 | - { | |
| 255 | - o.m->json_version = 1; | |
| 256 | - } | |
| 257 | - else | |
| 258 | - { | |
| 259 | - o.m->json_version = QUtil::string_to_int(parameter); | |
| 260 | - } | |
| 255 | + // The default value is 1 for backward compatibility. | |
| 256 | + o.m->json_version = 1; | |
| 261 | 257 | } |
| 262 | - else | |
| 258 | + else if (parameter == "latest") | |
| 263 | 259 | { |
| 264 | 260 | o.m->json_version = 1; |
| 265 | 261 | } |
| 262 | + else | |
| 263 | + { | |
| 264 | + o.m->json_version = QUtil::string_to_int(parameter.c_str()); | |
| 265 | + } | |
| 266 | 266 | if (o.m->json_version != 1) |
| 267 | 267 | { |
| 268 | 268 | usage(std::string("unsupported json version ") + parameter); |
| ... | ... | @@ -272,31 +272,31 @@ QPDFJob::Config::json(char const* parameter) |
| 272 | 272 | } |
| 273 | 273 | |
| 274 | 274 | QPDFJob::Config* |
| 275 | -QPDFJob::Config::jsonKey(char const* parameter) | |
| 275 | +QPDFJob::Config::jsonKey(std::string const& parameter) | |
| 276 | 276 | { |
| 277 | 277 | o.m->json_keys.insert(parameter); |
| 278 | 278 | return this; |
| 279 | 279 | } |
| 280 | 280 | |
| 281 | 281 | QPDFJob::Config* |
| 282 | -QPDFJob::Config::jsonObject(char const* parameter) | |
| 282 | +QPDFJob::Config::jsonObject(std::string const& parameter) | |
| 283 | 283 | { |
| 284 | 284 | o.m->json_objects.insert(parameter); |
| 285 | 285 | return this; |
| 286 | 286 | } |
| 287 | 287 | |
| 288 | 288 | QPDFJob::Config* |
| 289 | -QPDFJob::Config::keepFilesOpen(char const* parameter) | |
| 289 | +QPDFJob::Config::keepFilesOpen(std::string const& parameter) | |
| 290 | 290 | { |
| 291 | 291 | o.m->keep_files_open_set = true; |
| 292 | - o.m->keep_files_open = (strcmp(parameter, "y") == 0); | |
| 292 | + o.m->keep_files_open = (parameter == "y"); | |
| 293 | 293 | return this; |
| 294 | 294 | } |
| 295 | 295 | |
| 296 | 296 | QPDFJob::Config* |
| 297 | -QPDFJob::Config::keepFilesOpenThreshold(char const* parameter) | |
| 297 | +QPDFJob::Config::keepFilesOpenThreshold(std::string const& parameter) | |
| 298 | 298 | { |
| 299 | - o.m->keep_files_open_threshold = QUtil::string_to_uint(parameter); | |
| 299 | + o.m->keep_files_open_threshold = QUtil::string_to_uint(parameter.c_str()); | |
| 300 | 300 | return this; |
| 301 | 301 | } |
| 302 | 302 | |
| ... | ... | @@ -315,7 +315,7 @@ QPDFJob::Config::linearize() |
| 315 | 315 | } |
| 316 | 316 | |
| 317 | 317 | QPDFJob::Config* |
| 318 | -QPDFJob::Config::linearizePass1(char const* parameter) | |
| 318 | +QPDFJob::Config::linearizePass1(std::string const& parameter) | |
| 319 | 319 | { |
| 320 | 320 | o.m->linearize_pass1 = parameter; |
| 321 | 321 | return this; |
| ... | ... | @@ -330,7 +330,7 @@ QPDFJob::Config::listAttachments() |
| 330 | 330 | } |
| 331 | 331 | |
| 332 | 332 | QPDFJob::Config* |
| 333 | -QPDFJob::Config::minVersion(char const* parameter) | |
| 333 | +QPDFJob::Config::minVersion(std::string const& parameter) | |
| 334 | 334 | { |
| 335 | 335 | o.m->min_version = parameter; |
| 336 | 336 | return this; |
| ... | ... | @@ -358,31 +358,31 @@ QPDFJob::Config::noWarn() |
| 358 | 358 | } |
| 359 | 359 | |
| 360 | 360 | QPDFJob::Config* |
| 361 | -QPDFJob::Config::normalizeContent(char const* parameter) | |
| 361 | +QPDFJob::Config::normalizeContent(std::string const& parameter) | |
| 362 | 362 | { |
| 363 | 363 | o.m->normalize_set = true; |
| 364 | - o.m->normalize = (strcmp(parameter, "y") == 0); | |
| 364 | + o.m->normalize = (parameter == "y"); | |
| 365 | 365 | return this; |
| 366 | 366 | } |
| 367 | 367 | |
| 368 | 368 | QPDFJob::Config* |
| 369 | -QPDFJob::Config::oiMinArea(char const* parameter) | |
| 369 | +QPDFJob::Config::oiMinArea(std::string const& parameter) | |
| 370 | 370 | { |
| 371 | - o.m->oi_min_area = QUtil::string_to_uint(parameter); | |
| 371 | + o.m->oi_min_area = QUtil::string_to_uint(parameter.c_str()); | |
| 372 | 372 | return this; |
| 373 | 373 | } |
| 374 | 374 | |
| 375 | 375 | QPDFJob::Config* |
| 376 | -QPDFJob::Config::oiMinHeight(char const* parameter) | |
| 376 | +QPDFJob::Config::oiMinHeight(std::string const& parameter) | |
| 377 | 377 | { |
| 378 | - o.m->oi_min_height = QUtil::string_to_uint(parameter); | |
| 378 | + o.m->oi_min_height = QUtil::string_to_uint(parameter.c_str()); | |
| 379 | 379 | return this; |
| 380 | 380 | } |
| 381 | 381 | |
| 382 | 382 | QPDFJob::Config* |
| 383 | -QPDFJob::Config::oiMinWidth(char const* parameter) | |
| 383 | +QPDFJob::Config::oiMinWidth(std::string const& parameter) | |
| 384 | 384 | { |
| 385 | - o.m->oi_min_width = QUtil::string_to_uint(parameter); | |
| 385 | + o.m->oi_min_width = QUtil::string_to_uint(parameter.c_str()); | |
| 386 | 386 | return this; |
| 387 | 387 | } |
| 388 | 388 | |
| ... | ... | @@ -394,7 +394,7 @@ QPDFJob::Config::optimizeImages() |
| 394 | 394 | } |
| 395 | 395 | |
| 396 | 396 | QPDFJob::Config* |
| 397 | -QPDFJob::Config::password(char const* parameter) | |
| 397 | +QPDFJob::Config::password(std::string const& parameter) | |
| 398 | 398 | { |
| 399 | 399 | o.m->password = QUtil::make_shared_cstr(parameter); |
| 400 | 400 | return this; |
| ... | ... | @@ -451,7 +451,7 @@ QPDFJob::Config::recompressFlate() |
| 451 | 451 | } |
| 452 | 452 | |
| 453 | 453 | QPDFJob::Config* |
| 454 | -QPDFJob::Config::removeAttachment(char const* parameter) | |
| 454 | +QPDFJob::Config::removeAttachment(std::string const& parameter) | |
| 455 | 455 | { |
| 456 | 456 | o.m->attachments_to_remove.push_back(parameter); |
| 457 | 457 | return this; |
| ... | ... | @@ -473,7 +473,7 @@ QPDFJob::Config::requiresPassword() |
| 473 | 473 | } |
| 474 | 474 | |
| 475 | 475 | QPDFJob::Config* |
| 476 | -QPDFJob::Config::showAttachment(char const* parameter) | |
| 476 | +QPDFJob::Config::showAttachment(std::string const& parameter) | |
| 477 | 477 | { |
| 478 | 478 | o.m->attachment_to_show = parameter; |
| 479 | 479 | o.m->require_outfile = false; |
| ... | ... | @@ -530,14 +530,13 @@ QPDFJob::Config::showXref() |
| 530 | 530 | QPDFJob::Config* |
| 531 | 531 | QPDFJob::Config::splitPages() |
| 532 | 532 | { |
| 533 | - return splitPages(nullptr); | |
| 533 | + return splitPages(""); | |
| 534 | 534 | } |
| 535 | 535 | |
| 536 | 536 | QPDFJob::Config* |
| 537 | -QPDFJob::Config::splitPages(char const* parameter) | |
| 537 | +QPDFJob::Config::splitPages(std::string const& parameter) | |
| 538 | 538 | { |
| 539 | - int n = (((parameter == 0) || (strlen(parameter) == 0)) ? 1 : | |
| 540 | - QUtil::string_to_int(parameter)); | |
| 539 | + int n = (parameter.empty() ? 1 : QUtil::string_to_int(parameter.c_str())); | |
| 541 | 540 | o.m->split_pages = n; |
| 542 | 541 | return this; |
| 543 | 542 | } |
| ... | ... | @@ -592,10 +591,10 @@ QPDFJob::Config::withImages() |
| 592 | 591 | } |
| 593 | 592 | |
| 594 | 593 | QPDFJob::Config* |
| 595 | -QPDFJob::Config::passwordFile(char const* parameter) | |
| 594 | +QPDFJob::Config::passwordFile(std::string const& parameter) | |
| 596 | 595 | { |
| 597 | 596 | std::list<std::string> lines; |
| 598 | - if (strcmp(parameter, "-") == 0) | |
| 597 | + if (parameter == "-") | |
| 599 | 598 | { |
| 600 | 599 | QTC::TC("qpdf", "QPDFJob_config password stdin"); |
| 601 | 600 | lines = QUtil::read_lines_from_file(std::cin); |
| ... | ... | @@ -603,7 +602,7 @@ QPDFJob::Config::passwordFile(char const* parameter) |
| 603 | 602 | else |
| 604 | 603 | { |
| 605 | 604 | QTC::TC("qpdf", "QPDFJob_config password file"); |
| 606 | - lines = QUtil::read_lines_from_file(parameter); | |
| 605 | + lines = QUtil::read_lines_from_file(parameter.c_str()); | |
| 607 | 606 | } |
| 608 | 607 | if (lines.size() >= 1) |
| 609 | 608 | { |
| ... | ... | @@ -620,21 +619,21 @@ QPDFJob::Config::passwordFile(char const* parameter) |
| 620 | 619 | } |
| 621 | 620 | |
| 622 | 621 | QPDFJob::Config* |
| 623 | -QPDFJob::Config::passwordMode(char const* parameter) | |
| 622 | +QPDFJob::Config::passwordMode(std::string const& parameter) | |
| 624 | 623 | { |
| 625 | - if (strcmp(parameter, "bytes") == 0) | |
| 624 | + if (parameter == "bytes") | |
| 626 | 625 | { |
| 627 | 626 | o.m->password_mode = QPDFJob::pm_bytes; |
| 628 | 627 | } |
| 629 | - else if (strcmp(parameter, "hex-bytes") == 0) | |
| 628 | + else if (parameter == "hex-bytes") | |
| 630 | 629 | { |
| 631 | 630 | o.m->password_mode = QPDFJob::pm_hex_bytes; |
| 632 | 631 | } |
| 633 | - else if (strcmp(parameter, "unicode") == 0) | |
| 632 | + else if (parameter == "unicode") | |
| 634 | 633 | { |
| 635 | 634 | o.m->password_mode = QPDFJob::pm_unicode; |
| 636 | 635 | } |
| 637 | - else if (strcmp(parameter, "auto") == 0) | |
| 636 | + else if (parameter == "auto") | |
| 638 | 637 | { |
| 639 | 638 | o.m->password_mode = QPDFJob::pm_auto; |
| 640 | 639 | } |
| ... | ... | @@ -646,18 +645,18 @@ QPDFJob::Config::passwordMode(char const* parameter) |
| 646 | 645 | } |
| 647 | 646 | |
| 648 | 647 | QPDFJob::Config* |
| 649 | -QPDFJob::Config::streamData(char const* parameter) | |
| 648 | +QPDFJob::Config::streamData(std::string const& parameter) | |
| 650 | 649 | { |
| 651 | 650 | o.m->stream_data_set = true; |
| 652 | - if (strcmp(parameter, "compress") == 0) | |
| 651 | + if (parameter == "compress") | |
| 653 | 652 | { |
| 654 | 653 | o.m->stream_data_mode = qpdf_s_compress; |
| 655 | 654 | } |
| 656 | - else if (strcmp(parameter, "preserve") == 0) | |
| 655 | + else if (parameter == "preserve") | |
| 657 | 656 | { |
| 658 | 657 | o.m->stream_data_mode = qpdf_s_preserve; |
| 659 | 658 | } |
| 660 | - else if (strcmp(parameter, "uncompress") == 0) | |
| 659 | + else if (parameter == "uncompress") | |
| 661 | 660 | { |
| 662 | 661 | o.m->stream_data_mode = qpdf_s_uncompress; |
| 663 | 662 | } |
| ... | ... | @@ -669,22 +668,22 @@ QPDFJob::Config::streamData(char const* parameter) |
| 669 | 668 | } |
| 670 | 669 | |
| 671 | 670 | QPDFJob::Config* |
| 672 | -QPDFJob::Config::decodeLevel(char const* parameter) | |
| 671 | +QPDFJob::Config::decodeLevel(std::string const& parameter) | |
| 673 | 672 | { |
| 674 | 673 | o.m->decode_level_set = true; |
| 675 | - if (strcmp(parameter, "none") == 0) | |
| 674 | + if (parameter == "none") | |
| 676 | 675 | { |
| 677 | 676 | o.m->decode_level = qpdf_dl_none; |
| 678 | 677 | } |
| 679 | - else if (strcmp(parameter, "generalized") == 0) | |
| 678 | + else if (parameter == "generalized") | |
| 680 | 679 | { |
| 681 | 680 | o.m->decode_level = qpdf_dl_generalized; |
| 682 | 681 | } |
| 683 | - else if (strcmp(parameter, "specialized") == 0) | |
| 682 | + else if (parameter == "specialized") | |
| 684 | 683 | { |
| 685 | 684 | o.m->decode_level = qpdf_dl_specialized; |
| 686 | 685 | } |
| 687 | - else if (strcmp(parameter, "all") == 0) | |
| 686 | + else if (parameter == "all") | |
| 688 | 687 | { |
| 689 | 688 | o.m->decode_level = qpdf_dl_all; |
| 690 | 689 | } |
| ... | ... | @@ -696,18 +695,18 @@ QPDFJob::Config::decodeLevel(char const* parameter) |
| 696 | 695 | } |
| 697 | 696 | |
| 698 | 697 | QPDFJob::Config* |
| 699 | -QPDFJob::Config::objectStreams(char const* parameter) | |
| 698 | +QPDFJob::Config::objectStreams(std::string const& parameter) | |
| 700 | 699 | { |
| 701 | 700 | o.m->object_stream_set = true; |
| 702 | - if (strcmp(parameter, "disable") == 0) | |
| 701 | + if (parameter == "disable") | |
| 703 | 702 | { |
| 704 | 703 | o.m->object_stream_mode = qpdf_o_disable; |
| 705 | 704 | } |
| 706 | - else if (strcmp(parameter, "preserve") == 0) | |
| 705 | + else if (parameter == "preserve") | |
| 707 | 706 | { |
| 708 | 707 | o.m->object_stream_mode = qpdf_o_preserve; |
| 709 | 708 | } |
| 710 | - else if (strcmp(parameter, "generate") == 0) | |
| 709 | + else if (parameter == "generate") | |
| 711 | 710 | { |
| 712 | 711 | o.m->object_stream_mode = qpdf_o_generate; |
| 713 | 712 | } |
| ... | ... | @@ -719,17 +718,17 @@ QPDFJob::Config::objectStreams(char const* parameter) |
| 719 | 718 | } |
| 720 | 719 | |
| 721 | 720 | QPDFJob::Config* |
| 722 | -QPDFJob::Config::removeUnreferencedResources(char const* parameter) | |
| 721 | +QPDFJob::Config::removeUnreferencedResources(std::string const& parameter) | |
| 723 | 722 | { |
| 724 | - if (strcmp(parameter, "auto") == 0) | |
| 723 | + if (parameter == "auto") | |
| 725 | 724 | { |
| 726 | 725 | o.m->remove_unreferenced_page_resources = QPDFJob::re_auto; |
| 727 | 726 | } |
| 728 | - else if (strcmp(parameter, "yes") == 0) | |
| 727 | + else if (parameter == "yes") | |
| 729 | 728 | { |
| 730 | 729 | o.m->remove_unreferenced_page_resources = QPDFJob::re_yes; |
| 731 | 730 | } |
| 732 | - else if (strcmp(parameter, "no") == 0) | |
| 731 | + else if (parameter == "no") | |
| 733 | 732 | { |
| 734 | 733 | o.m->remove_unreferenced_page_resources = QPDFJob::re_no; |
| 735 | 734 | } |
| ... | ... | @@ -741,7 +740,7 @@ QPDFJob::Config::removeUnreferencedResources(char const* parameter) |
| 741 | 740 | } |
| 742 | 741 | |
| 743 | 742 | QPDFJob::Config* |
| 744 | -QPDFJob::Config::showObject(char const* parameter) | |
| 743 | +QPDFJob::Config::showObject(std::string const& parameter) | |
| 745 | 744 | { |
| 746 | 745 | QPDFJob::parse_object_id( |
| 747 | 746 | parameter, o.m->show_trailer, o.m->show_obj, o.m->show_gen); |
| ... | ... | @@ -750,11 +749,11 @@ QPDFJob::Config::showObject(char const* parameter) |
| 750 | 749 | } |
| 751 | 750 | |
| 752 | 751 | QPDFJob::Config* |
| 753 | -QPDFJob::Config::jobJsonFile(char const* parameter) | |
| 752 | +QPDFJob::Config::jobJsonFile(std::string const& parameter) | |
| 754 | 753 | { |
| 755 | 754 | PointerHolder<char> file_buf; |
| 756 | 755 | size_t size; |
| 757 | - QUtil::read_file_into_memory(parameter, file_buf, size); | |
| 756 | + QUtil::read_file_into_memory(parameter.c_str(), file_buf, size); | |
| 758 | 757 | try |
| 759 | 758 | { |
| 760 | 759 | o.initializeFromJson(std::string(file_buf.getPointer(), size), true); |
| ... | ... | @@ -770,7 +769,7 @@ QPDFJob::Config::jobJsonFile(char const* parameter) |
| 770 | 769 | } |
| 771 | 770 | |
| 772 | 771 | QPDFJob::Config* |
| 773 | -QPDFJob::Config::rotate(char const* parameter) | |
| 772 | +QPDFJob::Config::rotate(std::string const& parameter) | |
| 774 | 773 | { |
| 775 | 774 | o.parseRotationParameter(parameter); |
| 776 | 775 | return this; |
| ... | ... | @@ -788,21 +787,21 @@ QPDFJob::CopyAttConfig::CopyAttConfig(Config* c) : |
| 788 | 787 | } |
| 789 | 788 | |
| 790 | 789 | QPDFJob::CopyAttConfig* |
| 791 | -QPDFJob::CopyAttConfig::file(char const* parameter) | |
| 790 | +QPDFJob::CopyAttConfig::file(std::string const& parameter) | |
| 792 | 791 | { |
| 793 | 792 | this->caf.path = parameter; |
| 794 | 793 | return this; |
| 795 | 794 | } |
| 796 | 795 | |
| 797 | 796 | QPDFJob::CopyAttConfig* |
| 798 | -QPDFJob::CopyAttConfig::prefix(char const* parameter) | |
| 797 | +QPDFJob::CopyAttConfig::prefix(std::string const& parameter) | |
| 799 | 798 | { |
| 800 | 799 | this->caf.prefix = parameter; |
| 801 | 800 | return this; |
| 802 | 801 | } |
| 803 | 802 | |
| 804 | 803 | QPDFJob::CopyAttConfig* |
| 805 | -QPDFJob::CopyAttConfig::password(char const* parameter) | |
| 804 | +QPDFJob::CopyAttConfig::password(std::string const& parameter) | |
| 806 | 805 | { |
| 807 | 806 | this->caf.password = parameter; |
| 808 | 807 | return this; |
| ... | ... | @@ -831,28 +830,28 @@ QPDFJob::Config::addAttachment() |
| 831 | 830 | } |
| 832 | 831 | |
| 833 | 832 | QPDFJob::AttConfig* |
| 834 | -QPDFJob::AttConfig::file(char const* parameter) | |
| 833 | +QPDFJob::AttConfig::file(std::string const& parameter) | |
| 835 | 834 | { |
| 836 | 835 | this->att.path = parameter; |
| 837 | 836 | return this; |
| 838 | 837 | } |
| 839 | 838 | |
| 840 | 839 | QPDFJob::AttConfig* |
| 841 | -QPDFJob::AttConfig::key(char const* parameter) | |
| 840 | +QPDFJob::AttConfig::key(std::string const& parameter) | |
| 842 | 841 | { |
| 843 | 842 | this->att.key = parameter; |
| 844 | 843 | return this; |
| 845 | 844 | } |
| 846 | 845 | |
| 847 | 846 | QPDFJob::AttConfig* |
| 848 | -QPDFJob::AttConfig::filename(char const* parameter) | |
| 847 | +QPDFJob::AttConfig::filename(std::string const& parameter) | |
| 849 | 848 | { |
| 850 | 849 | this->att.filename = parameter; |
| 851 | 850 | return this; |
| 852 | 851 | } |
| 853 | 852 | |
| 854 | 853 | QPDFJob::AttConfig* |
| 855 | -QPDFJob::AttConfig::creationdate(char const* parameter) | |
| 854 | +QPDFJob::AttConfig::creationdate(std::string const& parameter) | |
| 856 | 855 | { |
| 857 | 856 | if (! QUtil::pdf_time_to_qpdf_time(parameter)) |
| 858 | 857 | { |
| ... | ... | @@ -863,7 +862,7 @@ QPDFJob::AttConfig::creationdate(char const* parameter) |
| 863 | 862 | } |
| 864 | 863 | |
| 865 | 864 | QPDFJob::AttConfig* |
| 866 | -QPDFJob::AttConfig::moddate(char const* parameter) | |
| 865 | +QPDFJob::AttConfig::moddate(std::string const& parameter) | |
| 867 | 866 | { |
| 868 | 867 | if (! QUtil::pdf_time_to_qpdf_time(parameter)) |
| 869 | 868 | { |
| ... | ... | @@ -874,9 +873,9 @@ QPDFJob::AttConfig::moddate(char const* parameter) |
| 874 | 873 | } |
| 875 | 874 | |
| 876 | 875 | QPDFJob::AttConfig* |
| 877 | -QPDFJob::AttConfig::mimetype(char const* parameter) | |
| 876 | +QPDFJob::AttConfig::mimetype(std::string const& parameter) | |
| 878 | 877 | { |
| 879 | - if (strchr(parameter, '/') == nullptr) | |
| 878 | + if (parameter.find('/') == std::string::npos) | |
| 880 | 879 | { |
| 881 | 880 | usage("mime type should be specified as type/subtype"); |
| 882 | 881 | } |
| ... | ... | @@ -885,7 +884,7 @@ QPDFJob::AttConfig::mimetype(char const* parameter) |
| 885 | 884 | } |
| 886 | 885 | |
| 887 | 886 | QPDFJob::AttConfig* |
| 888 | -QPDFJob::AttConfig::description(char const* parameter) | |
| 887 | +QPDFJob::AttConfig::description(std::string const& parameter) | |
| 889 | 888 | { |
| 890 | 889 | this->att.description = parameter; |
| 891 | 890 | return this; |
| ... | ... | @@ -999,7 +998,7 @@ QPDFJob::UOConfig::endUnderlayOverlay() |
| 999 | 998 | } |
| 1000 | 999 | |
| 1001 | 1000 | QPDFJob::UOConfig* |
| 1002 | -QPDFJob::UOConfig::file(char const* parameter) | |
| 1001 | +QPDFJob::UOConfig::file(std::string const& parameter) | |
| 1003 | 1002 | { |
| 1004 | 1003 | if (! config->o.m->under_overlay->filename.empty()) |
| 1005 | 1004 | { |
| ... | ... | @@ -1013,37 +1012,37 @@ QPDFJob::UOConfig::file(char const* parameter) |
| 1013 | 1012 | } |
| 1014 | 1013 | |
| 1015 | 1014 | QPDFJob::UOConfig* |
| 1016 | -QPDFJob::UOConfig::to(char const* parameter) | |
| 1015 | +QPDFJob::UOConfig::to(std::string const& parameter) | |
| 1017 | 1016 | { |
| 1018 | - config->o.parseNumrange(parameter, 0); | |
| 1017 | + config->o.parseNumrange(parameter.c_str(), 0); | |
| 1019 | 1018 | config->o.m->under_overlay->to_nr = parameter; |
| 1020 | 1019 | return this; |
| 1021 | 1020 | } |
| 1022 | 1021 | |
| 1023 | 1022 | QPDFJob::UOConfig* |
| 1024 | -QPDFJob::UOConfig::from(char const* parameter) | |
| 1023 | +QPDFJob::UOConfig::from(std::string const& parameter) | |
| 1025 | 1024 | { |
| 1026 | - if (strlen(parameter)) | |
| 1025 | + if (! parameter.empty()) | |
| 1027 | 1026 | { |
| 1028 | - config->o.parseNumrange(parameter, 0); | |
| 1027 | + config->o.parseNumrange(parameter.c_str(), 0); | |
| 1029 | 1028 | } |
| 1030 | 1029 | config->o.m->under_overlay->from_nr = parameter; |
| 1031 | 1030 | return this; |
| 1032 | 1031 | } |
| 1033 | 1032 | |
| 1034 | 1033 | QPDFJob::UOConfig* |
| 1035 | -QPDFJob::UOConfig::repeat(char const* parameter) | |
| 1034 | +QPDFJob::UOConfig::repeat(std::string const& parameter) | |
| 1036 | 1035 | { |
| 1037 | - if (strlen(parameter)) | |
| 1036 | + if (! parameter.empty()) | |
| 1038 | 1037 | { |
| 1039 | - config->o.parseNumrange(parameter, 0); | |
| 1038 | + config->o.parseNumrange(parameter.c_str(), 0); | |
| 1040 | 1039 | } |
| 1041 | 1040 | config->o.m->under_overlay->repeat_nr = parameter; |
| 1042 | 1041 | return this; |
| 1043 | 1042 | } |
| 1044 | 1043 | |
| 1045 | 1044 | QPDFJob::UOConfig* |
| 1046 | -QPDFJob::UOConfig::password(char const* parameter) | |
| 1045 | +QPDFJob::UOConfig::password(std::string const& parameter) | |
| 1047 | 1046 | { |
| 1048 | 1047 | config->o.m->under_overlay->password = QUtil::make_shared_cstr(parameter); |
| 1049 | 1048 | return this; |
| ... | ... | @@ -1086,42 +1085,42 @@ QPDFJob::EncConfig::allowInsecure() |
| 1086 | 1085 | } |
| 1087 | 1086 | |
| 1088 | 1087 | QPDFJob::EncConfig* |
| 1089 | -QPDFJob::EncConfig::accessibility(char const* parameter) | |
| 1088 | +QPDFJob::EncConfig::accessibility(std::string const& parameter) | |
| 1090 | 1089 | { |
| 1091 | - config->o.m->r3_accessibility = (strcmp(parameter, "y") == 0); | |
| 1090 | + config->o.m->r3_accessibility = (parameter == "y"); | |
| 1092 | 1091 | return this; |
| 1093 | 1092 | } |
| 1094 | 1093 | |
| 1095 | 1094 | QPDFJob::EncConfig* |
| 1096 | -QPDFJob::EncConfig::extract(char const* parameter) | |
| 1095 | +QPDFJob::EncConfig::extract(std::string const& parameter) | |
| 1097 | 1096 | { |
| 1098 | 1097 | if (config->o.m->keylen == 40) |
| 1099 | 1098 | { |
| 1100 | - config->o.m->r2_extract = (strcmp(parameter, "y") == 0); | |
| 1099 | + config->o.m->r2_extract = (parameter == "y"); | |
| 1101 | 1100 | } |
| 1102 | 1101 | else |
| 1103 | 1102 | { |
| 1104 | - config->o.m->r3_extract = (strcmp(parameter, "y") == 0); | |
| 1103 | + config->o.m->r3_extract = (parameter == "y"); | |
| 1105 | 1104 | } |
| 1106 | 1105 | return this; |
| 1107 | 1106 | } |
| 1108 | 1107 | |
| 1109 | 1108 | QPDFJob::EncConfig* |
| 1110 | -QPDFJob::EncConfig::print(char const* parameter) | |
| 1109 | +QPDFJob::EncConfig::print(std::string const& parameter) | |
| 1111 | 1110 | { |
| 1112 | 1111 | if (config->o.m->keylen == 40) |
| 1113 | 1112 | { |
| 1114 | - config->o.m->r2_print = (strcmp(parameter, "y") == 0); | |
| 1113 | + config->o.m->r2_print = (parameter == "y"); | |
| 1115 | 1114 | } |
| 1116 | - else if (strcmp(parameter, "full") == 0) | |
| 1115 | + else if (parameter == "full") | |
| 1117 | 1116 | { |
| 1118 | 1117 | config->o.m->r3_print = qpdf_r3p_full; |
| 1119 | 1118 | } |
| 1120 | - else if (strcmp(parameter, "low") == 0) | |
| 1119 | + else if (parameter == "low") | |
| 1121 | 1120 | { |
| 1122 | 1121 | config->o.m->r3_print = qpdf_r3p_low; |
| 1123 | 1122 | } |
| 1124 | - else if (strcmp(parameter, "none") == 0) | |
| 1123 | + else if (parameter == "none") | |
| 1125 | 1124 | { |
| 1126 | 1125 | config->o.m->r3_print = qpdf_r3p_none; |
| 1127 | 1126 | } |
| ... | ... | @@ -1133,41 +1132,41 @@ QPDFJob::EncConfig::print(char const* parameter) |
| 1133 | 1132 | } |
| 1134 | 1133 | |
| 1135 | 1134 | QPDFJob::EncConfig* |
| 1136 | -QPDFJob::EncConfig::modify(char const* parameter) | |
| 1135 | +QPDFJob::EncConfig::modify(std::string const& parameter) | |
| 1137 | 1136 | { |
| 1138 | 1137 | if (config->o.m->keylen == 40) |
| 1139 | 1138 | { |
| 1140 | - config->o.m->r2_modify = (strcmp(parameter, "y") == 0); | |
| 1139 | + config->o.m->r2_modify = (parameter == "y"); | |
| 1141 | 1140 | } |
| 1142 | - else if (strcmp(parameter, "all") == 0) | |
| 1141 | + else if (parameter == "all") | |
| 1143 | 1142 | { |
| 1144 | 1143 | config->o.m->r3_assemble = true; |
| 1145 | 1144 | config->o.m->r3_annotate_and_form = true; |
| 1146 | 1145 | config->o.m->r3_form_filling = true; |
| 1147 | 1146 | config->o.m->r3_modify_other = true; |
| 1148 | 1147 | } |
| 1149 | - else if (strcmp(parameter, "annotate") == 0) | |
| 1148 | + else if (parameter == "annotate") | |
| 1150 | 1149 | { |
| 1151 | 1150 | config->o.m->r3_assemble = true; |
| 1152 | 1151 | config->o.m->r3_annotate_and_form = true; |
| 1153 | 1152 | config->o.m->r3_form_filling = true; |
| 1154 | 1153 | config->o.m->r3_modify_other = false; |
| 1155 | 1154 | } |
| 1156 | - else if (strcmp(parameter, "form") == 0) | |
| 1155 | + else if (parameter == "form") | |
| 1157 | 1156 | { |
| 1158 | 1157 | config->o.m->r3_assemble = true; |
| 1159 | 1158 | config->o.m->r3_annotate_and_form = false; |
| 1160 | 1159 | config->o.m->r3_form_filling = true; |
| 1161 | 1160 | config->o.m->r3_modify_other = false; |
| 1162 | 1161 | } |
| 1163 | - else if (strcmp(parameter, "assembly") == 0) | |
| 1162 | + else if (parameter == "assembly") | |
| 1164 | 1163 | { |
| 1165 | 1164 | config->o.m->r3_assemble = true; |
| 1166 | 1165 | config->o.m->r3_annotate_and_form = false; |
| 1167 | 1166 | config->o.m->r3_form_filling = false; |
| 1168 | 1167 | config->o.m->r3_modify_other = false; |
| 1169 | 1168 | } |
| 1170 | - else if (strcmp(parameter, "none") == 0) | |
| 1169 | + else if (parameter == "none") | |
| 1171 | 1170 | { |
| 1172 | 1171 | config->o.m->r3_assemble = false; |
| 1173 | 1172 | config->o.m->r3_annotate_and_form = false; |
| ... | ... | @@ -1189,44 +1188,44 @@ QPDFJob::EncConfig::cleartextMetadata() |
| 1189 | 1188 | } |
| 1190 | 1189 | |
| 1191 | 1190 | QPDFJob::EncConfig* |
| 1192 | -QPDFJob::EncConfig::assemble(char const* parameter) | |
| 1191 | +QPDFJob::EncConfig::assemble(std::string const& parameter) | |
| 1193 | 1192 | { |
| 1194 | - config->o.m->r3_assemble = (strcmp(parameter, "y") == 0); | |
| 1193 | + config->o.m->r3_assemble = (parameter == "y"); | |
| 1195 | 1194 | return this; |
| 1196 | 1195 | } |
| 1197 | 1196 | |
| 1198 | 1197 | QPDFJob::EncConfig* |
| 1199 | -QPDFJob::EncConfig::annotate(char const* parameter) | |
| 1198 | +QPDFJob::EncConfig::annotate(std::string const& parameter) | |
| 1200 | 1199 | { |
| 1201 | 1200 | if (config->o.m->keylen == 40) |
| 1202 | 1201 | { |
| 1203 | - config->o.m->r2_annotate = (strcmp(parameter, "y") == 0); | |
| 1202 | + config->o.m->r2_annotate = (parameter == "y"); | |
| 1204 | 1203 | } |
| 1205 | 1204 | else |
| 1206 | 1205 | { |
| 1207 | - config->o.m->r3_annotate_and_form = (strcmp(parameter, "y") == 0); | |
| 1206 | + config->o.m->r3_annotate_and_form = (parameter == "y"); | |
| 1208 | 1207 | } |
| 1209 | 1208 | return this; |
| 1210 | 1209 | } |
| 1211 | 1210 | |
| 1212 | 1211 | QPDFJob::EncConfig* |
| 1213 | -QPDFJob::EncConfig::form(char const* parameter) | |
| 1212 | +QPDFJob::EncConfig::form(std::string const& parameter) | |
| 1214 | 1213 | { |
| 1215 | - config->o.m->r3_form_filling = (strcmp(parameter, "y") == 0); | |
| 1214 | + config->o.m->r3_form_filling = (parameter == "y"); | |
| 1216 | 1215 | return this; |
| 1217 | 1216 | } |
| 1218 | 1217 | |
| 1219 | 1218 | QPDFJob::EncConfig* |
| 1220 | -QPDFJob::EncConfig::modifyOther(char const* parameter) | |
| 1219 | +QPDFJob::EncConfig::modifyOther(std::string const& parameter) | |
| 1221 | 1220 | { |
| 1222 | - config->o.m->r3_modify_other = (strcmp(parameter, "y") == 0); | |
| 1221 | + config->o.m->r3_modify_other = (parameter == "y"); | |
| 1223 | 1222 | return this; |
| 1224 | 1223 | } |
| 1225 | 1224 | |
| 1226 | 1225 | QPDFJob::EncConfig* |
| 1227 | -QPDFJob::EncConfig::useAes(char const* parameter) | |
| 1226 | +QPDFJob::EncConfig::useAes(std::string const& parameter) | |
| 1228 | 1227 | { |
| 1229 | - config->o.m->use_aes = (strcmp(parameter, "y") == 0); | |
| 1228 | + config->o.m->use_aes = (parameter == "y"); | |
| 1230 | 1229 | return this; |
| 1231 | 1230 | } |
| 1232 | 1231 | ... | ... |
libqpdf/QUtil.cc
| ... | ... | @@ -2615,9 +2615,9 @@ QUtil::possible_repaired_encodings(std::string supplied) |
| 2615 | 2615 | } |
| 2616 | 2616 | |
| 2617 | 2617 | #ifndef QPDF_NO_WCHAR_T |
| 2618 | -int | |
| 2619 | -QUtil::call_main_from_wmain(int argc, wchar_t* argv[], | |
| 2620 | - std::function<int(int, char*[])> realmain) | |
| 2618 | +static int | |
| 2619 | +call_main_from_wmain(bool, int argc, wchar_t const* const argv[], | |
| 2620 | + std::function<int(int, char*[])> realmain) | |
| 2621 | 2621 | { |
| 2622 | 2622 | // argv contains UTF-16-encoded strings with a 16-bit wchar_t. |
| 2623 | 2623 | // Convert this to UTF-8-encoded strings for compatibility with |
| ... | ... | @@ -2640,7 +2640,8 @@ QUtil::call_main_from_wmain(int argc, wchar_t* argv[], |
| 2640 | 2640 | utf8_argv.push_back(QUtil::make_shared_cstr(utf8)); |
| 2641 | 2641 | } |
| 2642 | 2642 | auto utf8_argv_sp = |
| 2643 | - std::shared_ptr<char*>(new char*[1+utf8_argv.size()], std::default_delete<char*[]>()); | |
| 2643 | + std::shared_ptr<char*>( | |
| 2644 | + new char*[1+utf8_argv.size()], std::default_delete<char*[]>()); | |
| 2644 | 2645 | char** new_argv = utf8_argv_sp.get(); |
| 2645 | 2646 | for (size_t i = 0; i < utf8_argv.size(); ++i) |
| 2646 | 2647 | { |
| ... | ... | @@ -2650,4 +2651,23 @@ QUtil::call_main_from_wmain(int argc, wchar_t* argv[], |
| 2650 | 2651 | new_argv[argc] = 0; |
| 2651 | 2652 | return realmain(argc, new_argv); |
| 2652 | 2653 | } |
| 2654 | + | |
| 2655 | +int | |
| 2656 | +QUtil::call_main_from_wmain(int argc, wchar_t* argv[], | |
| 2657 | + std::function<int(int, char*[])> realmain) | |
| 2658 | +{ | |
| 2659 | + return ::call_main_from_wmain(true, argc, argv, realmain); | |
| 2660 | +} | |
| 2661 | + | |
| 2662 | +int | |
| 2663 | +QUtil::call_main_from_wmain( | |
| 2664 | + int argc, wchar_t const* const argv[], | |
| 2665 | + std::function<int(int, char const* const[])> realmain) | |
| 2666 | +{ | |
| 2667 | + return ::call_main_from_wmain( | |
| 2668 | + true, argc, argv, [realmain](int new_argc, char* new_argv[]) { | |
| 2669 | + return realmain(new_argc, new_argv); | |
| 2670 | + }); | |
| 2671 | +} | |
| 2672 | + | |
| 2653 | 2673 | #endif // QPDF_NO_WCHAR_T | ... | ... |
libqpdf/qpdf/QPDFArgParser.hh
| ... | ... | @@ -21,16 +21,6 @@ |
| 21 | 21 | // done mostly by automatically-generated code (one-off code for |
| 22 | 22 | // qpdf), though the handlers themselves are hand-coded. See |
| 23 | 23 | // generate_auto_job at the top of the source tree for details. |
| 24 | - | |
| 25 | -// Note about memory: there is code that expects argv to be a char*[], | |
| 26 | -// meaning that arguments are writable. Several operations, including | |
| 27 | -// reading arguments from a file or parsing a line for bash | |
| 28 | -// completion, involve fabricating an argv array. To ensure that the | |
| 29 | -// memory is valid and is cleaned up properly, we keep various vectors | |
| 30 | -// of smart character pointers that argv points into. In order for | |
| 31 | -// those pointers to remain valid, the QPDFArgParser instance must | |
| 32 | -// remain in scope for the life of any code that may reference | |
| 33 | -// anything from argv. | |
| 34 | 24 | class QPDFArgParser |
| 35 | 25 | { |
| 36 | 26 | public: |
| ... | ... | @@ -38,7 +28,7 @@ class QPDFArgParser |
| 38 | 28 | // name of the executable for setting up completion. This may be |
| 39 | 29 | // needed if the program is invoked by a wrapper. |
| 40 | 30 | QPDF_DLL |
| 41 | - QPDFArgParser(int argc, char* argv[], char const* progname_env); | |
| 31 | + QPDFArgParser(int argc, char const* const argv[], char const* progname_env); | |
| 42 | 32 | |
| 43 | 33 | // Calls exit(0) if a help option is given or if in completion |
| 44 | 34 | // mode. If there are argument parsing errors, QPDFUsage is |
| ... | ... | @@ -60,7 +50,7 @@ class QPDFArgParser |
| 60 | 50 | // a series of options that end with `--`. |
| 61 | 51 | |
| 62 | 52 | typedef std::function<void()> bare_arg_handler_t; |
| 63 | - typedef std::function<void(char*)> param_arg_handler_t; | |
| 53 | + typedef std::function<void(std::string const&)> param_arg_handler_t; | |
| 64 | 54 | |
| 65 | 55 | QPDF_DLL |
| 66 | 56 | void selectMainOptionTable(); |
| ... | ... | @@ -163,7 +153,7 @@ class QPDFArgParser |
| 163 | 153 | // unknown value returns a string directing the user to run the |
| 164 | 154 | // top-level --help option. |
| 165 | 155 | QPDF_DLL |
| 166 | - std::string getHelp(char const* topic_or_option); | |
| 156 | + std::string getHelp(std::string const& topic_or_option); | |
| 167 | 157 | |
| 168 | 158 | // Convenience methods for adding member functions of a class as |
| 169 | 159 | // handlers. |
| ... | ... | @@ -173,7 +163,7 @@ class QPDFArgParser |
| 173 | 163 | return std::bind(std::mem_fn(f), o); |
| 174 | 164 | } |
| 175 | 165 | template <class T> |
| 176 | - static param_arg_handler_t bindParam(void (T::*f)(char *), T* o) | |
| 166 | + static param_arg_handler_t bindParam(void (T::*f)(std::string const&), T* o) | |
| 177 | 167 | { |
| 178 | 168 | return std::bind(std::mem_fn(f), o, std::placeholders::_1); |
| 179 | 169 | } |
| ... | ... | @@ -238,13 +228,13 @@ class QPDFArgParser |
| 238 | 228 | |
| 239 | 229 | void argCompletionBash(); |
| 240 | 230 | void argCompletionZsh(); |
| 241 | - void argHelp(char*); | |
| 242 | - void invalidHelpArg(char*); | |
| 231 | + void argHelp(std::string const&); | |
| 232 | + void invalidHelpArg(std::string const&); | |
| 243 | 233 | |
| 244 | 234 | void checkCompletion(); |
| 245 | 235 | void handleArgFileArguments(); |
| 246 | 236 | void handleBashArguments(); |
| 247 | - void readArgsFromFile(char const* filename); | |
| 237 | + void readArgsFromFile(std::string const& filename); | |
| 248 | 238 | void doFinalChecks(); |
| 249 | 239 | void addOptionsToCompletions(option_table_t&); |
| 250 | 240 | void addChoicesToCompletions( |
| ... | ... | @@ -267,12 +257,12 @@ class QPDFArgParser |
| 267 | 257 | ~Members() = default; |
| 268 | 258 | |
| 269 | 259 | private: |
| 270 | - Members(int argc, char* argv[], char const* progname_env); | |
| 260 | + Members(int argc, char const* const argv[], char const* progname_env); | |
| 271 | 261 | Members(Members const&) = delete; |
| 272 | 262 | |
| 273 | 263 | int argc; |
| 274 | - char** argv; | |
| 275 | - char const* whoami; | |
| 264 | + char const* const* argv; | |
| 265 | + std::string whoami; | |
| 276 | 266 | std::string progname_env; |
| 277 | 267 | int cur_arg; |
| 278 | 268 | bool bash_completion; |
| ... | ... | @@ -287,10 +277,10 @@ class QPDFArgParser |
| 287 | 277 | option_table_t* option_table; |
| 288 | 278 | std::string option_table_name; |
| 289 | 279 | bare_arg_handler_t final_check_handler; |
| 290 | - std::vector<std::shared_ptr<char>> new_argv; | |
| 291 | - std::vector<std::shared_ptr<char>> bash_argv; | |
| 292 | - std::shared_ptr<char*> argv_ph; | |
| 293 | - std::shared_ptr<char*> bash_argv_ph; | |
| 280 | + std::vector<std::shared_ptr<char const>> new_argv; | |
| 281 | + std::vector<std::shared_ptr<char const>> bash_argv; | |
| 282 | + std::shared_ptr<char const*> argv_ph; | |
| 283 | + std::shared_ptr<char const*> bash_argv_ph; | |
| 294 | 284 | std::map<std::string, HelpTopic> help_topics; |
| 295 | 285 | std::map<std::string, HelpTopic> option_help; |
| 296 | 286 | std::string help_footer; | ... | ... |
libqpdf/qpdf/auto_job_decl.hh
| ... | ... | @@ -17,7 +17,7 @@ void argCopyright(); |
| 17 | 17 | void argJsonHelp(); |
| 18 | 18 | void argShowCrypto(); |
| 19 | 19 | void argJobJsonHelp(); |
| 20 | -void argPositional(char*); | |
| 20 | +void argPositional(std::string const&); | |
| 21 | 21 | void argAddAttachment(); |
| 22 | 22 | void argCopyAttachmentsFrom(); |
| 23 | 23 | void argEmpty(); |
| ... | ... | @@ -26,17 +26,17 @@ void argOverlay(); |
| 26 | 26 | void argPages(); |
| 27 | 27 | void argReplaceInput(); |
| 28 | 28 | void argUnderlay(); |
| 29 | -void argPagesPositional(char*); | |
| 30 | -void argPagesPassword(char *); | |
| 29 | +void argPagesPositional(std::string const&); | |
| 30 | +void argPagesPassword(std::string const&); | |
| 31 | 31 | void argEndPages(); |
| 32 | -void argEncPositional(char*); | |
| 32 | +void argEncPositional(std::string const&); | |
| 33 | 33 | void argEndEncryption(); |
| 34 | 34 | void argEnd40BitEncryption(); |
| 35 | 35 | void argEnd128BitEncryption(); |
| 36 | 36 | void argEnd256BitEncryption(); |
| 37 | -void argUOPositional(char*); | |
| 37 | +void argUOPositional(std::string const&); | |
| 38 | 38 | void argEndUnderlayOverlay(); |
| 39 | -void argAttPositional(char*); | |
| 39 | +void argAttPositional(std::string const&); | |
| 40 | 40 | void argEndAttachment(); |
| 41 | -void argCopyAttPositional(char*); | |
| 41 | +void argCopyAttPositional(std::string const&); | |
| 42 | 42 | void argEndCopyAttachment(); | ... | ... |
libqpdf/qpdf/auto_job_init.hh
| ... | ... | @@ -6,7 +6,7 @@ |
| 6 | 6 | auto b = [this](void (ArgParser::*f)()) { |
| 7 | 7 | return QPDFArgParser::bindBare(f, this); |
| 8 | 8 | }; |
| 9 | -auto p = [this](void (ArgParser::*f)(char *)) { | |
| 9 | +auto p = [this](void (ArgParser::*f)(std::string const&)) { | |
| 10 | 10 | return QPDFArgParser::bindParam(f, this); |
| 11 | 11 | }; |
| 12 | 12 | |
| ... | ... | @@ -79,88 +79,88 @@ this->ap.addBare("underlay", b(&ArgParser::argUnderlay)); |
| 79 | 79 | this->ap.addBare("verbose", [this](){c_main->verbose();}); |
| 80 | 80 | this->ap.addBare("warning-exit-0", [this](){c_main->warningExit0();}); |
| 81 | 81 | this->ap.addBare("with-images", [this](){c_main->withImages();}); |
| 82 | -this->ap.addRequiredParameter("compression-level", [this](char *x){c_main->compressionLevel(x);}, "level"); | |
| 83 | -this->ap.addRequiredParameter("copy-encryption", [this](char *x){c_main->copyEncryption(x);}, "file"); | |
| 84 | -this->ap.addRequiredParameter("encryption-file-password", [this](char *x){c_main->encryptionFilePassword(x);}, "password"); | |
| 85 | -this->ap.addRequiredParameter("force-version", [this](char *x){c_main->forceVersion(x);}, "version"); | |
| 86 | -this->ap.addRequiredParameter("ii-min-bytes", [this](char *x){c_main->iiMinBytes(x);}, "minimum"); | |
| 87 | -this->ap.addRequiredParameter("job-json-file", [this](char *x){c_main->jobJsonFile(x);}, "file"); | |
| 88 | -this->ap.addRequiredParameter("json-object", [this](char *x){c_main->jsonObject(x);}, "trailer"); | |
| 89 | -this->ap.addRequiredParameter("keep-files-open-threshold", [this](char *x){c_main->keepFilesOpenThreshold(x);}, "count"); | |
| 90 | -this->ap.addRequiredParameter("linearize-pass1", [this](char *x){c_main->linearizePass1(x);}, "filename"); | |
| 91 | -this->ap.addRequiredParameter("min-version", [this](char *x){c_main->minVersion(x);}, "version"); | |
| 92 | -this->ap.addRequiredParameter("oi-min-area", [this](char *x){c_main->oiMinArea(x);}, "minimum"); | |
| 93 | -this->ap.addRequiredParameter("oi-min-height", [this](char *x){c_main->oiMinHeight(x);}, "minimum"); | |
| 94 | -this->ap.addRequiredParameter("oi-min-width", [this](char *x){c_main->oiMinWidth(x);}, "minimum"); | |
| 95 | -this->ap.addRequiredParameter("password", [this](char *x){c_main->password(x);}, "password"); | |
| 96 | -this->ap.addRequiredParameter("password-file", [this](char *x){c_main->passwordFile(x);}, "password"); | |
| 97 | -this->ap.addRequiredParameter("remove-attachment", [this](char *x){c_main->removeAttachment(x);}, "attachment"); | |
| 98 | -this->ap.addRequiredParameter("rotate", [this](char *x){c_main->rotate(x);}, "[+|-]angle"); | |
| 99 | -this->ap.addRequiredParameter("show-attachment", [this](char *x){c_main->showAttachment(x);}, "attachment"); | |
| 100 | -this->ap.addRequiredParameter("show-object", [this](char *x){c_main->showObject(x);}, "trailer"); | |
| 101 | -this->ap.addOptionalParameter("collate", [this](char *x){c_main->collate(x);}); | |
| 102 | -this->ap.addOptionalParameter("split-pages", [this](char *x){c_main->splitPages(x);}); | |
| 103 | -this->ap.addChoices("compress-streams", [this](char *x){c_main->compressStreams(x);}, true, yn_choices); | |
| 104 | -this->ap.addChoices("decode-level", [this](char *x){c_main->decodeLevel(x);}, true, decode_level_choices); | |
| 105 | -this->ap.addChoices("flatten-annotations", [this](char *x){c_main->flattenAnnotations(x);}, true, flatten_choices); | |
| 106 | -this->ap.addChoices("json-key", [this](char *x){c_main->jsonKey(x);}, true, json_key_choices); | |
| 107 | -this->ap.addChoices("keep-files-open", [this](char *x){c_main->keepFilesOpen(x);}, true, yn_choices); | |
| 108 | -this->ap.addChoices("normalize-content", [this](char *x){c_main->normalizeContent(x);}, true, yn_choices); | |
| 109 | -this->ap.addChoices("object-streams", [this](char *x){c_main->objectStreams(x);}, true, object_streams_choices); | |
| 110 | -this->ap.addChoices("password-mode", [this](char *x){c_main->passwordMode(x);}, true, password_mode_choices); | |
| 111 | -this->ap.addChoices("remove-unreferenced-resources", [this](char *x){c_main->removeUnreferencedResources(x);}, true, remove_unref_choices); | |
| 112 | -this->ap.addChoices("stream-data", [this](char *x){c_main->streamData(x);}, true, stream_data_choices); | |
| 113 | -this->ap.addChoices("json", [this](char *x){c_main->json(x);}, false, json_version_choices); | |
| 82 | +this->ap.addRequiredParameter("compression-level", [this](std::string const& x){c_main->compressionLevel(x);}, "level"); | |
| 83 | +this->ap.addRequiredParameter("copy-encryption", [this](std::string const& x){c_main->copyEncryption(x);}, "file"); | |
| 84 | +this->ap.addRequiredParameter("encryption-file-password", [this](std::string const& x){c_main->encryptionFilePassword(x);}, "password"); | |
| 85 | +this->ap.addRequiredParameter("force-version", [this](std::string const& x){c_main->forceVersion(x);}, "version"); | |
| 86 | +this->ap.addRequiredParameter("ii-min-bytes", [this](std::string const& x){c_main->iiMinBytes(x);}, "minimum"); | |
| 87 | +this->ap.addRequiredParameter("job-json-file", [this](std::string const& x){c_main->jobJsonFile(x);}, "file"); | |
| 88 | +this->ap.addRequiredParameter("json-object", [this](std::string const& x){c_main->jsonObject(x);}, "trailer"); | |
| 89 | +this->ap.addRequiredParameter("keep-files-open-threshold", [this](std::string const& x){c_main->keepFilesOpenThreshold(x);}, "count"); | |
| 90 | +this->ap.addRequiredParameter("linearize-pass1", [this](std::string const& x){c_main->linearizePass1(x);}, "filename"); | |
| 91 | +this->ap.addRequiredParameter("min-version", [this](std::string const& x){c_main->minVersion(x);}, "version"); | |
| 92 | +this->ap.addRequiredParameter("oi-min-area", [this](std::string const& x){c_main->oiMinArea(x);}, "minimum"); | |
| 93 | +this->ap.addRequiredParameter("oi-min-height", [this](std::string const& x){c_main->oiMinHeight(x);}, "minimum"); | |
| 94 | +this->ap.addRequiredParameter("oi-min-width", [this](std::string const& x){c_main->oiMinWidth(x);}, "minimum"); | |
| 95 | +this->ap.addRequiredParameter("password", [this](std::string const& x){c_main->password(x);}, "password"); | |
| 96 | +this->ap.addRequiredParameter("password-file", [this](std::string const& x){c_main->passwordFile(x);}, "password"); | |
| 97 | +this->ap.addRequiredParameter("remove-attachment", [this](std::string const& x){c_main->removeAttachment(x);}, "attachment"); | |
| 98 | +this->ap.addRequiredParameter("rotate", [this](std::string const& x){c_main->rotate(x);}, "[+|-]angle"); | |
| 99 | +this->ap.addRequiredParameter("show-attachment", [this](std::string const& x){c_main->showAttachment(x);}, "attachment"); | |
| 100 | +this->ap.addRequiredParameter("show-object", [this](std::string const& x){c_main->showObject(x);}, "trailer"); | |
| 101 | +this->ap.addOptionalParameter("collate", [this](std::string const& x){c_main->collate(x);}); | |
| 102 | +this->ap.addOptionalParameter("split-pages", [this](std::string const& x){c_main->splitPages(x);}); | |
| 103 | +this->ap.addChoices("compress-streams", [this](std::string const& x){c_main->compressStreams(x);}, true, yn_choices); | |
| 104 | +this->ap.addChoices("decode-level", [this](std::string const& x){c_main->decodeLevel(x);}, true, decode_level_choices); | |
| 105 | +this->ap.addChoices("flatten-annotations", [this](std::string const& x){c_main->flattenAnnotations(x);}, true, flatten_choices); | |
| 106 | +this->ap.addChoices("json-key", [this](std::string const& x){c_main->jsonKey(x);}, true, json_key_choices); | |
| 107 | +this->ap.addChoices("keep-files-open", [this](std::string const& x){c_main->keepFilesOpen(x);}, true, yn_choices); | |
| 108 | +this->ap.addChoices("normalize-content", [this](std::string const& x){c_main->normalizeContent(x);}, true, yn_choices); | |
| 109 | +this->ap.addChoices("object-streams", [this](std::string const& x){c_main->objectStreams(x);}, true, object_streams_choices); | |
| 110 | +this->ap.addChoices("password-mode", [this](std::string const& x){c_main->passwordMode(x);}, true, password_mode_choices); | |
| 111 | +this->ap.addChoices("remove-unreferenced-resources", [this](std::string const& x){c_main->removeUnreferencedResources(x);}, true, remove_unref_choices); | |
| 112 | +this->ap.addChoices("stream-data", [this](std::string const& x){c_main->streamData(x);}, true, stream_data_choices); | |
| 113 | +this->ap.addChoices("json", [this](std::string const& x){c_main->json(x);}, false, json_version_choices); | |
| 114 | 114 | this->ap.registerOptionTable("pages", b(&ArgParser::argEndPages)); |
| 115 | 115 | this->ap.addPositional(p(&ArgParser::argPagesPositional)); |
| 116 | 116 | this->ap.addRequiredParameter("password", p(&ArgParser::argPagesPassword), "password"); |
| 117 | 117 | this->ap.registerOptionTable("encryption", b(&ArgParser::argEndEncryption)); |
| 118 | 118 | this->ap.addPositional(p(&ArgParser::argEncPositional)); |
| 119 | 119 | this->ap.registerOptionTable("40-bit encryption", b(&ArgParser::argEnd40BitEncryption)); |
| 120 | -this->ap.addChoices("extract", [this](char *x){c_enc->extract(x);}, true, yn_choices); | |
| 121 | -this->ap.addChoices("annotate", [this](char *x){c_enc->annotate(x);}, true, yn_choices); | |
| 122 | -this->ap.addChoices("print", [this](char *x){c_enc->print(x);}, true, yn_choices); | |
| 123 | -this->ap.addChoices("modify", [this](char *x){c_enc->modify(x);}, true, yn_choices); | |
| 120 | +this->ap.addChoices("extract", [this](std::string const& x){c_enc->extract(x);}, true, yn_choices); | |
| 121 | +this->ap.addChoices("annotate", [this](std::string const& x){c_enc->annotate(x);}, true, yn_choices); | |
| 122 | +this->ap.addChoices("print", [this](std::string const& x){c_enc->print(x);}, true, yn_choices); | |
| 123 | +this->ap.addChoices("modify", [this](std::string const& x){c_enc->modify(x);}, true, yn_choices); | |
| 124 | 124 | this->ap.registerOptionTable("128-bit encryption", b(&ArgParser::argEnd128BitEncryption)); |
| 125 | 125 | this->ap.addBare("cleartext-metadata", [this](){c_enc->cleartextMetadata();}); |
| 126 | 126 | this->ap.addBare("force-V4", [this](){c_enc->forceV4();}); |
| 127 | -this->ap.addChoices("accessibility", [this](char *x){c_enc->accessibility(x);}, true, yn_choices); | |
| 128 | -this->ap.addChoices("extract", [this](char *x){c_enc->extract(x);}, true, yn_choices); | |
| 129 | -this->ap.addChoices("print", [this](char *x){c_enc->print(x);}, true, print128_choices); | |
| 130 | -this->ap.addChoices("assemble", [this](char *x){c_enc->assemble(x);}, true, yn_choices); | |
| 131 | -this->ap.addChoices("annotate", [this](char *x){c_enc->annotate(x);}, true, yn_choices); | |
| 132 | -this->ap.addChoices("form", [this](char *x){c_enc->form(x);}, true, yn_choices); | |
| 133 | -this->ap.addChoices("modify-other", [this](char *x){c_enc->modifyOther(x);}, true, yn_choices); | |
| 134 | -this->ap.addChoices("modify", [this](char *x){c_enc->modify(x);}, true, modify128_choices); | |
| 135 | -this->ap.addChoices("use-aes", [this](char *x){c_enc->useAes(x);}, true, yn_choices); | |
| 127 | +this->ap.addChoices("accessibility", [this](std::string const& x){c_enc->accessibility(x);}, true, yn_choices); | |
| 128 | +this->ap.addChoices("extract", [this](std::string const& x){c_enc->extract(x);}, true, yn_choices); | |
| 129 | +this->ap.addChoices("print", [this](std::string const& x){c_enc->print(x);}, true, print128_choices); | |
| 130 | +this->ap.addChoices("assemble", [this](std::string const& x){c_enc->assemble(x);}, true, yn_choices); | |
| 131 | +this->ap.addChoices("annotate", [this](std::string const& x){c_enc->annotate(x);}, true, yn_choices); | |
| 132 | +this->ap.addChoices("form", [this](std::string const& x){c_enc->form(x);}, true, yn_choices); | |
| 133 | +this->ap.addChoices("modify-other", [this](std::string const& x){c_enc->modifyOther(x);}, true, yn_choices); | |
| 134 | +this->ap.addChoices("modify", [this](std::string const& x){c_enc->modify(x);}, true, modify128_choices); | |
| 135 | +this->ap.addChoices("use-aes", [this](std::string const& x){c_enc->useAes(x);}, true, yn_choices); | |
| 136 | 136 | this->ap.registerOptionTable("256-bit encryption", b(&ArgParser::argEnd256BitEncryption)); |
| 137 | 137 | this->ap.addBare("cleartext-metadata", [this](){c_enc->cleartextMetadata();}); |
| 138 | 138 | this->ap.addBare("force-R5", [this](){c_enc->forceR5();}); |
| 139 | 139 | this->ap.addBare("allow-insecure", [this](){c_enc->allowInsecure();}); |
| 140 | -this->ap.addChoices("accessibility", [this](char *x){c_enc->accessibility(x);}, true, yn_choices); | |
| 141 | -this->ap.addChoices("extract", [this](char *x){c_enc->extract(x);}, true, yn_choices); | |
| 142 | -this->ap.addChoices("print", [this](char *x){c_enc->print(x);}, true, print128_choices); | |
| 143 | -this->ap.addChoices("assemble", [this](char *x){c_enc->assemble(x);}, true, yn_choices); | |
| 144 | -this->ap.addChoices("annotate", [this](char *x){c_enc->annotate(x);}, true, yn_choices); | |
| 145 | -this->ap.addChoices("form", [this](char *x){c_enc->form(x);}, true, yn_choices); | |
| 146 | -this->ap.addChoices("modify-other", [this](char *x){c_enc->modifyOther(x);}, true, yn_choices); | |
| 147 | -this->ap.addChoices("modify", [this](char *x){c_enc->modify(x);}, true, modify128_choices); | |
| 140 | +this->ap.addChoices("accessibility", [this](std::string const& x){c_enc->accessibility(x);}, true, yn_choices); | |
| 141 | +this->ap.addChoices("extract", [this](std::string const& x){c_enc->extract(x);}, true, yn_choices); | |
| 142 | +this->ap.addChoices("print", [this](std::string const& x){c_enc->print(x);}, true, print128_choices); | |
| 143 | +this->ap.addChoices("assemble", [this](std::string const& x){c_enc->assemble(x);}, true, yn_choices); | |
| 144 | +this->ap.addChoices("annotate", [this](std::string const& x){c_enc->annotate(x);}, true, yn_choices); | |
| 145 | +this->ap.addChoices("form", [this](std::string const& x){c_enc->form(x);}, true, yn_choices); | |
| 146 | +this->ap.addChoices("modify-other", [this](std::string const& x){c_enc->modifyOther(x);}, true, yn_choices); | |
| 147 | +this->ap.addChoices("modify", [this](std::string const& x){c_enc->modify(x);}, true, modify128_choices); | |
| 148 | 148 | this->ap.registerOptionTable("underlay/overlay", b(&ArgParser::argEndUnderlayOverlay)); |
| 149 | 149 | this->ap.addPositional(p(&ArgParser::argUOPositional)); |
| 150 | -this->ap.addRequiredParameter("to", [this](char *x){c_uo->to(x);}, "page-range"); | |
| 151 | -this->ap.addRequiredParameter("from", [this](char *x){c_uo->from(x);}, "page-range"); | |
| 152 | -this->ap.addRequiredParameter("repeat", [this](char *x){c_uo->repeat(x);}, "page-range"); | |
| 153 | -this->ap.addRequiredParameter("password", [this](char *x){c_uo->password(x);}, "password"); | |
| 150 | +this->ap.addRequiredParameter("to", [this](std::string const& x){c_uo->to(x);}, "page-range"); | |
| 151 | +this->ap.addRequiredParameter("from", [this](std::string const& x){c_uo->from(x);}, "page-range"); | |
| 152 | +this->ap.addRequiredParameter("repeat", [this](std::string const& x){c_uo->repeat(x);}, "page-range"); | |
| 153 | +this->ap.addRequiredParameter("password", [this](std::string const& x){c_uo->password(x);}, "password"); | |
| 154 | 154 | this->ap.registerOptionTable("attachment", b(&ArgParser::argEndAttachment)); |
| 155 | 155 | this->ap.addPositional(p(&ArgParser::argAttPositional)); |
| 156 | 156 | this->ap.addBare("replace", [this](){c_att->replace();}); |
| 157 | -this->ap.addRequiredParameter("key", [this](char *x){c_att->key(x);}, "attachment-key"); | |
| 158 | -this->ap.addRequiredParameter("filename", [this](char *x){c_att->filename(x);}, "filename"); | |
| 159 | -this->ap.addRequiredParameter("creationdate", [this](char *x){c_att->creationdate(x);}, "creation-date"); | |
| 160 | -this->ap.addRequiredParameter("moddate", [this](char *x){c_att->moddate(x);}, "modification-date"); | |
| 161 | -this->ap.addRequiredParameter("mimetype", [this](char *x){c_att->mimetype(x);}, "mime/type"); | |
| 162 | -this->ap.addRequiredParameter("description", [this](char *x){c_att->description(x);}, "description"); | |
| 157 | +this->ap.addRequiredParameter("key", [this](std::string const& x){c_att->key(x);}, "attachment-key"); | |
| 158 | +this->ap.addRequiredParameter("filename", [this](std::string const& x){c_att->filename(x);}, "filename"); | |
| 159 | +this->ap.addRequiredParameter("creationdate", [this](std::string const& x){c_att->creationdate(x);}, "creation-date"); | |
| 160 | +this->ap.addRequiredParameter("moddate", [this](std::string const& x){c_att->moddate(x);}, "modification-date"); | |
| 161 | +this->ap.addRequiredParameter("mimetype", [this](std::string const& x){c_att->mimetype(x);}, "mime/type"); | |
| 162 | +this->ap.addRequiredParameter("description", [this](std::string const& x){c_att->description(x);}, "description"); | |
| 163 | 163 | this->ap.registerOptionTable("copy attachment", b(&ArgParser::argEndCopyAttachment)); |
| 164 | 164 | this->ap.addPositional(p(&ArgParser::argCopyAttPositional)); |
| 165 | -this->ap.addRequiredParameter("prefix", [this](char *x){c_copy_att->prefix(x);}, "prefix"); | |
| 166 | -this->ap.addRequiredParameter("password", [this](char *x){c_copy_att->password(x);}, "password"); | |
| 165 | +this->ap.addRequiredParameter("prefix", [this](std::string const& x){c_copy_att->prefix(x);}, "prefix"); | |
| 166 | +this->ap.addRequiredParameter("password", [this](std::string const& x){c_copy_att->password(x);}, "password"); | ... | ... |
libqpdf/qpdf/auto_job_json_init.hh
| ... | ... | @@ -22,7 +22,7 @@ pushKey("password"); |
| 22 | 22 | setupPassword(); |
| 23 | 23 | popHandler(); // key: password |
| 24 | 24 | pushKey("passwordFile"); |
| 25 | -addParameter([this](char const* p) { c_main->passwordFile(p); }); | |
| 25 | +addParameter([this](std::string const& p) { c_main->passwordFile(p); }); | |
| 26 | 26 | popHandler(); // key: passwordFile |
| 27 | 27 | pushKey("empty"); |
| 28 | 28 | setupEmpty(); |
| ... | ... | @@ -43,19 +43,19 @@ pushKey("newlineBeforeEndstream"); |
| 43 | 43 | addBare([this]() { c_main->newlineBeforeEndstream(); }); |
| 44 | 44 | popHandler(); // key: newlineBeforeEndstream |
| 45 | 45 | pushKey("normalizeContent"); |
| 46 | -addChoices(yn_choices, true, [this](char const* p) { c_main->normalizeContent(p); }); | |
| 46 | +addChoices(yn_choices, true, [this](std::string const& p) { c_main->normalizeContent(p); }); | |
| 47 | 47 | popHandler(); // key: normalizeContent |
| 48 | 48 | pushKey("streamData"); |
| 49 | -addChoices(stream_data_choices, true, [this](char const* p) { c_main->streamData(p); }); | |
| 49 | +addChoices(stream_data_choices, true, [this](std::string const& p) { c_main->streamData(p); }); | |
| 50 | 50 | popHandler(); // key: streamData |
| 51 | 51 | pushKey("compressStreams"); |
| 52 | -addChoices(yn_choices, true, [this](char const* p) { c_main->compressStreams(p); }); | |
| 52 | +addChoices(yn_choices, true, [this](std::string const& p) { c_main->compressStreams(p); }); | |
| 53 | 53 | popHandler(); // key: compressStreams |
| 54 | 54 | pushKey("recompressFlate"); |
| 55 | 55 | addBare([this]() { c_main->recompressFlate(); }); |
| 56 | 56 | popHandler(); // key: recompressFlate |
| 57 | 57 | pushKey("decodeLevel"); |
| 58 | -addChoices(decode_level_choices, true, [this](char const* p) { c_main->decodeLevel(p); }); | |
| 58 | +addChoices(decode_level_choices, true, [this](std::string const& p) { c_main->decodeLevel(p); }); | |
| 59 | 59 | popHandler(); // key: decodeLevel |
| 60 | 60 | pushKey("decrypt"); |
| 61 | 61 | addBare([this]() { c_main->decrypt(); }); |
| ... | ... | @@ -73,31 +73,31 @@ pushKey("noOriginalObjectIds"); |
| 73 | 73 | addBare([this]() { c_main->noOriginalObjectIds(); }); |
| 74 | 74 | popHandler(); // key: noOriginalObjectIds |
| 75 | 75 | pushKey("copyEncryption"); |
| 76 | -addParameter([this](char const* p) { c_main->copyEncryption(p); }); | |
| 76 | +addParameter([this](std::string const& p) { c_main->copyEncryption(p); }); | |
| 77 | 77 | popHandler(); // key: copyEncryption |
| 78 | 78 | pushKey("encryptionFilePassword"); |
| 79 | -addParameter([this](char const* p) { c_main->encryptionFilePassword(p); }); | |
| 79 | +addParameter([this](std::string const& p) { c_main->encryptionFilePassword(p); }); | |
| 80 | 80 | popHandler(); // key: encryptionFilePassword |
| 81 | 81 | pushKey("linearize"); |
| 82 | 82 | addBare([this]() { c_main->linearize(); }); |
| 83 | 83 | popHandler(); // key: linearize |
| 84 | 84 | pushKey("linearizePass1"); |
| 85 | -addParameter([this](char const* p) { c_main->linearizePass1(p); }); | |
| 85 | +addParameter([this](std::string const& p) { c_main->linearizePass1(p); }); | |
| 86 | 86 | popHandler(); // key: linearizePass1 |
| 87 | 87 | pushKey("objectStreams"); |
| 88 | -addChoices(object_streams_choices, true, [this](char const* p) { c_main->objectStreams(p); }); | |
| 88 | +addChoices(object_streams_choices, true, [this](std::string const& p) { c_main->objectStreams(p); }); | |
| 89 | 89 | popHandler(); // key: objectStreams |
| 90 | 90 | pushKey("minVersion"); |
| 91 | -addParameter([this](char const* p) { c_main->minVersion(p); }); | |
| 91 | +addParameter([this](std::string const& p) { c_main->minVersion(p); }); | |
| 92 | 92 | popHandler(); // key: minVersion |
| 93 | 93 | pushKey("forceVersion"); |
| 94 | -addParameter([this](char const* p) { c_main->forceVersion(p); }); | |
| 94 | +addParameter([this](std::string const& p) { c_main->forceVersion(p); }); | |
| 95 | 95 | popHandler(); // key: forceVersion |
| 96 | 96 | pushKey("progress"); |
| 97 | 97 | addBare([this]() { c_main->progress(); }); |
| 98 | 98 | popHandler(); // key: progress |
| 99 | 99 | pushKey("splitPages"); |
| 100 | -addParameter([this](char const* p) { c_main->splitPages(p); }); | |
| 100 | +addParameter([this](std::string const& p) { c_main->splitPages(p); }); | |
| 101 | 101 | popHandler(); // key: splitPages |
| 102 | 102 | pushKey("encrypt"); |
| 103 | 103 | beginDict(bindJSON(&Handlers::beginEncrypt), bindBare(&Handlers::endEncrypt)); // .encrypt |
| ... | ... | @@ -110,82 +110,82 @@ popHandler(); // key: ownerPassword |
| 110 | 110 | pushKey("40bit"); |
| 111 | 111 | beginDict(bindJSON(&Handlers::beginEncrypt40bit), bindBare(&Handlers::endEncrypt40bit)); // .encrypt.40bit |
| 112 | 112 | pushKey("annotate"); |
| 113 | -addChoices(yn_choices, true, [this](char const* p) { c_enc->annotate(p); }); | |
| 113 | +addChoices(yn_choices, true, [this](std::string const& p) { c_enc->annotate(p); }); | |
| 114 | 114 | popHandler(); // key: annotate |
| 115 | 115 | pushKey("extract"); |
| 116 | -addChoices(yn_choices, true, [this](char const* p) { c_enc->extract(p); }); | |
| 116 | +addChoices(yn_choices, true, [this](std::string const& p) { c_enc->extract(p); }); | |
| 117 | 117 | popHandler(); // key: extract |
| 118 | 118 | pushKey("modify"); |
| 119 | -addChoices(modify128_choices, true, [this](char const* p) { c_enc->modify(p); }); | |
| 119 | +addChoices(modify128_choices, true, [this](std::string const& p) { c_enc->modify(p); }); | |
| 120 | 120 | popHandler(); // key: modify |
| 121 | 121 | pushKey("print"); |
| 122 | -addChoices(print128_choices, true, [this](char const* p) { c_enc->print(p); }); | |
| 122 | +addChoices(print128_choices, true, [this](std::string const& p) { c_enc->print(p); }); | |
| 123 | 123 | popHandler(); // key: print |
| 124 | 124 | popHandler(); // key: 40bit |
| 125 | 125 | pushKey("128bit"); |
| 126 | 126 | beginDict(bindJSON(&Handlers::beginEncrypt128bit), bindBare(&Handlers::endEncrypt128bit)); // .encrypt.128bit |
| 127 | 127 | pushKey("accessibility"); |
| 128 | -addChoices(yn_choices, true, [this](char const* p) { c_enc->accessibility(p); }); | |
| 128 | +addChoices(yn_choices, true, [this](std::string const& p) { c_enc->accessibility(p); }); | |
| 129 | 129 | popHandler(); // key: accessibility |
| 130 | 130 | pushKey("annotate"); |
| 131 | -addChoices(yn_choices, true, [this](char const* p) { c_enc->annotate(p); }); | |
| 131 | +addChoices(yn_choices, true, [this](std::string const& p) { c_enc->annotate(p); }); | |
| 132 | 132 | popHandler(); // key: annotate |
| 133 | 133 | pushKey("assemble"); |
| 134 | -addChoices(yn_choices, true, [this](char const* p) { c_enc->assemble(p); }); | |
| 134 | +addChoices(yn_choices, true, [this](std::string const& p) { c_enc->assemble(p); }); | |
| 135 | 135 | popHandler(); // key: assemble |
| 136 | 136 | pushKey("cleartextMetadata"); |
| 137 | 137 | addBare([this]() { c_enc->cleartextMetadata(); }); |
| 138 | 138 | popHandler(); // key: cleartextMetadata |
| 139 | 139 | pushKey("extract"); |
| 140 | -addChoices(yn_choices, true, [this](char const* p) { c_enc->extract(p); }); | |
| 140 | +addChoices(yn_choices, true, [this](std::string const& p) { c_enc->extract(p); }); | |
| 141 | 141 | popHandler(); // key: extract |
| 142 | 142 | pushKey("form"); |
| 143 | -addChoices(yn_choices, true, [this](char const* p) { c_enc->form(p); }); | |
| 143 | +addChoices(yn_choices, true, [this](std::string const& p) { c_enc->form(p); }); | |
| 144 | 144 | popHandler(); // key: form |
| 145 | 145 | pushKey("modifyOther"); |
| 146 | -addChoices(yn_choices, true, [this](char const* p) { c_enc->modifyOther(p); }); | |
| 146 | +addChoices(yn_choices, true, [this](std::string const& p) { c_enc->modifyOther(p); }); | |
| 147 | 147 | popHandler(); // key: modifyOther |
| 148 | 148 | pushKey("modify"); |
| 149 | -addChoices(modify128_choices, true, [this](char const* p) { c_enc->modify(p); }); | |
| 149 | +addChoices(modify128_choices, true, [this](std::string const& p) { c_enc->modify(p); }); | |
| 150 | 150 | popHandler(); // key: modify |
| 151 | 151 | pushKey("print"); |
| 152 | -addChoices(print128_choices, true, [this](char const* p) { c_enc->print(p); }); | |
| 152 | +addChoices(print128_choices, true, [this](std::string const& p) { c_enc->print(p); }); | |
| 153 | 153 | popHandler(); // key: print |
| 154 | 154 | pushKey("forceV4"); |
| 155 | 155 | addBare([this]() { c_enc->forceV4(); }); |
| 156 | 156 | popHandler(); // key: forceV4 |
| 157 | 157 | pushKey("useAes"); |
| 158 | -addChoices(yn_choices, true, [this](char const* p) { c_enc->useAes(p); }); | |
| 158 | +addChoices(yn_choices, true, [this](std::string const& p) { c_enc->useAes(p); }); | |
| 159 | 159 | popHandler(); // key: useAes |
| 160 | 160 | popHandler(); // key: 128bit |
| 161 | 161 | pushKey("256bit"); |
| 162 | 162 | beginDict(bindJSON(&Handlers::beginEncrypt256bit), bindBare(&Handlers::endEncrypt256bit)); // .encrypt.256bit |
| 163 | 163 | pushKey("accessibility"); |
| 164 | -addChoices(yn_choices, true, [this](char const* p) { c_enc->accessibility(p); }); | |
| 164 | +addChoices(yn_choices, true, [this](std::string const& p) { c_enc->accessibility(p); }); | |
| 165 | 165 | popHandler(); // key: accessibility |
| 166 | 166 | pushKey("annotate"); |
| 167 | -addChoices(yn_choices, true, [this](char const* p) { c_enc->annotate(p); }); | |
| 167 | +addChoices(yn_choices, true, [this](std::string const& p) { c_enc->annotate(p); }); | |
| 168 | 168 | popHandler(); // key: annotate |
| 169 | 169 | pushKey("assemble"); |
| 170 | -addChoices(yn_choices, true, [this](char const* p) { c_enc->assemble(p); }); | |
| 170 | +addChoices(yn_choices, true, [this](std::string const& p) { c_enc->assemble(p); }); | |
| 171 | 171 | popHandler(); // key: assemble |
| 172 | 172 | pushKey("cleartextMetadata"); |
| 173 | 173 | addBare([this]() { c_enc->cleartextMetadata(); }); |
| 174 | 174 | popHandler(); // key: cleartextMetadata |
| 175 | 175 | pushKey("extract"); |
| 176 | -addChoices(yn_choices, true, [this](char const* p) { c_enc->extract(p); }); | |
| 176 | +addChoices(yn_choices, true, [this](std::string const& p) { c_enc->extract(p); }); | |
| 177 | 177 | popHandler(); // key: extract |
| 178 | 178 | pushKey("form"); |
| 179 | -addChoices(yn_choices, true, [this](char const* p) { c_enc->form(p); }); | |
| 179 | +addChoices(yn_choices, true, [this](std::string const& p) { c_enc->form(p); }); | |
| 180 | 180 | popHandler(); // key: form |
| 181 | 181 | pushKey("modifyOther"); |
| 182 | -addChoices(yn_choices, true, [this](char const* p) { c_enc->modifyOther(p); }); | |
| 182 | +addChoices(yn_choices, true, [this](std::string const& p) { c_enc->modifyOther(p); }); | |
| 183 | 183 | popHandler(); // key: modifyOther |
| 184 | 184 | pushKey("modify"); |
| 185 | -addChoices(modify128_choices, true, [this](char const* p) { c_enc->modify(p); }); | |
| 185 | +addChoices(modify128_choices, true, [this](std::string const& p) { c_enc->modify(p); }); | |
| 186 | 186 | popHandler(); // key: modify |
| 187 | 187 | pushKey("print"); |
| 188 | -addChoices(print128_choices, true, [this](char const* p) { c_enc->print(p); }); | |
| 188 | +addChoices(print128_choices, true, [this](std::string const& p) { c_enc->print(p); }); | |
| 189 | 189 | popHandler(); // key: print |
| 190 | 190 | pushKey("allowInsecure"); |
| 191 | 191 | addBare([this]() { c_enc->allowInsecure(); }); |
| ... | ... | @@ -220,7 +220,7 @@ pushKey("showNpages"); |
| 220 | 220 | addBare([this]() { c_main->showNpages(); }); |
| 221 | 221 | popHandler(); // key: showNpages |
| 222 | 222 | pushKey("showObject"); |
| 223 | -addParameter([this](char const* p) { c_main->showObject(p); }); | |
| 223 | +addParameter([this](std::string const& p) { c_main->showObject(p); }); | |
| 224 | 224 | popHandler(); // key: showObject |
| 225 | 225 | pushKey("showPages"); |
| 226 | 226 | addBare([this]() { c_main->showPages(); }); |
| ... | ... | @@ -235,29 +235,29 @@ pushKey("listAttachments"); |
| 235 | 235 | addBare([this]() { c_main->listAttachments(); }); |
| 236 | 236 | popHandler(); // key: listAttachments |
| 237 | 237 | pushKey("showAttachment"); |
| 238 | -addParameter([this](char const* p) { c_main->showAttachment(p); }); | |
| 238 | +addParameter([this](std::string const& p) { c_main->showAttachment(p); }); | |
| 239 | 239 | popHandler(); // key: showAttachment |
| 240 | 240 | pushKey("json"); |
| 241 | -addChoices(json_version_choices, false, [this](char const* p) { c_main->json(p); }); | |
| 241 | +addChoices(json_version_choices, false, [this](std::string const& p) { c_main->json(p); }); | |
| 242 | 242 | popHandler(); // key: json |
| 243 | 243 | pushKey("jsonKey"); |
| 244 | 244 | beginArray(bindJSON(&Handlers::beginJsonKeyArray), bindBare(&Handlers::endJsonKeyArray)); // .jsonKey[] |
| 245 | -addChoices(json_key_choices, true, [this](char const* p) { c_main->jsonKey(p); }); | |
| 245 | +addChoices(json_key_choices, true, [this](std::string const& p) { c_main->jsonKey(p); }); | |
| 246 | 246 | popHandler(); // array: .jsonKey[] |
| 247 | 247 | popHandler(); // key: jsonKey |
| 248 | 248 | pushKey("jsonObject"); |
| 249 | 249 | beginArray(bindJSON(&Handlers::beginJsonObjectArray), bindBare(&Handlers::endJsonObjectArray)); // .jsonObject[] |
| 250 | -addParameter([this](char const* p) { c_main->jsonObject(p); }); | |
| 250 | +addParameter([this](std::string const& p) { c_main->jsonObject(p); }); | |
| 251 | 251 | popHandler(); // array: .jsonObject[] |
| 252 | 252 | popHandler(); // key: jsonObject |
| 253 | 253 | pushKey("allowWeakCrypto"); |
| 254 | 254 | addBare([this]() { c_main->allowWeakCrypto(); }); |
| 255 | 255 | popHandler(); // key: allowWeakCrypto |
| 256 | 256 | pushKey("keepFilesOpen"); |
| 257 | -addChoices(yn_choices, true, [this](char const* p) { c_main->keepFilesOpen(p); }); | |
| 257 | +addChoices(yn_choices, true, [this](std::string const& p) { c_main->keepFilesOpen(p); }); | |
| 258 | 258 | popHandler(); // key: keepFilesOpen |
| 259 | 259 | pushKey("keepFilesOpenThreshold"); |
| 260 | -addParameter([this](char const* p) { c_main->keepFilesOpenThreshold(p); }); | |
| 260 | +addParameter([this](std::string const& p) { c_main->keepFilesOpenThreshold(p); }); | |
| 261 | 261 | popHandler(); // key: keepFilesOpenThreshold |
| 262 | 262 | pushKey("noWarn"); |
| 263 | 263 | addBare([this]() { c_main->noWarn(); }); |
| ... | ... | @@ -272,7 +272,7 @@ pushKey("passwordIsHexKey"); |
| 272 | 272 | addBare([this]() { c_main->passwordIsHexKey(); }); |
| 273 | 273 | popHandler(); // key: passwordIsHexKey |
| 274 | 274 | pushKey("passwordMode"); |
| 275 | -addChoices(password_mode_choices, true, [this](char const* p) { c_main->passwordMode(p); }); | |
| 275 | +addChoices(password_mode_choices, true, [this](std::string const& p) { c_main->passwordMode(p); }); | |
| 276 | 276 | popHandler(); // key: passwordMode |
| 277 | 277 | pushKey("suppressPasswordRecovery"); |
| 278 | 278 | addBare([this]() { c_main->suppressPasswordRecovery(); }); |
| ... | ... | @@ -284,16 +284,16 @@ pushKey("coalesceContents"); |
| 284 | 284 | addBare([this]() { c_main->coalesceContents(); }); |
| 285 | 285 | popHandler(); // key: coalesceContents |
| 286 | 286 | pushKey("compressionLevel"); |
| 287 | -addParameter([this](char const* p) { c_main->compressionLevel(p); }); | |
| 287 | +addParameter([this](std::string const& p) { c_main->compressionLevel(p); }); | |
| 288 | 288 | popHandler(); // key: compressionLevel |
| 289 | 289 | pushKey("externalizeInlineImages"); |
| 290 | 290 | addBare([this]() { c_main->externalizeInlineImages(); }); |
| 291 | 291 | popHandler(); // key: externalizeInlineImages |
| 292 | 292 | pushKey("iiMinBytes"); |
| 293 | -addParameter([this](char const* p) { c_main->iiMinBytes(p); }); | |
| 293 | +addParameter([this](std::string const& p) { c_main->iiMinBytes(p); }); | |
| 294 | 294 | popHandler(); // key: iiMinBytes |
| 295 | 295 | pushKey("removeUnreferencedResources"); |
| 296 | -addChoices(remove_unref_choices, true, [this](char const* p) { c_main->removeUnreferencedResources(p); }); | |
| 296 | +addChoices(remove_unref_choices, true, [this](std::string const& p) { c_main->removeUnreferencedResources(p); }); | |
| 297 | 297 | popHandler(); // key: removeUnreferencedResources |
| 298 | 298 | pushKey("addAttachment"); |
| 299 | 299 | beginArray(bindJSON(&Handlers::beginAddAttachmentArray), bindBare(&Handlers::endAddAttachmentArray)); // .addAttachment[] |
| ... | ... | @@ -302,22 +302,22 @@ pushKey("file"); |
| 302 | 302 | setupAddAttachmentFile(); |
| 303 | 303 | popHandler(); // key: file |
| 304 | 304 | pushKey("creationdate"); |
| 305 | -addParameter([this](char const* p) { c_att->creationdate(p); }); | |
| 305 | +addParameter([this](std::string const& p) { c_att->creationdate(p); }); | |
| 306 | 306 | popHandler(); // key: creationdate |
| 307 | 307 | pushKey("description"); |
| 308 | -addParameter([this](char const* p) { c_att->description(p); }); | |
| 308 | +addParameter([this](std::string const& p) { c_att->description(p); }); | |
| 309 | 309 | popHandler(); // key: description |
| 310 | 310 | pushKey("filename"); |
| 311 | -addParameter([this](char const* p) { c_att->filename(p); }); | |
| 311 | +addParameter([this](std::string const& p) { c_att->filename(p); }); | |
| 312 | 312 | popHandler(); // key: filename |
| 313 | 313 | pushKey("key"); |
| 314 | -addParameter([this](char const* p) { c_att->key(p); }); | |
| 314 | +addParameter([this](std::string const& p) { c_att->key(p); }); | |
| 315 | 315 | popHandler(); // key: key |
| 316 | 316 | pushKey("mimetype"); |
| 317 | -addParameter([this](char const* p) { c_att->mimetype(p); }); | |
| 317 | +addParameter([this](std::string const& p) { c_att->mimetype(p); }); | |
| 318 | 318 | popHandler(); // key: mimetype |
| 319 | 319 | pushKey("moddate"); |
| 320 | -addParameter([this](char const* p) { c_att->moddate(p); }); | |
| 320 | +addParameter([this](std::string const& p) { c_att->moddate(p); }); | |
| 321 | 321 | popHandler(); // key: moddate |
| 322 | 322 | pushKey("replace"); |
| 323 | 323 | addBare([this]() { c_att->replace(); }); |
| ... | ... | @@ -325,7 +325,7 @@ popHandler(); // key: replace |
| 325 | 325 | popHandler(); // array: .addAttachment[] |
| 326 | 326 | popHandler(); // key: addAttachment |
| 327 | 327 | pushKey("removeAttachment"); |
| 328 | -addParameter([this](char const* p) { c_main->removeAttachment(p); }); | |
| 328 | +addParameter([this](std::string const& p) { c_main->removeAttachment(p); }); | |
| 329 | 329 | popHandler(); // key: removeAttachment |
| 330 | 330 | pushKey("copyAttachmentsFrom"); |
| 331 | 331 | beginArray(bindJSON(&Handlers::beginCopyAttachmentsFromArray), bindBare(&Handlers::endCopyAttachmentsFromArray)); // .copyAttachmentsFrom[] |
| ... | ... | @@ -337,15 +337,15 @@ pushKey("password"); |
| 337 | 337 | setupCopyAttachmentsFromPassword(); |
| 338 | 338 | popHandler(); // key: password |
| 339 | 339 | pushKey("prefix"); |
| 340 | -addParameter([this](char const* p) { c_copy_att->prefix(p); }); | |
| 340 | +addParameter([this](std::string const& p) { c_copy_att->prefix(p); }); | |
| 341 | 341 | popHandler(); // key: prefix |
| 342 | 342 | popHandler(); // array: .copyAttachmentsFrom[] |
| 343 | 343 | popHandler(); // key: copyAttachmentsFrom |
| 344 | 344 | pushKey("collate"); |
| 345 | -addParameter([this](char const* p) { c_main->collate(p); }); | |
| 345 | +addParameter([this](std::string const& p) { c_main->collate(p); }); | |
| 346 | 346 | popHandler(); // key: collate |
| 347 | 347 | pushKey("flattenAnnotations"); |
| 348 | -addChoices(flatten_choices, true, [this](char const* p) { c_main->flattenAnnotations(p); }); | |
| 348 | +addChoices(flatten_choices, true, [this](std::string const& p) { c_main->flattenAnnotations(p); }); | |
| 349 | 349 | popHandler(); // key: flattenAnnotations |
| 350 | 350 | pushKey("flattenRotation"); |
| 351 | 351 | addBare([this]() { c_main->flattenRotation(); }); |
| ... | ... | @@ -357,13 +357,13 @@ pushKey("keepInlineImages"); |
| 357 | 357 | addBare([this]() { c_main->keepInlineImages(); }); |
| 358 | 358 | popHandler(); // key: keepInlineImages |
| 359 | 359 | pushKey("oiMinArea"); |
| 360 | -addParameter([this](char const* p) { c_main->oiMinArea(p); }); | |
| 360 | +addParameter([this](std::string const& p) { c_main->oiMinArea(p); }); | |
| 361 | 361 | popHandler(); // key: oiMinArea |
| 362 | 362 | pushKey("oiMinHeight"); |
| 363 | -addParameter([this](char const* p) { c_main->oiMinHeight(p); }); | |
| 363 | +addParameter([this](std::string const& p) { c_main->oiMinHeight(p); }); | |
| 364 | 364 | popHandler(); // key: oiMinHeight |
| 365 | 365 | pushKey("oiMinWidth"); |
| 366 | -addParameter([this](char const* p) { c_main->oiMinWidth(p); }); | |
| 366 | +addParameter([this](std::string const& p) { c_main->oiMinWidth(p); }); | |
| 367 | 367 | popHandler(); // key: oiMinWidth |
| 368 | 368 | pushKey("optimizeImages"); |
| 369 | 369 | addBare([this]() { c_main->optimizeImages(); }); |
| ... | ... | @@ -386,7 +386,7 @@ pushKey("removePageLabels"); |
| 386 | 386 | addBare([this]() { c_main->removePageLabels(); }); |
| 387 | 387 | popHandler(); // key: removePageLabels |
| 388 | 388 | pushKey("rotate"); |
| 389 | -addParameter([this](char const* p) { c_main->rotate(p); }); | |
| 389 | +addParameter([this](std::string const& p) { c_main->rotate(p); }); | |
| 390 | 390 | popHandler(); // key: rotate |
| 391 | 391 | pushKey("overlay"); |
| 392 | 392 | beginDict(bindJSON(&Handlers::beginOverlay), bindBare(&Handlers::endOverlay)); // .overlay |
| ... | ... | @@ -397,13 +397,13 @@ pushKey("password"); |
| 397 | 397 | setupOverlayPassword(); |
| 398 | 398 | popHandler(); // key: password |
| 399 | 399 | pushKey("from"); |
| 400 | -addParameter([this](char const* p) { c_uo->from(p); }); | |
| 400 | +addParameter([this](std::string const& p) { c_uo->from(p); }); | |
| 401 | 401 | popHandler(); // key: from |
| 402 | 402 | pushKey("repeat"); |
| 403 | -addParameter([this](char const* p) { c_uo->repeat(p); }); | |
| 403 | +addParameter([this](std::string const& p) { c_uo->repeat(p); }); | |
| 404 | 404 | popHandler(); // key: repeat |
| 405 | 405 | pushKey("to"); |
| 406 | -addParameter([this](char const* p) { c_uo->to(p); }); | |
| 406 | +addParameter([this](std::string const& p) { c_uo->to(p); }); | |
| 407 | 407 | popHandler(); // key: to |
| 408 | 408 | popHandler(); // key: overlay |
| 409 | 409 | pushKey("underlay"); |
| ... | ... | @@ -415,20 +415,20 @@ pushKey("password"); |
| 415 | 415 | setupUnderlayPassword(); |
| 416 | 416 | popHandler(); // key: password |
| 417 | 417 | pushKey("from"); |
| 418 | -addParameter([this](char const* p) { c_uo->from(p); }); | |
| 418 | +addParameter([this](std::string const& p) { c_uo->from(p); }); | |
| 419 | 419 | popHandler(); // key: from |
| 420 | 420 | pushKey("repeat"); |
| 421 | -addParameter([this](char const* p) { c_uo->repeat(p); }); | |
| 421 | +addParameter([this](std::string const& p) { c_uo->repeat(p); }); | |
| 422 | 422 | popHandler(); // key: repeat |
| 423 | 423 | pushKey("to"); |
| 424 | -addParameter([this](char const* p) { c_uo->to(p); }); | |
| 424 | +addParameter([this](std::string const& p) { c_uo->to(p); }); | |
| 425 | 425 | popHandler(); // key: to |
| 426 | 426 | popHandler(); // key: underlay |
| 427 | 427 | pushKey("warningExit0"); |
| 428 | 428 | addBare([this]() { c_main->warningExit0(); }); |
| 429 | 429 | popHandler(); // key: warningExit0 |
| 430 | 430 | pushKey("jobJsonFile"); |
| 431 | -addParameter([this](char const* p) { c_main->jobJsonFile(p); }); | |
| 431 | +addParameter([this](std::string const& p) { c_main->jobJsonFile(p); }); | |
| 432 | 432 | popHandler(); // key: jobJsonFile |
| 433 | 433 | pushKey("preserveUnreferencedResources"); |
| 434 | 434 | addBare([this]() { c_main->preserveUnreferencedResources(); }); | ... | ... |
libqpdf/qpdfjob-c.cc
| ... | ... | @@ -7,9 +7,10 @@ |
| 7 | 7 | #include <cstdio> |
| 8 | 8 | #include <cstring> |
| 9 | 9 | |
| 10 | -int qpdfjob_run_from_argv(int argc, char* argv[]) | |
| 10 | +int qpdfjob_run_from_argv(int argc, char const* const argv[]) | |
| 11 | 11 | { |
| 12 | - auto whoami = QUtil::getWhoami(argv[0]); | |
| 12 | + auto whoami_p = QUtil::make_shared_cstr(argv[0]); | |
| 13 | + auto whoami = QUtil::getWhoami(whoami_p.get()); | |
| 13 | 14 | QUtil::setLineBuf(stdout); |
| 14 | 15 | |
| 15 | 16 | QPDFJob j; |
| ... | ... | @@ -27,7 +28,7 @@ int qpdfjob_run_from_argv(int argc, char* argv[]) |
| 27 | 28 | } |
| 28 | 29 | |
| 29 | 30 | #ifndef QPDF_NO_WCHAR_T |
| 30 | -int qpdfjob_run_from_wide_argv(int argc, wchar_t* argv[]) | |
| 31 | +int qpdfjob_run_from_wide_argv(int argc, wchar_t const* const argv[]) | |
| 31 | 32 | { |
| 32 | 33 | return QUtil::call_main_from_wmain(argc, argv, qpdfjob_run_from_argv); |
| 33 | 34 | } | ... | ... |
libtests/arg_parser.cc
| ... | ... | @@ -15,12 +15,12 @@ class ArgParser |
| 15 | 15 | |
| 16 | 16 | private: |
| 17 | 17 | void handlePotato(); |
| 18 | - void handleSalad(char* p); | |
| 19 | - void handleMoo(char* p); | |
| 20 | - void handleOink(char* p); | |
| 21 | - void handleQuack(char* p); | |
| 18 | + void handleSalad(std::string const& p); | |
| 19 | + void handleMoo(std::string const& p); | |
| 20 | + void handleOink(std::string const& p); | |
| 21 | + void handleQuack(std::string const& p); | |
| 22 | 22 | void startQuack(); |
| 23 | - void getQuack(char* p); | |
| 23 | + void getQuack(std::string const& p); | |
| 24 | 24 | void endQuack(); |
| 25 | 25 | void finalChecks(); |
| 26 | 26 | |
| ... | ... | @@ -44,7 +44,7 @@ ArgParser::initOptions() |
| 44 | 44 | auto b = [this](void (ArgParser::*f)()) { |
| 45 | 45 | return QPDFArgParser::bindBare(f, this); |
| 46 | 46 | }; |
| 47 | - auto p = [this](void (ArgParser::*f)(char *)) { | |
| 47 | + auto p = [this](void (ArgParser::*f)(std::string const&)) { | |
| 48 | 48 | return QPDFArgParser::bindParam(f, this); |
| 49 | 49 | }; |
| 50 | 50 | |
| ... | ... | @@ -98,19 +98,19 @@ ArgParser::handlePotato() |
| 98 | 98 | } |
| 99 | 99 | |
| 100 | 100 | void |
| 101 | -ArgParser::handleSalad(char* p) | |
| 101 | +ArgParser::handleSalad(std::string const& p) | |
| 102 | 102 | { |
| 103 | 103 | output(std::string("got salad=") + p); |
| 104 | 104 | } |
| 105 | 105 | |
| 106 | 106 | void |
| 107 | -ArgParser::handleMoo(char* p) | |
| 107 | +ArgParser::handleMoo(std::string const& p) | |
| 108 | 108 | { |
| 109 | - output(std::string("got moo=") + (p ? p : "(none)")); | |
| 109 | + output(std::string("got moo=") + (p.empty() ? "(none)" : p)); | |
| 110 | 110 | } |
| 111 | 111 | |
| 112 | 112 | void |
| 113 | -ArgParser::handleOink(char* p) | |
| 113 | +ArgParser::handleOink(std::string const& p) | |
| 114 | 114 | { |
| 115 | 115 | output(std::string("got oink=") + p); |
| 116 | 116 | } |
| ... | ... | @@ -137,7 +137,7 @@ ArgParser::startQuack() |
| 137 | 137 | } |
| 138 | 138 | |
| 139 | 139 | void |
| 140 | -ArgParser::getQuack(char* p) | |
| 140 | +ArgParser::getQuack(std::string const& p) | |
| 141 | 141 | { |
| 142 | 142 | ++this->quacks; |
| 143 | 143 | if (this->ap.isCompleting() && (this->ap.argsLeft() == 0)) |
| ... | ... | @@ -210,7 +210,7 @@ ArgParser::test_exceptions() |
| 210 | 210 | }); |
| 211 | 211 | err("invalid choice handler to unknown", [this]() { |
| 212 | 212 | ap.addInvalidChoiceHandler( |
| 213 | - "elephant", [](char*){}); | |
| 213 | + "elephant", [](std::string const&){}); | |
| 214 | 214 | }); |
| 215 | 215 | } |
| 216 | 216 | ... | ... |
libtests/main_from_wmain.cc
| ... | ... | @@ -4,17 +4,37 @@ |
| 4 | 4 | #ifndef QPDF_NO_WCHAR_T |
| 5 | 5 | void wmain_test() |
| 6 | 6 | { |
| 7 | + // writable args and function args | |
| 7 | 8 | auto realmain = [](int argc, char* argv[]) { |
| 8 | - for (int i = 0; i < argc; ++i) { | |
| 9 | - std::cout << argv[i] << std::endl; | |
| 10 | - } return 0; | |
| 11 | - }; | |
| 9 | + for (int i = 0; i < argc; ++i) { | |
| 10 | + std::cout << argv[i] << std::endl; | |
| 11 | + } return 0; | |
| 12 | + }; | |
| 12 | 13 | wchar_t* argv[3]; |
| 14 | + // This works because call_main_from_wmain doesn't actually write | |
| 15 | + // to the arguments and neither does our function. Otherwise, this | |
| 16 | + // cast would be unsafe. | |
| 13 | 17 | argv[0] = const_cast<wchar_t*>(L"ascii"); |
| 14 | 18 | argv[1] = const_cast<wchar_t*>(L"10 \xf7 2 = 5"); |
| 15 | 19 | argv[2] = const_cast<wchar_t*>(L"qwww\xf7\x03c0"); |
| 16 | 20 | QUtil::call_main_from_wmain(3, argv, realmain); |
| 17 | 21 | } |
| 22 | + | |
| 23 | +void cwmain_test() | |
| 24 | +{ | |
| 25 | + // const args and function args | |
| 26 | + auto realmain = [](int argc, char const* const argv[]) { | |
| 27 | + for (int i = 0; i < argc; ++i) { | |
| 28 | + std::cout << "const " << argv[i] << std::endl; | |
| 29 | + } return 0; | |
| 30 | + }; | |
| 31 | + wchar_t const* argv[3] = { | |
| 32 | + L"ascii", | |
| 33 | + L"10 \xf7 2 = 5", | |
| 34 | + L"qwww\xf7\x03c0", | |
| 35 | + }; | |
| 36 | + QUtil::call_main_from_wmain(3, argv, realmain); | |
| 37 | +} | |
| 18 | 38 | #endif // QPDF_NO_WCHAR_T |
| 19 | 39 | |
| 20 | 40 | int main(int argc, char* argv[]) |
| ... | ... | @@ -23,6 +43,7 @@ int main(int argc, char* argv[]) |
| 23 | 43 | try |
| 24 | 44 | { |
| 25 | 45 | wmain_test(); |
| 46 | + cwmain_test(); | |
| 26 | 47 | } |
| 27 | 48 | catch (std::exception& e) |
| 28 | 49 | { | ... | ... |
libtests/qtest/qutil/wmain.out
qpdf/qpdfjob-ctest.c
| ... | ... | @@ -7,11 +7,11 @@ |
| 7 | 7 | #ifndef QPDF_NO_WCHAR_T |
| 8 | 8 | static void wide_test() |
| 9 | 9 | { |
| 10 | - wchar_t* argv[5]; | |
| 11 | - argv[0] = (wchar_t*)(L"qpdfjob"); | |
| 12 | - argv[1] = (wchar_t*)(L"minimal.pdf"); | |
| 13 | - argv[2] = (wchar_t*)(L"a.pdf"); | |
| 14 | - argv[3] = (wchar_t*)(L"--static-id"); | |
| 10 | + wchar_t const* argv[5]; | |
| 11 | + argv[0] = L"qpdfjob"; | |
| 12 | + argv[1] = L"minimal.pdf"; | |
| 13 | + argv[2] = L"a.pdf"; | |
| 14 | + argv[3] = L"--static-id"; | |
| 15 | 15 | argv[4] = NULL; |
| 16 | 16 | assert(qpdfjob_run_from_wide_argv(4, argv) == 0); |
| 17 | 17 | printf("wide test passed\n"); |
| ... | ... | @@ -22,11 +22,11 @@ static void run_tests() |
| 22 | 22 | { |
| 23 | 23 | /* Be sure to use a different output file for each test. */ |
| 24 | 24 | |
| 25 | - char* argv[5]; | |
| 26 | - argv[0] = (char*)("qpdfjob"); | |
| 27 | - argv[1] = (char*)("minimal.pdf"); | |
| 28 | - argv[2] = (char*)("a.pdf"); | |
| 29 | - argv[3] = (char*)("--deterministic-id"); | |
| 25 | + char const* argv[5]; | |
| 26 | + argv[0] = "qpdfjob"; | |
| 27 | + argv[1] = "minimal.pdf"; | |
| 28 | + argv[2] = "a.pdf"; | |
| 29 | + argv[3] = "--deterministic-id"; | |
| 30 | 30 | argv[4] = NULL; |
| 31 | 31 | assert(qpdfjob_run_from_argv(4, argv) == 0); |
| 32 | 32 | printf("argv test passed\n"); | ... | ... |