Commit 4577df4b5ddf363f5f877fe3b4b4c9ae710c9d55
1 parent
f1d805ba
QPDFJob increment: generate option table initialization
Showing
5 changed files
with
233 additions
and
215 deletions
generate_auto_job
| ... | ... | @@ -162,11 +162,66 @@ class Main: |
| 162 | 162 | print(f'void {identifier}();', file=f) |
| 163 | 163 | |
| 164 | 164 | def generate_init(self, data, f): |
| 165 | + print('auto b = [this](void (ArgParser::*f)()) {', file=f) | |
| 166 | + print(' return QPDFArgParser::bindBare(f, this);', file=f) | |
| 167 | + print('};', file=f) | |
| 168 | + print('auto p = [this](void (ArgParser::*f)(char *)) {', file=f) | |
| 169 | + print(' return QPDFArgParser::bindParam(f, this);', file=f) | |
| 170 | + print('};', file=f) | |
| 171 | + print('', file=f) | |
| 165 | 172 | for k, v in data['choices'].items(): |
| 166 | 173 | print(f'char const* {k}_choices[] = {{', file=f, end='') |
| 167 | 174 | for i in v: |
| 168 | 175 | print(f'"{i}", ', file=f, end='') |
| 169 | 176 | print('0};', file=f) |
| 177 | + print('', file=f) | |
| 178 | + for o in data['options']: | |
| 179 | + table = o['table'] | |
| 180 | + if table == 'main': | |
| 181 | + print('this->ap.selectMainOptionTable();', file=f) | |
| 182 | + elif table == 'help': | |
| 183 | + print('this->ap.selectHelpOptionTable();', file=f) | |
| 184 | + else: | |
| 185 | + identifier = self.to_identifier(table, 'argEnd', False) | |
| 186 | + print(f'this->ap.registerOptionTable("{table}",' | |
| 187 | + f' b(&ArgParser::{identifier}));', file=f) | |
| 188 | + prefix = 'arg' + o.get('prefix', '') | |
| 189 | + if o.get('positional', False): | |
| 190 | + print('this->ap.addPositional(' | |
| 191 | + f'p(&ArgParser::{prefix}Positional));', file=f) | |
| 192 | + for i in o.get('bare', []): | |
| 193 | + identifier = self.to_identifier(i, prefix, False) | |
| 194 | + print(f'this->ap.addBare("{i}", ' | |
| 195 | + f'b(&ArgParser::{identifier}));', file=f) | |
| 196 | + for i in o.get('optional_parameter', []): | |
| 197 | + identifier = self.to_identifier(i, prefix, False) | |
| 198 | + print(f'this->ap.addOptionalParameter("{i}", ' | |
| 199 | + f'p(&ArgParser::{identifier}));', file=f) | |
| 200 | + for k, v in o.get('required_parameter', {}).items(): | |
| 201 | + identifier = self.to_identifier(k, prefix, False) | |
| 202 | + print(f'this->ap.addRequiredParameter("{k}", ' | |
| 203 | + f'p(&ArgParser::{identifier})' | |
| 204 | + f', "{v}");', file=f) | |
| 205 | + for k, v in o.get('required_choices', {}).items(): | |
| 206 | + identifier = self.to_identifier(k, prefix, False) | |
| 207 | + print(f'this->ap.addRequiredChoices("{k}", ' | |
| 208 | + f'p(&ArgParser::{identifier})' | |
| 209 | + f', {v}_choices);', file=f) | |
| 210 | + for o in data['options']: | |
| 211 | + table = o['table'] | |
| 212 | + if 'from_table' not in o: | |
| 213 | + continue | |
| 214 | + if table == 'main': | |
| 215 | + print('this->ap.selectMainOptionTable();', file=f) | |
| 216 | + elif table == 'help': | |
| 217 | + print('this->ap.selectHelpOptionTable();', file=f) | |
| 218 | + else: | |
| 219 | + print(f'this->ap.selectOptionTable("{table}");', file=f) | |
| 220 | + ft = o['from_table'] | |
| 221 | + other_table = ft['table'] | |
| 222 | + for j in ft['options']: | |
| 223 | + print('this->ap.copyFromOtherTable' | |
| 224 | + f'("{j}", "{other_table}");', file=f) | |
| 170 | 225 | |
| 171 | 226 | |
| 172 | 227 | if __name__ == '__main__': | ... | ... |
job.sums
| 1 | 1 | # Generated by generate_auto_job |
| 2 | -generate_auto_job 52a5e6bc70375e1183fedd5865ae4eae2a10be8d80edede1c48f9946be5d2538 | |
| 3 | -job.yml b4d230c46ca2b2e75b3b974e2d9ad21fb007eb5007d05cf249ae1e2cde81040c | |
| 2 | +generate_auto_job 575569edf2ab0036ed7f810bf506968c73c9209a64ec0ae2ed959f0426291447 | |
| 3 | +job.yml 5de5f1cd3f998274ed4aafa234e61b726a8f96157148ad463970439a96e897bd | |
| 4 | 4 | libqpdf/qpdf/auto_job_decl.hh fca37543c1a2b7f675374e23b1ab34b30a7f5f2d843c53d4bc7e9a12bf4c3615 |
| 5 | -libqpdf/qpdf/auto_job_init.hh 0640167b8d550030c086851408b842e2a93c86577253d78f1b7d41d4ca695bd9 | |
| 5 | +libqpdf/qpdf/auto_job_init.hh 7d7dfe96d4da765b8defb646058027584ea8924c604c558402aa7f2d2e61a005 | ... | ... |
job.yml
| ... | ... | @@ -165,12 +165,12 @@ options: |
| 165 | 165 | required_choices: |
| 166 | 166 | accessibility: yn |
| 167 | 167 | extract: yn |
| 168 | - print: print128_choices | |
| 168 | + print: print128 | |
| 169 | 169 | assemble: yn |
| 170 | 170 | annotate: yn |
| 171 | 171 | form: yn |
| 172 | 172 | modify-other: yn |
| 173 | - modify: modify128_choices | |
| 173 | + modify: modify128 | |
| 174 | 174 | use-aes: yn |
| 175 | 175 | - table: 256-bit encryption |
| 176 | 176 | prefix: Enc256 | ... | ... |
libqpdf/QPDFJob_argv.cc
| ... | ... | @@ -26,7 +26,7 @@ namespace |
| 26 | 26 | # include <qpdf/auto_job_decl.hh> |
| 27 | 27 | |
| 28 | 28 | void usage(std::string const& message); |
| 29 | - void initOptionTable(); | |
| 29 | + void initOptionTables(); | |
| 30 | 30 | void doFinalChecks(); |
| 31 | 31 | void parseUnderOverlayOptions(QPDFJob::UnderOverlay*); |
| 32 | 32 | void parseRotationParameter(std::string const&); |
| ... | ... | @@ -45,221 +45,16 @@ ArgParser::ArgParser(QPDFArgParser& ap, QPDFJob& o) : |
| 45 | 45 | o(o), |
| 46 | 46 | pages_password(nullptr) |
| 47 | 47 | { |
| 48 | - initOptionTable(); | |
| 48 | + initOptionTables(); | |
| 49 | 49 | } |
| 50 | 50 | |
| 51 | 51 | void |
| 52 | -ArgParser::initOptionTable() | |
| 52 | +ArgParser::initOptionTables() | |
| 53 | 53 | { |
| 54 | - auto b = [this](void (ArgParser::*f)()) { | |
| 55 | - return QPDFArgParser::bindBare(f, this); | |
| 56 | - }; | |
| 57 | - auto p = [this](void (ArgParser::*f)(char *)) { | |
| 58 | - return QPDFArgParser::bindParam(f, this); | |
| 59 | - }; | |
| 60 | - | |
| 61 | - this->ap.addFinalCheck(b(&ArgParser::doFinalChecks)); | |
| 62 | 54 | |
| 63 | 55 | # include <qpdf/auto_job_init.hh> |
| 64 | - | |
| 65 | - this->ap.selectHelpOptionTable(); | |
| 66 | - this->ap.addBare("help", b(&ArgParser::argHelp)); | |
| 67 | - this->ap.addBare("version", b(&ArgParser::argVersion)); | |
| 68 | - this->ap.addBare("copyright", b(&ArgParser::argCopyright)); | |
| 69 | - this->ap.addBare("json-help", b(&ArgParser::argJsonHelp)); | |
| 70 | - this->ap.addBare("show-crypto", b(&ArgParser::argShowCrypto)); | |
| 71 | - | |
| 72 | - this->ap.selectMainOptionTable(); | |
| 73 | - this->ap.addPositional(p(&ArgParser::argPositional)); | |
| 74 | - this->ap.addRequiredParameter("password", | |
| 75 | - p(&ArgParser::argPassword), "password"); | |
| 76 | - this->ap.addRequiredParameter("password-file", | |
| 77 | - p(&ArgParser::argPasswordFile), "password-file"); | |
| 78 | - this->ap.addBare("empty", b(&ArgParser::argEmpty)); | |
| 79 | - this->ap.addBare("linearize", b(&ArgParser::argLinearize)); | |
| 80 | - this->ap.addBare("decrypt", b(&ArgParser::argDecrypt)); | |
| 81 | - this->ap.addBare("password-is-hex-key", b(&ArgParser::argPasswordIsHexKey)); | |
| 82 | - this->ap.addBare("suppress-password-recovery", | |
| 83 | - b(&ArgParser::argSuppressPasswordRecovery)); | |
| 84 | - this->ap.addRequiredChoices("password-mode", | |
| 85 | - p(&ArgParser::argPasswordMode), password_mode_choices); | |
| 86 | - this->ap.addRequiredParameter("copy-encryption", | |
| 87 | - p(&ArgParser::argCopyEncryption), "file"); | |
| 88 | - this->ap.addRequiredParameter("encryption-file-password", | |
| 89 | - p(&ArgParser::argEncryptionFilePassword), "password"); | |
| 90 | - this->ap.addRequiredParameter("rotate", | |
| 91 | - p(&ArgParser::argRotate), "[+|-]angle:page-range"); | |
| 92 | - this->ap.addOptionalParameter("collate",p(&ArgParser::argCollate)); | |
| 93 | - this->ap.addBare("flatten-rotation", b(&ArgParser::argFlattenRotation)); | |
| 94 | - this->ap.addBare("list-attachments", b(&ArgParser::argListAttachments)); | |
| 95 | - this->ap.addRequiredParameter("show-attachment", | |
| 96 | - p(&ArgParser::argShowAttachment), "attachment-key"); | |
| 97 | - this->ap.addRequiredParameter("remove-attachment", | |
| 98 | - p(&ArgParser::argRemoveAttachment), "attachment-key"); | |
| 99 | - this->ap.addBare("add-attachment", b(&ArgParser::argAddAttachment)); | |
| 100 | - this->ap.addBare( | |
| 101 | - "copy-attachments-from", b(&ArgParser::argCopyAttachmentsFrom)); | |
| 102 | - this->ap.addRequiredChoices("stream-data", | |
| 103 | - p(&ArgParser::argStreamData), stream_data_choices); | |
| 104 | - this->ap.addRequiredChoices("compress-streams", | |
| 105 | - p(&ArgParser::argCompressStreams), yn_choices); | |
| 106 | - this->ap.addBare("recompress-flate", b(&ArgParser::argRecompressFlate)); | |
| 107 | - this->ap.addRequiredParameter("compression-level", | |
| 108 | - p(&ArgParser::argCompressionLevel), "level"); | |
| 109 | - this->ap.addRequiredChoices("decode-level", | |
| 110 | - p(&ArgParser::argDecodeLevel), decode_level_choices); | |
| 111 | - this->ap.addRequiredChoices("normalize-content", | |
| 112 | - p(&ArgParser::argNormalizeContent), yn_choices); | |
| 113 | - this->ap.addBare("suppress-recovery", b(&ArgParser::argSuppressRecovery)); | |
| 114 | - this->ap.addRequiredChoices("object-streams", | |
| 115 | - p(&ArgParser::argObjectStreams), object_streams_choices); | |
| 116 | - this->ap.addBare( | |
| 117 | - "ignore-xref-streams", b(&ArgParser::argIgnoreXrefStreams)); | |
| 118 | - this->ap.addBare("qdf", b(&ArgParser::argQdf)); | |
| 119 | - this->ap.addBare( | |
| 120 | - "preserve-unreferenced", b(&ArgParser::argPreserveUnreferenced)); | |
| 121 | - this->ap.addBare( | |
| 122 | - "preserve-unreferenced-resources", | |
| 123 | - b(&ArgParser::argPreserveUnreferencedResources)); | |
| 124 | - this->ap.addRequiredChoices("remove-unreferenced-resources", | |
| 125 | - p(&ArgParser::argRemoveUnreferencedResources), remove_unref_choices); | |
| 126 | - this->ap.addRequiredChoices("keep-files-open", | |
| 127 | - p(&ArgParser::argKeepFilesOpen), yn_choices); | |
| 128 | - this->ap.addRequiredParameter("keep-files-open-threshold", | |
| 129 | - p(&ArgParser::argKeepFilesOpenThreshold), "count"); | |
| 130 | - this->ap.addBare("newline-before-endstream", b(&ArgParser::argNewlineBeforeEndstream)); | |
| 131 | - this->ap.addRequiredParameter("linearize-pass1", | |
| 132 | - p(&ArgParser::argLinearizePass1), "filename"); | |
| 133 | - this->ap.addBare("coalesce-contents", b(&ArgParser::argCoalesceContents)); | |
| 134 | - this->ap.addRequiredChoices("flatten-annotations", | |
| 135 | - p(&ArgParser::argFlattenAnnotations), flatten_choices); | |
| 136 | - this->ap.addBare("generate-appearances", b(&ArgParser::argGenerateAppearances)); | |
| 137 | - this->ap.addRequiredParameter("min-version", | |
| 138 | - p(&ArgParser::argMinVersion), "version"); | |
| 139 | - this->ap.addRequiredParameter("force-version", | |
| 140 | - p(&ArgParser::argForceVersion), "version"); | |
| 141 | - this->ap.addOptionalParameter("split-pages",p(&ArgParser::argSplitPages)); | |
| 142 | - this->ap.addBare("verbose", b(&ArgParser::argVerbose)); | |
| 143 | - this->ap.addBare("progress", b(&ArgParser::argProgress)); | |
| 144 | - this->ap.addBare("no-warn", b(&ArgParser::argNoWarn)); | |
| 145 | - this->ap.addBare("warning-exit-0", b(&ArgParser::argWarningExit0)); | |
| 146 | - this->ap.addBare("deterministic-id", b(&ArgParser::argDeterministicId)); | |
| 147 | - this->ap.addBare("static-id", b(&ArgParser::argStaticId)); | |
| 148 | - this->ap.addBare("static-aes-iv", b(&ArgParser::argStaticAesIv)); | |
| 149 | - this->ap.addBare("no-original-object-ids", b(&ArgParser::argNoOriginalObjectIds)); | |
| 150 | - this->ap.addBare("show-encryption", b(&ArgParser::argShowEncryption)); | |
| 151 | - this->ap.addBare("show-encryption-key", b(&ArgParser::argShowEncryptionKey)); | |
| 152 | - this->ap.addBare("check-linearization", b(&ArgParser::argCheckLinearization)); | |
| 153 | - this->ap.addBare("show-linearization", b(&ArgParser::argShowLinearization)); | |
| 154 | - this->ap.addBare("show-xref", b(&ArgParser::argShowXref)); | |
| 155 | - this->ap.addRequiredParameter("show-object", | |
| 156 | - p(&ArgParser::argShowObject), "trailer|obj[,gen]"); | |
| 157 | - this->ap.addBare("raw-stream-data", b(&ArgParser::argRawStreamData)); | |
| 158 | - this->ap.addBare("filtered-stream-data", b(&ArgParser::argFilteredStreamData)); | |
| 159 | - this->ap.addBare("show-npages", b(&ArgParser::argShowNpages)); | |
| 160 | - this->ap.addBare("show-pages", b(&ArgParser::argShowPages)); | |
| 161 | - this->ap.addBare("with-images", b(&ArgParser::argWithImages)); | |
| 162 | - this->ap.addBare("json", b(&ArgParser::argJson)); | |
| 163 | - this->ap.addRequiredChoices("json-key", | |
| 164 | - p(&ArgParser::argJsonKey), json_key_choices); | |
| 165 | - this->ap.addRequiredParameter("json-object", | |
| 166 | - p(&ArgParser::argJsonObject), "trailer|obj[,gen]"); | |
| 167 | - this->ap.addBare("check", b(&ArgParser::argCheck)); | |
| 168 | - this->ap.addBare("optimize-images", b(&ArgParser::argOptimizeImages)); | |
| 169 | - this->ap.addBare("externalize-inline-images", b(&ArgParser::argExternalizeInlineImages)); | |
| 170 | - this->ap.addBare("keep-inline-images", b(&ArgParser::argKeepInlineImages)); | |
| 171 | - this->ap.addBare("remove-page-labels", b(&ArgParser::argRemovePageLabels)); | |
| 172 | - this->ap.addRequiredParameter("oi-min-width", | |
| 173 | - p(&ArgParser::argOiMinWidth), "minimum-width"); | |
| 174 | - this->ap.addRequiredParameter("oi-min-height", | |
| 175 | - p(&ArgParser::argOiMinHeight), "minimum-height"); | |
| 176 | - this->ap.addRequiredParameter("oi-min-area", | |
| 177 | - p(&ArgParser::argOiMinArea), "minimum-area"); | |
| 178 | - this->ap.addRequiredParameter("ii-min-bytes", | |
| 179 | - p(&ArgParser::argIiMinBytes), "minimum-bytes"); | |
| 180 | - this->ap.addBare("overlay", b(&ArgParser::argOverlay)); | |
| 181 | - this->ap.addBare("underlay", b(&ArgParser::argUnderlay)); | |
| 182 | - this->ap.addBare("replace-input", b(&ArgParser::argReplaceInput)); | |
| 183 | - this->ap.addBare("is-encrypted", b(&ArgParser::argIsEncrypted)); | |
| 184 | - this->ap.addBare("requires-password", b(&ArgParser::argRequiresPassword)); | |
| 185 | - this->ap.addBare("allow-weak-crypto", b(&ArgParser::argAllowWeakCrypto)); | |
| 186 | - | |
| 187 | - this->ap.selectMainOptionTable(); | |
| 188 | - this->ap.addBare("pages", b(&ArgParser::argPages)); | |
| 189 | - this->ap.registerOptionTable(O_PAGES, b(&ArgParser::argEndPages)); | |
| 190 | - this->ap.addRequiredParameter( | |
| 191 | - "password", p(&ArgParser::argPagesPassword), "password"); | |
| 192 | - this->ap.addPositional(p(&ArgParser::argPagesPositional)); | |
| 193 | - | |
| 194 | - this->ap.selectMainOptionTable(); | |
| 195 | - this->ap.addBare("encrypt", b(&ArgParser::argEncrypt)); | |
| 196 | - this->ap.registerOptionTable(O_ENCRYPTION, b(&ArgParser::argEndEncryption)); | |
| 197 | - this->ap.addPositional(p(&ArgParser::argEncPositional)); | |
| 198 | - this->ap.registerOptionTable(O_40_BIT_ENCRYPTION, b(&ArgParser::argEndEncryption)); | |
| 199 | - this->ap.addRequiredChoices("extract",p(&ArgParser::argEnc40Extract), yn_choices); | |
| 200 | - this->ap.addRequiredChoices("annotate",p(&ArgParser::argEnc40Annotate), yn_choices); | |
| 201 | - this->ap.addRequiredChoices("print",p(&ArgParser::argEnc40Print), yn_choices); | |
| 202 | - this->ap.addRequiredChoices("modify",p(&ArgParser::argEnc40Modify), yn_choices); | |
| 203 | - this->ap.registerOptionTable(O_128_BIT_ENCRYPTION, b(&ArgParser::argEndEncryption)); | |
| 204 | - this->ap.registerOptionTable(O_256_BIT_ENCRYPTION, b(&ArgParser::argEndEncryption)); | |
| 205 | - for (char const* k: {O_128_BIT_ENCRYPTION, O_256_BIT_ENCRYPTION}) | |
| 206 | - { | |
| 207 | - this->ap.selectOptionTable(k); | |
| 208 | - this->ap.addRequiredChoices("accessibility", | |
| 209 | - p(&ArgParser::argEnc128Accessibility), yn_choices); | |
| 210 | - this->ap.addRequiredChoices("extract", p(&ArgParser::argEnc128Extract), yn_choices); | |
| 211 | - this->ap.addRequiredChoices("print", | |
| 212 | - p(&ArgParser::argEnc128Print), print128_choices); | |
| 213 | - this->ap.addRequiredChoices("assemble",p(&ArgParser::argEnc128Assemble), yn_choices); | |
| 214 | - this->ap.addRequiredChoices("annotate",p(&ArgParser::argEnc128Annotate), yn_choices); | |
| 215 | - this->ap.addRequiredChoices("form",p(&ArgParser::argEnc128Form), yn_choices); | |
| 216 | - this->ap.addRequiredChoices("modify-other",p(&ArgParser::argEnc128ModifyOther), yn_choices); | |
| 217 | - this->ap.addRequiredChoices("modify", | |
| 218 | - p(&ArgParser::argEnc128Modify), modify128_choices); | |
| 219 | - this->ap.addBare("cleartext-metadata", b(&ArgParser::argEnc128CleartextMetadata)); | |
| 220 | - } | |
| 221 | - | |
| 222 | - this->ap.selectOptionTable(O_128_BIT_ENCRYPTION); | |
| 223 | - this->ap.addRequiredChoices("use-aes",p(&ArgParser::argEnc128UseAes), yn_choices); | |
| 224 | - this->ap.addBare("force-V4", b(&ArgParser::argEnc128ForceV4)); | |
| 225 | - | |
| 226 | - this->ap.selectOptionTable(O_256_BIT_ENCRYPTION); | |
| 227 | - this->ap.addBare("force-R5", b(&ArgParser::argEnc256ForceR5)); | |
| 228 | - this->ap.addBare("allow-insecure", b(&ArgParser::argEnc256AllowInsecure)); | |
| 229 | - | |
| 230 | - this->ap.registerOptionTable(O_UNDERLAY_OVERLAY, b(&ArgParser::argEndUnderlayOverlay)); | |
| 231 | - this->ap.addPositional(p(&ArgParser::argUOPositional)); | |
| 232 | - this->ap.addRequiredParameter("to", | |
| 233 | - p(&ArgParser::argUOTo), "page-range"); | |
| 234 | - this->ap.addRequiredParameter("from", | |
| 235 | - p(&ArgParser::argUOFrom), "page-range"); | |
| 236 | - this->ap.addRequiredParameter("repeat", | |
| 237 | - p(&ArgParser::argUORepeat), "page-range"); | |
| 238 | - this->ap.addRequiredParameter("password", | |
| 239 | - p(&ArgParser::argUOPassword), "password"); | |
| 240 | - | |
| 241 | - this->ap.registerOptionTable(O_ATTACHMENT, b(&ArgParser::argEndAttachment)); | |
| 242 | - this->ap.addPositional(p(&ArgParser::argAttPositional)); | |
| 243 | - this->ap.addRequiredParameter("key", | |
| 244 | - p(&ArgParser::argAttKey), "attachment-key"); | |
| 245 | - this->ap.addRequiredParameter("filename", | |
| 246 | - p(&ArgParser::argAttFilename), "filename"); | |
| 247 | - this->ap.addRequiredParameter("creationdate", | |
| 248 | - p(&ArgParser::argAttCreationdate), "creation-date"); | |
| 249 | - this->ap.addRequiredParameter("moddate", | |
| 250 | - p(&ArgParser::argAttModdate), "modification-date"); | |
| 251 | - this->ap.addRequiredParameter("mimetype", | |
| 252 | - p(&ArgParser::argAttMimetype), "mime/type"); | |
| 253 | - this->ap.addRequiredParameter("description", | |
| 254 | - p(&ArgParser::argAttDescription), "description"); | |
| 255 | - this->ap.addBare("replace", b(&ArgParser::argAttReplace)); | |
| 256 | - | |
| 257 | - this->ap.registerOptionTable(O_COPY_ATTACHMENT, b(&ArgParser::argEndCopyAttachment)); | |
| 258 | - this->ap.addPositional(p(&ArgParser::argCopyAttPositional)); | |
| 259 | - this->ap.addRequiredParameter("prefix", | |
| 260 | - p(&ArgParser::argCopyAttPrefix), "prefix"); | |
| 261 | - this->ap.addRequiredParameter("password", | |
| 262 | - p(&ArgParser::argCopyAttPassword), "password"); | |
| 56 | + this->ap.addFinalCheck( | |
| 57 | + QPDFArgParser::bindBare(&ArgParser::doFinalChecks, this)); | |
| 263 | 58 | } |
| 264 | 59 | |
| 265 | 60 | void |
| ... | ... | @@ -1822,6 +1617,24 @@ ArgParser::argEndEncryption() |
| 1822 | 1617 | } |
| 1823 | 1618 | |
| 1824 | 1619 | void |
| 1620 | +ArgParser::argEnd40BitEncryption() | |
| 1621 | +{ | |
| 1622 | + argEndEncryption(); | |
| 1623 | +} | |
| 1624 | + | |
| 1625 | +void | |
| 1626 | +ArgParser::argEnd128BitEncryption() | |
| 1627 | +{ | |
| 1628 | + argEndEncryption(); | |
| 1629 | +} | |
| 1630 | + | |
| 1631 | +void | |
| 1632 | +ArgParser::argEnd256BitEncryption() | |
| 1633 | +{ | |
| 1634 | + argEndEncryption(); | |
| 1635 | +} | |
| 1636 | + | |
| 1637 | +void | |
| 1825 | 1638 | ArgParser::argUOPositional(char* arg) |
| 1826 | 1639 | { |
| 1827 | 1640 | if (o.under_overlay->filename) | ... | ... |
libqpdf/qpdf/auto_job_init.hh
| ... | ... | @@ -3,6 +3,13 @@ |
| 3 | 3 | // Edits will be automatically overwritten if the build is |
| 4 | 4 | // run in maintainer mode. |
| 5 | 5 | // |
| 6 | +auto b = [this](void (ArgParser::*f)()) { | |
| 7 | + return QPDFArgParser::bindBare(f, this); | |
| 8 | +}; | |
| 9 | +auto p = [this](void (ArgParser::*f)(char *)) { | |
| 10 | + return QPDFArgParser::bindParam(f, this); | |
| 11 | +}; | |
| 12 | + | |
| 6 | 13 | char const* yn_choices[] = {"y", "n", 0}; |
| 7 | 14 | char const* password_mode_choices[] = {"bytes", "hex-bytes", "unicode", "auto", 0}; |
| 8 | 15 | char const* stream_data_choices[] = {"compress", "preserve", "uncompress", 0}; |
| ... | ... | @@ -13,3 +20,146 @@ char const* flatten_choices[] = {"all", "print", "screen", 0}; |
| 13 | 20 | char const* json_key_choices[] = {"acroform", "attachments", "encrypt", "objectinfo", "objects", "outlines", "pagelabels", "pages", 0}; |
| 14 | 21 | char const* print128_choices[] = {"full", "low", "none", 0}; |
| 15 | 22 | char const* modify128_choices[] = {"all", "annotate", "form", "assembly", "none", 0}; |
| 23 | + | |
| 24 | +this->ap.selectHelpOptionTable(); | |
| 25 | +this->ap.addBare("help", b(&ArgParser::argHelp)); | |
| 26 | +this->ap.addBare("version", b(&ArgParser::argVersion)); | |
| 27 | +this->ap.addBare("copyright", b(&ArgParser::argCopyright)); | |
| 28 | +this->ap.addBare("json-help", b(&ArgParser::argJsonHelp)); | |
| 29 | +this->ap.addBare("show-crypto", b(&ArgParser::argShowCrypto)); | |
| 30 | +this->ap.selectMainOptionTable(); | |
| 31 | +this->ap.addPositional(p(&ArgParser::argPositional)); | |
| 32 | +this->ap.addBare("add-attachment", b(&ArgParser::argAddAttachment)); | |
| 33 | +this->ap.addBare("allow-weak-crypto", b(&ArgParser::argAllowWeakCrypto)); | |
| 34 | +this->ap.addBare("check", b(&ArgParser::argCheck)); | |
| 35 | +this->ap.addBare("check-linearization", b(&ArgParser::argCheckLinearization)); | |
| 36 | +this->ap.addBare("coalesce-contents", b(&ArgParser::argCoalesceContents)); | |
| 37 | +this->ap.addBare("copy-attachments-from", b(&ArgParser::argCopyAttachmentsFrom)); | |
| 38 | +this->ap.addBare("decrypt", b(&ArgParser::argDecrypt)); | |
| 39 | +this->ap.addBare("deterministic-id", b(&ArgParser::argDeterministicId)); | |
| 40 | +this->ap.addBare("empty", b(&ArgParser::argEmpty)); | |
| 41 | +this->ap.addBare("encrypt", b(&ArgParser::argEncrypt)); | |
| 42 | +this->ap.addBare("externalize-inline-images", b(&ArgParser::argExternalizeInlineImages)); | |
| 43 | +this->ap.addBare("filtered-stream-data", b(&ArgParser::argFilteredStreamData)); | |
| 44 | +this->ap.addBare("flatten-rotation", b(&ArgParser::argFlattenRotation)); | |
| 45 | +this->ap.addBare("generate-appearances", b(&ArgParser::argGenerateAppearances)); | |
| 46 | +this->ap.addBare("ignore-xref-streams", b(&ArgParser::argIgnoreXrefStreams)); | |
| 47 | +this->ap.addBare("is-encrypted", b(&ArgParser::argIsEncrypted)); | |
| 48 | +this->ap.addBare("json", b(&ArgParser::argJson)); | |
| 49 | +this->ap.addBare("keep-inline-images", b(&ArgParser::argKeepInlineImages)); | |
| 50 | +this->ap.addBare("linearize", b(&ArgParser::argLinearize)); | |
| 51 | +this->ap.addBare("list-attachments", b(&ArgParser::argListAttachments)); | |
| 52 | +this->ap.addBare("newline-before-endstream", b(&ArgParser::argNewlineBeforeEndstream)); | |
| 53 | +this->ap.addBare("no-original-object-ids", b(&ArgParser::argNoOriginalObjectIds)); | |
| 54 | +this->ap.addBare("no-warn", b(&ArgParser::argNoWarn)); | |
| 55 | +this->ap.addBare("optimize-images", b(&ArgParser::argOptimizeImages)); | |
| 56 | +this->ap.addBare("overlay", b(&ArgParser::argOverlay)); | |
| 57 | +this->ap.addBare("pages", b(&ArgParser::argPages)); | |
| 58 | +this->ap.addBare("password-is-hex-key", b(&ArgParser::argPasswordIsHexKey)); | |
| 59 | +this->ap.addBare("preserve-unreferenced", b(&ArgParser::argPreserveUnreferenced)); | |
| 60 | +this->ap.addBare("preserve-unreferenced-resources", b(&ArgParser::argPreserveUnreferencedResources)); | |
| 61 | +this->ap.addBare("progress", b(&ArgParser::argProgress)); | |
| 62 | +this->ap.addBare("qdf", b(&ArgParser::argQdf)); | |
| 63 | +this->ap.addBare("raw-stream-data", b(&ArgParser::argRawStreamData)); | |
| 64 | +this->ap.addBare("recompress-flate", b(&ArgParser::argRecompressFlate)); | |
| 65 | +this->ap.addBare("remove-page-labels", b(&ArgParser::argRemovePageLabels)); | |
| 66 | +this->ap.addBare("replace-input", b(&ArgParser::argReplaceInput)); | |
| 67 | +this->ap.addBare("requires-password", b(&ArgParser::argRequiresPassword)); | |
| 68 | +this->ap.addBare("show-encryption", b(&ArgParser::argShowEncryption)); | |
| 69 | +this->ap.addBare("show-encryption-key", b(&ArgParser::argShowEncryptionKey)); | |
| 70 | +this->ap.addBare("show-linearization", b(&ArgParser::argShowLinearization)); | |
| 71 | +this->ap.addBare("show-npages", b(&ArgParser::argShowNpages)); | |
| 72 | +this->ap.addBare("show-pages", b(&ArgParser::argShowPages)); | |
| 73 | +this->ap.addBare("show-xref", b(&ArgParser::argShowXref)); | |
| 74 | +this->ap.addBare("static-aes-iv", b(&ArgParser::argStaticAesIv)); | |
| 75 | +this->ap.addBare("static-id", b(&ArgParser::argStaticId)); | |
| 76 | +this->ap.addBare("suppress-password-recovery", b(&ArgParser::argSuppressPasswordRecovery)); | |
| 77 | +this->ap.addBare("suppress-recovery", b(&ArgParser::argSuppressRecovery)); | |
| 78 | +this->ap.addBare("underlay", b(&ArgParser::argUnderlay)); | |
| 79 | +this->ap.addBare("verbose", b(&ArgParser::argVerbose)); | |
| 80 | +this->ap.addBare("warning-exit-0", b(&ArgParser::argWarningExit0)); | |
| 81 | +this->ap.addBare("with-images", b(&ArgParser::argWithImages)); | |
| 82 | +this->ap.addOptionalParameter("collate", p(&ArgParser::argCollate)); | |
| 83 | +this->ap.addOptionalParameter("split-pages", p(&ArgParser::argSplitPages)); | |
| 84 | +this->ap.addRequiredParameter("compression-level", p(&ArgParser::argCompressionLevel), "level"); | |
| 85 | +this->ap.addRequiredParameter("copy-encryption", p(&ArgParser::argCopyEncryption), "file"); | |
| 86 | +this->ap.addRequiredParameter("encryption-file-password", p(&ArgParser::argEncryptionFilePassword), "password"); | |
| 87 | +this->ap.addRequiredParameter("force-version", p(&ArgParser::argForceVersion), "version"); | |
| 88 | +this->ap.addRequiredParameter("ii-min-bytes", p(&ArgParser::argIiMinBytes), "minimum"); | |
| 89 | +this->ap.addRequiredParameter("json-object", p(&ArgParser::argJsonObject), "trailer"); | |
| 90 | +this->ap.addRequiredParameter("keep-files-open-threshold", p(&ArgParser::argKeepFilesOpenThreshold), "count"); | |
| 91 | +this->ap.addRequiredParameter("linearize-pass1", p(&ArgParser::argLinearizePass1), "filename"); | |
| 92 | +this->ap.addRequiredParameter("min-version", p(&ArgParser::argMinVersion), "version"); | |
| 93 | +this->ap.addRequiredParameter("oi-min-area", p(&ArgParser::argOiMinArea), "minimum"); | |
| 94 | +this->ap.addRequiredParameter("oi-min-height", p(&ArgParser::argOiMinHeight), "minimum"); | |
| 95 | +this->ap.addRequiredParameter("oi-min-width", p(&ArgParser::argOiMinWidth), "minimum"); | |
| 96 | +this->ap.addRequiredParameter("password", p(&ArgParser::argPassword), "password"); | |
| 97 | +this->ap.addRequiredParameter("password-file", p(&ArgParser::argPasswordFile), "password"); | |
| 98 | +this->ap.addRequiredParameter("remove-attachment", p(&ArgParser::argRemoveAttachment), "attachment"); | |
| 99 | +this->ap.addRequiredParameter("rotate", p(&ArgParser::argRotate), "[+|-]angle"); | |
| 100 | +this->ap.addRequiredParameter("show-attachment", p(&ArgParser::argShowAttachment), "attachment"); | |
| 101 | +this->ap.addRequiredParameter("show-object", p(&ArgParser::argShowObject), "trailer"); | |
| 102 | +this->ap.addRequiredChoices("compress-streams", p(&ArgParser::argCompressStreams), yn_choices); | |
| 103 | +this->ap.addRequiredChoices("decode-level", p(&ArgParser::argDecodeLevel), decode_level_choices); | |
| 104 | +this->ap.addRequiredChoices("flatten-annotations", p(&ArgParser::argFlattenAnnotations), flatten_choices); | |
| 105 | +this->ap.addRequiredChoices("json-key", p(&ArgParser::argJsonKey), json_key_choices); | |
| 106 | +this->ap.addRequiredChoices("keep-files-open", p(&ArgParser::argKeepFilesOpen), yn_choices); | |
| 107 | +this->ap.addRequiredChoices("normalize-content", p(&ArgParser::argNormalizeContent), yn_choices); | |
| 108 | +this->ap.addRequiredChoices("object-streams", p(&ArgParser::argObjectStreams), object_streams_choices); | |
| 109 | +this->ap.addRequiredChoices("password-mode", p(&ArgParser::argPasswordMode), password_mode_choices); | |
| 110 | +this->ap.addRequiredChoices("remove-unreferenced-resources", p(&ArgParser::argRemoveUnreferencedResources), remove_unref_choices); | |
| 111 | +this->ap.addRequiredChoices("stream-data", p(&ArgParser::argStreamData), stream_data_choices); | |
| 112 | +this->ap.registerOptionTable("pages", b(&ArgParser::argEndPages)); | |
| 113 | +this->ap.addPositional(p(&ArgParser::argPagesPositional)); | |
| 114 | +this->ap.addRequiredParameter("password", p(&ArgParser::argPagesPassword), "password"); | |
| 115 | +this->ap.registerOptionTable("encryption", b(&ArgParser::argEndEncryption)); | |
| 116 | +this->ap.addPositional(p(&ArgParser::argEncPositional)); | |
| 117 | +this->ap.registerOptionTable("40-bit encryption", b(&ArgParser::argEnd40BitEncryption)); | |
| 118 | +this->ap.addRequiredChoices("extract", p(&ArgParser::argEnc40Extract), yn_choices); | |
| 119 | +this->ap.addRequiredChoices("annotate", p(&ArgParser::argEnc40Annotate), yn_choices); | |
| 120 | +this->ap.addRequiredChoices("print", p(&ArgParser::argEnc40Print), yn_choices); | |
| 121 | +this->ap.addRequiredChoices("modify", p(&ArgParser::argEnc40Modify), yn_choices); | |
| 122 | +this->ap.registerOptionTable("128-bit encryption", b(&ArgParser::argEnd128BitEncryption)); | |
| 123 | +this->ap.addBare("cleartext-metadata", b(&ArgParser::argEnc128CleartextMetadata)); | |
| 124 | +this->ap.addBare("force-V4", b(&ArgParser::argEnc128ForceV4)); | |
| 125 | +this->ap.addRequiredChoices("accessibility", p(&ArgParser::argEnc128Accessibility), yn_choices); | |
| 126 | +this->ap.addRequiredChoices("extract", p(&ArgParser::argEnc128Extract), yn_choices); | |
| 127 | +this->ap.addRequiredChoices("print", p(&ArgParser::argEnc128Print), print128_choices); | |
| 128 | +this->ap.addRequiredChoices("assemble", p(&ArgParser::argEnc128Assemble), yn_choices); | |
| 129 | +this->ap.addRequiredChoices("annotate", p(&ArgParser::argEnc128Annotate), yn_choices); | |
| 130 | +this->ap.addRequiredChoices("form", p(&ArgParser::argEnc128Form), yn_choices); | |
| 131 | +this->ap.addRequiredChoices("modify-other", p(&ArgParser::argEnc128ModifyOther), yn_choices); | |
| 132 | +this->ap.addRequiredChoices("modify", p(&ArgParser::argEnc128Modify), modify128_choices); | |
| 133 | +this->ap.addRequiredChoices("use-aes", p(&ArgParser::argEnc128UseAes), yn_choices); | |
| 134 | +this->ap.registerOptionTable("256-bit encryption", b(&ArgParser::argEnd256BitEncryption)); | |
| 135 | +this->ap.addBare("force-R5", b(&ArgParser::argEnc256ForceR5)); | |
| 136 | +this->ap.addBare("allow-insecure", b(&ArgParser::argEnc256AllowInsecure)); | |
| 137 | +this->ap.registerOptionTable("underlay/overlay", b(&ArgParser::argEndUnderlayOverlay)); | |
| 138 | +this->ap.addPositional(p(&ArgParser::argUOPositional)); | |
| 139 | +this->ap.addRequiredParameter("to", p(&ArgParser::argUOTo), "page-range"); | |
| 140 | +this->ap.addRequiredParameter("from", p(&ArgParser::argUOFrom), "page-range"); | |
| 141 | +this->ap.addRequiredParameter("repeat", p(&ArgParser::argUORepeat), "page-range"); | |
| 142 | +this->ap.addRequiredParameter("password", p(&ArgParser::argUOPassword), "password"); | |
| 143 | +this->ap.registerOptionTable("attachment", b(&ArgParser::argEndAttachment)); | |
| 144 | +this->ap.addPositional(p(&ArgParser::argAttPositional)); | |
| 145 | +this->ap.addBare("replace", b(&ArgParser::argAttReplace)); | |
| 146 | +this->ap.addRequiredParameter("key", p(&ArgParser::argAttKey), "attachment-key"); | |
| 147 | +this->ap.addRequiredParameter("filename", p(&ArgParser::argAttFilename), "filename"); | |
| 148 | +this->ap.addRequiredParameter("creationdate", p(&ArgParser::argAttCreationdate), "creation-date"); | |
| 149 | +this->ap.addRequiredParameter("moddate", p(&ArgParser::argAttModdate), "modification-date"); | |
| 150 | +this->ap.addRequiredParameter("mimetype", p(&ArgParser::argAttMimetype), "mime/type"); | |
| 151 | +this->ap.addRequiredParameter("description", p(&ArgParser::argAttDescription), "description"); | |
| 152 | +this->ap.registerOptionTable("copy attachment", b(&ArgParser::argEndCopyAttachment)); | |
| 153 | +this->ap.addPositional(p(&ArgParser::argCopyAttPositional)); | |
| 154 | +this->ap.addRequiredParameter("prefix", p(&ArgParser::argCopyAttPrefix), "prefix"); | |
| 155 | +this->ap.addRequiredParameter("password", p(&ArgParser::argCopyAttPassword), "password"); | |
| 156 | +this->ap.selectOptionTable("256-bit encryption"); | |
| 157 | +this->ap.copyFromOtherTable("cleartext-metadata", "128-bit encryption"); | |
| 158 | +this->ap.copyFromOtherTable("accessibility", "128-bit encryption"); | |
| 159 | +this->ap.copyFromOtherTable("extract", "128-bit encryption"); | |
| 160 | +this->ap.copyFromOtherTable("print", "128-bit encryption"); | |
| 161 | +this->ap.copyFromOtherTable("assemble", "128-bit encryption"); | |
| 162 | +this->ap.copyFromOtherTable("annotate", "128-bit encryption"); | |
| 163 | +this->ap.copyFromOtherTable("form", "128-bit encryption"); | |
| 164 | +this->ap.copyFromOtherTable("modify-other", "128-bit encryption"); | |
| 165 | +this->ap.copyFromOtherTable("modify", "128-bit encryption"); | ... | ... |