Commit 361b19be4a5ebcd639bf97a02a50f4a63323308e

Authored by m-holger
Committed by GitHub
2 parents eda40d87 54afdecb

Merge pull request #1463 from m-holger/modernize

Modernize code
Showing 128 changed files with 1403 additions and 1439 deletions

Too many changes.

To preserve performance only 100 of 128 files are displayed.

@@ -45,7 +45,6 @@ with modern equivalent. Key updates are: @@ -45,7 +45,6 @@ with modern equivalent. Key updates are:
45 Next steps are: 45 Next steps are:
46 46
47 * review function signatures in the public API 47 * review function signatures in the public API
48 -* replace code that uses QUtil::make_shared_cstr etc  
49 48
50 Except for the above, prefer to make modernization changes as part of other updates. 49 Except for the above, prefer to make modernization changes as part of other updates.
51 50
compare-for-test/qpdf-test-compare.cc
@@ -13,18 +13,14 @@ static char const* whoami = nullptr; @@ -13,18 +13,14 @@ static char const* whoami = nullptr;
13 void 13 void
14 usage() 14 usage()
15 { 15 {
16 - std::cerr << "Usage: " << whoami << " actual expected" << std::endl  
17 - << R"(Where "actual" is the actual output and "expected" is the expected)"  
18 - << std::endl  
19 - << "output of a test, compare the two PDF files. The files are considered"  
20 - << std::endl  
21 - << "to match if all their objects are identical except that, if a stream is"  
22 - << std::endl  
23 - << "compressed with FlateDecode, the uncompressed data must match." << std::endl  
24 - << std::endl  
25 - << "If the files match, the output is the expected file. Otherwise, it is"  
26 - << std::endl  
27 - << "the actual file. Read comments in the code for rationale." << std::endl; 16 + std::cerr << "Usage: " << whoami << " actual expected" << '\n'
  17 + << R"(Where "actual" is the actual output and "expected" is the expected)" << '\n'
  18 + << "output of a test, compare the two PDF files. The files are considered" << '\n'
  19 + << "to match if all their objects are identical except that, if a stream is" << '\n'
  20 + << "compressed with FlateDecode, the uncompressed data must match." << '\n'
  21 + << '\n'
  22 + << "If the files match, the output is the expected file. Otherwise, it is" << '\n'
  23 + << "the actual file. Read comments in the code for rationale." << '\n';
28 exit(2); 24 exit(2);
29 } 25 }
30 26
@@ -187,7 +183,7 @@ main(int argc, char* argv[]) @@ -187,7 +183,7 @@ main(int argc, char* argv[])
187 } 183 }
188 184
189 if ((argc == 2) && (strcmp(argv[1], "--version") == 0)) { 185 if ((argc == 2) && (strcmp(argv[1], "--version") == 0)) {
190 - std::cout << whoami << " from qpdf version " << QPDF::QPDFVersion() << std::endl; 186 + std::cout << whoami << " from qpdf version " << QPDF::QPDFVersion() << '\n';
191 exit(0); 187 exit(0);
192 } 188 }
193 189
@@ -211,7 +207,7 @@ main(int argc, char* argv[]) @@ -211,7 +207,7 @@ main(int argc, char* argv[])
211 to_output = expected; 207 to_output = expected;
212 } else { 208 } else {
213 if (show_why) { 209 if (show_why) {
214 - std::cerr << difference << std::endl; 210 + std::cerr << difference << '\n';
215 exit(2); 211 exit(2);
216 } 212 }
217 // The files differ; write the actual file. If it is determined that the actual file 213 // The files differ; write the actual file. If it is determined that the actual file
@@ -237,7 +233,7 @@ main(int argc, char* argv[]) @@ -237,7 +233,7 @@ main(int argc, char* argv[])
237 exit(2); 233 exit(2);
238 } 234 }
239 } catch (std::exception& e) { 235 } catch (std::exception& e) {
240 - std::cerr << whoami << ": " << e.what() << std::endl; 236 + std::cerr << whoami << ": " << e.what() << '\n';
241 exit(2); 237 exit(2);
242 } 238 }
243 return 0; 239 return 0;
examples/pdf-attach-file.cc
@@ -19,15 +19,15 @@ static char const* whoami = nullptr; @@ -19,15 +19,15 @@ static char const* whoami = nullptr;
19 static void 19 static void
20 usage(std::string const& msg) 20 usage(std::string const& msg)
21 { 21 {
22 - std::cerr << msg << std::endl  
23 - << std::endl  
24 - << "Usage: " << whoami << " options" << std::endl  
25 - << "Options:" << std::endl  
26 - << " --infile infile.pdf" << std::endl  
27 - << " --outfile outfile.pdf" << std::endl  
28 - << " --attachment attachment" << std::endl  
29 - << " [--password infile-password]" << std::endl  
30 - << " [--mimetype attachment mime type]" << std::endl; 22 + std::cerr << msg << '\n'
  23 + << '\n'
  24 + << "Usage: " << whoami << " options\n"
  25 + << "Options:\n"
  26 + << " --infile infile.pdf\n"
  27 + << " --outfile outfile.pdf\n"
  28 + << " --attachment attachment\n"
  29 + << " [--password infile-password]\n"
  30 + << " [--mimetype attachment mime type]\n";
31 exit(2); 31 exit(2);
32 } 32 }
33 33
@@ -69,7 +69,7 @@ process( @@ -69,7 +69,7 @@ process(
69 69
70 // Create a file spec. 70 // Create a file spec.
71 std::string key = QUtil::path_basename(attachment); 71 std::string key = QUtil::path_basename(attachment);
72 - std::cout << whoami << ": attaching " << attachment << " as " << key << std::endl; 72 + std::cout << whoami << ": attaching " << attachment << " as " << key << '\n';
73 auto fs = QPDFFileSpecObjectHelper::createFileSpec(q, key, attachment); 73 auto fs = QPDFFileSpecObjectHelper::createFileSpec(q, key, attachment);
74 74
75 if (mimetype) { 75 if (mimetype) {
@@ -208,7 +208,7 @@ main(int argc, char* argv[]) @@ -208,7 +208,7 @@ main(int argc, char* argv[])
208 try { 208 try {
209 process(infilename, password, attachment, mimetype, outfilename); 209 process(infilename, password, attachment, mimetype, outfilename);
210 } catch (std::exception& e) { 210 } catch (std::exception& e) {
211 - std::cerr << whoami << " exception: " << e.what() << std::endl; 211 + std::cerr << whoami << " exception: " << e.what() << '\n';
212 exit(2); 212 exit(2);
213 } 213 }
214 214
examples/pdf-bookmarks.cc
@@ -23,12 +23,12 @@ static std::map&lt;QPDFObjGen, int&gt; page_map; @@ -23,12 +23,12 @@ static std::map&lt;QPDFObjGen, int&gt; page_map;
23 void 23 void
24 usage() 24 usage()
25 { 25 {
26 - std::cerr << "Usage: " << whoami << " [options] file.pdf [password]" << std::endl  
27 - << "Options:" << std::endl  
28 - << " --numbers give bookmarks outline-style numbers" << std::endl  
29 - << " --lines draw lines to show bookmark hierarchy" << std::endl  
30 - << " --show-open indicate whether a bookmark is initially open" << std::endl  
31 - << " --show-targets show target if possible" << std::endl; 26 + std::cerr << "Usage: " << whoami << " [options] file.pdf [password]\n"
  27 + << "Options:\n"
  28 + << " --numbers give bookmarks outline-style numbers\n"
  29 + << " --lines draw lines to show bookmark hierarchy\n"
  30 + << " --show-open indicate whether a bookmark is initially open\n"
  31 + << " --show-targets show target if possible\n";
32 exit(2); 32 exit(2);
33 } 33 }
34 34
@@ -74,7 +74,7 @@ show_bookmark_details(QPDFOutlineObjectHelper outline, std::vector&lt;int&gt; numbers) @@ -74,7 +74,7 @@ show_bookmark_details(QPDFOutlineObjectHelper outline, std::vector&lt;int&gt; numbers)
74 case st_lines: 74 case st_lines:
75 QTC::TC("examples", "pdf-bookmarks lines"); 75 QTC::TC("examples", "pdf-bookmarks lines");
76 print_lines(numbers); 76 print_lines(numbers);
77 - std::cout << "|" << std::endl; 77 + std::cout << "|\n";
78 print_lines(numbers); 78 print_lines(numbers);
79 std::cout << "+-+ "; 79 std::cout << "+-+ ";
80 break; 80 break;
@@ -104,7 +104,7 @@ show_bookmark_details(QPDFOutlineObjectHelper outline, std::vector&lt;int&gt; numbers) @@ -104,7 +104,7 @@ show_bookmark_details(QPDFOutlineObjectHelper outline, std::vector&lt;int&gt; numbers)
104 QPDFObjectHandle dest_page = outline.getDestPage(); 104 QPDFObjectHandle dest_page = outline.getDestPage();
105 if (!dest_page.isNull()) { 105 if (!dest_page.isNull()) {
106 QTC::TC("examples", "pdf-bookmarks dest"); 106 QTC::TC("examples", "pdf-bookmarks dest");
107 - if (page_map.count(dest_page)) { 107 + if (page_map.contains(dest_page)) {
108 target = std::to_string(page_map[dest_page]); 108 target = std::to_string(page_map[dest_page]);
109 } 109 }
110 } 110 }
@@ -136,7 +136,7 @@ main(int argc, char* argv[]) @@ -136,7 +136,7 @@ main(int argc, char* argv[])
136 whoami = QUtil::getWhoami(argv[0]); 136 whoami = QUtil::getWhoami(argv[0]);
137 137
138 if ((argc == 2) && (strcmp(argv[1], "--version") == 0)) { 138 if ((argc == 2) && (strcmp(argv[1], "--version") == 0)) {
139 - std::cout << whoami << " version 1.5" << std::endl; 139 + std::cout << whoami << " version 1.5\n";
140 exit(0); 140 exit(0);
141 } 141 }
142 142
@@ -185,10 +185,10 @@ main(int argc, char* argv[]) @@ -185,10 +185,10 @@ main(int argc, char* argv[])
185 } 185 }
186 extract_bookmarks(odh.getTopLevelOutlines(), numbers); 186 extract_bookmarks(odh.getTopLevelOutlines(), numbers);
187 } else { 187 } else {
188 - std::cout << filename << " has no bookmarks" << std::endl; 188 + std::cout << filename << " has no bookmarks\n";
189 } 189 }
190 } catch (std::exception& e) { 190 } catch (std::exception& e) {
191 - std::cerr << whoami << " processing file " << filename << ": " << e.what() << std::endl; 191 + std::cerr << whoami << " processing file " << filename << ": " << e.what() << '\n';
192 exit(2); 192 exit(2);
193 } 193 }
194 194
examples/pdf-count-strings.cc
@@ -18,8 +18,8 @@ static char const* whoami = nullptr; @@ -18,8 +18,8 @@ static char const* whoami = nullptr;
18 void 18 void
19 usage() 19 usage()
20 { 20 {
21 - std::cerr << "Usage: " << whoami << " infile" << std::endl  
22 - << "Applies token filters to infile" << std::endl; 21 + std::cerr << "Usage: " << whoami << " infile\n"
  22 + << "Applies token filters to infile\n";
23 exit(2); 23 exit(2);
24 } 24 }
25 25
@@ -88,14 +88,14 @@ main(int argc, char* argv[]) @@ -88,14 +88,14 @@ main(int argc, char* argv[])
88 } else { 88 } else {
89 // Write output to stdout for even pages. 89 // Write output to stdout for even pages.
90 Pl_StdioFile out("stdout", stdout); 90 Pl_StdioFile out("stdout", stdout);
91 - std::cout << "% Contents of page " << pageno << std::endl; 91 + std::cout << "% Contents of page " << pageno << '\n';
92 page.filterContents(&counter, &out); 92 page.filterContents(&counter, &out);
93 - std::cout << "\n% end " << pageno << std::endl; 93 + std::cout << "\n% end " << pageno << '\n';
94 } 94 }
95 - std::cout << "Page " << pageno << ": strings = " << counter.getCount() << std::endl; 95 + std::cout << "Page " << pageno << ": strings = " << counter.getCount() << '\n';
96 } 96 }
97 } catch (std::exception& e) { 97 } catch (std::exception& e) {
98 - std::cerr << whoami << ": " << e.what() << std::endl; 98 + std::cerr << whoami << ": " << e.what() << '\n';
99 exit(2); 99 exit(2);
100 } 100 }
101 101
examples/pdf-create.cc
@@ -117,8 +117,8 @@ ImageProvider::provideStreamData(QPDFObjGen const&amp;, Pipeline* pipeline) @@ -117,8 +117,8 @@ ImageProvider::provideStreamData(QPDFObjGen const&amp;, Pipeline* pipeline)
117 void 117 void
118 usage() 118 usage()
119 { 119 {
120 - std::cerr << "Usage: " << whoami << " filename" << std::endl  
121 - << "Creates a simple PDF and writes it to filename" << std::endl; 120 + std::cerr << "Usage: " << whoami << " filename\n"
  121 + << "Creates a simple PDF and writes it to filename\n";
122 exit(2); 122 exit(2);
123 } 123 }
124 124
@@ -257,12 +257,12 @@ check( @@ -257,12 +257,12 @@ check(
257 if (!filter.isNameAndEquals(desired_filter)) { 257 if (!filter.isNameAndEquals(desired_filter)) {
258 this_errors = errors = true; 258 this_errors = errors = true;
259 std::cout << "page " << pageno << ": expected filter " << desired_filter 259 std::cout << "page " << pageno << ": expected filter " << desired_filter
260 - << "; actual filter = " << filter.unparse() << std::endl; 260 + << "; actual filter = " << filter.unparse() << '\n';
261 } 261 }
262 if (!color_space.isNameAndEquals(desired_color_space)) { 262 if (!color_space.isNameAndEquals(desired_color_space)) {
263 this_errors = errors = true; 263 this_errors = errors = true;
264 std::cout << "page " << pageno << ": expected color space " << desired_color_space 264 std::cout << "page " << pageno << ": expected color space " << desired_color_space
265 - << "; actual color space = " << color_space.unparse() << std::endl; 265 + << "; actual color space = " << color_space.unparse() << '\n';
266 } 266 }
267 267
268 if (!this_errors) { 268 if (!this_errors) {
@@ -275,7 +275,7 @@ check( @@ -275,7 +275,7 @@ check(
275 std::shared_ptr<Buffer> desired_data(b_p.getBuffer()); 275 std::shared_ptr<Buffer> desired_data(b_p.getBuffer());
276 276
277 if (desired_data->getSize() != actual_data->getSize()) { 277 if (desired_data->getSize() != actual_data->getSize()) {
278 - std::cout << "page " << pageno << ": image data length mismatch" << std::endl; 278 + std::cout << "page " << pageno << ": image data length mismatch\n";
279 this_errors = errors = true; 279 this_errors = errors = true;
280 } else { 280 } else {
281 // Compare bytes. For JPEG, allow a certain number of the bytes to be off desired by 281 // Compare bytes. For JPEG, allow a certain number of the bytes to be off desired by
@@ -297,7 +297,7 @@ check( @@ -297,7 +297,7 @@ check(
297 if (mismatches > threshold) { 297 if (mismatches > threshold) {
298 std::cout << "page " << pageno << ": " << desired_color_space << ", " 298 std::cout << "page " << pageno << ": " << desired_color_space << ", "
299 << desired_filter << ": mismatches: " << mismatches << " of " << len 299 << desired_filter << ": mismatches: " << mismatches << " of " << len
300 - << std::endl; 300 + << '\n';
301 this_errors = errors = true; 301 this_errors = errors = true;
302 } 302 }
303 } 303 }
@@ -308,7 +308,7 @@ check( @@ -308,7 +308,7 @@ check(
308 if (errors) { 308 if (errors) {
309 throw std::logic_error("errors found"); 309 throw std::logic_error("errors found");
310 } else { 310 } else {
311 - std::cout << "all checks passed" << std::endl; 311 + std::cout << "all checks passed\n";
312 } 312 }
313 } 313 }
314 314
@@ -366,7 +366,7 @@ main(int argc, char* argv[]) @@ -366,7 +366,7 @@ main(int argc, char* argv[])
366 try { 366 try {
367 create_pdf(filename); 367 create_pdf(filename);
368 } catch (std::exception& e) { 368 } catch (std::exception& e) {
369 - std::cerr << e.what() << std::endl; 369 + std::cerr << e.what() << '\n';
370 exit(2); 370 exit(2);
371 } 371 }
372 372
examples/pdf-custom-filter.cc
@@ -116,7 +116,7 @@ SF_XORDecode::setDecodeParms(QPDFObjectHandle decode_parms) @@ -116,7 +116,7 @@ SF_XORDecode::setDecodeParms(QPDFObjectHandle decode_parms)
116 this->key = buf->getBuffer()[0]; 116 this->key = buf->getBuffer()[0];
117 return true; 117 return true;
118 } catch (std::exception& e) { 118 } catch (std::exception& e) {
119 - std::cerr << "Error extracting key for /XORDecode: " << e.what() << std::endl; 119 + std::cerr << "Error extracting key for /XORDecode: " << e.what() << '\n';
120 } 120 }
121 return false; 121 return false;
122 } 122 }
@@ -276,7 +276,7 @@ StreamReplacer::registerStream( @@ -276,7 +276,7 @@ StreamReplacer::registerStream(
276 // We don't need to process a stream more than once. In this example, we are just iterating 276 // We don't need to process a stream more than once. In this example, we are just iterating
277 // through objects, but if we were doing something like iterating through images on pages, we 277 // through objects, but if we were doing something like iterating through images on pages, we
278 // might realistically encounter the same stream more than once. 278 // might realistically encounter the same stream more than once.
279 - if (this->copied_streams.count(og) > 0) { 279 + if (this->copied_streams.contains(og)) {
280 return; 280 return;
281 } 281 }
282 // Store something in copied_streams so that we don't double-process even in the negative case. 282 // Store something in copied_streams so that we don't double-process even in the negative case.
@@ -361,15 +361,13 @@ process(char const* infilename, char const* outfilename, bool decode_specialized @@ -361,15 +361,13 @@ process(char const* infilename, char const* outfilename, bool decode_specialized
361 // For the test suite, use static IDs. 361 // For the test suite, use static IDs.
362 w.setStaticID(true); // for testing only 362 w.setStaticID(true); // for testing only
363 w.write(); 363 w.write();
364 - std::cout << whoami << ": new file written to " << outfilename << std::endl; 364 + std::cout << whoami << ": new file written to " << outfilename << '\n';
365 } 365 }
366 366
367 static void 367 static void
368 usage() 368 usage()
369 { 369 {
370 - std::cerr << "\n"  
371 - << "Usage: " << whoami << " [--decode-specialized] infile outfile\n"  
372 - << std::endl; 370 + std::cerr << '\n' << "Usage: " << whoami << " [--decode-specialized] infile outfile\n" << '\n';
373 exit(2); 371 exit(2);
374 } 372 }
375 373
@@ -404,7 +402,7 @@ main(int argc, char* argv[]) @@ -404,7 +402,7 @@ main(int argc, char* argv[])
404 // Do the actual processing. 402 // Do the actual processing.
405 process(infilename, outfilename, decode_specialized); 403 process(infilename, outfilename, decode_specialized);
406 } catch (std::exception& e) { 404 } catch (std::exception& e) {
407 - std::cerr << whoami << ": exception: " << e.what() << std::endl; 405 + std::cerr << whoami << ": exception: " << e.what() << '\n';
408 exit(2); 406 exit(2);
409 } 407 }
410 408
examples/pdf-double-page-size.cc
@@ -13,8 +13,8 @@ static char const* whoami = nullptr; @@ -13,8 +13,8 @@ static char const* whoami = nullptr;
13 void 13 void
14 usage() 14 usage()
15 { 15 {
16 - std::cerr << "Usage: " << whoami << " infile.pdf outfile.pdf [in-password]" << std::endl  
17 - << "Double size of all pages in infile.pdf; write output to outfile.pdf" << std::endl; 16 + std::cerr << "Usage: " << whoami << " infile.pdf outfile.pdf [in-password]\n"
  17 + << "Double size of all pages in infile.pdf; write output to outfile.pdf\n";
18 exit(2); 18 exit(2);
19 } 19 }
20 20
@@ -87,9 +87,9 @@ main(int argc, char* argv[]) @@ -87,9 +87,9 @@ main(int argc, char* argv[])
87 w.setStreamDataMode(qpdf_s_uncompress); 87 w.setStreamDataMode(qpdf_s_uncompress);
88 } 88 }
89 w.write(); 89 w.write();
90 - std::cout << whoami << ": new file written to " << outfilename << std::endl; 90 + std::cout << whoami << ": new file written to " << outfilename << '\n';
91 } catch (std::exception& e) { 91 } catch (std::exception& e) {
92 - std::cerr << whoami << " processing file " << infilename << ": " << e.what() << std::endl; 92 + std::cerr << whoami << " processing file " << infilename << ": " << e.what() << '\n';
93 exit(2); 93 exit(2);
94 } 94 }
95 95
examples/pdf-filter-tokens.cc
@@ -20,8 +20,8 @@ static char const* whoami = nullptr; @@ -20,8 +20,8 @@ static char const* whoami = nullptr;
20 void 20 void
21 usage() 21 usage()
22 { 22 {
23 - std::cerr << "Usage: " << whoami << " infile outfile" << std::endl  
24 - << "Applies token filters to infile and writes outfile" << std::endl; 23 + std::cerr << "Usage: " << whoami << " infile outfile\n"
  24 + << "Applies token filters to infile and writes outfile\n";
25 exit(2); 25 exit(2);
26 } 26 }
27 27
@@ -184,7 +184,7 @@ main(int argc, char* argv[]) @@ -184,7 +184,7 @@ main(int argc, char* argv[])
184 w.setQDFMode(true); 184 w.setQDFMode(true);
185 w.write(); 185 w.write();
186 } catch (std::exception& e) { 186 } catch (std::exception& e) {
187 - std::cerr << whoami << ": " << e.what() << std::endl; 187 + std::cerr << whoami << ": " << e.what() << '\n';
188 exit(2); 188 exit(2);
189 } 189 }
190 190
examples/pdf-invert-images.cc
@@ -14,8 +14,8 @@ static char const* whoami = nullptr; @@ -14,8 +14,8 @@ static char const* whoami = nullptr;
14 void 14 void
15 usage() 15 usage()
16 { 16 {
17 - std::cerr << "Usage: " << whoami << " infile.pdf outfile.pdf [in-password]" << std::endl  
18 - << "Invert some images in infile.pdf; write output to outfile.pdf" << std::endl; 17 + std::cerr << "Usage: " << whoami << " infile.pdf outfile.pdf [in-password]\n"
  18 + << "Invert some images in infile.pdf; write output to outfile.pdf\n";
19 exit(2); 19 exit(2);
20 } 20 }
21 21
@@ -52,7 +52,7 @@ ImageInverter::registerImage( @@ -52,7 +52,7 @@ ImageInverter::registerImage(
52 // Store information about the images based on the object and generation number. Recall that a 52 // Store information about the images based on the object and generation number. Recall that a
53 // single image object may be used more than once, so no need to update the same stream multiple 53 // single image object may be used more than once, so no need to update the same stream multiple
54 // times. 54 // times.
55 - if (this->copied_images.count(og) > 0) { 55 + if (copied_images.contains(og)) {
56 return; 56 return;
57 } 57 }
58 this->copied_images[og] = image.copyStream(); 58 this->copied_images[og] = image.copyStream();
@@ -137,9 +137,9 @@ main(int argc, char* argv[]) @@ -137,9 +137,9 @@ main(int argc, char* argv[])
137 w.setStaticID(true); // for testing only 137 w.setStaticID(true); // for testing only
138 } 138 }
139 w.write(); 139 w.write();
140 - std::cout << whoami << ": new file written to " << outfilename << std::endl; 140 + std::cout << whoami << ": new file written to " << outfilename << '\n';
141 } catch (std::exception& e) { 141 } catch (std::exception& e) {
142 - std::cerr << whoami << " processing file " << infilename << ": " << e.what() << std::endl; 142 + std::cerr << whoami << " processing file " << infilename << ": " << e.what() << '\n';
143 exit(2); 143 exit(2);
144 } 144 }
145 145
examples/pdf-mod-info.cc
@@ -39,7 +39,7 @@ dumpInfoDict(QPDF&amp; pdf, std::ostream&amp; os = std::cout, std::string const&amp; sep = &quot; @@ -39,7 +39,7 @@ dumpInfoDict(QPDF&amp; pdf, std::ostream&amp; os = std::cout, std::string const&amp; sep = &quot;
39 { 39 {
40 val = it.second.unparseResolved(); 40 val = it.second.unparseResolved();
41 } 41 }
42 - os << it.first.substr(1) << sep << val << std::endl; // skip '/' 42 + os << it.first.substr(1) << sep << val << '\n'; // skip '/'
43 } 43 }
44 } 44 }
45 } 45 }
@@ -52,7 +52,7 @@ pdfDumpInfoDict(char const* fname) @@ -52,7 +52,7 @@ pdfDumpInfoDict(char const* fname)
52 pdf.processFile(fname); 52 pdf.processFile(fname);
53 dumpInfoDict(pdf); 53 dumpInfoDict(pdf);
54 } catch (std::exception& e) { 54 } catch (std::exception& e) {
55 - std::cerr << e.what() << std::endl; 55 + std::cerr << e.what() << '\n';
56 exit(2); 56 exit(2);
57 } 57 }
58 } 58 }
@@ -66,7 +66,7 @@ main(int argc, char* argv[]) @@ -66,7 +66,7 @@ main(int argc, char* argv[])
66 whoami = QUtil::getWhoami(argv[0]); 66 whoami = QUtil::getWhoami(argv[0]);
67 67
68 if ((argc == 2) && (!strcmp(argv[1], "--version"))) { 68 if ((argc == 2) && (!strcmp(argv[1], "--version"))) {
69 - std::cout << whoami << " version " << version << std::endl; 69 + std::cout << whoami << " version " << version << '\n';
70 exit(0); 70 exit(0);
71 } 71 }
72 if ((argc == 3) && (!strcmp(argv[1], "--dump"))) { 72 if ((argc == 3) && (!strcmp(argv[1], "--dump"))) {
@@ -90,11 +90,11 @@ main(int argc, char* argv[]) @@ -90,11 +90,11 @@ main(int argc, char* argv[])
90 } else if ((!strcmp(argv[i], "--key")) && (++i < argc)) { 90 } else if ((!strcmp(argv[i], "--key")) && (++i < argc)) {
91 QTC::TC("examples", "pdf-mod-info -key"); 91 QTC::TC("examples", "pdf-mod-info -key");
92 cur_key = argv[i]; 92 cur_key = argv[i];
93 - if (!((cur_key.length() > 0) && (cur_key.at(0) == '/'))) { 93 + if (cur_key.empty() || cur_key.at(0) != '/') {
94 cur_key = "/" + cur_key; 94 cur_key = "/" + cur_key;
95 } 95 }
96 Keys[cur_key] = ""; 96 Keys[cur_key] = "";
97 - } else if ((!strcmp(argv[i], "--val")) && (++i < argc)) { 97 + } else if (!strcmp(argv[i], "--val") && ++i < argc) {
98 if (cur_key.empty()) { 98 if (cur_key.empty()) {
99 QTC::TC("examples", "pdf-mod-info usage wrong val"); 99 QTC::TC("examples", "pdf-mod-info usage wrong val");
100 usage(); 100 usage();
@@ -115,7 +115,7 @@ main(int argc, char* argv[]) @@ -115,7 +115,7 @@ main(int argc, char* argv[])
115 QTC::TC("examples", "pdf-mod-info in-place"); 115 QTC::TC("examples", "pdf-mod-info in-place");
116 fl_out = fl_in; 116 fl_out = fl_in;
117 } 117 }
118 - if (Keys.size() == 0) { 118 + if (Keys.empty()) {
119 QTC::TC("examples", "pdf-mod-info no keys"); 119 QTC::TC("examples", "pdf-mod-info no keys");
120 usage(); 120 usage();
121 } 121 }
@@ -141,7 +141,7 @@ main(int argc, char* argv[]) @@ -141,7 +141,7 @@ main(int argc, char* argv[])
141 filetrailer.replaceKey("/Info", fileinfo); 141 filetrailer.replaceKey("/Info", fileinfo);
142 } 142 }
143 } 143 }
144 - if (it.second == "") { 144 + if (it.second.empty()) {
145 fileinfo.removeKey(it.first); 145 fileinfo.removeKey(it.first);
146 } else { 146 } else {
147 QPDFObjectHandle elt = fileinfo.newString(it.second); 147 QPDFObjectHandle elt = fileinfo.newString(it.second);
@@ -155,7 +155,7 @@ main(int argc, char* argv[]) @@ -155,7 +155,7 @@ main(int argc, char* argv[])
155 w.setStaticID(static_id); // for testing only 155 w.setStaticID(static_id); // for testing only
156 w.write(); 156 w.write();
157 } catch (std::exception& e) { 157 } catch (std::exception& e) {
158 - std::cerr << e.what() << std::endl; 158 + std::cerr << e.what() << '\n';
159 exit(2); 159 exit(2);
160 } 160 }
161 161
@@ -164,7 +164,7 @@ main(int argc, char* argv[]) @@ -164,7 +164,7 @@ main(int argc, char* argv[])
164 QUtil::os_wrapper( 164 QUtil::os_wrapper(
165 "rename " + fl_tmp + " " + std::string(fl_out), rename(fl_tmp.c_str(), fl_out)); 165 "rename " + fl_tmp + " " + std::string(fl_out), rename(fl_tmp.c_str(), fl_out));
166 } catch (std::exception& e) { 166 } catch (std::exception& e) {
167 - std::cerr << e.what() << std::endl; 167 + std::cerr << e.what() << '\n';
168 exit(2); 168 exit(2);
169 } 169 }
170 170
examples/pdf-name-number-tree.cc
@@ -10,8 +10,8 @@ static char const* whoami = nullptr; @@ -10,8 +10,8 @@ static char const* whoami = nullptr;
10 void 10 void
11 usage() 11 usage()
12 { 12 {
13 - std::cerr << "Usage: " << whoami << " outfile.pdf" << std::endl  
14 - << "Create some name/number trees and write to a file" << std::endl; 13 + std::cerr << "Usage: " << whoami << " outfile.pdf" << '\n'
  14 + << "Create some name/number trees and write to a file\n";
15 exit(2); 15 exit(2);
16 } 16 }
17 17
@@ -57,64 +57,63 @@ main(int argc, char* argv[]) @@ -57,64 +57,63 @@ main(int argc, char* argv[])
57 name_tree.insert("N", QPDFObjectHandle::newUnicodeString("knight")); 57 name_tree.insert("N", QPDFObjectHandle::newUnicodeString("knight"));
58 auto iter = name_tree.insert("P", QPDFObjectHandle::newUnicodeString("pawn")); 58 auto iter = name_tree.insert("P", QPDFObjectHandle::newUnicodeString("pawn"));
59 // Look at the iterator 59 // Look at the iterator
60 - std::cout << "just inserted " << iter->first << " -> " << iter->second.unparse() << std::endl; 60 + std::cout << "just inserted " << iter->first << " -> " << iter->second.unparse() << '\n';
61 --iter; 61 --iter;
62 - std::cout << "predecessor: " << iter->first << " -> " << iter->second.unparse() << std::endl; 62 + std::cout << "predecessor: " << iter->first << " -> " << iter->second.unparse() << '\n';
63 ++iter; 63 ++iter;
64 ++iter; 64 ++iter;
65 - std::cout << "successor: " << iter->first << " -> " << iter->second.unparse() << std::endl; 65 + std::cout << "successor: " << iter->first << " -> " << iter->second.unparse() << '\n';
66 66
67 // Use range-for iteration 67 // Use range-for iteration
68 - std::cout << "Name tree items:" << std::endl; 68 + std::cout << "Name tree items:\n";
69 for (auto i: name_tree) { 69 for (auto i: name_tree) {
70 - std::cout << " " << i.first << " -> " << i.second.unparse() << std::endl; 70 + std::cout << " " << i.first << " -> " << i.second.unparse() << '\n';
71 } 71 }
72 72
73 // This is a small tree, so everything will be at the root. We can look at it using dictionary 73 // This is a small tree, so everything will be at the root. We can look at it using dictionary
74 // and array iterators. 74 // and array iterators.
75 - std::cout << "Keys in name tree object:" << std::endl; 75 + std::cout << "Keys in name tree object:\n";
76 QPDFObjectHandle names; 76 QPDFObjectHandle names;
77 for (auto const& i: name_tree_oh.ditems()) { 77 for (auto const& i: name_tree_oh.ditems()) {
78 - std::cout << i.first << std::endl; 78 + std::cout << i.first << '\n';
79 if (i.first == "/Names") { 79 if (i.first == "/Names") {
80 names = i.second; 80 names = i.second;
81 } 81 }
82 } 82 }
83 // Values in names array: 83 // Values in names array:
84 - std::cout << "Values in names:" << std::endl; 84 + std::cout << "Values in names:\n";
85 for (auto& i: names.aitems()) { 85 for (auto& i: names.aitems()) {
86 - std::cout << " " << i.unparse() << std::endl; 86 + std::cout << " " << i.unparse() << '\n';
87 } 87 }
88 88
89 // pre 10.2 API 89 // pre 10.2 API
90 - std::cout << "Has Q?: " << name_tree.hasName("Q") << std::endl;  
91 - std::cout << "Has W?: " << name_tree.hasName("W") << std::endl; 90 + std::cout << "Has Q?: " << name_tree.hasName("Q") << '\n';
  91 + std::cout << "Has W?: " << name_tree.hasName("W") << '\n';
92 QPDFObjectHandle obj; 92 QPDFObjectHandle obj;
93 - std::cout << "Found W?: " << name_tree.findObject("W", obj) << std::endl;  
94 - std::cout << "Found Q?: " << name_tree.findObject("Q", obj) << std::endl;  
95 - std::cout << "Q: " << obj.unparse() << std::endl; 93 + std::cout << "Found W?: " << name_tree.findObject("W", obj) << '\n';
  94 + std::cout << "Found Q?: " << name_tree.findObject("Q", obj) << '\n';
  95 + std::cout << "Q: " << obj.unparse() << '\n';
96 96
97 // 10.2 API 97 // 10.2 API
98 iter = name_tree.find("Q"); 98 iter = name_tree.find("Q");
99 - std::cout << "Q: " << iter->first << " -> " << iter->second.unparse() << std::endl; 99 + std::cout << "Q: " << iter->first << " -> " << iter->second.unparse() << '\n';
100 iter = name_tree.find("W"); 100 iter = name_tree.find("W");
101 - std::cout << "W found: " << (iter != name_tree.end()) << std::endl; 101 + std::cout << "W found: " << (iter != name_tree.end()) << '\n';
102 // Allow find to return predecessor 102 // Allow find to return predecessor
103 iter = name_tree.find("W", true); 103 iter = name_tree.find("W", true);
104 - std::cout << "W's predecessor: " << iter->first << " -> " << iter->second.unparse()  
105 - << std::endl; 104 + std::cout << "W's predecessor: " << iter->first << " -> " << iter->second.unparse() << '\n';
106 105
107 // We can also remove items 106 // We can also remove items
108 - std::cout << "Remove P: " << name_tree.remove("P", &obj) << std::endl;  
109 - std::cout << "Value removed: " << obj.unparse() << std::endl;  
110 - std::cout << "Has P?: " << name_tree.hasName("P") << std::endl; 107 + std::cout << "Remove P: " << name_tree.remove("P", &obj) << '\n';
  108 + std::cout << "Value removed: " << obj.unparse() << '\n';
  109 + std::cout << "Has P?: " << name_tree.hasName("P") << '\n';
111 // Or we can remove using an iterator 110 // Or we can remove using an iterator
112 iter = name_tree.find("K"); 111 iter = name_tree.find("K");
113 - std::cout << "Find K: " << iter->second.unparse() << std::endl; 112 + std::cout << "Find K: " << iter->second.unparse() << '\n';
114 iter.remove(); 113 iter.remove();
115 std::cout << "Iter after removing K: " << iter->first << " -> " << iter->second.unparse() 114 std::cout << "Iter after removing K: " << iter->first << " -> " << iter->second.unparse()
116 - << std::endl;  
117 - std::cout << "Has K?: " << name_tree.hasName("K") << std::endl; 115 + << '\n';
  116 + std::cout << "Has K?: " << name_tree.hasName("K") << '\n';
118 117
119 // Illustrate some more advanced usage using number trees. These calls work for name trees too. 118 // Illustrate some more advanced usage using number trees. These calls work for name trees too.
120 119
@@ -129,14 +128,14 @@ main(int argc, char* argv[]) @@ -129,14 +128,14 @@ main(int argc, char* argv[])
129 for (int i = 7; i <= 350; i += 7) { 128 for (int i = 7; i <= 350; i += 7) {
130 iter2.insertAfter(i, QPDFObjectHandle::newString("-" + std::to_string(i) + "-")); 129 iter2.insertAfter(i, QPDFObjectHandle::newString("-" + std::to_string(i) + "-"));
131 } 130 }
132 - std::cout << "Numbers:" << std::endl; 131 + std::cout << "Numbers:\n";
133 int n = 1; 132 int n = 1;
134 for (auto& i: number_tree) { 133 for (auto& i: number_tree) {
135 std::cout << i.first << " -> " << i.second.getUTF8Value(); 134 std::cout << i.first << " -> " << i.second.getUTF8Value();
136 if (n % 5) { 135 if (n % 5) {
137 std::cout << ", "; 136 std::cout << ", ";
138 } else { 137 } else {
139 - std::cout << std::endl; 138 + std::cout << '\n';
140 } 139 }
141 ++n; 140 ++n;
142 } 141 }
@@ -151,14 +150,14 @@ main(int argc, char* argv[]) @@ -151,14 +150,14 @@ main(int argc, char* argv[])
151 ++iter2; 150 ++iter2;
152 } 151 }
153 } 152 }
154 - std::cout << "Numbers after filtering:" << std::endl; 153 + std::cout << "Numbers after filtering:\n";
155 n = 1; 154 n = 1;
156 for (auto& i: number_tree) { 155 for (auto& i: number_tree) {
157 std::cout << i.first << " -> " << i.second.getUTF8Value(); 156 std::cout << i.first << " -> " << i.second.getUTF8Value();
158 if (n % 5) { 157 if (n % 5) {
159 std::cout << ", "; 158 std::cout << ", ";
160 } else { 159 } else {
161 - std::cout << std::endl; 160 + std::cout << '\n';
162 } 161 }
163 ++n; 162 ++n;
164 } 163 }
examples/pdf-npages.cc
@@ -10,8 +10,8 @@ static char const* whoami = nullptr; @@ -10,8 +10,8 @@ static char const* whoami = nullptr;
10 void 10 void
11 usage() 11 usage()
12 { 12 {
13 - std::cerr << "Usage: " << whoami << " filename" << std::endl  
14 - << "Prints the number of pages in filename" << std::endl; 13 + std::cerr << "Usage: " << whoami << " filename\n"
  14 + << "Prints the number of pages in filename\n";
15 exit(2); 15 exit(2);
16 } 16 }
17 17
@@ -21,7 +21,7 @@ main(int argc, char* argv[]) @@ -21,7 +21,7 @@ main(int argc, char* argv[])
21 whoami = QUtil::getWhoami(argv[0]); 21 whoami = QUtil::getWhoami(argv[0]);
22 22
23 if ((argc == 2) && (strcmp(argv[1], "--version") == 0)) { 23 if ((argc == 2) && (strcmp(argv[1], "--version") == 0)) {
24 - std::cout << whoami << " version 1.3" << std::endl; 24 + std::cout << whoami << " version 1.3\n";
25 exit(0); 25 exit(0);
26 } 26 }
27 27
@@ -36,9 +36,9 @@ main(int argc, char* argv[]) @@ -36,9 +36,9 @@ main(int argc, char* argv[])
36 QPDFObjectHandle root = pdf.getRoot(); 36 QPDFObjectHandle root = pdf.getRoot();
37 QPDFObjectHandle pages = root.getKey("/Pages"); 37 QPDFObjectHandle pages = root.getKey("/Pages");
38 QPDFObjectHandle count = pages.getKey("/Count"); 38 QPDFObjectHandle count = pages.getKey("/Count");
39 - std::cout << count.getIntValue() << std::endl; 39 + std::cout << count.getIntValue() << '\n';
40 } catch (std::exception& e) { 40 } catch (std::exception& e) {
41 - std::cerr << whoami << ": " << e.what() << std::endl; 41 + std::cerr << whoami << ": " << e.what() << '\n';
42 exit(2); 42 exit(2);
43 } 43 }
44 44
examples/pdf-overlay-page.cc
@@ -15,9 +15,8 @@ static char const* whoami = nullptr; @@ -15,9 +15,8 @@ static char const* whoami = nullptr;
15 void 15 void
16 usage() 16 usage()
17 { 17 {
18 - std::cerr << "Usage: " << whoami << " infile pagefile outfile" << std::endl  
19 - << "Stamp page 1 of pagefile on every page of infile, writing to outfile"  
20 - << std::endl; 18 + std::cerr << "Usage: " << whoami << " infile pagefile outfile\n"
  19 + << "Stamp page 1 of pagefile on every page of infile, writing to outfile\n";
21 exit(2); 20 exit(2);
22 } 21 }
23 22
@@ -81,7 +80,7 @@ main(int argc, char* argv[]) @@ -81,7 +80,7 @@ main(int argc, char* argv[])
81 try { 80 try {
82 stamp_page(infile, stampfile, outfile); 81 stamp_page(infile, stampfile, outfile);
83 } catch (std::exception& e) { 82 } catch (std::exception& e) {
84 - std::cerr << whoami << ": " << e.what() << std::endl; 83 + std::cerr << whoami << ": " << e.what() << '\n';
85 exit(2); 84 exit(2);
86 } 85 }
87 return 0; 86 return 0;
examples/pdf-parse-content.cc
@@ -12,10 +12,10 @@ static char const* whoami = nullptr; @@ -12,10 +12,10 @@ static char const* whoami = nullptr;
12 void 12 void
13 usage() 13 usage()
14 { 14 {
15 - std::cerr << "Usage: " << whoami << " filename page-number" << std::endl  
16 - << "Prints a dump of the objects in the content streams of the given page."  
17 - << std::endl  
18 - << "Pages are numbered from 1." << std::endl; 15 + std::cerr << "Usage: " << whoami << " filename page-number\n"
  16 + << "Prints a dump of the objects in the content streams of the given page.\n"
  17 + << '\n'
  18 + << "Pages are numbered from 1.\n";
19 exit(2); 19 exit(2);
20 } 20 }
21 21
@@ -31,7 +31,7 @@ class ParserCallbacks: public QPDFObjectHandle::ParserCallbacks @@ -31,7 +31,7 @@ class ParserCallbacks: public QPDFObjectHandle::ParserCallbacks
31 void 31 void
32 ParserCallbacks::contentSize(size_t size) 32 ParserCallbacks::contentSize(size_t size)
33 { 33 {
34 - std::cout << "content size: " << size << std::endl; 34 + std::cout << "content size: " << size << '\n';
35 } 35 }
36 36
37 void 37 void
@@ -39,16 +39,16 @@ ParserCallbacks::handleObject(QPDFObjectHandle obj, size_t offset, size_t length @@ -39,16 +39,16 @@ ParserCallbacks::handleObject(QPDFObjectHandle obj, size_t offset, size_t length
39 { 39 {
40 std::cout << obj.getTypeName() << ", offset=" << offset << ", length=" << length << ": "; 40 std::cout << obj.getTypeName() << ", offset=" << offset << ", length=" << length << ": ";
41 if (obj.isInlineImage()) { 41 if (obj.isInlineImage()) {
42 - std::cout << QUtil::hex_encode(obj.getInlineImageValue()) << std::endl; 42 + std::cout << QUtil::hex_encode(obj.getInlineImageValue()) << '\n';
43 } else { 43 } else {
44 - std::cout << obj.unparse() << std::endl; 44 + std::cout << obj.unparse() << '\n';
45 } 45 }
46 } 46 }
47 47
48 void 48 void
49 ParserCallbacks::handleEOF() 49 ParserCallbacks::handleEOF()
50 { 50 {
51 - std::cout << "-EOF-" << std::endl; 51 + std::cout << "-EOF-\n";
52 } 52 }
53 53
54 int 54 int
@@ -74,7 +74,7 @@ main(int argc, char* argv[]) @@ -74,7 +74,7 @@ main(int argc, char* argv[])
74 ParserCallbacks cb; 74 ParserCallbacks cb;
75 page.parseContents(&cb); 75 page.parseContents(&cb);
76 } catch (std::exception& e) { 76 } catch (std::exception& e) {
77 - std::cerr << whoami << ": " << e.what() << std::endl; 77 + std::cerr << whoami << ": " << e.what() << '\n';
78 exit(2); 78 exit(2);
79 } 79 }
80 80
examples/pdf-set-form-values.cc
@@ -11,8 +11,8 @@ static char const* whoami = nullptr; @@ -11,8 +11,8 @@ static char const* whoami = nullptr;
11 void 11 void
12 usage() 12 usage()
13 { 13 {
14 - std::cerr << "Usage: " << whoami << " infile.pdf outfile.pdf value" << std::endl  
15 - << "Set the value of all text fields to a specified value" << std::endl; 14 + std::cerr << "Usage: " << whoami << " infile.pdf outfile.pdf value\n"
  15 + << "Set the value of all text fields to a specified value\n";
16 exit(2); 16 exit(2);
17 } 17 }
18 18
@@ -68,7 +68,7 @@ main(int argc, char* argv[]) @@ -68,7 +68,7 @@ main(int argc, char* argv[])
68 w.setStaticID(true); // for testing only 68 w.setStaticID(true); // for testing only
69 w.write(); 69 w.write();
70 } catch (std::exception& e) { 70 } catch (std::exception& e) {
71 - std::cerr << whoami << " processing file " << infilename << ": " << e.what() << std::endl; 71 + std::cerr << whoami << " processing file " << infilename << ": " << e.what() << '\n';
72 exit(2); 72 exit(2);
73 } 73 }
74 74
examples/pdf-split-pages.cc
@@ -42,7 +42,7 @@ process(char const* whoami, char const* infile, std::string outprefix) @@ -42,7 +42,7 @@ process(char const* whoami, char const* infile, std::string outprefix)
42 void 42 void
43 usage(char const* whoami) 43 usage(char const* whoami)
44 { 44 {
45 - std::cerr << "Usage: " << whoami << " infile outprefix" << std::endl; 45 + std::cerr << "Usage: " << whoami << " infile outprefix\n";
46 exit(2); 46 exit(2);
47 } 47 }
48 48
@@ -64,7 +64,7 @@ main(int argc, char* argv[]) @@ -64,7 +64,7 @@ main(int argc, char* argv[])
64 try { 64 try {
65 process(whoami, argv[1], argv[2]); 65 process(whoami, argv[1], argv[2]);
66 } catch (std::exception const& e) { 66 } catch (std::exception const& e) {
67 - std::cerr << whoami << ": exception: " << e.what() << std::endl; 67 + std::cerr << whoami << ": exception: " << e.what() << '\n';
68 return 2; 68 return 2;
69 } 69 }
70 return 0; 70 return 0;
examples/qpdf-job.cc
@@ -10,11 +10,10 @@ static char const* whoami = nullptr; @@ -10,11 +10,10 @@ static char const* whoami = nullptr;
10 static void 10 static void
11 usage() 11 usage()
12 { 12 {
13 - std::cerr << "Usage: " << whoami << std::endl 13 + std::cerr << "Usage: " << whoami << '\n'
14 << "This program linearizes the first page of in.pdf to out1.pdf, out2.pdf, and" 14 << "This program linearizes the first page of in.pdf to out1.pdf, out2.pdf, and"
15 - << std::endl  
16 - << " out3.pdf, each demonstrating a different way to use the QPDFJob API"  
17 - << std::endl; 15 + << '\n'
  16 + << " out3.pdf, each demonstrating a different way to use the QPDFJob API" << '\n';
18 exit(2); 17 exit(2);
19 } 18 }
20 19
@@ -49,9 +48,9 @@ main(int argc, char* argv[]) @@ -49,9 +48,9 @@ main(int argc, char* argv[])
49 ->compressStreams("n") // avoid dependency on zlib output 48 ->compressStreams("n") // avoid dependency on zlib output
50 ->checkConfiguration(); 49 ->checkConfiguration();
51 j.run(); 50 j.run();
52 - std::cout << "out1 status: " << j.getExitCode() << std::endl; 51 + std::cout << "out1 status: " << j.getExitCode() << '\n';
53 } catch (std::exception& e) { 52 } catch (std::exception& e) {
54 - std::cerr << "exception: " << e.what() << std::endl; 53 + std::cerr << "exception: " << e.what() << '\n';
55 return 2; 54 return 2;
56 } 55 }
57 56
@@ -71,9 +70,9 @@ main(int argc, char* argv[]) @@ -71,9 +70,9 @@ main(int argc, char* argv[])
71 QPDFJob j; 70 QPDFJob j;
72 j.initializeFromArgv(new_argv); 71 j.initializeFromArgv(new_argv);
73 j.run(); 72 j.run();
74 - std::cout << "out2 status: " << j.getExitCode() << std::endl; 73 + std::cout << "out2 status: " << j.getExitCode() << '\n';
75 } catch (std::exception& e) { 74 } catch (std::exception& e) {
76 - std::cerr << "exception: " << e.what() << std::endl; 75 + std::cerr << "exception: " << e.what() << '\n';
77 return 2; 76 return 2;
78 } 77 }
79 78
@@ -95,9 +94,9 @@ main(int argc, char* argv[]) @@ -95,9 +94,9 @@ main(int argc, char* argv[])
95 } 94 }
96 )"); 95 )");
97 j.run(); 96 j.run();
98 - std::cout << "out3 status: " << j.getExitCode() << std::endl; 97 + std::cout << "out3 status: " << j.getExitCode() << '\n';
99 } catch (std::exception& e) { 98 } catch (std::exception& e) {
100 - std::cerr << "exception: " << e.what() << std::endl; 99 + std::cerr << "exception: " << e.what() << '\n';
101 return 2; 100 return 2;
102 } 101 }
103 102
examples/qpdfjob-save-attachment.cc
@@ -13,7 +13,7 @@ main(int argc, char* argv[]) @@ -13,7 +13,7 @@ main(int argc, char* argv[])
13 auto whoami = QUtil::getWhoami(argv[0]); 13 auto whoami = QUtil::getWhoami(argv[0]);
14 14
15 if (argc != 4) { 15 if (argc != 4) {
16 - std::cerr << "Usage: " << whoami << " file attachment-key outfile" << std::endl; 16 + std::cerr << "Usage: " << whoami << " file attachment-key outfile" << '\n';
17 exit(2); 17 exit(2);
18 } 18 }
19 19
@@ -40,10 +40,10 @@ main(int argc, char* argv[]) @@ -40,10 +40,10 @@ main(int argc, char* argv[])
40 j.initializeFromArgv(j_argv); 40 j.initializeFromArgv(j_argv);
41 j.run(); 41 j.run();
42 } catch (std::exception& e) { 42 } catch (std::exception& e) {
43 - std::cerr << whoami << ": " << e.what() << std::endl; 43 + std::cerr << whoami << ": " << e.what() << '\n';
44 exit(2); 44 exit(2);
45 } 45 }
46 46
47 - std::cout << whoami << ": wrote attachment to " << outfilename << std::endl; 47 + std::cout << whoami << ": wrote attachment to " << outfilename << '\n';
48 return 0; 48 return 0;
49 } 49 }
fuzz/ascii85_fuzzer.cc
@@ -37,7 +37,7 @@ FuzzHelper::run() @@ -37,7 +37,7 @@ FuzzHelper::run()
37 try { 37 try {
38 doChecks(); 38 doChecks();
39 } catch (std::runtime_error const& e) { 39 } catch (std::runtime_error const& e) {
40 - std::cerr << "runtime_error: " << e.what() << std::endl; 40 + std::cerr << "runtime_error: " << e.what() << '\n';
41 } 41 }
42 } 42 }
43 43
fuzz/dct_fuzzer.cc
@@ -49,7 +49,7 @@ FuzzHelper::run() @@ -49,7 +49,7 @@ FuzzHelper::run()
49 try { 49 try {
50 doChecks(); 50 doChecks();
51 } catch (std::runtime_error const& e) { 51 } catch (std::runtime_error const& e) {
52 - std::cerr << "runtime_error: " << e.what() << std::endl; 52 + std::cerr << "runtime_error: " << e.what() << '\n';
53 } 53 }
54 } 54 }
55 55
fuzz/flate_fuzzer.cc
@@ -37,7 +37,7 @@ FuzzHelper::run() @@ -37,7 +37,7 @@ FuzzHelper::run()
37 try { 37 try {
38 doChecks(); 38 doChecks();
39 } catch (std::runtime_error const& e) { 39 } catch (std::runtime_error const& e) {
40 - std::cerr << "runtime_error: " << e.what() << std::endl; 40 + std::cerr << "runtime_error: " << e.what() << '\n';
41 } 41 }
42 } 42 }
43 43
fuzz/hex_fuzzer.cc
@@ -37,7 +37,7 @@ FuzzHelper::run() @@ -37,7 +37,7 @@ FuzzHelper::run()
37 try { 37 try {
38 doChecks(); 38 doChecks();
39 } catch (std::runtime_error const& e) { 39 } catch (std::runtime_error const& e) {
40 - std::cerr << "runtime_error: " << e.what() << std::endl; 40 + std::cerr << "runtime_error: " << e.what() << '\n';
41 } 41 }
42 } 42 }
43 43
fuzz/json_fuzzer.cc
@@ -30,7 +30,7 @@ FuzzHelper::doChecks() @@ -30,7 +30,7 @@ FuzzHelper::doChecks()
30 try { 30 try {
31 JSON::parse(std::string(reinterpret_cast<char const*>(data), size)); 31 JSON::parse(std::string(reinterpret_cast<char const*>(data), size));
32 } catch (std::runtime_error& e) { 32 } catch (std::runtime_error& e) {
33 - std::cerr << "runtime_error parsing json: " << e.what() << std::endl; 33 + std::cerr << "runtime_error parsing json: " << e.what() << '\n';
34 } 34 }
35 QPDF q; 35 QPDF q;
36 q.setMaxWarnings(1000); 36 q.setMaxWarnings(1000);
@@ -45,7 +45,7 @@ FuzzHelper::run() @@ -45,7 +45,7 @@ FuzzHelper::run()
45 try { 45 try {
46 doChecks(); 46 doChecks();
47 } catch (std::runtime_error const& e) { 47 } catch (std::runtime_error const& e) {
48 - std::cerr << "runtime_error: " << e.what() << std::endl; 48 + std::cerr << "runtime_error: " << e.what() << '\n';
49 } 49 }
50 } 50 }
51 51
fuzz/lzw_fuzzer.cc
@@ -37,7 +37,7 @@ FuzzHelper::run() @@ -37,7 +37,7 @@ FuzzHelper::run()
37 try { 37 try {
38 doChecks(); 38 doChecks();
39 } catch (std::runtime_error const& e) { 39 } catch (std::runtime_error const& e) {
40 - std::cerr << "runtime_error: " << e.what() << std::endl; 40 + std::cerr << "runtime_error: " << e.what() << '\n';
41 } 41 }
42 } 42 }
43 43
fuzz/pngpredictor_fuzzer.cc
@@ -37,7 +37,7 @@ FuzzHelper::run() @@ -37,7 +37,7 @@ FuzzHelper::run()
37 try { 37 try {
38 doChecks(); 38 doChecks();
39 } catch (std::runtime_error const& e) { 39 } catch (std::runtime_error const& e) {
40 - std::cerr << "runtime_error: " << e.what() << std::endl; 40 + std::cerr << "runtime_error: " << e.what() << '\n';
41 } 41 }
42 } 42 }
43 43
fuzz/qpdf_crypt_fuzzer.cc
@@ -76,9 +76,9 @@ FuzzHelper::doWrite(std::shared_ptr&lt;QPDFWriter&gt; w) @@ -76,9 +76,9 @@ FuzzHelper::doWrite(std::shared_ptr&lt;QPDFWriter&gt; w)
76 try { 76 try {
77 w->write(); 77 w->write();
78 } catch (QPDFExc const& e) { 78 } catch (QPDFExc const& e) {
79 - std::cerr << e.what() << std::endl; 79 + std::cerr << e.what() << '\n';
80 } catch (std::runtime_error const& e) { 80 } catch (std::runtime_error const& e) {
81 - std::cerr << e.what() << std::endl; 81 + std::cerr << e.what() << '\n';
82 } 82 }
83 } 83 }
84 84
@@ -135,9 +135,9 @@ FuzzHelper::run() @@ -135,9 +135,9 @@ FuzzHelper::run()
135 try { 135 try {
136 doChecks(); 136 doChecks();
137 } catch (QPDFExc const& e) { 137 } catch (QPDFExc const& e) {
138 - std::cerr << "QPDFExc: " << e.what() << std::endl; 138 + std::cerr << "QPDFExc: " << e.what() << '\n';
139 } catch (std::runtime_error const& e) { 139 } catch (std::runtime_error const& e) {
140 - std::cerr << "runtime_error: " << e.what() << std::endl; 140 + std::cerr << "runtime_error: " << e.what() << '\n';
141 } 141 }
142 } 142 }
143 143
fuzz/qpdf_crypt_insecure_fuzzer.cc
@@ -75,9 +75,9 @@ FuzzHelper::doWrite(std::shared_ptr&lt;QPDFWriter&gt; w) @@ -75,9 +75,9 @@ FuzzHelper::doWrite(std::shared_ptr&lt;QPDFWriter&gt; w)
75 try { 75 try {
76 w->write(); 76 w->write();
77 } catch (QPDFExc const& e) { 77 } catch (QPDFExc const& e) {
78 - std::cerr << e.what() << std::endl; 78 + std::cerr << e.what() << '\n';
79 } catch (std::runtime_error const& e) { 79 } catch (std::runtime_error const& e) {
80 - std::cerr << e.what() << std::endl; 80 + std::cerr << e.what() << '\n';
81 } 81 }
82 } 82 }
83 83
@@ -135,9 +135,9 @@ FuzzHelper::run() @@ -135,9 +135,9 @@ FuzzHelper::run()
135 try { 135 try {
136 doChecks(); 136 doChecks();
137 } catch (QPDFExc const& e) { 137 } catch (QPDFExc const& e) {
138 - std::cerr << "QPDFExc: " << e.what() << std::endl; 138 + std::cerr << "QPDFExc: " << e.what() << '\n';
139 } catch (std::runtime_error const& e) { 139 } catch (std::runtime_error const& e) {
140 - std::cerr << "runtime_error: " << e.what() << std::endl; 140 + std::cerr << "runtime_error: " << e.what() << '\n';
141 } 141 }
142 } 142 }
143 143
fuzz/qpdf_fuzzer.cc
@@ -75,9 +75,9 @@ FuzzHelper::doWrite(std::shared_ptr&lt;QPDFWriter&gt; w) @@ -75,9 +75,9 @@ FuzzHelper::doWrite(std::shared_ptr&lt;QPDFWriter&gt; w)
75 try { 75 try {
76 w->write(); 76 w->write();
77 } catch (QPDFExc const& e) { 77 } catch (QPDFExc const& e) {
78 - std::cerr << e.what() << std::endl; 78 + std::cerr << e.what() << '\n';
79 } catch (std::runtime_error const& e) { 79 } catch (std::runtime_error const& e) {
80 - std::cerr << e.what() << std::endl; 80 + std::cerr << e.what() << '\n';
81 } 81 }
82 } 82 }
83 83
@@ -133,9 +133,9 @@ FuzzHelper::run() @@ -133,9 +133,9 @@ FuzzHelper::run()
133 try { 133 try {
134 doChecks(); 134 doChecks();
135 } catch (QPDFExc const& e) { 135 } catch (QPDFExc const& e) {
136 - std::cerr << "QPDFExc: " << e.what() << std::endl; 136 + std::cerr << "QPDFExc: " << e.what() << '\n';
137 } catch (std::runtime_error const& e) { 137 } catch (std::runtime_error const& e) {
138 - std::cerr << "runtime_error: " << e.what() << std::endl; 138 + std::cerr << "runtime_error: " << e.what() << '\n';
139 } 139 }
140 } 140 }
141 141
fuzz/qpdf_lin_fuzzer.cc
@@ -75,9 +75,9 @@ FuzzHelper::doWrite(std::shared_ptr&lt;QPDFWriter&gt; w) @@ -75,9 +75,9 @@ FuzzHelper::doWrite(std::shared_ptr&lt;QPDFWriter&gt; w)
75 try { 75 try {
76 w->write(); 76 w->write();
77 } catch (QPDFExc const& e) { 77 } catch (QPDFExc const& e) {
78 - std::cerr << e.what() << std::endl; 78 + std::cerr << e.what() << '\n';
79 } catch (std::runtime_error const& e) { 79 } catch (std::runtime_error const& e) {
80 - std::cerr << e.what() << std::endl; 80 + std::cerr << e.what() << '\n';
81 } 81 }
82 } 82 }
83 83
@@ -134,9 +134,9 @@ FuzzHelper::run() @@ -134,9 +134,9 @@ FuzzHelper::run()
134 try { 134 try {
135 doChecks(); 135 doChecks();
136 } catch (QPDFExc const& e) { 136 } catch (QPDFExc const& e) {
137 - std::cerr << "QPDFExc: " << e.what() << std::endl; 137 + std::cerr << "QPDFExc: " << e.what() << '\n';
138 } catch (std::runtime_error const& e) { 138 } catch (std::runtime_error const& e) {
139 - std::cerr << "runtime_error: " << e.what() << std::endl; 139 + std::cerr << "runtime_error: " << e.what() << '\n';
140 } 140 }
141 } 141 }
142 142
fuzz/qpdf_outlines_fuzzer.cc
@@ -111,9 +111,9 @@ FuzzHelper::run() @@ -111,9 +111,9 @@ FuzzHelper::run()
111 try { 111 try {
112 doChecks(); 112 doChecks();
113 } catch (QPDFExc const& e) { 113 } catch (QPDFExc const& e) {
114 - std::cerr << "QPDFExc: " << e.what() << std::endl; 114 + std::cerr << "QPDFExc: " << e.what() << '\n';
115 } catch (std::runtime_error const& e) { 115 } catch (std::runtime_error const& e) {
116 - std::cerr << "runtime_error: " << e.what() << std::endl; 116 + std::cerr << "runtime_error: " << e.what() << '\n';
117 } 117 }
118 } 118 }
119 119
fuzz/qpdf_pages_fuzzer.cc
@@ -132,9 +132,9 @@ FuzzHelper::run() @@ -132,9 +132,9 @@ FuzzHelper::run()
132 try { 132 try {
133 doChecks(); 133 doChecks();
134 } catch (QPDFExc const& e) { 134 } catch (QPDFExc const& e) {
135 - std::cerr << "QPDFExc: " << e.what() << std::endl; 135 + std::cerr << "QPDFExc: " << e.what() << '\n';
136 } catch (std::runtime_error const& e) { 136 } catch (std::runtime_error const& e) {
137 - std::cerr << "runtime_error: " << e.what() << std::endl; 137 + std::cerr << "runtime_error: " << e.what() << '\n';
138 } 138 }
139 } 139 }
140 140
fuzz/runlength_fuzzer.cc
@@ -38,7 +38,7 @@ FuzzHelper::run() @@ -38,7 +38,7 @@ FuzzHelper::run()
38 try { 38 try {
39 doChecks(); 39 doChecks();
40 } catch (std::runtime_error const& e) { 40 } catch (std::runtime_error const& e) {
41 - std::cerr << "runtime_error: " << e.what() << std::endl; 41 + std::cerr << "runtime_error: " << e.what() << '\n';
42 } 42 }
43 } 43 }
44 44
fuzz/standalone_fuzz_target_runner.cc
@@ -12,7 +12,7 @@ main(int argc, char** argv) @@ -12,7 +12,7 @@ main(int argc, char** argv)
12 size_t size = 0; 12 size_t size = 0;
13 QUtil::read_file_into_memory(argv[i], file_buf, size); 13 QUtil::read_file_into_memory(argv[i], file_buf, size);
14 LLVMFuzzerTestOneInput(reinterpret_cast<unsigned char*>(file_buf.get()), size); 14 LLVMFuzzerTestOneInput(reinterpret_cast<unsigned char*>(file_buf.get()), size);
15 - std::cout << argv[i] << " successful" << std::endl; 15 + std::cout << argv[i] << " successful" << '\n';
16 } 16 }
17 return 0; 17 return 0;
18 } 18 }
fuzz/tiffpredictor_fuzzer.cc
@@ -41,7 +41,7 @@ FuzzHelper::run() @@ -41,7 +41,7 @@ FuzzHelper::run()
41 try { 41 try {
42 doChecks(); 42 doChecks();
43 } catch (std::runtime_error const& e) { 43 } catch (std::runtime_error const& e) {
44 - std::cerr << "runtime_error: " << e.what() << std::endl; 44 + std::cerr << "runtime_error: " << e.what() << '\n';
45 } 45 }
46 } 46 }
47 47
include/qpdf/ClosedFileInputSource.hh
@@ -69,9 +69,9 @@ class QPDF_DLL_CLASS ClosedFileInputSource: public InputSource @@ -69,9 +69,9 @@ class QPDF_DLL_CLASS ClosedFileInputSource: public InputSource
69 void after(); 69 void after();
70 70
71 std::string filename; 71 std::string filename;
72 - qpdf_offset_t offset; 72 + qpdf_offset_t offset{0};
73 std::shared_ptr<FileInputSource> fis; 73 std::shared_ptr<FileInputSource> fis;
74 - bool stay_open; 74 + bool stay_open{false};
75 }; 75 };
76 76
77 #endif // QPDF_CLOSEDFILEINPUTSOURCE_HH 77 #endif // QPDF_CLOSEDFILEINPUTSOURCE_HH
include/qpdf/QPDFAcroFormDocumentHelper.hh
@@ -234,10 +234,10 @@ class QPDFAcroFormDocumentHelper: public QPDFDocumentHelper @@ -234,10 +234,10 @@ class QPDFAcroFormDocumentHelper: public QPDFDocumentHelper
234 ~Members() = default; 234 ~Members() = default;
235 235
236 private: 236 private:
237 - Members(); 237 + Members() = default;
238 Members(Members const&) = delete; 238 Members(Members const&) = delete;
239 239
240 - bool cache_valid; 240 + bool cache_valid{false};
241 std::map<QPDFObjGen, std::vector<QPDFAnnotationObjectHelper>> field_to_annotations; 241 std::map<QPDFObjGen, std::vector<QPDFAnnotationObjectHelper>> field_to_annotations;
242 std::map<QPDFObjGen, QPDFFormFieldObjectHelper> annotation_to_field; 242 std::map<QPDFObjGen, QPDFFormFieldObjectHelper> annotation_to_field;
243 std::map<QPDFObjGen, std::string> field_to_name; 243 std::map<QPDFObjGen, std::string> field_to_name;
include/qpdf/QPDFJob.hh
@@ -158,10 +158,11 @@ class QPDFJob @@ -158,10 +158,11 @@ class QPDFJob
158 158
159 struct PageSpec 159 struct PageSpec
160 { 160 {
161 - PageSpec(std::string const& filename, char const* password, std::string const& range); 161 + PageSpec(
  162 + std::string const& filename, std::string const& password, std::string const& range);
162 163
163 std::string filename; 164 std::string filename;
164 - std::shared_ptr<char> password; 165 + std::string password;
165 std::string range; 166 std::string range;
166 }; 167 };
167 168
@@ -450,7 +451,7 @@ class QPDFJob @@ -450,7 +451,7 @@ class QPDFJob
450 451
451 std::string which; 452 std::string which;
452 std::string filename; 453 std::string filename;
453 - std::shared_ptr<char> password; 454 + std::string password;
454 std::string to_nr; 455 std::string to_nr;
455 std::string from_nr; 456 std::string from_nr;
456 std::string repeat_nr; 457 std::string repeat_nr;
@@ -591,7 +592,7 @@ class QPDFJob @@ -591,7 +592,7 @@ class QPDFJob
591 bool warnings{false}; 592 bool warnings{false};
592 unsigned long encryption_status{0}; 593 unsigned long encryption_status{0};
593 bool verbose{false}; 594 bool verbose{false};
594 - std::shared_ptr<char> password; 595 + std::string password;
595 bool linearize{false}; 596 bool linearize{false};
596 bool decrypt{false}; 597 bool decrypt{false};
597 bool remove_restrictions{false}; 598 bool remove_restrictions{false};
@@ -602,7 +603,7 @@ class QPDFJob @@ -602,7 +603,7 @@ class QPDFJob
602 bool warnings_exit_zero{false}; 603 bool warnings_exit_zero{false};
603 bool copy_encryption{false}; 604 bool copy_encryption{false};
604 std::string encryption_file; 605 std::string encryption_file;
605 - std::shared_ptr<char> encryption_file_password; 606 + std::string encryption_file_password;
606 bool encrypt{false}; 607 bool encrypt{false};
607 bool password_is_hex_key{false}; 608 bool password_is_hex_key{false};
608 bool suppress_password_recovery{false}; 609 bool suppress_password_recovery{false};
@@ -711,8 +712,9 @@ class QPDFJob @@ -711,8 +712,9 @@ class QPDFJob
711 bool replace_input{false}; 712 bool replace_input{false};
712 bool check_is_encrypted{false}; 713 bool check_is_encrypted{false};
713 bool check_requires_password{false}; 714 bool check_requires_password{false};
714 - std::shared_ptr<char> infilename;  
715 - std::shared_ptr<char> outfilename; 715 + std::string infilename;
  716 + bool empty_input{false};
  717 + std::string outfilename;
716 bool json_input{false}; 718 bool json_input{false};
717 bool json_output{false}; 719 bool json_output{false};
718 std::string update_from_json; 720 std::string update_from_json;
include/qpdf/QPDFObjGen.hh
@@ -110,7 +110,7 @@ class QPDFObjGen @@ -110,7 +110,7 @@ class QPDFObjGen
110 add(QPDFObjGen og) 110 add(QPDFObjGen og)
111 { 111 {
112 if (og.isIndirect()) { 112 if (og.isIndirect()) {
113 - if (count(og) > 0) { 113 + if (count(og)) {
114 return false; 114 return false;
115 } 115 }
116 emplace(og); 116 emplace(og);
libqpdf/AES_PDF_native.cc
@@ -17,8 +17,7 @@ AES_PDF_native::AES_PDF_native( @@ -17,8 +17,7 @@ AES_PDF_native::AES_PDF_native(
17 unsigned char* cbc_block) : 17 unsigned char* cbc_block) :
18 encrypt(encrypt), 18 encrypt(encrypt),
19 cbc_mode(cbc_mode), 19 cbc_mode(cbc_mode),
20 - cbc_block(cbc_block),  
21 - nrounds(0) 20 + cbc_block(cbc_block)
22 { 21 {
23 size_t keybits = 8 * key_bytes; 22 size_t keybits = 8 * key_bytes;
24 this->key = std::make_unique<unsigned char[]>(key_bytes); 23 this->key = std::make_unique<unsigned char[]>(key_bytes);
libqpdf/BitWriter.cc
@@ -5,9 +5,7 @@ @@ -5,9 +5,7 @@
5 #include <qpdf/bits_functions.hh> 5 #include <qpdf/bits_functions.hh>
6 6
7 BitWriter::BitWriter(Pipeline* pl) : 7 BitWriter::BitWriter(Pipeline* pl) :
8 - pl(pl),  
9 - ch(0),  
10 - bit_offset(7) 8 + pl(pl)
11 { 9 {
12 } 10 }
13 11
libqpdf/ClosedFileInputSource.cc
@@ -3,9 +3,7 @@ @@ -3,9 +3,7 @@
3 #include <qpdf/FileInputSource.hh> 3 #include <qpdf/FileInputSource.hh>
4 4
5 ClosedFileInputSource::ClosedFileInputSource(char const* filename) : 5 ClosedFileInputSource::ClosedFileInputSource(char const* filename) :
6 - filename(filename),  
7 - offset(0),  
8 - stay_open(false) 6 + filename(filename)
9 { 7 {
10 } 8 }
11 9
libqpdf/ContentNormalizer.cc
@@ -5,12 +5,6 @@ @@ -5,12 +5,6 @@
5 5
6 using namespace qpdf; 6 using namespace qpdf;
7 7
8 -ContentNormalizer::ContentNormalizer() :  
9 - any_bad_tokens(false),  
10 - last_token_was_bad(false)  
11 -{  
12 -}  
13 -  
14 void 8 void
15 ContentNormalizer::handleToken(QPDFTokenizer::Token const& token) 9 ContentNormalizer::handleToken(QPDFTokenizer::Token const& token)
16 { 10 {
libqpdf/InsecureRandomDataProvider.cc
@@ -4,11 +4,6 @@ @@ -4,11 +4,6 @@
4 #include <qpdf/qpdf-config.h> 4 #include <qpdf/qpdf-config.h>
5 #include <cstdlib> 5 #include <cstdlib>
6 6
7 -InsecureRandomDataProvider::InsecureRandomDataProvider() :  
8 - seeded_random(false)  
9 -{  
10 -}  
11 -  
12 void 7 void
13 InsecureRandomDataProvider::provideRandomData(unsigned char* data, size_t len) 8 InsecureRandomDataProvider::provideRandomData(unsigned char* data, size_t len)
14 { 9 {
libqpdf/JSON.cc
@@ -490,24 +490,18 @@ JSON::checkSchemaInternal( @@ -490,24 +490,18 @@ JSON::checkSchemaInternal(
490 } 490 }
491 } 491 }
492 492
493 - if (sch_dict && (!pattern_key.empty())) { 493 + if (sch_dict && !pattern_key.empty()) {
494 auto pattern_schema = sch_dict->members[pattern_key].m->value.get(); 494 auto pattern_schema = sch_dict->members[pattern_key].m->value.get();
495 - for (auto const& iter: this_dict->members) {  
496 - std::string const& key = iter.first; 495 + for (auto const& [key, val]: this_dict->members) {
497 checkSchemaInternal( 496 checkSchemaInternal(
498 - this_dict->members[key].m->value.get(),  
499 - pattern_schema,  
500 - flags,  
501 - errors,  
502 - prefix + "." + key); 497 + val.m->value.get(), pattern_schema, flags, errors, prefix + "." + key);
503 } 498 }
504 } else if (sch_dict) { 499 } else if (sch_dict) {
505 - for (auto& iter: sch_dict->members) {  
506 - std::string const& key = iter.first;  
507 - if (this_dict->members.count(key)) { 500 + for (auto& [key, val]: sch_dict->members) {
  501 + if (this_dict->members.contains(key)) {
508 checkSchemaInternal( 502 checkSchemaInternal(
509 this_dict->members[key].m->value.get(), 503 this_dict->members[key].m->value.get(),
510 - iter.second.m->value.get(), 504 + val.m->value.get(),
511 flags, 505 flags,
512 errors, 506 errors,
513 prefix + "." + key); 507 prefix + "." + key);
@@ -516,18 +510,17 @@ JSON::checkSchemaInternal( @@ -516,18 +510,17 @@ JSON::checkSchemaInternal(
516 QTC::TC("libtests", "JSON optional key"); 510 QTC::TC("libtests", "JSON optional key");
517 } else { 511 } else {
518 QTC::TC("libtests", "JSON key missing in object"); 512 QTC::TC("libtests", "JSON key missing in object");
519 - errors.push_back( 513 + errors.emplace_back(
520 err_prefix + ": key \"" + key + 514 err_prefix + ": key \"" + key +
521 "\" is present in schema but missing in object"); 515 "\" is present in schema but missing in object");
522 } 516 }
523 } 517 }
524 } 518 }
525 - for (auto const& iter: this_dict->members) {  
526 - std::string const& key = iter.first;  
527 - if (sch_dict->members.count(key) == 0) { 519 + for (auto const& item: this_dict->members) {
  520 + if (!sch_dict->members.contains(item.first)) {
528 QTC::TC("libtests", "JSON key extra in object"); 521 QTC::TC("libtests", "JSON key extra in object");
529 - errors.push_back(  
530 - err_prefix + ": key \"" + key + 522 + errors.emplace_back(
  523 + err_prefix + ": key \"" + item.first +
531 "\" is not present in schema but appears in object"); 524 "\" is not present in schema but appears in object");
532 } 525 }
533 } 526 }
@@ -554,9 +547,9 @@ JSON::checkSchemaInternal( @@ -554,9 +547,9 @@ JSON::checkSchemaInternal(
554 checkSchemaInternal( 547 checkSchemaInternal(
555 this_v, sch_arr->elements.at(0).m->value.get(), flags, errors, prefix); 548 this_v, sch_arr->elements.at(0).m->value.get(), flags, errors, prefix);
556 } 549 }
557 - } else if (!this_arr || (this_arr->elements.size() != n_elements)) { 550 + } else if (!this_arr || this_arr->elements.size() != n_elements) {
558 QTC::TC("libtests", "JSON schema array length mismatch"); 551 QTC::TC("libtests", "JSON schema array length mismatch");
559 - errors.push_back( 552 + errors.emplace_back(
560 err_prefix + " is supposed to be an array of length " + std::to_string(n_elements)); 553 err_prefix + " is supposed to be an array of length " + std::to_string(n_elements));
561 return false; 554 return false;
562 } else { 555 } else {
@@ -576,7 +569,7 @@ JSON::checkSchemaInternal( @@ -576,7 +569,7 @@ JSON::checkSchemaInternal(
576 } 569 }
577 } else if (!sch_str) { 570 } else if (!sch_str) {
578 QTC::TC("libtests", "JSON schema other type"); 571 QTC::TC("libtests", "JSON schema other type");
579 - errors.push_back(err_prefix + " schema value is not dictionary, array, or string"); 572 + errors.emplace_back(err_prefix + " schema value is not dictionary, array, or string");
580 return false; 573 return false;
581 } 574 }
582 575
libqpdf/NNTree.cc
@@ -28,8 +28,7 @@ error(QPDF&amp; qpdf, QPDFObjectHandle&amp; node, std::string const&amp; msg) @@ -28,8 +28,7 @@ error(QPDF&amp; qpdf, QPDFObjectHandle&amp; node, std::string const&amp; msg)
28 } 28 }
29 29
30 NNTreeIterator::NNTreeIterator(NNTreeImpl& impl) : 30 NNTreeIterator::NNTreeIterator(NNTreeImpl& impl) :
31 - impl(impl),  
32 - item_number(-1) 31 + impl(impl)
33 { 32 {
34 } 33 }
35 34
@@ -666,7 +665,6 @@ NNTreeImpl::NNTreeImpl( @@ -666,7 +665,6 @@ NNTreeImpl::NNTreeImpl(
666 NNTreeDetails const& details, QPDF& qpdf, QPDFObjectHandle& oh, bool auto_repair) : 665 NNTreeDetails const& details, QPDF& qpdf, QPDFObjectHandle& oh, bool auto_repair) :
667 details(details), 666 details(details),
668 qpdf(qpdf), 667 qpdf(qpdf),
669 - split_threshold(32),  
670 oh(oh), 668 oh(oh),
671 auto_repair(auto_repair) 669 auto_repair(auto_repair)
672 { 670 {
libqpdf/Pl_Flate.cc
@@ -29,7 +29,7 @@ Pl_Flate::Members::Members(size_t out_bufsize, action_e action) : @@ -29,7 +29,7 @@ Pl_Flate::Members::Members(size_t out_bufsize, action_e action) :
29 // Indirect through zdata to reach the z_stream so we don't have to include zlib.h in 29 // Indirect through zdata to reach the z_stream so we don't have to include zlib.h in
30 // Pl_Flate.hh. This means people using shared library versions of qpdf don't have to have zlib 30 // Pl_Flate.hh. This means people using shared library versions of qpdf don't have to have zlib
31 // development files available, which particularly helps in a Windows environment. 31 // development files available, which particularly helps in a Windows environment.
32 - this->zdata = new z_stream; 32 + zdata = new z_stream;
33 33
34 if (out_bufsize > UINT_MAX) { 34 if (out_bufsize > UINT_MAX) {
35 throw std::runtime_error( 35 throw std::runtime_error(
@@ -52,8 +52,8 @@ Pl_Flate::Members::Members(size_t out_bufsize, action_e action) : @@ -52,8 +52,8 @@ Pl_Flate::Members::Members(size_t out_bufsize, action_e action) :
52 52
53 Pl_Flate::Members::~Members() 53 Pl_Flate::Members::~Members()
54 { 54 {
55 - if (this->initialized) {  
56 - z_stream& zstream = *(static_cast<z_stream*>(this->zdata)); 55 + if (initialized) {
  56 + z_stream& zstream = *(static_cast<z_stream*>(zdata));
57 if (action == a_deflate) { 57 if (action == a_deflate) {
58 deflateEnd(&zstream); 58 deflateEnd(&zstream);
59 } else { 59 } else {
@@ -62,7 +62,7 @@ Pl_Flate::Members::~Members() @@ -62,7 +62,7 @@ Pl_Flate::Members::~Members()
62 } 62 }
63 63
64 delete static_cast<z_stream*>(this->zdata); 64 delete static_cast<z_stream*>(this->zdata);
65 - this->zdata = nullptr; 65 + zdata = nullptr;
66 } 66 }
67 67
68 Pl_Flate::Pl_Flate( 68 Pl_Flate::Pl_Flate(
@@ -99,7 +99,7 @@ Pl_Flate::setWarnCallback(std::function&lt;void(char const*, int)&gt; callback) @@ -99,7 +99,7 @@ Pl_Flate::setWarnCallback(std::function&lt;void(char const*, int)&gt; callback)
99 void 99 void
100 Pl_Flate::warn(char const* msg, int code) 100 Pl_Flate::warn(char const* msg, int code)
101 { 101 {
102 - if (m->callback != nullptr) { 102 + if (m->callback) {
103 m->callback(msg, code); 103 m->callback(msg, code);
104 } 104 }
105 } 105 }
@@ -107,7 +107,7 @@ Pl_Flate::warn(char const* msg, int code) @@ -107,7 +107,7 @@ Pl_Flate::warn(char const* msg, int code)
107 void 107 void
108 Pl_Flate::write(unsigned char const* data, size_t len) 108 Pl_Flate::write(unsigned char const* data, size_t len)
109 { 109 {
110 - if (m->outbuf == nullptr) { 110 + if (!m->outbuf) {
111 throw std::logic_error( 111 throw std::logic_error(
112 this->identifier + ": Pl_Flate: write() called after finish() called"); 112 this->identifier + ": Pl_Flate: write() called after finish() called");
113 } 113 }
@@ -184,7 +184,7 @@ Pl_Flate::handleData(unsigned char const* data, size_t len, int flush) @@ -184,7 +184,7 @@ Pl_Flate::handleData(unsigned char const* data, size_t len, int flush)
184 // this error (including at least one in qpdf's test suite). In some cases, we want to 184 // this error (including at least one in qpdf's test suite). In some cases, we want to
185 // know about this, because it indicates incorrect compression, so call a callback if 185 // know about this, because it indicates incorrect compression, so call a callback if
186 // provided. 186 // provided.
187 - this->warn("input stream is complete but output may still be valid", err); 187 + warn("input stream is complete but output may still be valid", err);
188 done = true; 188 done = true;
189 break; 189 break;
190 190
@@ -215,7 +215,7 @@ Pl_Flate::handleData(unsigned char const* data, size_t len, int flush) @@ -215,7 +215,7 @@ Pl_Flate::handleData(unsigned char const* data, size_t len, int flush)
215 break; 215 break;
216 216
217 default: 217 default:
218 - this->checkError("data", err); 218 + checkError("data", err);
219 break; 219 break;
220 } 220 }
221 } 221 }
@@ -271,7 +271,7 @@ Pl_Flate::checkError(char const* prefix, int error_code) @@ -271,7 +271,7 @@ Pl_Flate::checkError(char const* prefix, int error_code)
271 z_stream& zstream = *(static_cast<z_stream*>(m->zdata)); 271 z_stream& zstream = *(static_cast<z_stream*>(m->zdata));
272 if (error_code != Z_OK) { 272 if (error_code != Z_OK) {
273 char const* action_str = (m->action == a_deflate ? "deflate" : "inflate"); 273 char const* action_str = (m->action == a_deflate ? "deflate" : "inflate");
274 - std::string msg = this->identifier + ": " + action_str + ": " + prefix + ": "; 274 + std::string msg = identifier + ": " + action_str + ": " + prefix + ": ";
275 275
276 if (zstream.msg) { 276 if (zstream.msg) {
277 msg += zstream.msg; 277 msg += zstream.msg;
libqpdf/Pl_PNGFilter.cc
@@ -39,7 +39,7 @@ Pl_PNGFilter::Pl_PNGFilter( @@ -39,7 +39,7 @@ Pl_PNGFilter::Pl_PNGFilter(
39 throw std::runtime_error( 39 throw std::runtime_error(
40 "PNGFilter created with invalid bits_per_sample not 1, 2, 4, 8, or 16"); 40 "PNGFilter created with invalid bits_per_sample not 1, 2, 4, 8, or 16");
41 } 41 }
42 - this->bytes_per_pixel = ((bits_per_sample * samples_per_pixel) + 7) / 8; 42 + bytes_per_pixel = ((bits_per_sample * samples_per_pixel) + 7) / 8;
43 unsigned long long bpr = ((columns * bits_per_sample * samples_per_pixel) + 7) / 8; 43 unsigned long long bpr = ((columns * bits_per_sample * samples_per_pixel) + 7) / 8;
44 if ((bpr == 0) || (bpr > (UINT_MAX - 1))) { 44 if ((bpr == 0) || (bpr > (UINT_MAX - 1))) {
45 throw std::runtime_error("PNGFilter created with invalid columns value"); 45 throw std::runtime_error("PNGFilter created with invalid columns value");
@@ -47,16 +47,16 @@ Pl_PNGFilter::Pl_PNGFilter( @@ -47,16 +47,16 @@ Pl_PNGFilter::Pl_PNGFilter(
47 if (memory_limit > 0 && bpr > (memory_limit / 2U)) { 47 if (memory_limit > 0 && bpr > (memory_limit / 2U)) {
48 throw std::runtime_error("PNGFilter memory limit exceeded"); 48 throw std::runtime_error("PNGFilter memory limit exceeded");
49 } 49 }
50 - this->bytes_per_row = bpr & UINT_MAX;  
51 - this->buf1 = QUtil::make_shared_array<unsigned char>(this->bytes_per_row + 1);  
52 - this->buf2 = QUtil::make_shared_array<unsigned char>(this->bytes_per_row + 1);  
53 - memset(this->buf1.get(), 0, this->bytes_per_row + 1);  
54 - memset(this->buf2.get(), 0, this->bytes_per_row + 1);  
55 - this->cur_row = this->buf1.get();  
56 - this->prev_row = this->buf2.get(); 50 + bytes_per_row = bpr & UINT_MAX;
  51 + buf1 = QUtil::make_shared_array<unsigned char>(bytes_per_row + 1);
  52 + buf2 = QUtil::make_shared_array<unsigned char>(bytes_per_row + 1);
  53 + memset(buf1.get(), 0, bytes_per_row + 1);
  54 + memset(buf2.get(), 0, bytes_per_row + 1);
  55 + cur_row = buf1.get();
  56 + prev_row = buf2.get();
57 57
58 // number of bytes per incoming row 58 // number of bytes per incoming row
59 - this->incoming = (action == a_encode ? this->bytes_per_row : this->bytes_per_row + 1); 59 + incoming = (action == a_encode ? bytes_per_row : bytes_per_row + 1);
60 } 60 }
61 61
62 void 62 void
@@ -68,34 +68,34 @@ Pl_PNGFilter::setMemoryLimit(unsigned long long limit) @@ -68,34 +68,34 @@ Pl_PNGFilter::setMemoryLimit(unsigned long long limit)
68 void 68 void
69 Pl_PNGFilter::write(unsigned char const* data, size_t len) 69 Pl_PNGFilter::write(unsigned char const* data, size_t len)
70 { 70 {
71 - size_t left = this->incoming - this->pos; 71 + size_t left = incoming - pos;
72 size_t offset = 0; 72 size_t offset = 0;
73 while (len >= left) { 73 while (len >= left) {
74 // finish off current row 74 // finish off current row
75 - memcpy(this->cur_row + this->pos, data + offset, left); 75 + memcpy(cur_row + pos, data + offset, left);
76 offset += left; 76 offset += left;
77 len -= left; 77 len -= left;
78 78
79 processRow(); 79 processRow();
80 80
81 // Swap rows 81 // Swap rows
82 - unsigned char* t = this->prev_row;  
83 - this->prev_row = this->cur_row;  
84 - this->cur_row = t ? t : this->buf2.get();  
85 - memset(this->cur_row, 0, this->bytes_per_row + 1);  
86 - left = this->incoming;  
87 - this->pos = 0; 82 + unsigned char* t = prev_row;
  83 + prev_row = cur_row;
  84 + cur_row = t ? t : buf2.get();
  85 + memset(cur_row, 0, bytes_per_row + 1);
  86 + left = incoming;
  87 + pos = 0;
88 } 88 }
89 if (len) { 89 if (len) {
90 - memcpy(this->cur_row + this->pos, data + offset, len); 90 + memcpy(cur_row + pos, data + offset, len);
91 } 91 }
92 - this->pos += len; 92 + pos += len;
93 } 93 }
94 94
95 void 95 void
96 Pl_PNGFilter::processRow() 96 Pl_PNGFilter::processRow()
97 { 97 {
98 - if (this->action == a_encode) { 98 + if (action == a_encode) {
99 encodeRow(); 99 encodeRow();
100 } else { 100 } else {
101 decodeRow(); 101 decodeRow();
@@ -105,22 +105,22 @@ Pl_PNGFilter::processRow() @@ -105,22 +105,22 @@ Pl_PNGFilter::processRow()
105 void 105 void
106 Pl_PNGFilter::decodeRow() 106 Pl_PNGFilter::decodeRow()
107 { 107 {
108 - int filter = this->cur_row[0];  
109 - if (this->prev_row) { 108 + int filter = cur_row[0];
  109 + if (prev_row) {
110 switch (filter) { 110 switch (filter) {
111 case 0: 111 case 0:
112 break; 112 break;
113 case 1: 113 case 1:
114 - this->decodeSub(); 114 + decodeSub();
115 break; 115 break;
116 case 2: 116 case 2:
117 - this->decodeUp(); 117 + decodeUp();
118 break; 118 break;
119 case 3: 119 case 3:
120 - this->decodeAverage(); 120 + decodeAverage();
121 break; 121 break;
122 case 4: 122 case 4:
123 - this->decodePaeth(); 123 + decodePaeth();
124 break; 124 break;
125 default: 125 default:
126 // ignore 126 // ignore
@@ -128,17 +128,17 @@ Pl_PNGFilter::decodeRow() @@ -128,17 +128,17 @@ Pl_PNGFilter::decodeRow()
128 } 128 }
129 } 129 }
130 130
131 - next()->write(this->cur_row + 1, this->bytes_per_row); 131 + next()->write(cur_row + 1, bytes_per_row);
132 } 132 }
133 133
134 void 134 void
135 Pl_PNGFilter::decodeSub() 135 Pl_PNGFilter::decodeSub()
136 { 136 {
137 QTC::TC("libtests", "Pl_PNGFilter decodeSub"); 137 QTC::TC("libtests", "Pl_PNGFilter decodeSub");
138 - unsigned char* buffer = this->cur_row + 1;  
139 - unsigned int bpp = this->bytes_per_pixel; 138 + unsigned char* buffer = cur_row + 1;
  139 + unsigned int bpp = bytes_per_pixel;
140 140
141 - for (unsigned int i = 0; i < this->bytes_per_row; ++i) { 141 + for (unsigned int i = 0; i < bytes_per_row; ++i) {
142 unsigned char left = 0; 142 unsigned char left = 0;
143 143
144 if (i >= bpp) { 144 if (i >= bpp) {
@@ -153,10 +153,10 @@ void @@ -153,10 +153,10 @@ void
153 Pl_PNGFilter::decodeUp() 153 Pl_PNGFilter::decodeUp()
154 { 154 {
155 QTC::TC("libtests", "Pl_PNGFilter decodeUp"); 155 QTC::TC("libtests", "Pl_PNGFilter decodeUp");
156 - unsigned char* buffer = this->cur_row + 1;  
157 - unsigned char* above_buffer = this->prev_row + 1; 156 + unsigned char* buffer = cur_row + 1;
  157 + unsigned char* above_buffer = prev_row + 1;
158 158
159 - for (unsigned int i = 0; i < this->bytes_per_row; ++i) { 159 + for (unsigned int i = 0; i < bytes_per_row; ++i) {
160 unsigned char up = above_buffer[i]; 160 unsigned char up = above_buffer[i];
161 buffer[i] = static_cast<unsigned char>(buffer[i] + up); 161 buffer[i] = static_cast<unsigned char>(buffer[i] + up);
162 } 162 }
@@ -166,11 +166,11 @@ void @@ -166,11 +166,11 @@ void
166 Pl_PNGFilter::decodeAverage() 166 Pl_PNGFilter::decodeAverage()
167 { 167 {
168 QTC::TC("libtests", "Pl_PNGFilter decodeAverage"); 168 QTC::TC("libtests", "Pl_PNGFilter decodeAverage");
169 - unsigned char* buffer = this->cur_row + 1;  
170 - unsigned char* above_buffer = this->prev_row + 1;  
171 - unsigned int bpp = this->bytes_per_pixel; 169 + unsigned char* buffer = cur_row + 1;
  170 + unsigned char* above_buffer = prev_row + 1;
  171 + unsigned int bpp = bytes_per_pixel;
172 172
173 - for (unsigned int i = 0; i < this->bytes_per_row; ++i) { 173 + for (unsigned int i = 0; i < bytes_per_row; ++i) {
174 int left = 0; 174 int left = 0;
175 int up = 0; 175 int up = 0;
176 176
@@ -187,11 +187,11 @@ void @@ -187,11 +187,11 @@ void
187 Pl_PNGFilter::decodePaeth() 187 Pl_PNGFilter::decodePaeth()
188 { 188 {
189 QTC::TC("libtests", "Pl_PNGFilter decodePaeth"); 189 QTC::TC("libtests", "Pl_PNGFilter decodePaeth");
190 - unsigned char* buffer = this->cur_row + 1;  
191 - unsigned char* above_buffer = this->prev_row + 1;  
192 - unsigned int bpp = this->bytes_per_pixel; 190 + unsigned char* buffer = cur_row + 1;
  191 + unsigned char* above_buffer = prev_row + 1;
  192 + unsigned int bpp = bytes_per_pixel;
193 193
194 - for (unsigned int i = 0; i < this->bytes_per_row; ++i) { 194 + for (unsigned int i = 0; i < bytes_per_row; ++i) {
195 int left = 0; 195 int left = 0;
196 int up = above_buffer[i]; 196 int up = above_buffer[i];
197 int upper_left = 0; 197 int upper_left = 0;
@@ -201,8 +201,7 @@ Pl_PNGFilter::decodePaeth() @@ -201,8 +201,7 @@ Pl_PNGFilter::decodePaeth()
201 upper_left = above_buffer[i - bpp]; 201 upper_left = above_buffer[i - bpp];
202 } 202 }
203 203
204 - buffer[i] =  
205 - static_cast<unsigned char>(buffer[i] + this->PaethPredictor(left, up, upper_left)); 204 + buffer[i] = static_cast<unsigned char>(buffer[i] + PaethPredictor(left, up, upper_left));
206 } 205 }
207 } 206 }
208 207
@@ -229,27 +228,27 @@ Pl_PNGFilter::encodeRow() @@ -229,27 +228,27 @@ Pl_PNGFilter::encodeRow()
229 // For now, hard-code to using UP filter. 228 // For now, hard-code to using UP filter.
230 unsigned char ch = 2; 229 unsigned char ch = 2;
231 next()->write(&ch, 1); 230 next()->write(&ch, 1);
232 - if (this->prev_row) {  
233 - for (unsigned int i = 0; i < this->bytes_per_row; ++i) {  
234 - ch = static_cast<unsigned char>(this->cur_row[i] - this->prev_row[i]); 231 + if (prev_row) {
  232 + for (unsigned int i = 0; i < bytes_per_row; ++i) {
  233 + ch = static_cast<unsigned char>(cur_row[i] - prev_row[i]);
235 next()->write(&ch, 1); 234 next()->write(&ch, 1);
236 } 235 }
237 } else { 236 } else {
238 - next()->write(this->cur_row, this->bytes_per_row); 237 + next()->write(cur_row, bytes_per_row);
239 } 238 }
240 } 239 }
241 240
242 void 241 void
243 Pl_PNGFilter::finish() 242 Pl_PNGFilter::finish()
244 { 243 {
245 - if (this->pos) { 244 + if (pos) {
246 // write partial row 245 // write partial row
247 processRow(); 246 processRow();
248 } 247 }
249 - this->prev_row = nullptr;  
250 - this->cur_row = buf1.get();  
251 - this->pos = 0;  
252 - memset(this->cur_row, 0, this->bytes_per_row + 1); 248 + prev_row = nullptr;
  249 + cur_row = buf1.get();
  250 + pos = 0;
  251 + memset(cur_row, 0, bytes_per_row + 1);
253 252
254 next()->finish(); 253 next()->finish();
255 } 254 }
libqpdf/Pl_SHA2.cc
@@ -5,8 +5,7 @@ @@ -5,8 +5,7 @@
5 #include <stdexcept> 5 #include <stdexcept>
6 6
7 Pl_SHA2::Pl_SHA2(int bits, Pipeline* next) : 7 Pl_SHA2::Pl_SHA2(int bits, Pipeline* next) :
8 - Pipeline("sha2", next),  
9 - in_progress(false) 8 + Pipeline("sha2", next)
10 { 9 {
11 if (bits) { 10 if (bits) {
12 resetBits(bits); 11 resetBits(bits);
libqpdf/QPDF.cc
@@ -564,7 +564,7 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign) @@ -564,7 +564,7 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign)
564 obj_copier.to_copy.clear(); 564 obj_copier.to_copy.clear();
565 565
566 auto og = foreign.getObjGen(); 566 auto og = foreign.getObjGen();
567 - if (!obj_copier.object_map.count(og)) { 567 + if (!obj_copier.object_map.contains(og)) {
568 warn(damagedPDF( 568 warn(damagedPDF(
569 other.getFilename() + " object " + og.unparse(' '), 569 other.getFilename() + " object " + og.unparse(' '),
570 foreign.getParsedOffset(), 570 foreign.getParsedOffset(),
@@ -594,7 +594,7 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier&amp; obj_copier, bool top) @@ -594,7 +594,7 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier&amp; obj_copier, bool top)
594 QTC::TC("qpdf", "QPDF loop reserving objects"); 594 QTC::TC("qpdf", "QPDF loop reserving objects");
595 return; 595 return;
596 } 596 }
597 - if (obj_copier.object_map.count(foreign_og) > 0) { 597 + if (obj_copier.object_map.contains(foreign_og)) {
598 QTC::TC("qpdf", "QPDF already reserved object"); 598 QTC::TC("qpdf", "QPDF already reserved object");
599 if (!(top && foreign.isPageObject() && obj_copier.object_map[foreign_og].isNull())) { 599 if (!(top && foreign.isPageObject() && obj_copier.object_map[foreign_og].isNull())) {
600 obj_copier.visiting.erase(foreign); 600 obj_copier.visiting.erase(foreign);
libqpdf/QPDFAcroFormDocumentHelper.cc
@@ -9,11 +9,6 @@ @@ -9,11 +9,6 @@
9 9
10 using namespace qpdf; 10 using namespace qpdf;
11 11
12 -QPDFAcroFormDocumentHelper::Members::Members() :  
13 - cache_valid(false)  
14 -{  
15 -}  
16 -  
17 QPDFAcroFormDocumentHelper::QPDFAcroFormDocumentHelper(QPDF& qpdf) : 12 QPDFAcroFormDocumentHelper::QPDFAcroFormDocumentHelper(QPDF& qpdf) :
18 QPDFDocumentHelper(qpdf), 13 QPDFDocumentHelper(qpdf),
19 m(new Members()) 14 m(new Members())
@@ -85,7 +80,7 @@ QPDFAcroFormDocumentHelper::addAndRenameFormFields(std::vector&lt;QPDFObjectHandle&gt; @@ -85,7 +80,7 @@ QPDFAcroFormDocumentHelper::addAndRenameFormFields(std::vector&lt;QPDFObjectHandle&gt;
85 // this field's /T is always at the end of the fully qualified name, appending to /T 80 // this field's /T is always at the end of the fully qualified name, appending to /T
86 // has the effect of appending the same thing to the fully qualified name. 81 // has the effect of appending the same thing to the fully qualified name.
87 std::string old_name = QPDFFormFieldObjectHelper(obj).getFullyQualifiedName(); 82 std::string old_name = QPDFFormFieldObjectHelper(obj).getFullyQualifiedName();
88 - if (renames.count(old_name) == 0) { 83 + if (!renames.contains(old_name)) {
89 std::string new_name = old_name; 84 std::string new_name = old_name;
90 int suffix = 0; 85 int suffix = 0;
91 std::string append; 86 std::string append;
@@ -145,7 +140,7 @@ QPDFAcroFormDocumentHelper::removeFormFields(std::set&lt;QPDFObjGen&gt; const&amp; to_remo @@ -145,7 +140,7 @@ QPDFAcroFormDocumentHelper::removeFormFields(std::set&lt;QPDFObjGen&gt; const&amp; to_remo
145 int i = 0; 140 int i = 0;
146 while (i < fields.getArrayNItems()) { 141 while (i < fields.getArrayNItems()) {
147 auto field = fields.getArrayItem(i); 142 auto field = fields.getArrayItem(i);
148 - if (to_remove.count(field.getObjGen())) { 143 + if (to_remove.contains(field.getObjGen())) {
149 fields.eraseItem(i); 144 fields.eraseItem(i);
150 } else { 145 } else {
151 ++i; 146 ++i;
@@ -191,7 +186,7 @@ QPDFAcroFormDocumentHelper::getAnnotationsForField(QPDFFormFieldObjectHelper h) @@ -191,7 +186,7 @@ QPDFAcroFormDocumentHelper::getAnnotationsForField(QPDFFormFieldObjectHelper h)
191 analyze(); 186 analyze();
192 std::vector<QPDFAnnotationObjectHelper> result; 187 std::vector<QPDFAnnotationObjectHelper> result;
193 QPDFObjGen og(h.getObjectHandle().getObjGen()); 188 QPDFObjGen og(h.getObjectHandle().getObjGen());
194 - if (m->field_to_annotations.count(og)) { 189 + if (m->field_to_annotations.contains(og)) {
195 result = m->field_to_annotations[og]; 190 result = m->field_to_annotations[og];
196 } 191 }
197 return result; 192 return result;
@@ -228,7 +223,7 @@ QPDFAcroFormDocumentHelper::getFieldForAnnotation(QPDFAnnotationObjectHelper h) @@ -228,7 +223,7 @@ QPDFAcroFormDocumentHelper::getFieldForAnnotation(QPDFAnnotationObjectHelper h)
228 } 223 }
229 analyze(); 224 analyze();
230 QPDFObjGen og(oh.getObjGen()); 225 QPDFObjGen og(oh.getObjGen());
231 - if (m->annotation_to_field.count(og)) { 226 + if (m->annotation_to_field.contains(og)) {
232 result = m->annotation_to_field[og]; 227 result = m->annotation_to_field[og];
233 } 228 }
234 return result; 229 return result;
@@ -271,7 +266,7 @@ QPDFAcroFormDocumentHelper::analyze() @@ -271,7 +266,7 @@ QPDFAcroFormDocumentHelper::analyze()
271 for (auto const& iter: getWidgetAnnotationsForPage(ph)) { 266 for (auto const& iter: getWidgetAnnotationsForPage(ph)) {
272 QPDFObjectHandle annot(iter.getObjectHandle()); 267 QPDFObjectHandle annot(iter.getObjectHandle());
273 QPDFObjGen og(annot.getObjGen()); 268 QPDFObjGen og(annot.getObjGen());
274 - if (m->annotation_to_field.count(og) == 0) { 269 + if (!m->annotation_to_field.contains(og)) {
275 QTC::TC("qpdf", "QPDFAcroFormDocumentHelper orphaned widget"); 270 QTC::TC("qpdf", "QPDFAcroFormDocumentHelper orphaned widget");
276 // This is not supposed to happen, but it's easy enough for us to handle this case. 271 // This is not supposed to happen, but it's easy enough for us to handle this case.
277 // Treat the annotation as its own field. This could allow qpdf to sensibly handle a 272 // Treat the annotation as its own field. This could allow qpdf to sensibly handle a
@@ -542,7 +537,7 @@ ResourceReplacer::handleToken(QPDFTokenizer::Token const&amp; token) @@ -542,7 +537,7 @@ ResourceReplacer::handleToken(QPDFTokenizer::Token const&amp; token)
542 bool wrote = false; 537 bool wrote = false;
543 if (token.getType() == QPDFTokenizer::tt_name) { 538 if (token.getType() == QPDFTokenizer::tt_name) {
544 std::string name = QPDFObjectHandle::newName(token.getValue()).getName(); 539 std::string name = QPDFObjectHandle::newName(token.getValue()).getName();
545 - if (to_replace.count(name) && to_replace[name].count(offset)) { 540 + if (to_replace.contains(name) && to_replace[name].contains(offset)) {
546 QTC::TC("qpdf", "QPDFAcroFormDocumentHelper replaced DA token"); 541 QTC::TC("qpdf", "QPDFAcroFormDocumentHelper replaced DA token");
547 write(to_replace[name][offset]); 542 write(to_replace[name][offset]);
548 wrote = true; 543 wrote = true;
@@ -675,7 +670,7 @@ QPDFAcroFormDocumentHelper::adjustAppearanceStream( @@ -675,7 +670,7 @@ QPDFAcroFormDocumentHelper::adjustAppearanceStream(
675 resources.mergeResources(merge_with, &dr_map); 670 resources.mergeResources(merge_with, &dr_map);
676 // Remove empty subdictionaries 671 // Remove empty subdictionaries
677 for (auto iter: resources.ditems()) { 672 for (auto iter: resources.ditems()) {
678 - if (iter.second.isDictionary() && (iter.second.getKeys().size() == 0)) { 673 + if (iter.second.isDictionary() && iter.second.getKeys().empty()) {
679 resources.removeKey(iter.first); 674 resources.removeKey(iter.first);
680 } 675 }
681 } 676 }
@@ -807,7 +802,7 @@ QPDFAcroFormDocumentHelper::transformAnnotations( @@ -807,7 +802,7 @@ QPDFAcroFormDocumentHelper::transformAnnotations(
807 std::map<QPDFObjGen, QPDFObjectHandle> orig_to_copy; 802 std::map<QPDFObjGen, QPDFObjectHandle> orig_to_copy;
808 auto maybe_copy_object = [&](QPDFObjectHandle& to_copy) { 803 auto maybe_copy_object = [&](QPDFObjectHandle& to_copy) {
809 auto og = to_copy.getObjGen(); 804 auto og = to_copy.getObjGen();
810 - if (orig_to_copy.count(og)) { 805 + if (orig_to_copy.contains(og)) {
811 to_copy = orig_to_copy[og]; 806 to_copy = orig_to_copy[og];
812 return false; 807 return false;
813 } else { 808 } else {
@@ -893,7 +888,7 @@ QPDFAcroFormDocumentHelper::transformAnnotations( @@ -893,7 +888,7 @@ QPDFAcroFormDocumentHelper::transformAnnotations(
893 auto parent = obj.getKey("/Parent"); 888 auto parent = obj.getKey("/Parent");
894 if (parent.isIndirect()) { 889 if (parent.isIndirect()) {
895 auto parent_og = parent.getObjGen(); 890 auto parent_og = parent.getObjGen();
896 - if (orig_to_copy.count(parent_og)) { 891 + if (orig_to_copy.contains(parent_og)) {
897 obj.replaceKey("/Parent", orig_to_copy[parent_og]); 892 obj.replaceKey("/Parent", orig_to_copy[parent_og]);
898 } else { 893 } else {
899 parent.warnIfPossible( 894 parent.warnIfPossible(
libqpdf/QPDFArgParser.cc
@@ -18,12 +18,7 @@ QPDFArgParser::Members::Members(int argc, char const* const argv[], char const* @@ -18,12 +18,7 @@ QPDFArgParser::Members::Members(int argc, char const* const argv[], char const*
18 18
19 argc(argc), 19 argc(argc),
20 argv(argv), 20 argv(argv),
21 - progname_env(progname_env),  
22 - cur_arg(0),  
23 - bash_completion(false),  
24 - zsh_completion(false),  
25 - option_table(nullptr),  
26 - final_check_handler(nullptr) 21 + progname_env(progname_env)
27 { 22 {
28 auto tmp = QUtil::make_unique_cstr(argv[0]); 23 auto tmp = QUtil::make_unique_cstr(argv[0]);
29 whoami = QUtil::getWhoami(tmp.get()); 24 whoami = QUtil::getWhoami(tmp.get());
@@ -71,7 +66,7 @@ QPDFArgParser::selectOptionTable(std::string const&amp; name) @@ -71,7 +66,7 @@ QPDFArgParser::selectOptionTable(std::string const&amp; name)
71 void 66 void
72 QPDFArgParser::registerOptionTable(std::string const& name, bare_arg_handler_t end_handler) 67 QPDFArgParser::registerOptionTable(std::string const& name, bare_arg_handler_t end_handler)
73 { 68 {
74 - if (0 != m->option_tables.count(name)) { 69 + if (m->option_tables.contains(name)) {
75 QTC::TC("libtests", "QPDFArgParser register registered table"); 70 QTC::TC("libtests", "QPDFArgParser register registered table");
76 throw std::logic_error( 71 throw std::logic_error(
77 "QPDFArgParser: registering already registered option table " + name); 72 "QPDFArgParser: registering already registered option table " + name);
@@ -84,7 +79,7 @@ QPDFArgParser::registerOptionTable(std::string const&amp; name, bare_arg_handler_t e @@ -84,7 +79,7 @@ QPDFArgParser::registerOptionTable(std::string const&amp; name, bare_arg_handler_t e
84 QPDFArgParser::OptionEntry& 79 QPDFArgParser::OptionEntry&
85 QPDFArgParser::registerArg(std::string const& arg) 80 QPDFArgParser::registerArg(std::string const& arg)
86 { 81 {
87 - if (0 != m->option_table->count(arg)) { 82 + if (m->option_table->contains(arg)) {
88 QTC::TC("libtests", "QPDFArgParser duplicate handler"); 83 QTC::TC("libtests", "QPDFArgParser duplicate handler");
89 throw std::logic_error( 84 throw std::logic_error(
90 "QPDFArgParser: adding a duplicate handler for option " + arg + " in " + 85 "QPDFArgParser: adding a duplicate handler for option " + arg + " in " +
@@ -198,13 +193,13 @@ QPDFArgParser::completionCommon(bool zsh) @@ -198,13 +193,13 @@ QPDFArgParser::completionCommon(bool zsh)
198 if (!zsh) { 193 if (!zsh) {
199 std::cout << " -o nospace"; 194 std::cout << " -o nospace";
200 } 195 }
201 - std::cout << " -C \"" << progname << "\" " << m->whoami << std::endl; 196 + std::cout << " -C \"" << progname << "\" " << m->whoami << '\n';
202 // Put output before error so calling from zsh works properly 197 // Put output before error so calling from zsh works properly
203 std::string path = progname; 198 std::string path = progname;
204 size_t slash = path.find('/'); 199 size_t slash = path.find('/');
205 if ((slash != 0) && (slash != std::string::npos)) { 200 if ((slash != 0) && (slash != std::string::npos)) {
206 std::cerr << "WARNING: " << m->whoami << " completion enabled" 201 std::cerr << "WARNING: " << m->whoami << " completion enabled"
207 - << " using relative path to executable" << std::endl; 202 + << " using relative path to executable" << '\n';
208 } 203 }
209 } 204 }
210 205
@@ -239,7 +234,7 @@ QPDFArgParser::handleArgFileArguments() @@ -239,7 +234,7 @@ QPDFArgParser::handleArgFileArguments()
239 // Support reading arguments from files. Create a new argv. Ensure that argv itself as well as 234 // Support reading arguments from files. Create a new argv. Ensure that argv itself as well as
240 // all its contents are automatically deleted by using shared pointers back to the pointers in 235 // all its contents are automatically deleted by using shared pointers back to the pointers in
241 // argv. 236 // argv.
242 - m->new_argv.push_back(QUtil::make_shared_cstr(m->argv[0])); 237 + m->new_argv.emplace_back(m->argv[0]);
243 for (int i = 1; i < m->argc; ++i) { 238 for (int i = 1; i < m->argc; ++i) {
244 char const* argfile = nullptr; 239 char const* argfile = nullptr;
245 if ((strlen(m->argv[i]) > 1) && (m->argv[i][0] == '@')) { 240 if ((strlen(m->argv[i]) > 1) && (m->argv[i][0] == '@')) {
@@ -254,16 +249,16 @@ QPDFArgParser::handleArgFileArguments() @@ -254,16 +249,16 @@ QPDFArgParser::handleArgFileArguments()
254 if (argfile) { 249 if (argfile) {
255 readArgsFromFile(1 + m->argv[i]); 250 readArgsFromFile(1 + m->argv[i]);
256 } else { 251 } else {
257 - m->new_argv.push_back(QUtil::make_shared_cstr(m->argv[i])); 252 + m->new_argv.emplace_back(m->argv[i]);
258 } 253 }
259 } 254 }
260 - m->argv_ph = QUtil::make_shared_array<char const*>(1 + m->new_argv.size());  
261 - for (size_t i = 0; i < m->new_argv.size(); ++i) {  
262 - m->argv_ph.get()[i] = m->new_argv.at(i).get(); 255 + m->argv_ph.reserve(1 + m->new_argv.size());
  256 + for (auto const& a: m->new_argv) {
  257 + m->argv_ph.push_back(a.data());
263 } 258 }
264 m->argc = QIntC::to_int(m->new_argv.size()); 259 m->argc = QIntC::to_int(m->new_argv.size());
265 - m->argv_ph.get()[m->argc] = nullptr;  
266 - m->argv = m->argv_ph.get(); 260 + m->argv_ph.push_back(nullptr);
  261 + m->argv = m->argv_ph.data();
267 } 262 }
268 263
269 void 264 void
@@ -290,7 +285,7 @@ QPDFArgParser::handleBashArguments() @@ -290,7 +285,7 @@ QPDFArgParser::handleBashArguments()
290 case st_top: 285 case st_top:
291 if (util::is_space(ch)) { 286 if (util::is_space(ch)) {
292 if (!arg.empty()) { 287 if (!arg.empty()) {
293 - m->bash_argv.push_back(QUtil::make_shared_cstr(arg)); 288 + m->bash_argv.emplace_back(arg);
294 arg.clear(); 289 arg.clear();
295 } 290 }
296 } else if (ch == '"') { 291 } else if (ch == '"') {
@@ -326,16 +321,16 @@ QPDFArgParser::handleBashArguments() @@ -326,16 +321,16 @@ QPDFArgParser::handleBashArguments()
326 if (m->bash_argv.empty()) { 321 if (m->bash_argv.empty()) {
327 // This can't happen if properly invoked by bash, but ensure we have a valid argv[0] 322 // This can't happen if properly invoked by bash, but ensure we have a valid argv[0]
328 // regardless. 323 // regardless.
329 - m->bash_argv.push_back(QUtil::make_shared_cstr(m->argv[0])); 324 + m->bash_argv.emplace_back(m->argv[0]);
330 } 325 }
331 // Explicitly discard any non-space-terminated word. The "current word" is handled specially. 326 // Explicitly discard any non-space-terminated word. The "current word" is handled specially.
332 - m->bash_argv_ph = QUtil::make_shared_array<char const*>(1 + m->bash_argv.size());  
333 - for (size_t i = 0; i < m->bash_argv.size(); ++i) {  
334 - m->bash_argv_ph.get()[i] = m->bash_argv.at(i).get(); 327 + m->bash_argv_ph.reserve(1 + m->bash_argv.size());
  328 + for (auto const& a: m->bash_argv) {
  329 + m->bash_argv_ph.push_back(a.data());
335 } 330 }
336 m->argc = QIntC::to_int(m->bash_argv.size()); 331 m->argc = QIntC::to_int(m->bash_argv.size());
337 - m->bash_argv_ph.get()[m->argc] = nullptr;  
338 - m->argv = m->bash_argv_ph.get(); 332 + m->bash_argv_ph.push_back(nullptr);
  333 + m->argv = m->bash_argv_ph.data();
339 } 334 }
340 335
341 void 336 void
@@ -360,7 +355,7 @@ QPDFArgParser::readArgsFromFile(std::string const&amp; filename) @@ -360,7 +355,7 @@ QPDFArgParser::readArgsFromFile(std::string const&amp; filename)
360 lines = QUtil::read_lines_from_file(filename.c_str()); 355 lines = QUtil::read_lines_from_file(filename.c_str());
361 } 356 }
362 for (auto const& line: lines) { 357 for (auto const& line: lines) {
363 - m->new_argv.push_back(QUtil::make_shared_cstr(line)); 358 + m->new_argv.emplace_back(line);
364 } 359 }
365 } 360 }
366 361
@@ -471,7 +466,7 @@ QPDFArgParser::parseArgs() @@ -471,7 +466,7 @@ QPDFArgParser::parseArgs()
471 // positional arguments. Besides, it doesn't make sense to have an empty option. 466 // positional arguments. Besides, it doesn't make sense to have an empty option.
472 arg_s = arg; 467 arg_s = arg;
473 size_t equal_pos = std::string::npos; 468 size_t equal_pos = std::string::npos;
474 - if (arg_s.length() > 0) { 469 + if (!arg_s.empty()) {
475 equal_pos = arg_s.find('=', 1); 470 equal_pos = arg_s.find('=', 1);
476 } 471 }
477 if (equal_pos != std::string::npos) { 472 if (equal_pos != std::string::npos) {
@@ -481,7 +476,7 @@ QPDFArgParser::parseArgs() @@ -481,7 +476,7 @@ QPDFArgParser::parseArgs()
481 } 476 }
482 477
483 if ((!m->bash_completion) && (m->argc == 2) && (m->cur_arg == 1) && 478 if ((!m->bash_completion) && (m->argc == 2) && (m->cur_arg == 1) &&
484 - m->help_option_table.count(arg_s)) { 479 + m->help_option_table.contains(arg_s)) {
485 // Handle help option, which is only valid as the sole option. 480 // Handle help option, which is only valid as the sole option.
486 QTC::TC("libtests", "QPDFArgParser help option"); 481 QTC::TC("libtests", "QPDFArgParser help option");
487 oep = m->help_option_table.find(arg_s); 482 oep = m->help_option_table.find(arg_s);
@@ -508,8 +503,8 @@ QPDFArgParser::parseArgs() @@ -508,8 +503,8 @@ QPDFArgParser::parseArgs()
508 } 503 }
509 504
510 OptionEntry& oe = oep->second; 505 OptionEntry& oe = oep->second;
511 - if ((oe.parameter_needed && (!have_parameter)) ||  
512 - ((!oe.choices.empty() && have_parameter && (0 == oe.choices.count(parameter))))) { 506 + if ((oe.parameter_needed && !have_parameter) ||
  507 + (!oe.choices.empty() && have_parameter && !oe.choices.contains(parameter))) {
513 std::string message = "--" + arg_s + " must be given as --" + arg_s + "="; 508 std::string message = "--" + arg_s + " must be given as --" + arg_s + "=";
514 if (oe.invalid_choice_handler) { 509 if (oe.invalid_choice_handler) {
515 oe.invalid_choice_handler(parameter); 510 oe.invalid_choice_handler(parameter);
@@ -584,7 +579,7 @@ void @@ -584,7 +579,7 @@ void
584 QPDFArgParser::addChoicesToCompletions( 579 QPDFArgParser::addChoicesToCompletions(
585 option_table_t& option_table, std::string const& option, std::string const& extra_prefix) 580 option_table_t& option_table, std::string const& option, std::string const& extra_prefix)
586 { 581 {
587 - if (option_table.count(option) != 0) { 582 + if (option_table.contains(option)) {
588 OptionEntry& oe = option_table[option]; 583 OptionEntry& oe = option_table[option];
589 for (auto const& choice: oe.choices) { 584 for (auto const& choice: oe.choices) {
590 QTC::TC("libtests", "QPDFArgParser complete choices"); 585 QTC::TC("libtests", "QPDFArgParser complete choices");
@@ -666,7 +661,7 @@ QPDFArgParser::handleCompletion() @@ -666,7 +661,7 @@ QPDFArgParser::handleCompletion()
666 std::string prefix = extra_prefix + m->bash_cur; 661 std::string prefix = extra_prefix + m->bash_cur;
667 for (auto const& iter: m->completions) { 662 for (auto const& iter: m->completions) {
668 if (prefix.empty() || (iter.substr(0, prefix.length()) == prefix)) { 663 if (prefix.empty() || (iter.substr(0, prefix.length()) == prefix)) {
669 - std::cout << iter << std::endl; 664 + std::cout << iter << '\n';
670 } 665 }
671 } 666 }
672 exit(0); 667 exit(0);
@@ -686,11 +681,11 @@ QPDFArgParser::addHelpTopic( @@ -686,11 +681,11 @@ QPDFArgParser::addHelpTopic(
686 QTC::TC("libtests", "QPDFArgParser add reserved help topic"); 681 QTC::TC("libtests", "QPDFArgParser add reserved help topic");
687 throw std::logic_error("QPDFArgParser: can't register reserved help topic " + topic); 682 throw std::logic_error("QPDFArgParser: can't register reserved help topic " + topic);
688 } 683 }
689 - if (!((topic.length() > 0) && (topic.at(0) != '-'))) { 684 + if (topic.empty() || topic.at(0) == '-') {
690 QTC::TC("libtests", "QPDFArgParser bad topic for help"); 685 QTC::TC("libtests", "QPDFArgParser bad topic for help");
691 throw std::logic_error("QPDFArgParser: help topics must not start with -"); 686 throw std::logic_error("QPDFArgParser: help topics must not start with -");
692 } 687 }
693 - if (m->help_topics.count(topic)) { 688 + if (m->help_topics.contains(topic)) {
694 QTC::TC("libtests", "QPDFArgParser add existing topic"); 689 QTC::TC("libtests", "QPDFArgParser add existing topic");
695 throw std::logic_error("QPDFArgParser: topic " + topic + " has already been added"); 690 throw std::logic_error("QPDFArgParser: topic " + topic + " has already been added");
696 } 691 }
@@ -710,7 +705,7 @@ QPDFArgParser::addOptionHelp( @@ -710,7 +705,7 @@ QPDFArgParser::addOptionHelp(
710 QTC::TC("libtests", "QPDFArgParser bad option for help"); 705 QTC::TC("libtests", "QPDFArgParser bad option for help");
711 throw std::logic_error("QPDFArgParser: options for help must start with --"); 706 throw std::logic_error("QPDFArgParser: options for help must start with --");
712 } 707 }
713 - if (m->option_help.count(option_name)) { 708 + if (m->option_help.contains(option_name)) {
714 QTC::TC("libtests", "QPDFArgParser duplicate option help"); 709 QTC::TC("libtests", "QPDFArgParser duplicate option help");
715 throw std::logic_error("QPDFArgParser: option " + option_name + " already has help"); 710 throw std::logic_error("QPDFArgParser: option " + option_name + " already has help");
716 } 711 }
@@ -729,13 +724,13 @@ QPDFArgParser::addOptionHelp( @@ -729,13 +724,13 @@ QPDFArgParser::addOptionHelp(
729 void 724 void
730 QPDFArgParser::getTopHelp(std::ostringstream& msg) 725 QPDFArgParser::getTopHelp(std::ostringstream& msg)
731 { 726 {
732 - msg << "Run \"" << m->whoami << " --help=topic\" for help on a topic." << std::endl  
733 - << "Run \"" << m->whoami << " --help=--option\" for help on an option." << std::endl  
734 - << "Run \"" << m->whoami << " --help=all\" to see all available help." << std::endl  
735 - << std::endl  
736 - << "Topics:" << std::endl; 727 + msg << "Run \"" << m->whoami << " --help=topic\" for help on a topic." << '\n'
  728 + << "Run \"" << m->whoami << " --help=--option\" for help on an option." << '\n'
  729 + << "Run \"" << m->whoami << " --help=all\" to see all available help." << '\n'
  730 + << '\n'
  731 + << "Topics:" << '\n';
737 for (auto const& i: m->help_topics) { 732 for (auto const& i: m->help_topics) {
738 - msg << " " << i.first << ": " << i.second.short_text << std::endl; 733 + msg << " " << i.first << ": " << i.second.short_text << '\n';
739 } 734 }
740 } 735 }
741 736
@@ -746,29 +741,27 @@ QPDFArgParser::getAllHelp(std::ostringstream&amp; msg) @@ -746,29 +741,27 @@ QPDFArgParser::getAllHelp(std::ostringstream&amp; msg)
746 auto show = [this, &msg](std::map<std::string, HelpTopic>& topics) { 741 auto show = [this, &msg](std::map<std::string, HelpTopic>& topics) {
747 for (auto const& i: topics) { 742 for (auto const& i: topics) {
748 auto const& topic = i.first; 743 auto const& topic = i.first;
749 - msg << std::endl  
750 - << "== " << topic << " (" << i.second.short_text << ") ==" << std::endl  
751 - << std::endl; 744 + msg << '\n' << "== " << topic << " (" << i.second.short_text << ") ==" << '\n' << '\n';
752 getTopicHelp(topic, i.second, msg); 745 getTopicHelp(topic, i.second, msg);
753 } 746 }
754 }; 747 };
755 show(m->help_topics); 748 show(m->help_topics);
756 show(m->option_help); 749 show(m->option_help);
757 - msg << std::endl << "====" << std::endl; 750 + msg << '\n' << "====" << '\n';
758 } 751 }
759 752
760 void 753 void
761 QPDFArgParser::getTopicHelp(std::string const& name, HelpTopic const& ht, std::ostringstream& msg) 754 QPDFArgParser::getTopicHelp(std::string const& name, HelpTopic const& ht, std::ostringstream& msg)
762 { 755 {
763 if (ht.long_text.empty()) { 756 if (ht.long_text.empty()) {
764 - msg << ht.short_text << std::endl; 757 + msg << ht.short_text << '\n';
765 } else { 758 } else {
766 msg << ht.long_text; 759 msg << ht.long_text;
767 } 760 }
768 if (!ht.options.empty()) { 761 if (!ht.options.empty()) {
769 - msg << std::endl << "Related options:" << std::endl; 762 + msg << '\n' << "Related options:" << '\n';
770 for (auto const& i: ht.options) { 763 for (auto const& i: ht.options) {
771 - msg << " " << i << ": " << m->option_help[i].short_text << std::endl; 764 + msg << " " << i << ": " << m->option_help[i].short_text << '\n';
772 } 765 }
773 } 766 }
774 } 767 }
@@ -782,9 +775,9 @@ QPDFArgParser::getHelp(std::string const&amp; arg) @@ -782,9 +775,9 @@ QPDFArgParser::getHelp(std::string const&amp; arg)
782 } else { 775 } else {
783 if (arg == "all") { 776 if (arg == "all") {
784 getAllHelp(msg); 777 getAllHelp(msg);
785 - } else if (m->option_help.count(arg)) { 778 + } else if (m->option_help.contains(arg)) {
786 getTopicHelp(arg, m->option_help[arg], msg); 779 getTopicHelp(arg, m->option_help[arg], msg);
787 - } else if (m->help_topics.count(arg)) { 780 + } else if (m->help_topics.contains(arg)) {
788 getTopicHelp(arg, m->help_topics[arg], msg); 781 getTopicHelp(arg, m->help_topics[arg], msg);
789 } else { 782 } else {
790 // should not be possible 783 // should not be possible
libqpdf/QPDFCryptoProvider.cc
@@ -88,7 +88,7 @@ QPDFCryptoProvider::registerImpl_internal(std::string const&amp; name, provider_fn f @@ -88,7 +88,7 @@ QPDFCryptoProvider::registerImpl_internal(std::string const&amp; name, provider_fn f
88 void 88 void
89 QPDFCryptoProvider::setDefaultProvider_internal(std::string const& name) 89 QPDFCryptoProvider::setDefaultProvider_internal(std::string const& name)
90 { 90 {
91 - if (!m->providers.count(name)) { 91 + if (!m->providers.contains(name)) {
92 throw std::logic_error( 92 throw std::logic_error(
93 "QPDFCryptoProvider: request to set default provider to unknown implementation \"" + 93 "QPDFCryptoProvider: request to set default provider to unknown implementation \"" +
94 name + "\""); 94 name + "\"");
libqpdf/QPDFJob.cc
@@ -262,13 +262,11 @@ ImageOptimizer::provideStreamData(QPDFObjGen const&amp;, Pipeline* pipeline) @@ -262,13 +262,11 @@ ImageOptimizer::provideStreamData(QPDFObjGen const&amp;, Pipeline* pipeline)
262 } 262 }
263 263
264 QPDFJob::PageSpec::PageSpec( 264 QPDFJob::PageSpec::PageSpec(
265 - std::string const& filename, char const* password, std::string const& range) : 265 + std::string const& filename, std::string const& password, std::string const& range) :
266 filename(filename), 266 filename(filename),
  267 + password(password.empty() ? "" : password),
267 range(range) 268 range(range)
268 { 269 {
269 - if (password) {  
270 - this->password = QUtil::make_shared_cstr(password);  
271 - }  
272 } 270 }
273 271
274 QPDFPageData::QPDFPageData(std::string const& filename, QPDF* qpdf, std::string const& range) : 272 QPDFPageData::QPDFPageData(std::string const& filename, QPDF* qpdf, std::string const& range) :
@@ -396,7 +394,7 @@ QPDFJob::parseRotationParameter(std::string const&amp; parameter) @@ -396,7 +394,7 @@ QPDFJob::parseRotationParameter(std::string const&amp; parameter)
396 } else { 394 } else {
397 angle_str = parameter; 395 angle_str = parameter;
398 } 396 }
399 - if (angle_str.length() > 0) { 397 + if (!angle_str.empty()) {
400 char first = angle_str.at(0); 398 char first = angle_str.at(0);
401 if ((first == '+') || (first == '-')) { 399 if ((first == '+') || (first == '-')) {
402 relative = ((first == '+') ? 1 : -1); 400 relative = ((first == '+') ? 1 : -1);
@@ -440,7 +438,7 @@ QPDFJob::createQPDF() @@ -440,7 +438,7 @@ QPDFJob::createQPDF()
440 checkConfiguration(); 438 checkConfiguration();
441 std::unique_ptr<QPDF> pdf_sp; 439 std::unique_ptr<QPDF> pdf_sp;
442 try { 440 try {
443 - processFile(pdf_sp, m->infilename.get(), m->password.get(), true, true); 441 + processFile(pdf_sp, m->infilename.data(), m->password.data(), true, true);
444 } catch (QPDFExc& e) { 442 } catch (QPDFExc& e) {
445 if (e.getErrorCode() == qpdf_e_password) { 443 if (e.getErrorCode() == qpdf_e_password) {
446 // Allow certain operations to work when an incorrect password is supplied. 444 // Allow certain operations to work when an incorrect password is supplied.
@@ -561,7 +559,7 @@ QPDFJob::hasWarnings() const @@ -561,7 +559,7 @@ QPDFJob::hasWarnings() const
561 bool 559 bool
562 QPDFJob::createsOutput() const 560 QPDFJob::createsOutput() const
563 { 561 {
564 - return ((m->outfilename != nullptr) || m->replace_input); 562 + return (!m->outfilename.empty() || m->replace_input);
565 } 563 }
566 564
567 int 565 int
@@ -604,34 +602,39 @@ QPDFJob::checkConfiguration() @@ -604,34 +602,39 @@ QPDFJob::checkConfiguration()
604 602
605 if (m->replace_input) { 603 if (m->replace_input) {
606 // Check for --empty appears later after we have checked m->infilename. 604 // Check for --empty appears later after we have checked m->infilename.
607 - if (m->outfilename) { 605 + if (!m->outfilename.empty()) {
608 usage("--replace-input may not be used when an output file is specified"); 606 usage("--replace-input may not be used when an output file is specified");
609 - } else if (m->split_pages) { 607 + }
  608 + if (m->split_pages) {
610 usage("--split-pages may not be used with --replace-input"); 609 usage("--split-pages may not be used with --replace-input");
611 - } else if (m->json_version) { 610 + }
  611 + if (m->json_version) {
612 usage("--json may not be used with --replace-input"); 612 usage("--json may not be used with --replace-input");
613 } 613 }
614 } 614 }
615 - if (m->json_version && (m->outfilename == nullptr)) { 615 + if (m->json_version && m->outfilename.empty()) {
616 // The output file is optional with --json for backward compatibility and defaults to 616 // The output file is optional with --json for backward compatibility and defaults to
617 // standard output. 617 // standard output.
618 - m->outfilename = QUtil::make_shared_cstr("-"); 618 + m->outfilename = "-";
619 } 619 }
620 - if (m->infilename == nullptr) { 620 + if (m->infilename.empty() && !m->empty_input) {
621 usage("an input file name is required"); 621 usage("an input file name is required");
622 - } else if (m->replace_input && (strlen(m->infilename.get()) == 0)) { 622 + }
  623 + if (m->replace_input && m->infilename.empty()) {
623 usage("--replace-input may not be used with --empty"); 624 usage("--replace-input may not be used with --empty");
624 - } else if (m->require_outfile && (m->outfilename == nullptr) && (!m->replace_input)) { 625 + }
  626 + if (m->require_outfile && m->outfilename.empty() && !m->replace_input) {
625 usage("an output file name is required; use - for standard output"); 627 usage("an output file name is required; use - for standard output");
626 - } else if ((!m->require_outfile) && ((m->outfilename != nullptr) || m->replace_input)) { 628 + }
  629 + if (!m->require_outfile && (!m->outfilename.empty() || m->replace_input)) {
627 usage("no output file may be given for this option"); 630 usage("no output file may be given for this option");
628 } 631 }
629 if (m->check_requires_password && m->check_is_encrypted) { 632 if (m->check_requires_password && m->check_is_encrypted) {
630 usage("--requires-password and --is-encrypted may not be given together"); 633 usage("--requires-password and --is-encrypted may not be given together");
631 } 634 }
632 635
633 - if (m->encrypt && (!m->allow_insecure) &&  
634 - (m->owner_password.empty() && (!m->user_password.empty()) && (m->keylen == 256))) { 636 + if (m->encrypt && !m->allow_insecure && m->owner_password.empty() &&
  637 + !m->user_password.empty() && m->keylen == 256) {
635 // Note that empty owner passwords for R < 5 are copied from the user password, so this lack 638 // Note that empty owner passwords for R < 5 are copied from the user password, so this lack
636 // of security is not an issue for those files. Also we are consider only the ability to 639 // of security is not an issue for those files. Also we are consider only the ability to
637 // open the file without a password to be insecure. We are not concerned about whether the 640 // open the file without a password to be insecure. We are not concerned about whether the
@@ -644,7 +647,7 @@ QPDFJob::checkConfiguration() @@ -644,7 +647,7 @@ QPDFJob::checkConfiguration()
644 } 647 }
645 648
646 bool save_to_stdout = false; 649 bool save_to_stdout = false;
647 - if (m->require_outfile && m->outfilename && (strcmp(m->outfilename.get(), "-") == 0)) { 650 + if (m->require_outfile && m->outfilename == "-") {
648 if (m->split_pages) { 651 if (m->split_pages) {
649 usage("--split-pages may not be used when writing to standard output"); 652 usage("--split-pages may not be used when writing to standard output");
650 } 653 }
@@ -656,7 +659,7 @@ QPDFJob::checkConfiguration() @@ -656,7 +659,7 @@ QPDFJob::checkConfiguration()
656 if (save_to_stdout) { 659 if (save_to_stdout) {
657 m->log->saveToStandardOutput(true); 660 m->log->saveToStandardOutput(true);
658 } 661 }
659 - if ((!m->split_pages) && QUtil::same_file(m->infilename.get(), m->outfilename.get())) { 662 + if (!m->split_pages && QUtil::same_file(m->infilename.data(), m->outfilename.data())) {
660 QTC::TC("qpdf", "QPDFJob same file error"); 663 QTC::TC("qpdf", "QPDFJob same file error");
661 usage( 664 usage(
662 "input file and output file are the same; use --replace-input to intentionally " 665 "input file and output file are the same; use --replace-input to intentionally "
@@ -664,11 +667,11 @@ QPDFJob::checkConfiguration() @@ -664,11 +667,11 @@ QPDFJob::checkConfiguration()
664 } 667 }
665 668
666 if (m->json_version == 1) { 669 if (m->json_version == 1) {
667 - if (m->json_keys.count("qpdf")) { 670 + if (m->json_keys.contains("qpdf")) {
668 usage("json key \"qpdf\" is only valid for json version > 1"); 671 usage("json key \"qpdf\" is only valid for json version > 1");
669 } 672 }
670 } else { 673 } else {
671 - if (m->json_keys.count("objectinfo") || m->json_keys.count("objects")) { 674 + if (m->json_keys.contains("objectinfo") || m->json_keys.contains("objects")) {
672 usage("json keys \"objects\" and \"objectinfo\" are only valid for json version 1"); 675 usage("json keys \"objects\" and \"objectinfo\" are only valid for json version 1");
673 } 676 }
674 } 677 }
@@ -781,7 +784,7 @@ QPDFJob::doCheck(QPDF&amp; pdf) @@ -781,7 +784,7 @@ QPDFJob::doCheck(QPDF&amp; pdf)
781 // may continue to perform additional checks after finding errors. 784 // may continue to perform additional checks after finding errors.
782 bool okay = true; 785 bool okay = true;
783 auto& cout = *m->log->getInfo(); 786 auto& cout = *m->log->getInfo();
784 - cout << "checking " << m->infilename.get() << "\n"; 787 + cout << "checking " << m->infilename << "\n";
785 QPDF::JobSetter::setCheckMode(pdf, true); 788 QPDF::JobSetter::setCheckMode(pdf, true);
786 try { 789 try {
787 int extension_level = pdf.getExtensionLevel(); 790 int extension_level = pdf.getExtensionLevel();
@@ -942,7 +945,7 @@ QPDFJob::doListAttachments(QPDF&amp; pdf) @@ -942,7 +945,7 @@ QPDFJob::doListAttachments(QPDF&amp; pdf)
942 }); 945 });
943 } 946 }
944 } else { 947 } else {
945 - *m->log->getInfo() << m->infilename.get() << " has no embedded files\n"; 948 + *m->log->getInfo() << m->infilename << " has no embedded files\n";
946 } 949 }
947 } 950 }
948 951
@@ -1002,13 +1005,13 @@ QPDFJob::doJSONObjects(Pipeline* p, bool&amp; first, QPDF&amp; pdf) @@ -1002,13 +1005,13 @@ QPDFJob::doJSONObjects(Pipeline* p, bool&amp; first, QPDF&amp; pdf)
1002 for (auto& obj: pdf.getAllObjects()) { 1005 for (auto& obj: pdf.getAllObjects()) {
1003 std::string key = obj.unparse(); 1006 std::string key = obj.unparse();
1004 1007
1005 - if (all_objects || wanted_og.count(obj.getObjGen())) { 1008 + if (all_objects || wanted_og.contains(obj.getObjGen())) {
1006 JSON::writeDictionaryKey(p, first_object, obj.unparse(), 2); 1009 JSON::writeDictionaryKey(p, first_object, obj.unparse(), 2);
1007 obj.writeJSON(1, p, true, 2); 1010 obj.writeJSON(1, p, true, 2);
1008 first_object = false; 1011 first_object = false;
1009 } 1012 }
1010 } 1013 }
1011 - if (all_objects || m->json_objects.count("trailer")) { 1014 + if (all_objects || m->json_objects.contains("trailer")) {
1012 JSON::writeDictionaryKey(p, first_object, "trailer", 2); 1015 JSON::writeDictionaryKey(p, first_object, "trailer", 2);
1013 pdf.getTrailer().writeJSON(1, p, true, 2); 1016 pdf.getTrailer().writeJSON(1, p, true, 2);
1014 first_object = false; 1017 first_object = false;
@@ -1016,7 +1019,7 @@ QPDFJob::doJSONObjects(Pipeline* p, bool&amp; first, QPDF&amp; pdf) @@ -1016,7 +1019,7 @@ QPDFJob::doJSONObjects(Pipeline* p, bool&amp; first, QPDF&amp; pdf)
1016 JSON::writeDictionaryClose(p, first_object, 1); 1019 JSON::writeDictionaryClose(p, first_object, 1);
1017 } else { 1020 } else {
1018 std::set<std::string> json_objects; 1021 std::set<std::string> json_objects;
1019 - if (m->json_objects.count("trailer")) { 1022 + if (m->json_objects.contains("trailer")) {
1020 json_objects.insert("trailer"); 1023 json_objects.insert("trailer");
1021 } 1024 }
1022 for (auto og: getWantedJSONObjects()) { 1025 for (auto og: getWantedJSONObjects()) {
@@ -1043,7 +1046,7 @@ QPDFJob::doJSONObjectinfo(Pipeline* p, bool&amp; first, QPDF&amp; pdf) @@ -1043,7 +1046,7 @@ QPDFJob::doJSONObjectinfo(Pipeline* p, bool&amp; first, QPDF&amp; pdf)
1043 bool all_objects = m->json_objects.empty(); 1046 bool all_objects = m->json_objects.empty();
1044 auto wanted_og = getWantedJSONObjects(); 1047 auto wanted_og = getWantedJSONObjects();
1045 for (auto& obj: pdf.getAllObjects()) { 1048 for (auto& obj: pdf.getAllObjects()) {
1046 - if (all_objects || wanted_og.count(obj.getObjGen())) { 1049 + if (all_objects || wanted_og.contains(obj.getObjGen())) {
1047 auto j_details = JSON::makeDictionary(); 1050 auto j_details = JSON::makeDictionary();
1048 auto j_stream = j_details.addDictionaryMember("stream", JSON::makeDictionary()); 1051 auto j_stream = j_details.addDictionaryMember("stream", JSON::makeDictionary());
1049 bool is_stream = obj.isStream(); 1052 bool is_stream = obj.isStream();
@@ -1165,7 +1168,7 @@ QPDFJob::addOutlinesToJson( @@ -1165,7 +1168,7 @@ QPDFJob::addOutlinesToJson(
1165 JSON j_destpage = JSON::makeNull(); 1168 JSON j_destpage = JSON::makeNull();
1166 if (page.isIndirect()) { 1169 if (page.isIndirect()) {
1167 QPDFObjGen og = page.getObjGen(); 1170 QPDFObjGen og = page.getObjGen();
1168 - if (page_numbers.count(og)) { 1171 + if (page_numbers.contains(og)) {
1169 j_destpage = JSON::makeInt(page_numbers[og]); 1172 j_destpage = JSON::makeInt(page_numbers[og]);
1170 } 1173 }
1171 } 1174 }
@@ -1384,190 +1387,201 @@ QPDFJob::json_schema(int json_version, std::set&lt;std::string&gt;* keys) @@ -1384,190 +1387,201 @@ QPDFJob::json_schema(int json_version, std::set&lt;std::string&gt;* keys)
1384 // mismatch is a bug in qpdf. This helps to enforce our policy of consistently providing a known 1387 // mismatch is a bug in qpdf. This helps to enforce our policy of consistently providing a known
1385 // structure where every documented key will always be present, which makes it easier to consume 1388 // structure where every documented key will always be present, which makes it easier to consume
1386 // our JSON. This is discussed in more depth in the manual. 1389 // our JSON. This is discussed in more depth in the manual.
1387 - JSON schema = JSON::makeDictionary();  
1388 - schema.addDictionaryMember(  
1389 - "version",  
1390 - JSON::makeString("JSON format serial number; increased for non-compatible changes"));  
1391 - JSON j_params = schema.addDictionaryMember("parameters", JSON::parse(R"({  
1392 - "decodelevel": "decode level used to determine stream filterability"  
1393 -})"));  
1394 1390
1395 - bool all_keys = ((keys == nullptr) || keys->empty()); 1391 + static constexpr const char* objects_schema_v1 = R"({
  1392 + "<n n R|trailer>": "json representation of object"
  1393 + })";
1396 1394
1397 - // The list of selectable top-level keys id duplicated in the following places: job.yml,  
1398 - // QPDFJob::json_schema, and QPDFJob::doJSON.  
1399 - if (json_version == 1) {  
1400 - if (all_keys || keys->count("objects")) {  
1401 - schema.addDictionaryMember("objects", JSON::parse(R"({  
1402 - "<n n R|trailer>": "json representation of object"  
1403 -})"));  
1404 - }  
1405 - if (all_keys || keys->count("objectinfo")) {  
1406 - JSON objectinfo = schema.addDictionaryMember("objectinfo", JSON::parse(R"({  
1407 - "<object-id>": {  
1408 - "stream": {  
1409 - "filter": "if stream, its filters, otherwise null",  
1410 - "is": "whether the object is a stream",  
1411 - "length": "if stream, its length, otherwise null"  
1412 - }  
1413 - }  
1414 -})")); 1395 + static constexpr const char* objectinfo_schema_v1 = R"({
  1396 + "<object-id>": {
  1397 + "stream": {
  1398 + "filter": "if stream, its filters, otherwise null",
  1399 + "is": "whether the object is a stream",
  1400 + "length": "if stream, its length, otherwise null"
1415 } 1401 }
1416 - } else {  
1417 - if (all_keys || keys->count("qpdf")) {  
1418 - schema.addDictionaryMember("qpdf", JSON::parse(R"([{  
1419 - "jsonversion": "numeric JSON version",  
1420 - "pdfversion": "PDF version as x.y",  
1421 - "pushedinheritedpageresources": "whether inherited attributes were pushed to the page level",  
1422 - "calledgetallpages": "whether getAllPages was called",  
1423 - "maxobjectid": "highest object ID in output, ignored on input"  
1424 -},  
1425 -{  
1426 - "<obj:n n R|trailer>": "json representation of object"  
1427 -}])"));  
1428 - }  
1429 - }  
1430 - if (all_keys || keys->count("pages")) {  
1431 - JSON page = schema.addDictionaryMember("pages", JSON::parse(R"([  
1432 - {  
1433 - "contents": [  
1434 - "reference to each content stream"  
1435 - ],  
1436 - "images": [ 1402 + }
  1403 + })";
  1404 +
  1405 + static constexpr const char* qpdf_schema = R"([{
  1406 + "jsonversion": "numeric JSON version",
  1407 + "pdfversion": "PDF version as x.y",
  1408 + "pushedinheritedpageresources": "whether inherited attributes were pushed to the page level",
  1409 + "calledgetallpages": "whether getAllPages was called",
  1410 + "maxobjectid": "highest object ID in output, ignored on input"
  1411 + },
  1412 + {
  1413 + "<obj:n n R|trailer>": "json representation of object"
  1414 + }])";
  1415 +
  1416 + static constexpr const char* pages_schema = R"([
1437 { 1417 {
1438 - "bitspercomponent": "bits per component",  
1439 - "colorspace": "color space",  
1440 - "decodeparms": [  
1441 - "decode parameters for image data" 1418 + "contents": [
  1419 + "reference to each content stream"
  1420 + ],
  1421 + "images": [
  1422 + {
  1423 + "bitspercomponent": "bits per component",
  1424 + "colorspace": "color space",
  1425 + "decodeparms": [
  1426 + "decode parameters for image data"
  1427 + ],
  1428 + "filter": [
  1429 + "filters applied to image data"
  1430 + ],
  1431 + "filterable": "whether image data can be decoded using the decode level qpdf was invoked with",
  1432 + "height": "image height",
  1433 + "name": "name of image in XObject table",
  1434 + "object": "reference to image stream",
  1435 + "width": "image width"
  1436 + }
1442 ], 1437 ],
1443 - "filter": [  
1444 - "filters applied to image data" 1438 + "label": "page label dictionary, or null if none",
  1439 + "object": "reference to original page object",
  1440 + "outlines": [
  1441 + {
  1442 + "dest": "outline destination dictionary",
  1443 + "object": "reference to outline that targets this page",
  1444 + "title": "outline title"
  1445 + }
1445 ], 1446 ],
1446 - "filterable": "whether image data can be decoded using the decode level qpdf was invoked with",  
1447 - "height": "image height",  
1448 - "name": "name of image in XObject table",  
1449 - "object": "reference to image stream",  
1450 - "width": "image width" 1447 + "pageposfrom1": "position of page in document numbering from 1"
  1448 + }
  1449 + ])";
  1450 +
  1451 + static constexpr const char* pagelabels_schema = R"([
  1452 + {
  1453 + "index": "starting page position starting from zero",
  1454 + "label": "page label dictionary"
1451 } 1455 }
1452 - ],  
1453 - "label": "page label dictionary, or null if none",  
1454 - "object": "reference to original page object",  
1455 - "outlines": [ 1456 + ])";
  1457 +
  1458 + static constexpr const char* outlines_schema = R"([
1456 { 1459 {
1457 "dest": "outline destination dictionary", 1460 "dest": "outline destination dictionary",
1458 - "object": "reference to outline that targets this page", 1461 + "destpageposfrom1": "position of destination page in document numbered from 1; null if not known",
  1462 + "kids": "array of descendent outlines",
  1463 + "object": "reference to this outline",
  1464 + "open": "whether the outline is displayed expanded",
1459 "title": "outline title" 1465 "title": "outline title"
1460 } 1466 }
1461 - ],  
1462 - "pageposfrom1": "position of page in document numbering from 1"  
1463 - }  
1464 -])"));  
1465 - }  
1466 - if (all_keys || keys->count("pagelabels")) {  
1467 - JSON labels = schema.addDictionaryMember("pagelabels", JSON::parse(R"([  
1468 - {  
1469 - "index": "starting page position starting from zero",  
1470 - "label": "page label dictionary"  
1471 - }  
1472 -])"));  
1473 - }  
1474 - if (all_keys || keys->count("outlines")) {  
1475 - JSON outlines = schema.addDictionaryMember("outlines", JSON::parse(R"([  
1476 - {  
1477 - "dest": "outline destination dictionary",  
1478 - "destpageposfrom1": "position of destination page in document numbered from 1; null if not known",  
1479 - "kids": "array of descendent outlines",  
1480 - "object": "reference to this outline",  
1481 - "open": "whether the outline is displayed expanded",  
1482 - "title": "outline title"  
1483 - }  
1484 -])"));  
1485 - }  
1486 - if (all_keys || keys->count("acroform")) {  
1487 - JSON acroform = schema.addDictionaryMember("acroform", JSON::parse(R"({  
1488 - "fields": [  
1489 - {  
1490 - "alternativename": "alternative name of field -- this is the one usually shown to users",  
1491 - "annotation": {  
1492 - "annotationflags": "annotation flags from /F -- see pdf_annotation_flag_e in qpdf/Constants.h",  
1493 - "appearancestate": "appearance state -- can be used to determine value for checkboxes and radio buttons",  
1494 - "object": "reference to the annotation object" 1467 + ])";
  1468 +
  1469 + static constexpr const char* acroform_schema = R"({
  1470 + "fields": [
  1471 + {
  1472 + "alternativename": "alternative name of field -- this is the one usually shown to users",
  1473 + "annotation": {
  1474 + "annotationflags": "annotation flags from /F -- see pdf_annotation_flag_e in qpdf/Constants.h",
  1475 + "appearancestate": "appearance state -- can be used to determine value for checkboxes and radio buttons",
  1476 + "object": "reference to the annotation object"
  1477 + },
  1478 + "choices": "for choices fields, the list of choices presented to the user",
  1479 + "defaultvalue": "default value of field",
  1480 + "fieldflags": "form field flags from /Ff -- see pdf_form_field_flag_e in qpdf/Constants.h",
  1481 + "fieldtype": "field type",
  1482 + "fullname": "full name of field",
  1483 + "ischeckbox": "whether field is a checkbox",
  1484 + "ischoice": "whether field is a list, combo, or dropdown",
  1485 + "isradiobutton": "whether field is a radio button -- buttons in a single group share a parent",
  1486 + "istext": "whether field is a text field",
  1487 + "mappingname": "mapping name of field",
  1488 + "object": "reference to this form field",
  1489 + "pageposfrom1": "position of containing page numbered from 1",
  1490 + "parent": "reference to this field's parent",
  1491 + "partialname": "partial name of field",
  1492 + "quadding": "field quadding -- number indicating left, center, or right",
  1493 + "value": "value of field"
  1494 + }
  1495 + ],
  1496 + "hasacroform": "whether the document has interactive forms",
  1497 + "needappearances": "whether the form fields' appearance streams need to be regenerated"
  1498 + })";
  1499 +
  1500 + static constexpr const char* encrypt_schema1 = R"({
  1501 + "capabilities": {
  1502 + "accessibility": "allow extraction for accessibility?",
  1503 + "extract": "allow extraction?",
  1504 + ")";
  1505 +
  1506 + static constexpr const char* encrypt_schema2 = R"(": "allow modifying annotations?",
  1507 + "modify": "allow all modifications?",
  1508 + "modifyassembly": "allow modifying document assembly?",
  1509 + "modifyforms": "allow modifying forms?",
  1510 + "modifyother": "allow other modifications?",
  1511 + "printhigh": "allow high resolution printing?",
  1512 + "printlow": "allow low resolution printing?"
  1513 + },
  1514 + "encrypted": "whether the document is encrypted",
  1515 + "ownerpasswordmatched": "whether supplied password matched owner password; always false for non-encrypted files",
  1516 + "recovereduserpassword": "If the owner password was used to recover the user password, reveal user password; otherwise null",
  1517 + "parameters": {
  1518 + "P": "P value from Encrypt dictionary",
  1519 + "R": "R value from Encrypt dictionary",
  1520 + "V": "V value from Encrypt dictionary",
  1521 + "bits": "encryption key bit length",
  1522 + "filemethod": "encryption method for attachments",
  1523 + "key": "encryption key; will be null unless --show-encryption-key was specified",
  1524 + "method": "overall encryption method: none, mixed, RC4, AESv2, AESv3",
  1525 + "streammethod": "encryption method for streams",
  1526 + "stringmethod": "encryption method for string"
1495 }, 1527 },
1496 - "choices": "for choices fields, the list of choices presented to the user",  
1497 - "defaultvalue": "default value of field",  
1498 - "fieldflags": "form field flags from /Ff -- see pdf_form_field_flag_e in qpdf/Constants.h",  
1499 - "fieldtype": "field type",  
1500 - "fullname": "full name of field",  
1501 - "ischeckbox": "whether field is a checkbox",  
1502 - "ischoice": "whether field is a list, combo, or dropdown",  
1503 - "isradiobutton": "whether field is a radio button -- buttons in a single group share a parent",  
1504 - "istext": "whether field is a text field",  
1505 - "mappingname": "mapping name of field",  
1506 - "object": "reference to this form field",  
1507 - "pageposfrom1": "position of containing page numbered from 1",  
1508 - "parent": "reference to this field's parent",  
1509 - "partialname": "partial name of field",  
1510 - "quadding": "field quadding -- number indicating left, center, or right",  
1511 - "value": "value of field"  
1512 - }  
1513 - ],  
1514 - "hasacroform": "whether the document has interactive forms",  
1515 - "needappearances": "whether the form fields' appearance streams need to be regenerated" 1528 + "userpasswordmatched": "whether supplied password matched user password; always false for non-encrypted files"
  1529 + })";
  1530 +
  1531 + static constexpr const char* attachments_schema = R"({
  1532 + "<attachment-key>": {
  1533 + "filespec": "object containing the file spec",
  1534 + "preferredcontents": "most preferred embedded file stream",
  1535 + "preferredname": "most preferred file name",
  1536 + "description": "description of attachment",
  1537 + "names": {
  1538 + "<name-key>": "file name for key"
  1539 + },
  1540 + "streams": {
  1541 + "<stream-key>": {
  1542 + "creationdate": "ISO-8601 creation date or null",
  1543 + "modificationdate": "ISO-8601 modification date or null",
  1544 + "mimetype": "mime type or null",
  1545 + "checksum": "MD5 checksum or null"
  1546 + }
  1547 + }
  1548 + }
  1549 + })";
  1550 +
  1551 + JSON schema = JSON::makeDictionary();
  1552 + schema.addDictionaryMember(
  1553 + "version",
  1554 + JSON::makeString("JSON format serial number; increased for non-compatible changes"));
  1555 + JSON j_params = schema.addDictionaryMember("parameters", JSON::parse(R"({
  1556 + "decodelevel": "decode level used to determine stream filterability"
1516 })")); 1557 })"));
  1558 +
  1559 + const bool all_keys = !keys || keys->empty();
  1560 +
  1561 + auto add_if_want_key = [&](std::string const& key, std::string const& json) -> void {
  1562 + if (all_keys || keys->contains(key)) {
  1563 + (void)schema.addDictionaryMember(key, JSON::parse(json));
  1564 + }
  1565 + };
  1566 +
  1567 + // The list of selectable top-level keys id duplicated in the following places: job.yml,
  1568 + // QPDFJob::json_schema, and QPDFJob::doJSON.
  1569 + if (json_version == 1) {
  1570 + add_if_want_key("objects", objects_schema_v1);
  1571 + add_if_want_key("objectinfo", objectinfo_schema_v1);
  1572 + } else {
  1573 + add_if_want_key("qpdf", qpdf_schema);
1517 } 1574 }
  1575 + add_if_want_key("pages", pages_schema);
  1576 + add_if_want_key("pagelabels", pagelabels_schema);
  1577 + add_if_want_key("outlines", outlines_schema);
  1578 + add_if_want_key("acroform", acroform_schema);
  1579 +
1518 std::string MODIFY_ANNOTATIONS = 1580 std::string MODIFY_ANNOTATIONS =
1519 (json_version == 1 ? "moddifyannotations" : "modifyannotations"); 1581 (json_version == 1 ? "moddifyannotations" : "modifyannotations");
1520 - if (all_keys || keys->count("encrypt")) {  
1521 - JSON encrypt = schema.addDictionaryMember("encrypt", JSON::parse(R"({  
1522 - "capabilities": {  
1523 - "accessibility": "allow extraction for accessibility?",  
1524 - "extract": "allow extraction?",  
1525 - ")" + MODIFY_ANNOTATIONS + R"(": "allow modifying annotations?",  
1526 - "modify": "allow all modifications?",  
1527 - "modifyassembly": "allow modifying document assembly?",  
1528 - "modifyforms": "allow modifying forms?",  
1529 - "modifyother": "allow other modifications?",  
1530 - "printhigh": "allow high resolution printing?",  
1531 - "printlow": "allow low resolution printing?"  
1532 - },  
1533 - "encrypted": "whether the document is encrypted",  
1534 - "ownerpasswordmatched": "whether supplied password matched owner password; always false for non-encrypted files",  
1535 - "recovereduserpassword": "If the owner password was used to recover the user password, reveal user password; otherwise null",  
1536 - "parameters": {  
1537 - "P": "P value from Encrypt dictionary",  
1538 - "R": "R value from Encrypt dictionary",  
1539 - "V": "V value from Encrypt dictionary",  
1540 - "bits": "encryption key bit length",  
1541 - "filemethod": "encryption method for attachments",  
1542 - "key": "encryption key; will be null unless --show-encryption-key was specified",  
1543 - "method": "overall encryption method: none, mixed, RC4, AESv2, AESv3",  
1544 - "streammethod": "encryption method for streams",  
1545 - "stringmethod": "encryption method for string"  
1546 - },  
1547 - "userpasswordmatched": "whether supplied password matched user password; always false for non-encrypted files"  
1548 -})"));  
1549 - }  
1550 - if (all_keys || keys->count("attachments")) {  
1551 - JSON attachments = schema.addDictionaryMember("attachments", JSON::parse(R"({  
1552 - "<attachment-key>": {  
1553 - "filespec": "object containing the file spec",  
1554 - "preferredcontents": "most preferred embedded file stream",  
1555 - "preferredname": "most preferred file name",  
1556 - "description": "description of attachment",  
1557 - "names": {  
1558 - "<name-key>": "file name for key"  
1559 - },  
1560 - "streams": {  
1561 - "<stream-key>": {  
1562 - "creationdate": "ISO-8601 creation date or null",  
1563 - "modificationdate": "ISO-8601 modification date or null",  
1564 - "mimetype": "mime type or null",  
1565 - "checksum": "MD5 checksum or null"  
1566 - }  
1567 - }  
1568 - }  
1569 -})"));  
1570 - } 1582 + add_if_want_key("encrypt", encrypt_schema1 + MODIFY_ANNOTATIONS + encrypt_schema2);
  1583 + add_if_want_key("attachments", attachments_schema);
  1584 +
1571 return schema; 1585 return schema;
1572 } 1586 }
1573 1587
@@ -1590,9 +1604,9 @@ QPDFJob::doJSON(QPDF&amp; pdf, Pipeline* p) @@ -1590,9 +1604,9 @@ QPDFJob::doJSON(QPDF&amp; pdf, Pipeline* p)
1590 // are reserved for users. 1604 // are reserved for users.
1591 1605
1592 std::string captured_json; 1606 std::string captured_json;
1593 - std::shared_ptr<Pl_String> pl_str; 1607 + std::unique_ptr<Pl_String> pl_str;
1594 if (m->test_json_schema) { 1608 if (m->test_json_schema) {
1595 - pl_str = std::make_shared<Pl_String>("capture json", p, captured_json); 1609 + pl_str = std::make_unique<Pl_String>("capture json", p, captured_json);
1596 p = pl_str.get(); 1610 p = pl_str.get();
1597 } 1611 }
1598 1612
@@ -1626,43 +1640,49 @@ QPDFJob::doJSON(QPDF&amp; pdf, Pipeline* p) @@ -1626,43 +1640,49 @@ QPDFJob::doJSON(QPDF&amp; pdf, Pipeline* p)
1626 j_params.addDictionaryMember("decodelevel", JSON::makeString(decode_level_str)); 1640 j_params.addDictionaryMember("decodelevel", JSON::makeString(decode_level_str));
1627 JSON::writeDictionaryItem(p, first, "parameters", j_params, 1); 1641 JSON::writeDictionaryItem(p, first, "parameters", j_params, 1);
1628 } 1642 }
1629 - bool all_keys = m->json_keys.empty(); 1643 +
  1644 + const bool all_keys = m->json_keys.empty();
  1645 +
  1646 + auto want_key = [&](std::string const& key) -> bool {
  1647 + return all_keys || m->json_keys.contains(key);
  1648 + };
  1649 +
1630 // The list of selectable top-level keys id duplicated in the following places: job.yml, 1650 // The list of selectable top-level keys id duplicated in the following places: job.yml,
1631 // QPDFJob::json_schema, and QPDFJob::doJSON. 1651 // QPDFJob::json_schema, and QPDFJob::doJSON.
1632 1652
1633 // We do pages and pagelabels first since they have the side effect of repairing the pages tree, 1653 // We do pages and pagelabels first since they have the side effect of repairing the pages tree,
1634 // which could potentially impact object references in remaining items. 1654 // which could potentially impact object references in remaining items.
1635 - if (all_keys || m->json_keys.count("pages")) { 1655 + if (want_key("pages")) {
1636 doJSONPages(p, first, pdf); 1656 doJSONPages(p, first, pdf);
1637 } 1657 }
1638 - if (all_keys || m->json_keys.count("pagelabels")) { 1658 + if (want_key("pagelabels")) {
1639 doJSONPageLabels(p, first, pdf); 1659 doJSONPageLabels(p, first, pdf);
1640 } 1660 }
1641 1661
1642 // The non-special keys are output in alphabetical order, but the order doesn't actually matter. 1662 // The non-special keys are output in alphabetical order, but the order doesn't actually matter.
1643 - if (all_keys || m->json_keys.count("acroform")) { 1663 + if (want_key("acroform")) {
1644 doJSONAcroform(p, first, pdf); 1664 doJSONAcroform(p, first, pdf);
1645 } 1665 }
1646 - if (all_keys || m->json_keys.count("attachments")) { 1666 + if (want_key("attachments")) {
1647 doJSONAttachments(p, first, pdf); 1667 doJSONAttachments(p, first, pdf);
1648 } 1668 }
1649 - if (all_keys || m->json_keys.count("encrypt")) { 1669 + if (want_key("encrypt")) {
1650 doJSONEncrypt(p, first, pdf); 1670 doJSONEncrypt(p, first, pdf);
1651 } 1671 }
1652 - if (all_keys || m->json_keys.count("outlines")) { 1672 + if (want_key("outlines")) {
1653 doJSONOutlines(p, first, pdf); 1673 doJSONOutlines(p, first, pdf);
1654 } 1674 }
1655 1675
1656 // We do objects last so their information is consistent with repairing the page tree. To see 1676 // We do objects last so their information is consistent with repairing the page tree. To see
1657 // the original file with any page tree problems and the page tree not flattened, select 1677 // the original file with any page tree problems and the page tree not flattened, select
1658 // qpdf/objects/objectinfo without other keys. 1678 // qpdf/objects/objectinfo without other keys.
1659 - if (all_keys || m->json_keys.count("objects") || m->json_keys.count("qpdf")) { 1679 + if (want_key("objects") || want_key("qpdf")) {
1660 doJSONObjects(p, first, pdf); 1680 doJSONObjects(p, first, pdf);
1661 } 1681 }
1662 if (m->json_version == 1) { 1682 if (m->json_version == 1) {
1663 // "objectinfo" is not needed for version >1 since you can tell streams from other objects 1683 // "objectinfo" is not needed for version >1 since you can tell streams from other objects
1664 // in "objects". 1684 // in "objects".
1665 - if (all_keys || m->json_keys.count("objectinfo")) { 1685 + if (want_key("objectinfo")) {
1666 doJSONObjectinfo(p, first, pdf); 1686 doJSONObjectinfo(p, first, pdf);
1667 } 1687 }
1668 } 1688 }
@@ -1700,9 +1720,9 @@ QPDFJob::doInspection(QPDF&amp; pdf) @@ -1700,9 +1720,9 @@ QPDFJob::doInspection(QPDF&amp; pdf)
1700 } 1720 }
1701 if (m->check_linearization) { 1721 if (m->check_linearization) {
1702 if (!pdf.isLinearized()) { 1722 if (!pdf.isLinearized()) {
1703 - cout << m->infilename.get() << " is not linearized\n"; 1723 + cout << m->infilename << " is not linearized\n";
1704 } else if (pdf.checkLinearization()) { 1724 } else if (pdf.checkLinearization()) {
1705 - cout << m->infilename.get() << ": no linearization errors\n"; 1725 + cout << m->infilename << ": no linearization errors\n";
1706 } else { 1726 } else {
1707 m->warnings = true; 1727 m->warnings = true;
1708 } 1728 }
@@ -1711,7 +1731,7 @@ QPDFJob::doInspection(QPDF&amp; pdf) @@ -1711,7 +1731,7 @@ QPDFJob::doInspection(QPDF&amp; pdf)
1711 if (pdf.isLinearized()) { 1731 if (pdf.isLinearized()) {
1712 pdf.showLinearizationData(); 1732 pdf.showLinearizationData();
1713 } else { 1733 } else {
1714 - cout << m->infilename.get() << " is not linearized\n"; 1734 + cout << m->infilename << " is not linearized\n";
1715 } 1735 }
1716 } 1736 }
1717 if (m->show_xref) { 1737 if (m->show_xref) {
@@ -1748,7 +1768,7 @@ QPDFJob::doProcessOnce( @@ -1748,7 +1768,7 @@ QPDFJob::doProcessOnce(
1748 if (empty) { 1768 if (empty) {
1749 pdf->emptyPDF(); 1769 pdf->emptyPDF();
1750 } else if (main_input && m->json_input) { 1770 } else if (main_input && m->json_input) {
1751 - pdf->createFromJSON(m->infilename.get()); 1771 + pdf->createFromJSON(m->infilename);
1752 } else { 1772 } else {
1753 fn(pdf.get(), password); 1773 fn(pdf.get(), password);
1754 } 1774 }
@@ -1862,7 +1882,7 @@ QPDFJob::validateUnderOverlay(QPDF&amp; pdf, UnderOverlay* uo) @@ -1862,7 +1882,7 @@ QPDFJob::validateUnderOverlay(QPDF&amp; pdf, UnderOverlay* uo)
1862 { 1882 {
1863 QPDFPageDocumentHelper main_pdh(pdf); 1883 QPDFPageDocumentHelper main_pdh(pdf);
1864 int main_npages = QIntC::to_int(main_pdh.getAllPages().size()); 1884 int main_npages = QIntC::to_int(main_pdh.getAllPages().size());
1865 - processFile(uo->pdf, uo->filename.c_str(), uo->password.get(), true, false); 1885 + processFile(uo->pdf, uo->filename.data(), uo->password.data(), true, false);
1866 QPDFPageDocumentHelper uo_pdh(*(uo->pdf)); 1886 QPDFPageDocumentHelper uo_pdh(*(uo->pdf));
1867 int uo_npages = QIntC::to_int(uo_pdh.getAllPages().size()); 1887 int uo_npages = QIntC::to_int(uo_pdh.getAllPages().size());
1868 try { 1888 try {
@@ -1891,7 +1911,7 @@ get_afdh_for_qpdf( @@ -1891,7 +1911,7 @@ get_afdh_for_qpdf(
1891 std::map<unsigned long long, std::shared_ptr<QPDFAcroFormDocumentHelper>>& afdh_map, QPDF* q) 1911 std::map<unsigned long long, std::shared_ptr<QPDFAcroFormDocumentHelper>>& afdh_map, QPDF* q)
1892 { 1912 {
1893 auto uid = q->getUniqueId(); 1913 auto uid = q->getUniqueId();
1894 - if (!afdh_map.count(uid)) { 1914 + if (!afdh_map.contains(uid)) {
1895 afdh_map[uid] = std::make_shared<QPDFAcroFormDocumentHelper>(*q); 1915 afdh_map[uid] = std::make_shared<QPDFAcroFormDocumentHelper>(*q);
1896 } 1916 }
1897 return afdh_map[uid].get(); 1917 return afdh_map[uid].get();
@@ -1909,7 +1929,7 @@ QPDFJob::doUnderOverlayForPage( @@ -1909,7 +1929,7 @@ QPDFJob::doUnderOverlayForPage(
1909 QPDFPageObjectHelper& dest_page) 1929 QPDFPageObjectHelper& dest_page)
1910 { 1930 {
1911 int pageno = 1 + QIntC::to_int(page_idx); 1931 int pageno = 1 + QIntC::to_int(page_idx);
1912 - if (!(pagenos.count(pageno) && pagenos[pageno].count(uo_idx))) { 1932 + if (!(pagenos.contains(pageno) && pagenos[pageno].contains(uo_idx))) {
1913 return ""; 1933 return "";
1914 } 1934 }
1915 1935
@@ -1928,7 +1948,7 @@ QPDFJob::doUnderOverlayForPage( @@ -1928,7 +1948,7 @@ QPDFJob::doUnderOverlayForPage(
1928 v << " " << uo.filename << " " << uo.which << " " << from_pageno << "\n"; 1948 v << " " << uo.filename << " " << uo.which << " " << from_pageno << "\n";
1929 }); 1949 });
1930 auto from_page = pages.at(QIntC::to_size(from_pageno - 1)); 1950 auto from_page = pages.at(QIntC::to_size(from_pageno - 1));
1931 - if (fo[from_pageno].count(uo_idx) == 0) { 1951 + if (!fo[from_pageno].contains(uo_idx)) {
1932 fo[from_pageno][uo_idx] = pdf.copyForeignObject(from_page.getFormXObjectForPage()); 1952 fo[from_pageno][uo_idx] = pdf.copyForeignObject(from_page.getFormXObjectForPage());
1933 } 1953 }
1934 1954
@@ -2410,7 +2430,7 @@ QPDFJob::handlePageSpecs(QPDF&amp; pdf, std::vector&lt;std::unique_ptr&lt;QPDF&gt;&gt;&amp; page_hea @@ -2410,7 +2430,7 @@ QPDFJob::handlePageSpecs(QPDF&amp; pdf, std::vector&lt;std::unique_ptr&lt;QPDF&gt;&gt;&amp; page_hea
2410 // Handle "." as a shortcut for the input file 2430 // Handle "." as a shortcut for the input file
2411 for (auto& page_spec: m->page_specs) { 2431 for (auto& page_spec: m->page_specs) {
2412 if (page_spec.filename == ".") { 2432 if (page_spec.filename == ".") {
2413 - page_spec.filename = m->infilename.get(); 2433 + page_spec.filename = m->infilename;
2414 } 2434 }
2415 if (page_spec.range.empty()) { 2435 if (page_spec.range.empty()) {
2416 page_spec.range = "1-z"; 2436 page_spec.range = "1-z";
@@ -2436,11 +2456,11 @@ QPDFJob::handlePageSpecs(QPDF&amp; pdf, std::vector&lt;std::unique_ptr&lt;QPDF&gt;&gt;&amp; page_hea @@ -2436,11 +2456,11 @@ QPDFJob::handlePageSpecs(QPDF&amp; pdf, std::vector&lt;std::unique_ptr&lt;QPDF&gt;&gt;&amp; page_hea
2436 // Create a QPDF object for each file that we may take pages from. 2456 // Create a QPDF object for each file that we may take pages from.
2437 std::map<std::string, QPDF*> page_spec_qpdfs; 2457 std::map<std::string, QPDF*> page_spec_qpdfs;
2438 std::map<std::string, ClosedFileInputSource*> page_spec_cfis; 2458 std::map<std::string, ClosedFileInputSource*> page_spec_cfis;
2439 - page_spec_qpdfs[m->infilename.get()] = &pdf; 2459 + page_spec_qpdfs[m->infilename] = &pdf;
2440 std::vector<QPDFPageData> parsed_specs; 2460 std::vector<QPDFPageData> parsed_specs;
2441 std::map<unsigned long long, std::set<QPDFObjGen>> copied_pages; 2461 std::map<unsigned long long, std::set<QPDFObjGen>> copied_pages;
2442 for (auto& page_spec: m->page_specs) { 2462 for (auto& page_spec: m->page_specs) {
2443 - if (page_spec_qpdfs.count(page_spec.filename) == 0) { 2463 + if (!page_spec_qpdfs.contains(page_spec.filename)) {
2444 // Open the PDF file and store the QPDF object. Throw a std::shared_ptr to the qpdf into 2464 // Open the PDF file and store the QPDF object. Throw a std::shared_ptr to the qpdf into
2445 // a heap so that it survives through copying to the output but gets cleaned up 2465 // a heap so that it survives through copying to the output but gets cleaned up
2446 // automatically at the end. Do not canonicalize the file name. Using two different 2466 // automatically at the end. Do not canonicalize the file name. Using two different
@@ -2448,11 +2468,11 @@ QPDFJob::handlePageSpecs(QPDF&amp; pdf, std::vector&lt;std::unique_ptr&lt;QPDF&gt;&gt;&amp; page_hea @@ -2448,11 +2468,11 @@ QPDFJob::handlePageSpecs(QPDF&amp; pdf, std::vector&lt;std::unique_ptr&lt;QPDF&gt;&gt;&amp; page_hea
2448 // you are using this an example of how to do this with the API, you can just create two 2468 // you are using this an example of how to do this with the API, you can just create two
2449 // different QPDF objects to the same underlying file with the same path to achieve the 2469 // different QPDF objects to the same underlying file with the same path to achieve the
2450 // same effect. 2470 // same effect.
2451 - char const* password = page_spec.password.get();  
2452 - if ((!m->encryption_file.empty()) && (password == nullptr) &&  
2453 - (page_spec.filename == m->encryption_file)) { 2471 + auto password = page_spec.password;
  2472 + if (!m->encryption_file.empty() && password.empty() &&
  2473 + page_spec.filename == m->encryption_file) {
2454 QTC::TC("qpdf", "QPDFJob pages encryption password"); 2474 QTC::TC("qpdf", "QPDFJob pages encryption password");
2455 - password = m->encryption_file_password.get(); 2475 + password = m->encryption_file_password;
2456 } 2476 }
2457 doIfVerbose([&](Pipeline& v, std::string const& prefix) { 2477 doIfVerbose([&](Pipeline& v, std::string const& prefix) {
2458 v << prefix << ": processing " << page_spec.filename << "\n"; 2478 v << prefix << ": processing " << page_spec.filename << "\n";
@@ -2470,7 +2490,7 @@ QPDFJob::handlePageSpecs(QPDF&amp; pdf, std::vector&lt;std::unique_ptr&lt;QPDF&gt;&gt;&amp; page_hea @@ -2470,7 +2490,7 @@ QPDFJob::handlePageSpecs(QPDF&amp; pdf, std::vector&lt;std::unique_ptr&lt;QPDF&gt;&gt;&amp; page_hea
2470 is = std::shared_ptr<InputSource>(fis); 2490 is = std::shared_ptr<InputSource>(fis);
2471 } 2491 }
2472 std::unique_ptr<QPDF> qpdf_sp; 2492 std::unique_ptr<QPDF> qpdf_sp;
2473 - processInputSource(qpdf_sp, is, password, true); 2493 + processInputSource(qpdf_sp, is, password.data(), true);
2474 page_spec_qpdfs[page_spec.filename] = qpdf_sp.get(); 2494 page_spec_qpdfs[page_spec.filename] = qpdf_sp.get();
2475 page_heap.push_back(std::move(qpdf_sp)); 2495 page_heap.push_back(std::move(qpdf_sp));
2476 if (cis) { 2496 if (cis) {
@@ -2490,13 +2510,13 @@ QPDFJob::handlePageSpecs(QPDF&amp; pdf, std::vector&lt;std::unique_ptr&lt;QPDF&gt;&gt;&amp; page_hea @@ -2490,13 +2510,13 @@ QPDFJob::handlePageSpecs(QPDF&amp; pdf, std::vector&lt;std::unique_ptr&lt;QPDF&gt;&gt;&amp; page_hea
2490 for (auto const& iter: page_spec_qpdfs) { 2510 for (auto const& iter: page_spec_qpdfs) {
2491 std::string const& filename = iter.first; 2511 std::string const& filename = iter.first;
2492 ClosedFileInputSource* cis = nullptr; 2512 ClosedFileInputSource* cis = nullptr;
2493 - if (page_spec_cfis.count(filename)) { 2513 + if (page_spec_cfis.contains(filename)) {
2494 cis = page_spec_cfis[filename]; 2514 cis = page_spec_cfis[filename];
2495 cis->stayOpen(true); 2515 cis->stayOpen(true);
2496 } 2516 }
2497 QPDF& other(*(iter.second)); 2517 QPDF& other(*(iter.second));
2498 auto other_uuid = other.getUniqueId(); 2518 auto other_uuid = other.getUniqueId();
2499 - if (remove_unreferenced.count(other_uuid) == 0) { 2519 + if (!remove_unreferenced.contains(other_uuid)) {
2500 remove_unreferenced[other_uuid] = shouldRemoveUnreferencedResources(other); 2520 remove_unreferenced[other_uuid] = shouldRemoveUnreferencedResources(other);
2501 } 2521 }
2502 if (cis) { 2522 if (cis) {
@@ -2563,7 +2583,7 @@ QPDFJob::handlePageSpecs(QPDF&amp; pdf, std::vector&lt;std::unique_ptr&lt;QPDF&gt;&gt;&amp; page_hea @@ -2563,7 +2583,7 @@ QPDFJob::handlePageSpecs(QPDF&amp; pdf, std::vector&lt;std::unique_ptr&lt;QPDF&gt;&gt;&amp; page_hea
2563 std::set<QPDFObjGen> referenced_fields; 2583 std::set<QPDFObjGen> referenced_fields;
2564 for (auto& page_data: parsed_specs) { 2584 for (auto& page_data: parsed_specs) {
2565 ClosedFileInputSource* cis = nullptr; 2585 ClosedFileInputSource* cis = nullptr;
2566 - if (page_spec_cfis.count(page_data.filename)) { 2586 + if (page_spec_cfis.contains(page_data.filename)) {
2567 cis = page_spec_cfis[page_data.filename]; 2587 cis = page_spec_cfis[page_data.filename];
2568 cis->stayOpen(true); 2588 cis->stayOpen(true);
2569 } 2589 }
@@ -2582,7 +2602,7 @@ QPDFJob::handlePageSpecs(QPDF&amp; pdf, std::vector&lt;std::unique_ptr&lt;QPDF&gt;&gt;&amp; page_hea @@ -2582,7 +2602,7 @@ QPDFJob::handlePageSpecs(QPDF&amp; pdf, std::vector&lt;std::unique_ptr&lt;QPDF&gt;&gt;&amp; page_hea
2582 QPDFPageObjectHelper to_copy = page_data.orig_pages.at(QIntC::to_size(pageno)); 2602 QPDFPageObjectHelper to_copy = page_data.orig_pages.at(QIntC::to_size(pageno));
2583 QPDFObjGen to_copy_og = to_copy.getObjectHandle().getObjGen(); 2603 QPDFObjGen to_copy_og = to_copy.getObjectHandle().getObjGen();
2584 unsigned long long from_uuid = page_data.qpdf->getUniqueId(); 2604 unsigned long long from_uuid = page_data.qpdf->getUniqueId();
2585 - if (copied_pages[from_uuid].count(to_copy_og)) { 2605 + if (copied_pages[from_uuid].contains(to_copy_og)) {
2586 QTC::TC( 2606 QTC::TC(
2587 "qpdf", 2607 "qpdf",
2588 "QPDFJob copy same page more than once", 2608 "QPDFJob copy same page more than once",
@@ -2600,7 +2620,7 @@ QPDFJob::handlePageSpecs(QPDF&amp; pdf, std::vector&lt;std::unique_ptr&lt;QPDF&gt;&gt;&amp; page_hea @@ -2600,7 +2620,7 @@ QPDFJob::handlePageSpecs(QPDF&amp; pdf, std::vector&lt;std::unique_ptr&lt;QPDF&gt;&gt;&amp; page_hea
2600 if (this_file) { 2620 if (this_file) {
2601 // This is a page from the original file. Keep track of the fact that we are using 2621 // This is a page from the original file. Keep track of the fact that we are using
2602 // it. 2622 // it.
2603 - first_copy_from_orig = (selected_from_orig.count(pageno) == 0); 2623 + first_copy_from_orig = (!selected_from_orig.contains(pageno));
2604 selected_from_orig.insert(pageno); 2624 selected_from_orig.insert(pageno);
2605 } 2625 }
2606 auto new_page = added_page(pdf, to_copy); 2626 auto new_page = added_page(pdf, to_copy);
@@ -2645,7 +2665,7 @@ QPDFJob::handlePageSpecs(QPDF&amp; pdf, std::vector&lt;std::unique_ptr&lt;QPDF&gt;&gt;&amp; page_hea @@ -2645,7 +2665,7 @@ QPDFJob::handlePageSpecs(QPDF&amp; pdf, std::vector&lt;std::unique_ptr&lt;QPDF&gt;&gt;&amp; page_hea
2645 // sure we keep form fields from pages we preserved. 2665 // sure we keep form fields from pages we preserved.
2646 for (size_t pageno = 0; pageno < orig_pages.size(); ++pageno) { 2666 for (size_t pageno = 0; pageno < orig_pages.size(); ++pageno) {
2647 auto page = orig_pages.at(pageno); 2667 auto page = orig_pages.at(pageno);
2648 - if (selected_from_orig.count(QIntC::to_int(pageno))) { 2668 + if (selected_from_orig.contains(QIntC::to_int(pageno))) {
2649 for (auto field: this_afdh->getFormFieldsForPage(page)) { 2669 for (auto field: this_afdh->getFormFieldsForPage(page)) {
2650 QTC::TC("qpdf", "QPDFJob pages keeping field from original"); 2670 QTC::TC("qpdf", "QPDFJob pages keeping field from original");
2651 referenced_fields.insert(field.getObjectHandle().getObjGen()); 2671 referenced_fields.insert(field.getObjectHandle().getObjGen());
@@ -2664,7 +2684,7 @@ QPDFJob::handlePageSpecs(QPDF&amp; pdf, std::vector&lt;std::unique_ptr&lt;QPDF&gt;&gt;&amp; page_hea @@ -2664,7 +2684,7 @@ QPDFJob::handlePageSpecs(QPDF&amp; pdf, std::vector&lt;std::unique_ptr&lt;QPDF&gt;&gt;&amp; page_hea
2664 new_fields = pdf.makeIndirectObject(new_fields); 2684 new_fields = pdf.makeIndirectObject(new_fields);
2665 } 2685 }
2666 for (auto const& field: fields.aitems()) { 2686 for (auto const& field: fields.aitems()) {
2667 - if (referenced_fields.count(field.getObjGen())) { 2687 + if (referenced_fields.contains(field.getObjGen())) {
2668 new_fields.appendItem(field); 2688 new_fields.appendItem(field);
2669 } 2689 }
2670 } 2690 }
@@ -2940,8 +2960,8 @@ QPDFJob::setWriterOptions(QPDFWriter&amp; w) @@ -2940,8 +2960,8 @@ QPDFJob::setWriterOptions(QPDFWriter&amp; w)
2940 std::unique_ptr<QPDF> encryption_pdf; 2960 std::unique_ptr<QPDF> encryption_pdf;
2941 processFile( 2961 processFile(
2942 encryption_pdf, 2962 encryption_pdf,
2943 - m->encryption_file.c_str(),  
2944 - m->encryption_file_password.get(), 2963 + m->encryption_file.data(),
  2964 + m->encryption_file_password.data(),
2945 false, 2965 false,
2946 false); 2966 false);
2947 w.copyEncryptionParameters(*encryption_pdf); 2967 w.copyEncryptionParameters(*encryption_pdf);
@@ -2977,7 +2997,8 @@ QPDFJob::setWriterOptions(QPDFWriter&amp; w) @@ -2977,7 +2997,8 @@ QPDFJob::setWriterOptions(QPDFWriter&amp; w)
2977 std::shared_ptr<QPDFWriter::ProgressReporter>( 2997 std::shared_ptr<QPDFWriter::ProgressReporter>(
2978 new QPDFWriter::FunctionProgressReporter(m->progress_handler))); 2998 new QPDFWriter::FunctionProgressReporter(m->progress_handler)));
2979 } else { 2999 } else {
2980 - char const* outfilename = m->outfilename ? m->outfilename.get() : "standard output"; 3000 + char const* outfilename =
  3001 + !m->outfilename.empty() ? m->outfilename.data() : "standard output";
2981 w.registerProgressReporter( 3002 w.registerProgressReporter(
2982 std::shared_ptr<QPDFWriter::ProgressReporter>( 3003 std::shared_ptr<QPDFWriter::ProgressReporter>(
2983 // line-break 3004 // line-break
@@ -2992,20 +3013,20 @@ QPDFJob::doSplitPages(QPDF&amp; pdf) @@ -2992,20 +3013,20 @@ QPDFJob::doSplitPages(QPDF&amp; pdf)
2992 // Generate output file pattern 3013 // Generate output file pattern
2993 std::string before; 3014 std::string before;
2994 std::string after; 3015 std::string after;
2995 - size_t len = strlen(m->outfilename.get());  
2996 - char* num_spot = strstr(const_cast<char*>(m->outfilename.get()), "%d");  
2997 - if (num_spot != nullptr) { 3016 + size_t len = m->outfilename.size();
  3017 + auto num_spot = m->outfilename.find("%d");
  3018 + if (num_spot != std::string::npos) {
2998 QTC::TC("qpdf", "QPDFJob split-pages %d"); 3019 QTC::TC("qpdf", "QPDFJob split-pages %d");
2999 - before = std::string(m->outfilename.get(), QIntC::to_size(num_spot - m->outfilename.get()));  
3000 - after = num_spot + 2; 3020 + before = m->outfilename.substr(0, num_spot);
  3021 + after = m->outfilename.substr(num_spot + 2);
3001 } else if ( 3022 } else if (
3002 - (len >= 4) && (QUtil::str_compare_nocase(m->outfilename.get() + len - 4, ".pdf") == 0)) { 3023 + len >= 4 && QUtil::str_compare_nocase(m->outfilename.substr(len - 4).data(), ".pdf") == 0) {
3003 QTC::TC("qpdf", "QPDFJob split-pages .pdf"); 3024 QTC::TC("qpdf", "QPDFJob split-pages .pdf");
3004 - before = std::string(m->outfilename.get(), len - 4) + "-";  
3005 - after = m->outfilename.get() + len - 4; 3025 + before = std::string(m->outfilename.data(), len - 4) + "-";
  3026 + after = m->outfilename.data() + len - 4;
3006 } else { 3027 } else {
3007 QTC::TC("qpdf", "QPDFJob split-pages other"); 3028 QTC::TC("qpdf", "QPDFJob split-pages other");
3008 - before = std::string(m->outfilename.get()) + "-"; 3029 + before = m->outfilename + "-";
3009 } 3030 }
3010 3031
3011 if (shouldRemoveUnreferencedResources(pdf)) { 3032 if (shouldRemoveUnreferencedResources(pdf)) {
@@ -3064,7 +3085,7 @@ QPDFJob::doSplitPages(QPDF&amp; pdf) @@ -3064,7 +3085,7 @@ QPDFJob::doSplitPages(QPDF&amp; pdf)
3064 page_range += "-" + QUtil::uint_to_string(last, QIntC::to_int(pageno_len)); 3085 page_range += "-" + QUtil::uint_to_string(last, QIntC::to_int(pageno_len));
3065 } 3086 }
3066 std::string outfile = before + page_range + after; 3087 std::string outfile = before + page_range + after;
3067 - if (QUtil::same_file(m->infilename.get(), outfile.c_str())) { 3088 + if (QUtil::same_file(m->infilename.data(), outfile.data())) {
3068 throw std::runtime_error("split pages would overwrite input file with " + outfile); 3089 throw std::runtime_error("split pages would overwrite input file with " + outfile);
3069 } 3090 }
3070 QPDFWriter w(outpdf, outfile.c_str()); 3091 QPDFWriter w(outpdf, outfile.c_str());
@@ -3079,15 +3100,15 @@ QPDFJob::doSplitPages(QPDF&amp; pdf) @@ -3079,15 +3100,15 @@ QPDFJob::doSplitPages(QPDF&amp; pdf)
3079 void 3100 void
3080 QPDFJob::writeOutfile(QPDF& pdf) 3101 QPDFJob::writeOutfile(QPDF& pdf)
3081 { 3102 {
3082 - std::shared_ptr<char> temp_out; 3103 + std::string temp_out;
3083 if (m->replace_input) { 3104 if (m->replace_input) {
3084 // Append but don't prepend to the path to generate a temporary name. This saves us from 3105 // Append but don't prepend to the path to generate a temporary name. This saves us from
3085 // having to split the path by directory and non-directory. 3106 // having to split the path by directory and non-directory.
3086 - temp_out = QUtil::make_shared_cstr(std::string(m->infilename.get()) + ".~qpdf-temp#"); 3107 + temp_out = m->infilename + ".~qpdf-temp#";
3087 // m->outfilename will be restored to 0 before temp_out goes out of scope. 3108 // m->outfilename will be restored to 0 before temp_out goes out of scope.
3088 m->outfilename = temp_out; 3109 m->outfilename = temp_out;
3089 - } else if (strcmp(m->outfilename.get(), "-") == 0) {  
3090 - m->outfilename = nullptr; 3110 + } else if (m->outfilename == "-") {
  3111 + m->outfilename.clear();
3091 } 3112 }
3092 if (m->json_version) { 3113 if (m->json_version) {
3093 writeJSON(pdf); 3114 writeJSON(pdf);
@@ -3095,8 +3116,8 @@ QPDFJob::writeOutfile(QPDF&amp; pdf) @@ -3095,8 +3116,8 @@ QPDFJob::writeOutfile(QPDF&amp; pdf)
3095 // QPDFWriter must have block scope so the output file will be closed after write() 3116 // QPDFWriter must have block scope so the output file will be closed after write()
3096 // finishes. 3117 // finishes.
3097 QPDFWriter w(pdf); 3118 QPDFWriter w(pdf);
3098 - if (m->outfilename) {  
3099 - w.setOutputFilename(m->outfilename.get()); 3119 + if (!m->outfilename.empty()) {
  3120 + w.setOutputFilename(m->outfilename.data());
3100 } else { 3121 } else {
3101 // saveToStandardOutput has already been called, but calling it again is defensive and 3122 // saveToStandardOutput has already been called, but calling it again is defensive and
3102 // harmless. 3123 // harmless.
@@ -3106,24 +3127,24 @@ QPDFJob::writeOutfile(QPDF&amp; pdf) @@ -3106,24 +3127,24 @@ QPDFJob::writeOutfile(QPDF&amp; pdf)
3106 setWriterOptions(w); 3127 setWriterOptions(w);
3107 w.write(); 3128 w.write();
3108 } 3129 }
3109 - if (m->outfilename) { 3130 + if (!m->outfilename.empty()) {
3110 doIfVerbose([&](Pipeline& v, std::string const& prefix) { 3131 doIfVerbose([&](Pipeline& v, std::string const& prefix) {
3111 - v << prefix << ": wrote file " << m->outfilename.get() << "\n"; 3132 + v << prefix << ": wrote file " << m->outfilename << "\n";
3112 }); 3133 });
3113 } 3134 }
3114 if (m->replace_input) { 3135 if (m->replace_input) {
3115 - m->outfilename = nullptr; 3136 + m->outfilename.clear();
3116 } 3137 }
3117 if (m->replace_input) { 3138 if (m->replace_input) {
3118 // We must close the input before we can rename files 3139 // We must close the input before we can rename files
3119 pdf.closeInputSource(); 3140 pdf.closeInputSource();
3120 - std::string backup = std::string(m->infilename.get()) + ".~qpdf-orig"; 3141 + std::string backup = m->infilename + ".~qpdf-orig";
3121 bool warnings = pdf.anyWarnings(); 3142 bool warnings = pdf.anyWarnings();
3122 if (!warnings) { 3143 if (!warnings) {
3123 backup.append(1, '#'); 3144 backup.append(1, '#');
3124 } 3145 }
3125 - QUtil::rename_file(m->infilename.get(), backup.c_str());  
3126 - QUtil::rename_file(temp_out.get(), m->infilename.get()); 3146 + QUtil::rename_file(m->infilename.data(), backup.data());
  3147 + QUtil::rename_file(temp_out.data(), m->infilename.data());
3127 if (warnings) { 3148 if (warnings) {
3128 *m->log->getError() << m->message_prefix 3149 *m->log->getError() << m->message_prefix
3129 << ": there are warnings; original file kept in " << backup << "\n"; 3150 << ": there are warnings; original file kept in " << backup << "\n";
@@ -3145,12 +3166,12 @@ QPDFJob::writeJSON(QPDF&amp; pdf) @@ -3145,12 +3166,12 @@ QPDFJob::writeJSON(QPDF&amp; pdf)
3145 // File pipeline must have block scope so it will be closed after write. 3166 // File pipeline must have block scope so it will be closed after write.
3146 std::shared_ptr<QUtil::FileCloser> fc; 3167 std::shared_ptr<QUtil::FileCloser> fc;
3147 std::shared_ptr<Pipeline> fp; 3168 std::shared_ptr<Pipeline> fp;
3148 - if (m->outfilename.get()) { 3169 + if (!m->outfilename.empty()) {
3149 QTC::TC("qpdf", "QPDFJob write json to file"); 3170 QTC::TC("qpdf", "QPDFJob write json to file");
3150 if (m->json_stream_prefix.empty()) { 3171 if (m->json_stream_prefix.empty()) {
3151 - m->json_stream_prefix = m->outfilename.get(); 3172 + m->json_stream_prefix = m->outfilename;
3152 } 3173 }
3153 - fc = std::make_shared<QUtil::FileCloser>(QUtil::safe_fopen(m->outfilename.get(), "w")); 3174 + fc = std::make_shared<QUtil::FileCloser>(QUtil::safe_fopen(m->outfilename.data(), "w"));
3154 fp = std::make_shared<Pl_StdioFile>("json output", fc->f); 3175 fp = std::make_shared<Pl_StdioFile>("json output", fc->f);
3155 } else if ((m->json_stream_data == qpdf_sj_file) && m->json_stream_prefix.empty()) { 3176 } else if ((m->json_stream_data == qpdf_sj_file) && m->json_stream_prefix.empty()) {
3156 QTC::TC("qpdf", "QPDFJob need json-stream-prefix for stdout"); 3177 QTC::TC("qpdf", "QPDFJob need json-stream-prefix for stdout");
libqpdf/QPDFJob_argv.cc
@@ -58,25 +58,25 @@ void @@ -58,25 +58,25 @@ void
58 ArgParser::initOptionTables() 58 ArgParser::initOptionTables()
59 { 59 {
60 #include <qpdf/auto_job_init.hh> 60 #include <qpdf/auto_job_init.hh>
61 - this->ap.addFinalCheck([this]() { c_main->checkConfiguration(); }); 61 + ap.addFinalCheck([this]() { c_main->checkConfiguration(); });
62 // add_help is defined in auto_job_help.hh 62 // add_help is defined in auto_job_help.hh
63 - add_help(this->ap); 63 + add_help(ap);
64 // Special case: ignore -- at the top level. This undocumented behavior is for backward 64 // Special case: ignore -- at the top level. This undocumented behavior is for backward
65 // compatibility; it was unintentionally the case prior to 10.6, and some users were relying on 65 // compatibility; it was unintentionally the case prior to 10.6, and some users were relying on
66 // it. 66 // it.
67 - this->ap.selectMainOptionTable();  
68 - this->ap.addBare("--", []() {}); 67 + ap.selectMainOptionTable();
  68 + ap.addBare("--", []() {});
69 } 69 }
70 70
71 void 71 void
72 ArgParser::argPositional(std::string const& arg) 72 ArgParser::argPositional(std::string const& arg)
73 { 73 {
74 - if (!this->gave_input) { 74 + if (!gave_input) {
75 c_main->inputFile(arg); 75 c_main->inputFile(arg);
76 - this->gave_input = true;  
77 - } else if (!this->gave_output) { 76 + gave_input = true;
  77 + } else if (!gave_output) {
78 c_main->outputFile(arg); 78 c_main->outputFile(arg);
79 - this->gave_output = true; 79 + gave_output = true;
80 } else { 80 } else {
81 usage("unknown argument " + arg); 81 usage("unknown argument " + arg);
82 } 82 }
@@ -86,20 +86,20 @@ void @@ -86,20 +86,20 @@ void
86 ArgParser::argEmpty() 86 ArgParser::argEmpty()
87 { 87 {
88 c_main->emptyInput(); 88 c_main->emptyInput();
89 - this->gave_input = true; 89 + gave_input = true;
90 } 90 }
91 91
92 void 92 void
93 ArgParser::argReplaceInput() 93 ArgParser::argReplaceInput()
94 { 94 {
95 c_main->replaceInput(); 95 c_main->replaceInput();
96 - this->gave_output = true; 96 + gave_output = true;
97 } 97 }
98 98
99 void 99 void
100 ArgParser::argVersion() 100 ArgParser::argVersion()
101 { 101 {
102 - auto whoami = this->ap.getProgname(); 102 + auto whoami = ap.getProgname();
103 *QPDFLogger::defaultLogger()->getInfo() 103 *QPDFLogger::defaultLogger()->getInfo()
104 << whoami << " version " << QPDF::QPDFVersion() << "\n" 104 << whoami << " version " << QPDF::QPDFVersion() << "\n"
105 << "Run " << whoami << " --copyright to see copyright and license information.\n"; 105 << "Run " << whoami << " --copyright to see copyright and license information.\n";
@@ -136,7 +136,7 @@ ArgParser::argCopyright() @@ -136,7 +136,7 @@ ArgParser::argCopyright()
136 // 1 2 3 4 5 6 7 8 136 // 1 2 3 4 5 6 7 8
137 // 12345678901234567890123456789012345678901234567890123456789012345678901234567890 137 // 12345678901234567890123456789012345678901234567890123456789012345678901234567890
138 *QPDFLogger::defaultLogger()->getInfo() 138 *QPDFLogger::defaultLogger()->getInfo()
139 - << this->ap.getProgname() 139 + << ap.getProgname()
140 << " version " << QPDF::QPDFVersion() << "\n" 140 << " version " << QPDF::QPDFVersion() << "\n"
141 << "\n" 141 << "\n"
142 << "Copyright (c) 2005-2021 Jay Berkenbilt\n" 142 << "Copyright (c) 2005-2021 Jay Berkenbilt\n"
@@ -190,9 +190,9 @@ ArgParser::argShowCrypto() @@ -190,9 +190,9 @@ ArgParser::argShowCrypto()
190 void 190 void
191 ArgParser::argEncrypt() 191 ArgParser::argEncrypt()
192 { 192 {
193 - this->c_enc = c_main->encrypt(0, "", "");  
194 - this->accumulated_args.clear();  
195 - this->ap.selectOptionTable(O_ENCRYPTION); 193 + c_enc = c_main->encrypt(0, "", "");
  194 + accumulated_args.clear();
  195 + ap.selectOptionTable(O_ENCRYPTION);
196 } 196 }
197 197
198 void 198 void
@@ -202,14 +202,14 @@ ArgParser::argEncPositional(std::string const&amp; arg) @@ -202,14 +202,14 @@ ArgParser::argEncPositional(std::string const&amp; arg)
202 usage("positional and dashed encryption arguments may not be mixed"); 202 usage("positional and dashed encryption arguments may not be mixed");
203 } 203 }
204 204
205 - this->accumulated_args.push_back(arg);  
206 - if (this->accumulated_args.size() < 3) { 205 + accumulated_args.push_back(arg);
  206 + if (accumulated_args.size() < 3) {
207 return; 207 return;
208 } 208 }
209 - user_password = this->accumulated_args.at(0);  
210 - owner_password = this->accumulated_args.at(1);  
211 - auto len_str = this->accumulated_args.at(2);  
212 - this->accumulated_args.clear(); 209 + user_password = accumulated_args.at(0);
  210 + owner_password = accumulated_args.at(1);
  211 + auto len_str = accumulated_args.at(2);
  212 + accumulated_args.clear();
213 argEncBits(len_str); 213 argEncBits(len_str);
214 } 214 }
215 215
@@ -219,8 +219,8 @@ ArgParser::argEncUserPassword(std::string const&amp; arg) @@ -219,8 +219,8 @@ ArgParser::argEncUserPassword(std::string const&amp; arg)
219 if (!accumulated_args.empty()) { 219 if (!accumulated_args.empty()) {
220 usage("positional and dashed encryption arguments may not be mixed"); 220 usage("positional and dashed encryption arguments may not be mixed");
221 } 221 }
222 - this->used_enc_password_args = true;  
223 - this->user_password = arg; 222 + used_enc_password_args = true;
  223 + user_password = arg;
224 } 224 }
225 225
226 void 226 void
@@ -229,8 +229,8 @@ ArgParser::argEncOwnerPassword(std::string const&amp; arg) @@ -229,8 +229,8 @@ ArgParser::argEncOwnerPassword(std::string const&amp; arg)
229 if (!accumulated_args.empty()) { 229 if (!accumulated_args.empty()) {
230 usage("positional and dashed encryption arguments may not be mixed"); 230 usage("positional and dashed encryption arguments may not be mixed");
231 } 231 }
232 - this->used_enc_password_args = true;  
233 - this->owner_password = arg; 232 + used_enc_password_args = true;
  233 + owner_password = arg;
234 } 234 }
235 235
236 void 236 void
@@ -242,25 +242,25 @@ ArgParser::argEncBits(std::string const&amp; arg) @@ -242,25 +242,25 @@ ArgParser::argEncBits(std::string const&amp; arg)
242 int keylen = 0; 242 int keylen = 0;
243 if (arg == "40") { 243 if (arg == "40") {
244 keylen = 40; 244 keylen = 40;
245 - this->ap.selectOptionTable(O_40_BIT_ENCRYPTION); 245 + ap.selectOptionTable(O_40_BIT_ENCRYPTION);
246 } else if (arg == "128") { 246 } else if (arg == "128") {
247 keylen = 128; 247 keylen = 128;
248 - this->ap.selectOptionTable(O_128_BIT_ENCRYPTION); 248 + ap.selectOptionTable(O_128_BIT_ENCRYPTION);
249 } else if (arg == "256") { 249 } else if (arg == "256") {
250 keylen = 256; 250 keylen = 256;
251 - this->ap.selectOptionTable(O_256_BIT_ENCRYPTION); 251 + ap.selectOptionTable(O_256_BIT_ENCRYPTION);
252 } else { 252 } else {
253 usage("encryption key length must be 40, 128, or 256"); 253 usage("encryption key length must be 40, 128, or 256");
254 } 254 }
255 - this->c_enc = c_main->encrypt(keylen, user_password, owner_password); 255 + c_enc = c_main->encrypt(keylen, user_password, owner_password);
256 } 256 }
257 257
258 void 258 void
259 ArgParser::argPages() 259 ArgParser::argPages()
260 { 260 {
261 - this->accumulated_args.clear();  
262 - this->c_pages = c_main->pages();  
263 - this->ap.selectOptionTable(O_PAGES); 261 + accumulated_args.clear();
  262 + c_pages = c_main->pages();
  263 + ap.selectOptionTable(O_PAGES);
264 } 264 }
265 265
266 void 266 void
@@ -308,29 +308,29 @@ ArgParser::argEndPages() @@ -308,29 +308,29 @@ ArgParser::argEndPages()
308 void 308 void
309 ArgParser::argUnderlay() 309 ArgParser::argUnderlay()
310 { 310 {
311 - this->c_uo = c_main->underlay();  
312 - this->ap.selectOptionTable(O_UNDERLAY_OVERLAY); 311 + c_uo = c_main->underlay();
  312 + ap.selectOptionTable(O_UNDERLAY_OVERLAY);
313 } 313 }
314 314
315 void 315 void
316 ArgParser::argOverlay() 316 ArgParser::argOverlay()
317 { 317 {
318 - this->c_uo = c_main->overlay();  
319 - this->ap.selectOptionTable(O_UNDERLAY_OVERLAY); 318 + c_uo = c_main->overlay();
  319 + ap.selectOptionTable(O_UNDERLAY_OVERLAY);
320 } 320 }
321 321
322 void 322 void
323 ArgParser::argAddAttachment() 323 ArgParser::argAddAttachment()
324 { 324 {
325 - this->c_att = c_main->addAttachment();  
326 - this->ap.selectOptionTable(O_ATTACHMENT); 325 + c_att = c_main->addAttachment();
  326 + ap.selectOptionTable(O_ATTACHMENT);
327 } 327 }
328 328
329 void 329 void
330 ArgParser::argCopyAttachmentsFrom() 330 ArgParser::argCopyAttachmentsFrom()
331 { 331 {
332 - this->c_copy_att = c_main->copyAttachmentsFrom();  
333 - this->ap.selectOptionTable(O_COPY_ATTACHMENT); 332 + c_copy_att = c_main->copyAttachmentsFrom();
  333 + ap.selectOptionTable(O_COPY_ATTACHMENT);
334 } 334 }
335 335
336 void 336 void
@@ -400,7 +400,7 @@ ArgParser::argEndCopyAttachment() @@ -400,7 +400,7 @@ ArgParser::argEndCopyAttachment()
400 void 400 void
401 ArgParser::argSetPageLabels() 401 ArgParser::argSetPageLabels()
402 { 402 {
403 - this->ap.selectOptionTable(O_SET_PAGE_LABELS); 403 + ap.selectOptionTable(O_SET_PAGE_LABELS);
404 accumulated_args.clear(); 404 accumulated_args.clear();
405 } 405 }
406 406
@@ -427,14 +427,14 @@ ArgParser::argJobJsonHelp() @@ -427,14 +427,14 @@ ArgParser::argJobJsonHelp()
427 void 427 void
428 ArgParser::usage(std::string const& message) 428 ArgParser::usage(std::string const& message)
429 { 429 {
430 - this->ap.usage(message); 430 + ap.usage(message);
431 } 431 }
432 432
433 void 433 void
434 ArgParser::parseOptions() 434 ArgParser::parseOptions()
435 { 435 {
436 try { 436 try {
437 - this->ap.parseArgs(); 437 + ap.parseArgs();
438 } catch (std::runtime_error& e) { 438 } catch (std::runtime_error& e) {
439 usage(e.what()); 439 usage(e.what());
440 } 440 }
libqpdf/QPDFJob_config.cc
@@ -15,8 +15,8 @@ QPDFJob::Config::checkConfiguration() @@ -15,8 +15,8 @@ QPDFJob::Config::checkConfiguration()
15 QPDFJob::Config* 15 QPDFJob::Config*
16 QPDFJob::Config::inputFile(std::string const& filename) 16 QPDFJob::Config::inputFile(std::string const& filename)
17 { 17 {
18 - if (o.m->infilename == nullptr) {  
19 - o.m->infilename = QUtil::make_shared_cstr(filename); 18 + if (o.m->infilename.empty()) {
  19 + o.m->infilename = filename;
20 } else { 20 } else {
21 usage("input file has already been given"); 21 usage("input file has already been given");
22 } 22 }
@@ -26,13 +26,13 @@ QPDFJob::Config::inputFile(std::string const&amp; filename) @@ -26,13 +26,13 @@ QPDFJob::Config::inputFile(std::string const&amp; filename)
26 QPDFJob::Config* 26 QPDFJob::Config*
27 QPDFJob::Config::emptyInput() 27 QPDFJob::Config::emptyInput()
28 { 28 {
29 - if (o.m->infilename == nullptr) {  
30 - // Various places in QPDFJob.cc know that the empty string for infile means empty. We set it  
31 - // to something other than a null pointer as an indication that some input source has been  
32 - // specified. This approach means that passing "" as the argument to inputFile in job JSON,  
33 - // or equivalently using "" as a positional command-line argument would be the same as  
34 - // --empty. This probably isn't worth blocking or coding around.  
35 - o.m->infilename = QUtil::make_shared_cstr(""); 29 + if (o.m->infilename.empty()) {
  30 + // Various places in QPDFJob.cc used to know that the empty string for infile means empty.
  31 + // This approach meant that passing "" as the argument to inputFile in job JSON, or
  32 + // equivalently using "" as a positional command-line argument would be the same as
  33 + // --empty. This was deemed to be not worth blocking or coding around. This no longer holds
  34 + // from 12.3.
  35 + o.m->empty_input = true;
36 } else { 36 } else {
37 usage("empty input can't be used since input file has already been given"); 37 usage("empty input can't be used since input file has already been given");
38 } 38 }
@@ -42,8 +42,8 @@ QPDFJob::Config::emptyInput() @@ -42,8 +42,8 @@ QPDFJob::Config::emptyInput()
42 QPDFJob::Config* 42 QPDFJob::Config*
43 QPDFJob::Config::outputFile(std::string const& filename) 43 QPDFJob::Config::outputFile(std::string const& filename)
44 { 44 {
45 - if ((o.m->outfilename == nullptr) && (!o.m->replace_input)) {  
46 - o.m->outfilename = QUtil::make_shared_cstr(filename); 45 + if (o.m->outfilename.empty() && !o.m->replace_input) {
  46 + o.m->outfilename = filename;
47 } else { 47 } else {
48 usage("output file has already been given"); 48 usage("output file has already been given");
49 } 49 }
@@ -53,7 +53,7 @@ QPDFJob::Config::outputFile(std::string const&amp; filename) @@ -53,7 +53,7 @@ QPDFJob::Config::outputFile(std::string const&amp; filename)
53 QPDFJob::Config* 53 QPDFJob::Config*
54 QPDFJob::Config::replaceInput() 54 QPDFJob::Config::replaceInput()
55 { 55 {
56 - if ((o.m->outfilename == nullptr) && (!o.m->replace_input)) { 56 + if (o.m->outfilename.empty() && !o.m->replace_input) {
57 o.m->replace_input = true; 57 o.m->replace_input = true;
58 } else { 58 } else {
59 usage("replace-input can't be used since output file has already been given"); 59 usage("replace-input can't be used since output file has already been given");
@@ -175,7 +175,7 @@ QPDFJob::Config::deterministicId() @@ -175,7 +175,7 @@ QPDFJob::Config::deterministicId()
175 QPDFJob::Config* 175 QPDFJob::Config*
176 QPDFJob::Config::encryptionFilePassword(std::string const& parameter) 176 QPDFJob::Config::encryptionFilePassword(std::string const& parameter)
177 { 177 {
178 - o.m->encryption_file_password = QUtil::make_shared_cstr(parameter); 178 + o.m->encryption_file_password = parameter;
179 return this; 179 return this;
180 } 180 }
181 181
@@ -456,7 +456,7 @@ QPDFJob::Config::optimizeImages() @@ -456,7 +456,7 @@ QPDFJob::Config::optimizeImages()
456 QPDFJob::Config* 456 QPDFJob::Config*
457 QPDFJob::Config::password(std::string const& parameter) 457 QPDFJob::Config::password(std::string const& parameter)
458 { 458 {
459 - o.m->password = QUtil::make_shared_cstr(parameter); 459 + o.m->password = parameter;
460 return this; 460 return this;
461 } 461 }
462 462
@@ -696,12 +696,12 @@ QPDFJob::Config::passwordFile(std::string const&amp; parameter) @@ -696,12 +696,12 @@ QPDFJob::Config::passwordFile(std::string const&amp; parameter)
696 QTC::TC("qpdf", "QPDFJob_config password file"); 696 QTC::TC("qpdf", "QPDFJob_config password file");
697 lines = QUtil::read_lines_from_file(parameter.c_str()); 697 lines = QUtil::read_lines_from_file(parameter.c_str());
698 } 698 }
699 - if (lines.size() >= 1) {  
700 - o.m->password = QUtil::make_shared_cstr(lines.front()); 699 + if (!lines.empty()) {
  700 + o.m->password = lines.front();
701 701
702 if (lines.size() > 1) { 702 if (lines.size() > 1) {
703 *QPDFLogger::defaultLogger()->getError() 703 *QPDFLogger::defaultLogger()->getError()
704 - << this->o.m->message_prefix << ": WARNING: all but the first line of" 704 + << o.m->message_prefix << ": WARNING: all but the first line of"
705 << " the password file are ignored\n"; 705 << " the password file are ignored\n";
706 } 706 }
707 } 707 }
@@ -806,7 +806,7 @@ QPDFJob::Config::jobJsonFile(std::string const&amp; parameter) @@ -806,7 +806,7 @@ QPDFJob::Config::jobJsonFile(std::string const&amp; parameter)
806 } catch (std::exception& e) { 806 } catch (std::exception& e) {
807 throw std::runtime_error( 807 throw std::runtime_error(
808 "error with job-json file " + std::string(parameter) + ": " + e.what() + "\nRun " + 808 "error with job-json file " + std::string(parameter) + ": " + e.what() + "\nRun " +
809 - this->o.m->message_prefix + " --job-json-help for information on the file format."); 809 + o.m->message_prefix + " --job-json-help for information on the file format.");
810 } 810 }
811 return this; 811 return this;
812 } 812 }
@@ -832,32 +832,32 @@ QPDFJob::CopyAttConfig::CopyAttConfig(Config* c) : @@ -832,32 +832,32 @@ QPDFJob::CopyAttConfig::CopyAttConfig(Config* c) :
832 QPDFJob::CopyAttConfig* 832 QPDFJob::CopyAttConfig*
833 QPDFJob::CopyAttConfig::file(std::string const& parameter) 833 QPDFJob::CopyAttConfig::file(std::string const& parameter)
834 { 834 {
835 - this->caf.path = parameter; 835 + caf.path = parameter;
836 return this; 836 return this;
837 } 837 }
838 838
839 QPDFJob::CopyAttConfig* 839 QPDFJob::CopyAttConfig*
840 QPDFJob::CopyAttConfig::prefix(std::string const& parameter) 840 QPDFJob::CopyAttConfig::prefix(std::string const& parameter)
841 { 841 {
842 - this->caf.prefix = parameter; 842 + caf.prefix = parameter;
843 return this; 843 return this;
844 } 844 }
845 845
846 QPDFJob::CopyAttConfig* 846 QPDFJob::CopyAttConfig*
847 QPDFJob::CopyAttConfig::password(std::string const& parameter) 847 QPDFJob::CopyAttConfig::password(std::string const& parameter)
848 { 848 {
849 - this->caf.password = parameter; 849 + caf.password = parameter;
850 return this; 850 return this;
851 } 851 }
852 852
853 QPDFJob::Config* 853 QPDFJob::Config*
854 QPDFJob::CopyAttConfig::endCopyAttachmentsFrom() 854 QPDFJob::CopyAttConfig::endCopyAttachmentsFrom()
855 { 855 {
856 - if (this->caf.path.empty()) { 856 + if (caf.path.empty()) {
857 usage("copy attachments: no file specified"); 857 usage("copy attachments: no file specified");
858 } 858 }
859 - this->config->o.m->attachments_to_copy.push_back(this->caf);  
860 - return this->config; 859 + config->o.m->attachments_to_copy.push_back(caf);
  860 + return config;
861 } 861 }
862 862
863 QPDFJob::AttConfig::AttConfig(Config* c) : 863 QPDFJob::AttConfig::AttConfig(Config* c) :
@@ -874,21 +874,21 @@ QPDFJob::Config::addAttachment() @@ -874,21 +874,21 @@ QPDFJob::Config::addAttachment()
874 QPDFJob::AttConfig* 874 QPDFJob::AttConfig*
875 QPDFJob::AttConfig::file(std::string const& parameter) 875 QPDFJob::AttConfig::file(std::string const& parameter)
876 { 876 {
877 - this->att.path = parameter; 877 + att.path = parameter;
878 return this; 878 return this;
879 } 879 }
880 880
881 QPDFJob::AttConfig* 881 QPDFJob::AttConfig*
882 QPDFJob::AttConfig::key(std::string const& parameter) 882 QPDFJob::AttConfig::key(std::string const& parameter)
883 { 883 {
884 - this->att.key = parameter; 884 + att.key = parameter;
885 return this; 885 return this;
886 } 886 }
887 887
888 QPDFJob::AttConfig* 888 QPDFJob::AttConfig*
889 QPDFJob::AttConfig::filename(std::string const& parameter) 889 QPDFJob::AttConfig::filename(std::string const& parameter)
890 { 890 {
891 - this->att.filename = parameter; 891 + att.filename = parameter;
892 return this; 892 return this;
893 } 893 }
894 894
@@ -898,7 +898,7 @@ QPDFJob::AttConfig::creationdate(std::string const&amp; parameter) @@ -898,7 +898,7 @@ QPDFJob::AttConfig::creationdate(std::string const&amp; parameter)
898 if (!QUtil::pdf_time_to_qpdf_time(parameter)) { 898 if (!QUtil::pdf_time_to_qpdf_time(parameter)) {
899 usage(std::string(parameter) + " is not a valid PDF timestamp"); 899 usage(std::string(parameter) + " is not a valid PDF timestamp");
900 } 900 }
901 - this->att.creationdate = parameter; 901 + att.creationdate = parameter;
902 return this; 902 return this;
903 } 903 }
904 904
@@ -908,7 +908,7 @@ QPDFJob::AttConfig::moddate(std::string const&amp; parameter) @@ -908,7 +908,7 @@ QPDFJob::AttConfig::moddate(std::string const&amp; parameter)
908 if (!QUtil::pdf_time_to_qpdf_time(parameter)) { 908 if (!QUtil::pdf_time_to_qpdf_time(parameter)) {
909 usage(std::string(parameter) + " is not a valid PDF timestamp"); 909 usage(std::string(parameter) + " is not a valid PDF timestamp");
910 } 910 }
911 - this->att.moddate = parameter; 911 + att.moddate = parameter;
912 return this; 912 return this;
913 } 913 }
914 914
@@ -918,21 +918,21 @@ QPDFJob::AttConfig::mimetype(std::string const&amp; parameter) @@ -918,21 +918,21 @@ QPDFJob::AttConfig::mimetype(std::string const&amp; parameter)
918 if (parameter.find('/') == std::string::npos) { 918 if (parameter.find('/') == std::string::npos) {
919 usage("mime type should be specified as type/subtype"); 919 usage("mime type should be specified as type/subtype");
920 } 920 }
921 - this->att.mimetype = parameter; 921 + att.mimetype = parameter;
922 return this; 922 return this;
923 } 923 }
924 924
925 QPDFJob::AttConfig* 925 QPDFJob::AttConfig*
926 QPDFJob::AttConfig::description(std::string const& parameter) 926 QPDFJob::AttConfig::description(std::string const& parameter)
927 { 927 {
928 - this->att.description = parameter; 928 + att.description = parameter;
929 return this; 929 return this;
930 } 930 }
931 931
932 QPDFJob::AttConfig* 932 QPDFJob::AttConfig*
933 QPDFJob::AttConfig::replace() 933 QPDFJob::AttConfig::replace()
934 { 934 {
935 - this->att.replace = true; 935 + att.replace = true;
936 return this; 936 return this;
937 } 937 }
938 938
@@ -940,28 +940,28 @@ QPDFJob::Config* @@ -940,28 +940,28 @@ QPDFJob::Config*
940 QPDFJob::AttConfig::endAddAttachment() 940 QPDFJob::AttConfig::endAddAttachment()
941 { 941 {
942 static std::string now = QUtil::qpdf_time_to_pdf_time(QUtil::get_current_qpdf_time()); 942 static std::string now = QUtil::qpdf_time_to_pdf_time(QUtil::get_current_qpdf_time());
943 - if (this->att.path.empty()) { 943 + if (att.path.empty()) {
944 usage("add attachment: no file specified"); 944 usage("add attachment: no file specified");
945 } 945 }
946 - std::string last_element = QUtil::path_basename(this->att.path); 946 + std::string last_element = QUtil::path_basename(att.path);
947 if (last_element.empty()) { 947 if (last_element.empty()) {
948 usage("file for --add-attachment may not be empty"); 948 usage("file for --add-attachment may not be empty");
949 } 949 }
950 - if (this->att.filename.empty()) {  
951 - this->att.filename = last_element; 950 + if (att.filename.empty()) {
  951 + att.filename = last_element;
952 } 952 }
953 - if (this->att.key.empty()) {  
954 - this->att.key = last_element; 953 + if (att.key.empty()) {
  954 + att.key = last_element;
955 } 955 }
956 - if (this->att.creationdate.empty()) {  
957 - this->att.creationdate = now; 956 + if (att.creationdate.empty()) {
  957 + att.creationdate = now;
958 } 958 }
959 - if (this->att.moddate.empty()) {  
960 - this->att.moddate = now; 959 + if (att.moddate.empty()) {
  960 + att.moddate = now;
961 } 961 }
962 962
963 - this->config->o.m->attachments_to_add.push_back(this->att);  
964 - return this->config; 963 + config->o.m->attachments_to_add.push_back(att);
  964 + return config;
965 } 965 }
966 966
967 QPDFJob::PagesConfig::PagesConfig(Config* c) : 967 QPDFJob::PagesConfig::PagesConfig(Config* c) :
@@ -985,21 +985,21 @@ QPDFJob::PagesConfig::endPages() @@ -985,21 +985,21 @@ QPDFJob::PagesConfig::endPages()
985 if (n_specs == 0) { 985 if (n_specs == 0) {
986 usage("--pages: no page specifications given"); 986 usage("--pages: no page specifications given");
987 } 987 }
988 - return this->config; 988 + return config;
989 } 989 }
990 990
991 QPDFJob::PagesConfig* 991 QPDFJob::PagesConfig*
992 QPDFJob::PagesConfig::pageSpec( 992 QPDFJob::PagesConfig::pageSpec(
993 std::string const& filename, std::string const& range, char const* password) 993 std::string const& filename, std::string const& range, char const* password)
994 { 994 {
995 - this->config->o.m->page_specs.emplace_back(filename, password, range); 995 + config->o.m->page_specs.emplace_back(filename, password, range);
996 return this; 996 return this;
997 } 997 }
998 998
999 QPDFJob::PagesConfig* 999 QPDFJob::PagesConfig*
1000 QPDFJob::PagesConfig::file(std::string const& arg) 1000 QPDFJob::PagesConfig::file(std::string const& arg)
1001 { 1001 {
1002 - this->config->o.m->page_specs.emplace_back(arg, nullptr, ""); 1002 + config->o.m->page_specs.emplace_back(arg, "", "");
1003 return this; 1003 return this;
1004 } 1004 }
1005 1005
@@ -1027,11 +1027,11 @@ QPDFJob::PagesConfig::password(std::string const&amp; arg) @@ -1027,11 +1027,11 @@ QPDFJob::PagesConfig::password(std::string const&amp; arg)
1027 usage("in --pages, --password must follow a file name"); 1027 usage("in --pages, --password must follow a file name");
1028 } 1028 }
1029 auto& last = config->o.m->page_specs.back(); 1029 auto& last = config->o.m->page_specs.back();
1030 - if (last.password) { 1030 + if (!last.password.empty()) {
1031 QTC::TC("qpdf", "QPDFJob duplicated pages password"); 1031 QTC::TC("qpdf", "QPDFJob duplicated pages password");
1032 usage("--password already specified for this file"); 1032 usage("--password already specified for this file");
1033 } 1033 }
1034 - last.password = QUtil::make_shared_cstr(arg); 1034 + last.password = arg;
1035 return this; 1035 return this;
1036 } 1036 }
1037 1037
@@ -1063,7 +1063,7 @@ QPDFJob::UOConfig::endUnderlayOverlay() @@ -1063,7 +1063,7 @@ QPDFJob::UOConfig::endUnderlayOverlay()
1063 usage(config->o.m->under_overlay->which + " file not specified"); 1063 usage(config->o.m->under_overlay->which + " file not specified");
1064 } 1064 }
1065 config->o.m->under_overlay = nullptr; 1065 config->o.m->under_overlay = nullptr;
1066 - return this->config; 1066 + return config;
1067 } 1067 }
1068 1068
1069 QPDFJob::UOConfig* 1069 QPDFJob::UOConfig*
@@ -1108,7 +1108,7 @@ QPDFJob::UOConfig::repeat(std::string const&amp; parameter) @@ -1108,7 +1108,7 @@ QPDFJob::UOConfig::repeat(std::string const&amp; parameter)
1108 QPDFJob::UOConfig* 1108 QPDFJob::UOConfig*
1109 QPDFJob::UOConfig::password(std::string const& parameter) 1109 QPDFJob::UOConfig::password(std::string const& parameter)
1110 { 1110 {
1111 - config->o.m->under_overlay->password = QUtil::make_shared_cstr(parameter); 1111 + config->o.m->under_overlay->password = parameter;
1112 return this; 1112 return this;
1113 } 1113 }
1114 1114
@@ -1192,7 +1192,7 @@ QPDFJob::EncConfig::endEncrypt() @@ -1192,7 +1192,7 @@ QPDFJob::EncConfig::endEncrypt()
1192 config->o.m->encrypt = true; 1192 config->o.m->encrypt = true;
1193 config->o.m->decrypt = false; 1193 config->o.m->decrypt = false;
1194 config->o.m->copy_encryption = false; 1194 config->o.m->copy_encryption = false;
1195 - return this->config; 1195 + return config;
1196 } 1196 }
1197 1197
1198 QPDFJob::EncConfig* 1198 QPDFJob::EncConfig*
@@ -1341,5 +1341,5 @@ QPDFJob::PageLabelsConfig::PageLabelsConfig(Config* c) : @@ -1341,5 +1341,5 @@ QPDFJob::PageLabelsConfig::PageLabelsConfig(Config* c) :
1341 QPDFJob::Config* 1341 QPDFJob::Config*
1342 QPDFJob::PageLabelsConfig::endSetPageLabels() 1342 QPDFJob::PageLabelsConfig::endSetPageLabels()
1343 { 1343 {
1344 - return this->config; 1344 + return config;
1345 } 1345 }
libqpdf/QPDFJob_json.cc
@@ -630,7 +630,7 @@ QPDFJob::initializeFromJson(std::string const&amp; json, bool partial) @@ -630,7 +630,7 @@ QPDFJob::initializeFromJson(std::string const&amp; json, bool partial)
630 std::ostringstream msg; 630 std::ostringstream msg;
631 msg << m->message_prefix << ": job json has errors:"; 631 msg << m->message_prefix << ": job json has errors:";
632 for (auto const& error: errors) { 632 for (auto const& error: errors) {
633 - msg << std::endl << " " << error; 633 + msg << "\n " << error;
634 } 634 }
635 throw std::runtime_error(msg.str()); 635 throw std::runtime_error(msg.str());
636 } 636 }
libqpdf/QPDFObjectHandle.cc
@@ -467,7 +467,7 @@ BaseHandle::write_json(int json_version, JSON::Writer&amp; p) const @@ -467,7 +467,7 @@ BaseHandle::write_json(int json_version, JSON::Writer&amp; p) const
467 case ::ot_real: 467 case ::ot_real:
468 { 468 {
469 auto const& val = std::get<QPDF_Real>(obj->value).val; 469 auto const& val = std::get<QPDF_Real>(obj->value).val;
470 - if (val.length() == 0) { 470 + if (val.empty()) {
471 // Can't really happen... 471 // Can't really happen...
472 p << "0"; 472 p << "0";
473 } else if (val.at(0) == '.') { 473 } else if (val.at(0) == '.') {
@@ -1184,7 +1184,7 @@ QPDFObjectHandle::mergeResources( @@ -1184,7 +1184,7 @@ QPDFObjectHandle::mergeResources(
1184 initialized_maps = true; 1184 initialized_maps = true;
1185 } 1185 }
1186 auto rval_og = rval.getObjGen(); 1186 auto rval_og = rval.getObjGen();
1187 - if (rval.isIndirect() && og_to_name.count(rval_og)) { 1187 + if (rval.isIndirect() && og_to_name.contains(rval_og)) {
1188 QTC::TC("qpdf", "QPDFObjectHandle merge reuse"); 1188 QTC::TC("qpdf", "QPDFObjectHandle merge reuse");
1189 auto new_key = og_to_name[rval_og]; 1189 auto new_key = og_to_name[rval_og];
1190 if (new_key != key) { 1190 if (new_key != key) {
@@ -1208,7 +1208,7 @@ QPDFObjectHandle::mergeResources( @@ -1208,7 +1208,7 @@ QPDFObjectHandle::mergeResources(
1208 } 1208 }
1209 for (auto other_item: other_val.aitems()) { 1209 for (auto other_item: other_val.aitems()) {
1210 if (other_item.isScalar()) { 1210 if (other_item.isScalar()) {
1211 - if (scalars.count(other_item.unparse()) == 0) { 1211 + if (!scalars.contains(other_item.unparse())) {
1212 QTC::TC("qpdf", "QPDFObjectHandle merge array"); 1212 QTC::TC("qpdf", "QPDFObjectHandle merge array");
1213 this_val.appendItem(other_item); 1213 this_val.appendItem(other_item);
1214 } else { 1214 } else {
@@ -1247,7 +1247,7 @@ QPDFObjectHandle::getUniqueResourceName( @@ -1247,7 +1247,7 @@ QPDFObjectHandle::getUniqueResourceName(
1247 int max_suffix = min_suffix + QIntC::to_int(names.size()); 1247 int max_suffix = min_suffix + QIntC::to_int(names.size());
1248 while (min_suffix <= max_suffix) { 1248 while (min_suffix <= max_suffix) {
1249 std::string candidate = prefix + std::to_string(min_suffix); 1249 std::string candidate = prefix + std::to_string(min_suffix);
1250 - if (names.count(candidate) == 0) { 1250 + if (!names.contains(candidate)) {
1251 return candidate; 1251 return candidate;
1252 } 1252 }
1253 // Increment after return; min_suffix should be the value 1253 // Increment after return; min_suffix should be the value
libqpdf/QPDFOutlineDocumentHelper.cc
@@ -56,7 +56,7 @@ QPDFOutlineDocumentHelper::getOutlinesForPage(QPDFObjGen og) @@ -56,7 +56,7 @@ QPDFOutlineDocumentHelper::getOutlinesForPage(QPDFObjGen og)
56 initializeByPage(); 56 initializeByPage();
57 } 57 }
58 std::vector<QPDFOutlineObjectHelper> result; 58 std::vector<QPDFOutlineObjectHelper> result;
59 - if (m->by_page.count(og)) { 59 + if (m->by_page.contains(og)) {
60 result = m->by_page[og]; 60 result = m->by_page[og];
61 } 61 }
62 return result; 62 return result;
libqpdf/QPDFPageObjectHelper.cc
@@ -593,7 +593,7 @@ QPDFPageObjectHelper::removeUnreferencedResourcesHelper( @@ -593,7 +593,7 @@ QPDFPageObjectHelper::removeUnreferencedResourcesHelper(
593 for (auto const& i1: to_filter) { 593 for (auto const& i1: to_filter) {
594 for (auto const& n_iter: names_by_rtype[i1]) { 594 for (auto const& n_iter: names_by_rtype[i1]) {
595 std::string const& name = n_iter.first; 595 std::string const& name = n_iter.first;
596 - if (!known_names.count(name)) { 596 + if (!known_names.contains(name)) {
597 unresolved.insert(name); 597 unresolved.insert(name);
598 local_unresolved.insert(name); 598 local_unresolved.insert(name);
599 } 599 }
@@ -624,10 +624,10 @@ QPDFPageObjectHelper::removeUnreferencedResourcesHelper( @@ -624,10 +624,10 @@ QPDFPageObjectHelper::removeUnreferencedResourcesHelper(
624 624
625 for (auto& dict: rdicts) { 625 for (auto& dict: rdicts) {
626 for (auto const& key: dict.getKeys()) { 626 for (auto const& key: dict.getKeys()) {
627 - if (is_page && unresolved.count(key)) { 627 + if (is_page && unresolved.contains(key)) {
628 // This name is referenced by some nested form xobject, so don't remove it. 628 // This name is referenced by some nested form xobject, so don't remove it.
629 QTC::TC("qpdf", "QPDFPageObjectHelper resolving unresolved"); 629 QTC::TC("qpdf", "QPDFPageObjectHelper resolving unresolved");
630 - } else if (!rf.getNames().count(key)) { 630 + } else if (!rf.getNames().contains(key)) {
631 dict.removeKey(key); 631 dict.removeKey(key);
632 } 632 }
633 } 633 }
libqpdf/QPDFParser.cc
@@ -354,9 +354,9 @@ QPDFParser::parseRemainder(bool content_stream) @@ -354,9 +354,9 @@ QPDFParser::parseRemainder(bool content_stream)
354 fixMissingKeys(); 354 fixMissingKeys();
355 } 355 }
356 356
357 - if (!frame->contents_string.empty() && dict.count("/Type") &&  
358 - dict["/Type"].isNameAndEquals("/Sig") && dict.count("/ByteRange") &&  
359 - dict.count("/Contents") && dict["/Contents"].isString()) { 357 + if (!frame->contents_string.empty() && dict.contains("/Type") &&
  358 + dict["/Type"].isNameAndEquals("/Sig") && dict.contains("/ByteRange") &&
  359 + dict.contains("/Contents") && dict["/Contents"].isString()) {
360 dict["/Contents"] = QPDFObjectHandle::newString(frame->contents_string); 360 dict["/Contents"] = QPDFObjectHandle::newString(frame->contents_string);
361 dict["/Contents"].setParsedOffset(frame->contents_offset); 361 dict["/Contents"].setParsedOffset(frame->contents_offset);
362 } 362 }
@@ -560,7 +560,7 @@ QPDFParser::fixMissingKeys() @@ -560,7 +560,7 @@ QPDFParser::fixMissingKeys()
560 for (auto const& item: frame->olist) { 560 for (auto const& item: frame->olist) {
561 while (true) { 561 while (true) {
562 const std::string key = "/QPDFFake" + std::to_string(next_fake_key++); 562 const std::string key = "/QPDFFake" + std::to_string(next_fake_key++);
563 - const bool found_fake = frame->dict.count(key) == 0 && names.count(key) == 0; 563 + const bool found_fake = !frame->dict.contains(key) && !names.contains(key);
564 QTC::TC("qpdf", "QPDFParser found fake", (found_fake ? 0 : 1)); 564 QTC::TC("qpdf", "QPDFParser found fake", (found_fake ? 0 : 1));
565 if (found_fake) { 565 if (found_fake) {
566 warn( 566 warn(
libqpdf/QPDFWriter.cc
@@ -271,7 +271,7 @@ void @@ -271,7 +271,7 @@ void
271 QPDFWriter::setExtraHeaderText(std::string const& text) 271 QPDFWriter::setExtraHeaderText(std::string const& text)
272 { 272 {
273 m->extra_header_text = text; 273 m->extra_header_text = text;
274 - if ((m->extra_header_text.length() > 0) && (*(m->extra_header_text.rbegin()) != '\n')) { 274 + if (!m->extra_header_text.empty() && *m->extra_header_text.rbegin() != '\n') {
275 QTC::TC("qpdf", "QPDFWriter extra header text add newline"); 275 QTC::TC("qpdf", "QPDFWriter extra header text add newline");
276 m->extra_header_text += "\n"; 276 m->extra_header_text += "\n";
277 } else { 277 } else {
@@ -1065,7 +1065,7 @@ void @@ -1065,7 +1065,7 @@ void
1065 QPDFWriter::assignCompressedObjectNumbers(QPDFObjGen og) 1065 QPDFWriter::assignCompressedObjectNumbers(QPDFObjGen og)
1066 { 1066 {
1067 int objid = og.getObj(); 1067 int objid = og.getObj();
1068 - if ((og.getGen() != 0) || (m->object_stream_to_objects.count(objid) == 0)) { 1068 + if ((og.getGen() != 0) || (!m->object_stream_to_objects.contains(objid))) {
1069 // This is not an object stream. 1069 // This is not an object stream.
1070 return; 1070 return;
1071 } 1071 }
@@ -1115,7 +1115,7 @@ QPDFWriter::enqueueObject(QPDFObjectHandle object) @@ -1115,7 +1115,7 @@ QPDFWriter::enqueueObject(QPDFObjectHandle object)
1115 m->object_queue.push_back(object); 1115 m->object_queue.push_back(object);
1116 obj.renumber = m->next_objid++; 1116 obj.renumber = m->next_objid++;
1117 1117
1118 - if ((og.getGen() == 0) && m->object_stream_to_objects.count(og.getObj())) { 1118 + if ((og.getGen() == 0) && m->object_stream_to_objects.contains(og.getObj())) {
1119 // For linearized files, uncompressed objects go at end, and we take care of 1119 // For linearized files, uncompressed objects go at end, and we take care of
1120 // assigning numbers to them elsewhere. 1120 // assigning numbers to them elsewhere.
1121 if (!m->linearized) { 1121 if (!m->linearized) {
@@ -1285,7 +1285,7 @@ QPDFWriter::willFilterStream( @@ -1285,7 +1285,7 @@ QPDFWriter::willFilterStream(
1285 filter = true; 1285 filter = true;
1286 compress_stream = false; 1286 compress_stream = false;
1287 uncompress = true; 1287 uncompress = true;
1288 - } else if (filter_on_write && m->normalize_content && m->normalized_streams.count(old_og)) { 1288 + } else if (filter_on_write && m->normalize_content && m->normalized_streams.contains(old_og)) {
1289 normalize = true; 1289 normalize = true;
1290 filter = true; 1290 filter = true;
1291 } else if (filter_on_write && filter && m->compress_streams) { 1291 } else if (filter_on_write && filter && m->compress_streams) {
@@ -1415,11 +1415,11 @@ QPDFWriter::unparseObject( @@ -1415,11 +1415,11 @@ QPDFWriter::unparseObject(
1415 1415
1416 if (extensions) { 1416 if (extensions) {
1417 std::set<std::string> keys = extensions.getKeys(); 1417 std::set<std::string> keys = extensions.getKeys();
1418 - if (keys.count("/ADBE") > 0) { 1418 + if (keys.contains("/ADBE")) {
1419 have_extensions_adbe = true; 1419 have_extensions_adbe = true;
1420 keys.erase("/ADBE"); 1420 keys.erase("/ADBE");
1421 } 1421 }
1422 - if (keys.size() > 0) { 1422 + if (!keys.empty()) {
1423 have_extensions_other = true; 1423 have_extensions_other = true;
1424 } 1424 }
1425 } 1425 }
@@ -1807,12 +1807,12 @@ QPDFWriter::writeObject(QPDFObjectHandle object, int object_stream_index) @@ -1807,12 +1807,12 @@ QPDFWriter::writeObject(QPDFObjectHandle object, int object_stream_index)
1807 indicateProgress(false, false); 1807 indicateProgress(false, false);
1808 auto new_id = m->obj[old_og].renumber; 1808 auto new_id = m->obj[old_og].renumber;
1809 if (m->qdf_mode) { 1809 if (m->qdf_mode) {
1810 - if (m->page_object_to_seq.count(old_og)) { 1810 + if (m->page_object_to_seq.contains(old_og)) {
1811 writeString("%% Page "); 1811 writeString("%% Page ");
1812 writeString(std::to_string(m->page_object_to_seq[old_og])); 1812 writeString(std::to_string(m->page_object_to_seq[old_og]));
1813 writeString("\n"); 1813 writeString("\n");
1814 } 1814 }
1815 - if (m->contents_to_page_seq.count(old_og)) { 1815 + if (m->contents_to_page_seq.contains(old_og)) {
1816 writeString("%% Contents for page "); 1816 writeString("%% Contents for page ");
1817 writeString(std::to_string(m->contents_to_page_seq[old_og])); 1817 writeString(std::to_string(m->contents_to_page_seq[old_og]));
1818 writeString("\n"); 1818 writeString("\n");
@@ -2285,7 +2285,7 @@ QPDFWriter::write() @@ -2285,7 +2285,7 @@ QPDFWriter::write()
2285 QPDFObjGen 2285 QPDFObjGen
2286 QPDFWriter::getRenumberedObjGen(QPDFObjGen og) 2286 QPDFWriter::getRenumberedObjGen(QPDFObjGen og)
2287 { 2287 {
2288 - return QPDFObjGen(m->obj[og].renumber, 0); 2288 + return {m->obj[og].renumber, 0};
2289 } 2289 }
2290 2290
2291 std::map<QPDFObjGen, QPDFXRefEntry> 2291 std::map<QPDFObjGen, QPDFXRefEntry>
libqpdf/QPDF_Dictionary.cc
@@ -20,7 +20,7 @@ bool @@ -20,7 +20,7 @@ bool
20 BaseDictionary::hasKey(std::string const& key) const 20 BaseDictionary::hasKey(std::string const& key) const
21 { 21 {
22 auto d = dict(); 22 auto d = dict();
23 - return d->items.count(key) > 0 && !d->items[key].isNull(); 23 + return d->items.contains(key) && !d->items[key].null();
24 } 24 }
25 25
26 QPDFObjectHandle 26 QPDFObjectHandle
libqpdf/QPDF_encryption.cc
@@ -702,17 +702,17 @@ QPDF::interpretCF(std::shared_ptr&lt;EncryptionParameters&gt; encp, QPDFObjectHandle c @@ -702,17 +702,17 @@ QPDF::interpretCF(std::shared_ptr&lt;EncryptionParameters&gt; encp, QPDFObjectHandle c
702 { 702 {
703 if (cf.isName()) { 703 if (cf.isName()) {
704 std::string filter = cf.getName(); 704 std::string filter = cf.getName();
705 - if (encp->crypt_filters.count(filter) != 0) {  
706 - return encp->crypt_filters[filter];  
707 - } else if (filter == "/Identity") { 705 + auto it = encp->crypt_filters.find(filter);
  706 + if (it != encp->crypt_filters.end()) {
  707 + return it->second;
  708 + }
  709 + if (filter == "/Identity") {
708 return e_none; 710 return e_none;
709 - } else {  
710 - return e_unknown;  
711 } 711 }
712 - } else {  
713 - // Default: /Identity  
714 - return e_none; 712 + return e_unknown;
715 } 713 }
  714 + // Default: /Identity
  715 + return e_none;
716 } 716 }
717 717
718 void 718 void
libqpdf/QPDF_json.cc
@@ -161,7 +161,7 @@ QPDF::test_json_validators() @@ -161,7 +161,7 @@ QPDF::test_json_validators()
161 auto check_fn = [&passed](char const* msg, bool expr) { 161 auto check_fn = [&passed](char const* msg, bool expr) {
162 if (!expr) { 162 if (!expr) {
163 passed = false; 163 passed = false;
164 - std::cerr << msg << std::endl; 164 + std::cerr << msg << '\n';
165 } 165 }
166 }; 166 };
167 #define check(expr) check_fn(#expr, expr) 167 #define check(expr) check_fn(#expr, expr)
@@ -192,7 +192,7 @@ QPDF::test_json_validators() @@ -192,7 +192,7 @@ QPDF::test_json_validators()
192 check(is_unicode_string("u:potato", str)); 192 check(is_unicode_string("u:potato", str));
193 check(str == "potato"); 193 check(str == "potato");
194 check(is_unicode_string("u:", str)); 194 check(is_unicode_string("u:", str));
195 - check(str == ""); 195 + check(str.empty());
196 check(!is_binary_string("", str)); 196 check(!is_binary_string("", str));
197 check(!is_binary_string("x:", str)); 197 check(!is_binary_string("x:", str));
198 check(!is_binary_string("b:1", str)); 198 check(!is_binary_string("b:1", str));
@@ -889,7 +889,7 @@ QPDF::writeJSON( @@ -889,7 +889,7 @@ QPDF::writeJSON(
889 for (auto& obj: getAllObjects()) { 889 for (auto& obj: getAllObjects()) {
890 auto const og = obj.getObjGen(); 890 auto const og = obj.getObjGen();
891 std::string key = "obj:" + og.unparse(' ') + " R"; 891 std::string key = "obj:" + og.unparse(' ') + " R";
892 - if (all_objects || wanted_objects.count(key)) { 892 + if (all_objects || wanted_objects.contains(key)) {
893 if (first) { 893 if (first) {
894 jw << "\n \"" << key; 894 jw << "\n \"" << key;
895 first = false; 895 first = false;
@@ -911,7 +911,7 @@ QPDF::writeJSON( @@ -911,7 +911,7 @@ QPDF::writeJSON(
911 } 911 }
912 } 912 }
913 } 913 }
914 - if (all_objects || wanted_objects.count("trailer")) { 914 + if (all_objects || wanted_objects.contains("trailer")) {
915 if (!first) { 915 if (!first) {
916 jw << "\n },"; 916 jw << "\n },";
917 } 917 }
libqpdf/QPDF_linearization.cc
@@ -10,7 +10,7 @@ @@ -10,7 +10,7 @@
10 #include <qpdf/Pl_Flate.hh> 10 #include <qpdf/Pl_Flate.hh>
11 #include <qpdf/Pl_String.hh> 11 #include <qpdf/Pl_String.hh>
12 #include <qpdf/QPDFExc.hh> 12 #include <qpdf/QPDFExc.hh>
13 -#include <qpdf/QPDFLogger.hh> 13 +#include <qpdf/QPDFObjectHandle_private.hh>
14 #include <qpdf/QPDFWriter_private.hh> 14 #include <qpdf/QPDFWriter_private.hh>
15 #include <qpdf/QTC.hh> 15 #include <qpdf/QTC.hh>
16 #include <qpdf/QUtil.hh> 16 #include <qpdf/QUtil.hh>
@@ -502,7 +502,7 @@ QPDF::checkLinearizationInternal() @@ -502,7 +502,7 @@ QPDF::checkLinearizationInternal()
502 qpdf_offset_t max_E = -1; 502 qpdf_offset_t max_E = -1;
503 for (auto const& oh: m->part6) { 503 for (auto const& oh: m->part6) {
504 QPDFObjGen og(oh.getObjGen()); 504 QPDFObjGen og(oh.getObjGen());
505 - if (m->obj_cache.count(og) == 0) { 505 + if (!m->obj_cache.contains(og)) {
506 // All objects have to have been dereferenced to be classified. 506 // All objects have to have been dereferenced to be classified.
507 throw std::logic_error("linearization part6 object not in cache"); 507 throw std::logic_error("linearization part6 object not in cache");
508 } 508 }
@@ -530,12 +530,12 @@ QPDF::checkLinearizationInternal() @@ -530,12 +530,12 @@ QPDF::checkLinearizationInternal()
530 qpdf_offset_t 530 qpdf_offset_t
531 QPDF::maxEnd(ObjUser const& ou) 531 QPDF::maxEnd(ObjUser const& ou)
532 { 532 {
533 - if (m->obj_user_to_objects.count(ou) == 0) { 533 + if (!m->obj_user_to_objects.contains(ou)) {
534 stopOnError("no entry in object user table for requested object user"); 534 stopOnError("no entry in object user table for requested object user");
535 } 535 }
536 qpdf_offset_t end = 0; 536 qpdf_offset_t end = 0;
537 for (auto const& og: m->obj_user_to_objects[ou]) { 537 for (auto const& og: m->obj_user_to_objects[ou]) {
538 - if (!m->obj_cache.count(og)) { 538 + if (!m->obj_cache.contains(og)) {
539 stopOnError("unknown object referenced in object user table"); 539 stopOnError("unknown object referenced in object user table");
540 } 540 }
541 end = std::max(end, m->obj_cache[og].end_after_space); 541 end = std::max(end, m->obj_cache[og].end_after_space);
@@ -568,7 +568,7 @@ QPDF::getLinearizationOffset(QPDFObjGen og) @@ -568,7 +568,7 @@ QPDF::getLinearizationOffset(QPDFObjGen og)
568 QPDFObjectHandle 568 QPDFObjectHandle
569 QPDF::getUncompressedObject(QPDFObjectHandle& obj, std::map<int, int> const& object_stream_data) 569 QPDF::getUncompressedObject(QPDFObjectHandle& obj, std::map<int, int> const& object_stream_data)
570 { 570 {
571 - if (obj.isNull() || (object_stream_data.count(obj.getObjectID()) == 0)) { 571 + if (obj.null() || (!object_stream_data.contains(obj.getObjectID()))) {
572 return obj; 572 return obj;
573 } else { 573 } else {
574 int repl = (*(object_stream_data.find(obj.getObjectID()))).second; 574 int repl = (*(object_stream_data.find(obj.getObjectID()))).second;
@@ -593,11 +593,11 @@ QPDF::lengthNextN(int first_object, int n) @@ -593,11 +593,11 @@ QPDF::lengthNextN(int first_object, int n)
593 int length = 0; 593 int length = 0;
594 for (int i = 0; i < n; ++i) { 594 for (int i = 0; i < n; ++i) {
595 QPDFObjGen og(first_object + i, 0); 595 QPDFObjGen og(first_object + i, 0);
596 - if (m->xref_table.count(og) == 0) { 596 + if (!m->xref_table.contains(og)) {
597 linearizationWarning( 597 linearizationWarning(
598 "no xref table entry for " + std::to_string(first_object + i) + " 0"); 598 "no xref table entry for " + std::to_string(first_object + i) + " 0");
599 } else { 599 } else {
600 - if (m->obj_cache.count(og) == 0) { 600 + if (!m->obj_cache.contains(og)) {
601 stopOnError("found unknown object while calculating length for linearization data"); 601 stopOnError("found unknown object while calculating length for linearization data");
602 } 602 }
603 length += toI(m->obj_cache[og].end_after_space - getLinearizationOffset(og)); 603 length += toI(m->obj_cache[og].end_after_space - getLinearizationOffset(og));
@@ -625,7 +625,7 @@ QPDF::checkHPageOffset( @@ -625,7 +625,7 @@ QPDF::checkHPageOffset(
625 int npages = toI(pages.size()); 625 int npages = toI(pages.size());
626 qpdf_offset_t table_offset = adjusted_offset(m->page_offset_hints.first_page_offset); 626 qpdf_offset_t table_offset = adjusted_offset(m->page_offset_hints.first_page_offset);
627 QPDFObjGen first_page_og(pages.at(0).getObjGen()); 627 QPDFObjGen first_page_og(pages.at(0).getObjGen());
628 - if (m->xref_table.count(first_page_og) == 0) { 628 + if (!m->xref_table.contains(first_page_og)) {
629 stopOnError("supposed first page object is not known"); 629 stopOnError("supposed first page object is not known");
630 } 630 }
631 qpdf_offset_t offset = getLinearizationOffset(first_page_og); 631 qpdf_offset_t offset = getLinearizationOffset(first_page_og);
@@ -636,7 +636,7 @@ QPDF::checkHPageOffset( @@ -636,7 +636,7 @@ QPDF::checkHPageOffset(
636 for (int pageno = 0; pageno < npages; ++pageno) { 636 for (int pageno = 0; pageno < npages; ++pageno) {
637 QPDFObjGen page_og(pages.at(toS(pageno)).getObjGen()); 637 QPDFObjGen page_og(pages.at(toS(pageno)).getObjGen());
638 int first_object = page_og.getObj(); 638 int first_object = page_og.getObj();
639 - if (m->xref_table.count(page_og) == 0) { 639 + if (!m->xref_table.contains(page_og)) {
640 stopOnError("unknown object in page offset hint table"); 640 stopOnError("unknown object in page offset hint table");
641 } 641 }
642 offset = getLinearizationOffset(page_og); 642 offset = getLinearizationOffset(page_og);
@@ -677,7 +677,7 @@ QPDF::checkHPageOffset( @@ -677,7 +677,7 @@ QPDF::checkHPageOffset(
677 677
678 for (size_t i = 0; i < toS(he.nshared_objects); ++i) { 678 for (size_t i = 0; i < toS(he.nshared_objects); ++i) {
679 int idx = he.shared_identifiers.at(i); 679 int idx = he.shared_identifiers.at(i);
680 - if (shared_idx_to_obj.count(idx) == 0) { 680 + if (!shared_idx_to_obj.contains(idx)) {
681 stopOnError("unable to get object for item in shared objects hint table"); 681 stopOnError("unable to get object for item in shared objects hint table");
682 } 682 }
683 hint_shared.insert(shared_idx_to_obj[idx]); 683 hint_shared.insert(shared_idx_to_obj[idx]);
@@ -693,7 +693,7 @@ QPDF::checkHPageOffset( @@ -693,7 +693,7 @@ QPDF::checkHPageOffset(
693 } 693 }
694 694
695 for (int iter: hint_shared) { 695 for (int iter: hint_shared) {
696 - if (!computed_shared.count(iter)) { 696 + if (!computed_shared.contains(iter)) {
697 // pdlin puts thumbnails here even though it shouldn't 697 // pdlin puts thumbnails here even though it shouldn't
698 linearizationWarning( 698 linearizationWarning(
699 "page " + std::to_string(pageno) + ": shared object " + std::to_string(iter) + 699 "page " + std::to_string(pageno) + ": shared object " + std::to_string(iter) +
@@ -702,7 +702,7 @@ QPDF::checkHPageOffset( @@ -702,7 +702,7 @@ QPDF::checkHPageOffset(
702 } 702 }
703 703
704 for (int iter: computed_shared) { 704 for (int iter: computed_shared) {
705 - if (!hint_shared.count(iter)) { 705 + if (!hint_shared.contains(iter)) {
706 // Acrobat does not put some things including at least built-in fonts and procsets 706 // Acrobat does not put some things including at least built-in fonts and procsets
707 // here, at least in some cases. 707 // here, at least in some cases.
708 linearizationWarning( 708 linearizationWarning(
@@ -755,7 +755,7 @@ QPDF::checkHSharedObject(std::vector&lt;QPDFObjectHandle&gt; const&amp; pages, std::map&lt;in @@ -755,7 +755,7 @@ QPDF::checkHSharedObject(std::vector&lt;QPDFObjectHandle&gt; const&amp; pages, std::map&lt;in
755 cur_object = so.first_shared_obj; 755 cur_object = so.first_shared_obj;
756 756
757 QPDFObjGen og(cur_object, 0); 757 QPDFObjGen og(cur_object, 0);
758 - if (m->xref_table.count(og) == 0) { 758 + if (!m->xref_table.contains(og)) {
759 stopOnError("unknown object in shared object hint table"); 759 stopOnError("unknown object in shared object hint table");
760 } 760 }
761 qpdf_offset_t offset = getLinearizationOffset(og); 761 qpdf_offset_t offset = getLinearizationOffset(og);
@@ -806,7 +806,7 @@ QPDF::checkHOutlines() @@ -806,7 +806,7 @@ QPDF::checkHOutlines()
806 return; 806 return;
807 } 807 }
808 QPDFObjGen og(outlines.getObjGen()); 808 QPDFObjGen og(outlines.getObjGen());
809 - if (m->xref_table.count(og) == 0) { 809 + if (!m->xref_table.contains(og)) {
810 stopOnError("unknown object in outlines hint table"); 810 stopOnError("unknown object in outlines hint table");
811 } 811 }
812 qpdf_offset_t offset = getLinearizationOffset(og); 812 qpdf_offset_t offset = getLinearizationOffset(og);
@@ -1086,7 +1086,7 @@ QPDF::calculateLinearizationData(T const&amp; object_stream_data) @@ -1086,7 +1086,7 @@ QPDF::calculateLinearizationData(T const&amp; object_stream_data)
1086 break; 1086 break;
1087 1087
1088 case ObjUser::ou_root_key: 1088 case ObjUser::ou_root_key:
1089 - if (open_document_keys.count(ou.key) > 0) { 1089 + if (open_document_keys.contains(ou.key)) {
1090 in_open_document = true; 1090 in_open_document = true;
1091 } else if (ou.key == "/Outlines") { 1091 } else if (ou.key == "/Outlines") {
1092 in_outlines = true; 1092 in_outlines = true;
@@ -1187,7 +1187,7 @@ QPDF::calculateLinearizationData(T const&amp; object_stream_data) @@ -1187,7 +1187,7 @@ QPDF::calculateLinearizationData(T const&amp; object_stream_data)
1187 stopOnError("no pages found while calculating linearization data"); 1187 stopOnError("no pages found while calculating linearization data");
1188 } 1188 }
1189 QPDFObjGen first_page_og(pages.at(0).getObjGen()); 1189 QPDFObjGen first_page_og(pages.at(0).getObjGen());
1190 - if (!lc_first_page_private.count(first_page_og)) { 1190 + if (!lc_first_page_private.contains(first_page_og)) {
1191 stopOnError( 1191 stopOnError(
1192 "INTERNAL ERROR: QPDF::calculateLinearizationData: first page " 1192 "INTERNAL ERROR: QPDF::calculateLinearizationData: first page "
1193 "object not in lc_first_page_private"); 1193 "object not in lc_first_page_private");
@@ -1226,7 +1226,7 @@ QPDF::calculateLinearizationData(T const&amp; object_stream_data) @@ -1226,7 +1226,7 @@ QPDF::calculateLinearizationData(T const&amp; object_stream_data)
1226 // Place this page's page object 1226 // Place this page's page object
1227 1227
1228 QPDFObjGen page_og(pages.at(i).getObjGen()); 1228 QPDFObjGen page_og(pages.at(i).getObjGen());
1229 - if (!lc_other_page_private.count(page_og)) { 1229 + if (!lc_other_page_private.contains(page_og)) {
1230 stopOnError( 1230 stopOnError(
1231 "INTERNAL ERROR: QPDF::calculateLinearizationData: page object for page " + 1231 "INTERNAL ERROR: QPDF::calculateLinearizationData: page object for page " +
1232 std::to_string(i) + " not in lc_other_page_private"); 1232 std::to_string(i) + " not in lc_other_page_private");
@@ -1240,11 +1240,11 @@ QPDF::calculateLinearizationData(T const&amp; object_stream_data) @@ -1240,11 +1240,11 @@ QPDF::calculateLinearizationData(T const&amp; object_stream_data)
1240 m->c_page_offset_data.entries.at(i).nobjects = 1; 1240 m->c_page_offset_data.entries.at(i).nobjects = 1;
1241 1241
1242 ObjUser ou(ObjUser::ou_page, toI(i)); 1242 ObjUser ou(ObjUser::ou_page, toI(i));
1243 - if (m->obj_user_to_objects.count(ou) == 0) { 1243 + if (!m->obj_user_to_objects.contains(ou)) {
1244 stopOnError("found unreferenced page while calculating linearization data"); 1244 stopOnError("found unreferenced page while calculating linearization data");
1245 } 1245 }
1246 for (auto const& og: m->obj_user_to_objects[ou]) { 1246 for (auto const& og: m->obj_user_to_objects[ou]) {
1247 - if (lc_other_page_private.count(og)) { 1247 + if (lc_other_page_private.contains(og)) {
1248 lc_other_page_private.erase(og); 1248 lc_other_page_private.erase(og);
1249 m->part7.push_back(getObject(og)); 1249 m->part7.push_back(getObject(og));
1250 ++m->c_page_offset_data.entries.at(i).nobjects; 1250 ++m->c_page_offset_data.entries.at(i).nobjects;
@@ -1279,7 +1279,7 @@ QPDF::calculateLinearizationData(T const&amp; object_stream_data) @@ -1279,7 +1279,7 @@ QPDF::calculateLinearizationData(T const&amp; object_stream_data)
1279 stopOnError("found empty pages tree while calculating linearization data"); 1279 stopOnError("found empty pages tree while calculating linearization data");
1280 } 1280 }
1281 for (auto const& og: pages_ogs) { 1281 for (auto const& og: pages_ogs) {
1282 - if (lc_other.count(og)) { 1282 + if (lc_other.contains(og)) {
1283 lc_other.erase(og); 1283 lc_other.erase(og);
1284 m->part9.push_back(getObject(og)); 1284 m->part9.push_back(getObject(og));
1285 } 1285 }
@@ -1293,7 +1293,7 @@ QPDF::calculateLinearizationData(T const&amp; object_stream_data) @@ -1293,7 +1293,7 @@ QPDF::calculateLinearizationData(T const&amp; object_stream_data)
1293 if (!thumb.isNull()) { 1293 if (!thumb.isNull()) {
1294 // Output the thumbnail itself 1294 // Output the thumbnail itself
1295 QPDFObjGen thumb_og(thumb.getObjGen()); 1295 QPDFObjGen thumb_og(thumb.getObjGen());
1296 - if (lc_thumbnail_private.count(thumb_og)) { 1296 + if (lc_thumbnail_private.contains(thumb_og)) {
1297 lc_thumbnail_private.erase(thumb_og); 1297 lc_thumbnail_private.erase(thumb_og);
1298 m->part9.push_back(thumb); 1298 m->part9.push_back(thumb);
1299 } else { 1299 } else {
@@ -1304,7 +1304,7 @@ QPDF::calculateLinearizationData(T const&amp; object_stream_data) @@ -1304,7 +1304,7 @@ QPDF::calculateLinearizationData(T const&amp; object_stream_data)
1304 } 1304 }
1305 std::set<QPDFObjGen>& ogs = m->obj_user_to_objects[ObjUser(ObjUser::ou_thumb, toI(i))]; 1305 std::set<QPDFObjGen>& ogs = m->obj_user_to_objects[ObjUser(ObjUser::ou_thumb, toI(i))];
1306 for (auto const& og: ogs) { 1306 for (auto const& og: ogs) {
1307 - if (lc_thumbnail_private.count(og)) { 1307 + if (lc_thumbnail_private.contains(og)) {
1308 lc_thumbnail_private.erase(og); 1308 lc_thumbnail_private.erase(og);
1309 m->part9.push_back(getObject(og)); 1309 m->part9.push_back(getObject(og));
1310 } 1310 }
@@ -1384,11 +1384,11 @@ QPDF::calculateLinearizationData(T const&amp; object_stream_data) @@ -1384,11 +1384,11 @@ QPDF::calculateLinearizationData(T const&amp; object_stream_data)
1384 for (size_t i = 1; i < toS(npages); ++i) { 1384 for (size_t i = 1; i < toS(npages); ++i) {
1385 CHPageOffsetEntry& pe = m->c_page_offset_data.entries.at(i); 1385 CHPageOffsetEntry& pe = m->c_page_offset_data.entries.at(i);
1386 ObjUser ou(ObjUser::ou_page, toI(i)); 1386 ObjUser ou(ObjUser::ou_page, toI(i));
1387 - if (m->obj_user_to_objects.count(ou) == 0) { 1387 + if (!m->obj_user_to_objects.contains(ou)) {
1388 stopOnError("found unreferenced page while calculating linearization data"); 1388 stopOnError("found unreferenced page while calculating linearization data");
1389 } 1389 }
1390 for (auto const& og: m->obj_user_to_objects[ou]) { 1390 for (auto const& og: m->obj_user_to_objects[ou]) {
1391 - if ((m->object_to_obj_users[og].size() > 1) && (obj_to_index.count(og.getObj()) > 0)) { 1391 + if ((m->object_to_obj_users[og].size() > 1) && (obj_to_index.contains(og.getObj()))) {
1392 int idx = obj_to_index[og.getObj()]; 1392 int idx = obj_to_index[og.getObj()];
1393 ++pe.nshared_objects; 1393 ++pe.nshared_objects;
1394 pe.shared_identifiers.push_back(idx); 1394 pe.shared_identifiers.push_back(idx);
libqpdf/QPDF_objects.cc
@@ -153,7 +153,7 @@ QPDF::parse(char const* password) @@ -153,7 +153,7 @@ QPDF::parse(char const* password)
153 153
154 initializeEncryption(); 154 initializeEncryption();
155 m->parsed = true; 155 m->parsed = true;
156 - if (m->xref_table.size() > 0 && !getRoot().getKey("/Pages").isDictionary()) { 156 + if (!m->xref_table.empty() && !getRoot().getKey("/Pages").isDictionary()) {
157 // QPDFs created from JSON have an empty xref table and no root object yet. 157 // QPDFs created from JSON have an empty xref table and no root object yet.
158 throw damagedPDF("", -1, "unable to find page tree"); 158 throw damagedPDF("", -1, "unable to find page tree");
159 } 159 }
@@ -442,7 +442,7 @@ QPDF::read_xref(qpdf_offset_t xref_offset, bool in_stream_recovery) @@ -442,7 +442,7 @@ QPDF::read_xref(qpdf_offset_t xref_offset, bool in_stream_recovery)
442 } else { 442 } else {
443 xref_offset = read_xrefStream(xref_offset, in_stream_recovery); 443 xref_offset = read_xrefStream(xref_offset, in_stream_recovery);
444 } 444 }
445 - if (visited.count(xref_offset) != 0) { 445 + if (visited.contains(xref_offset)) {
446 QTC::TC("qpdf", "QPDF xref loop"); 446 QTC::TC("qpdf", "QPDF xref loop");
447 throw damagedPDF("", -1, "loop detected following xref tables"); 447 throw damagedPDF("", -1, "loop detected following xref tables");
448 } 448 }
@@ -1020,7 +1020,7 @@ QPDF::insertXrefEntry(int obj, int f0, qpdf_offset_t f1, int f2) @@ -1020,7 +1020,7 @@ QPDF::insertXrefEntry(int obj, int f0, qpdf_offset_t f1, int f2)
1020 return; 1020 return;
1021 } 1021 }
1022 1022
1023 - if (m->deleted_objects.count(obj)) { 1023 + if (m->deleted_objects.contains(obj)) {
1024 QTC::TC("qpdf", "QPDF xref deleted object"); 1024 QTC::TC("qpdf", "QPDF xref deleted object");
1025 return; 1025 return;
1026 } 1026 }
@@ -1056,7 +1056,7 @@ QPDF::insertXrefEntry(int obj, int f0, qpdf_offset_t f1, int f2) @@ -1056,7 +1056,7 @@ QPDF::insertXrefEntry(int obj, int f0, qpdf_offset_t f1, int f2)
1056 void 1056 void
1057 QPDF::insertFreeXrefEntry(QPDFObjGen og) 1057 QPDF::insertFreeXrefEntry(QPDFObjGen og)
1058 { 1058 {
1059 - if (!m->xref_table.count(og)) { 1059 + if (!m->xref_table.contains(og)) {
1060 m->deleted_objects.insert(og.getObj()); 1060 m->deleted_objects.insert(og.getObj());
1061 } 1061 }
1062 } 1062 }
@@ -1476,7 +1476,7 @@ QPDF::readObjectAtOffset( @@ -1476,7 +1476,7 @@ QPDF::readObjectAtOffset(
1476 if (try_recovery) { 1476 if (try_recovery) {
1477 // Try again after reconstructing xref table 1477 // Try again after reconstructing xref table
1478 reconstruct_xref(e); 1478 reconstruct_xref(e);
1479 - if (m->xref_table.count(exp_og) && (m->xref_table[exp_og].getType() == 1)) { 1479 + if (m->xref_table.contains(exp_og) && m->xref_table[exp_og].getType() == 1) {
1480 qpdf_offset_t new_offset = m->xref_table[exp_og].getOffset(); 1480 qpdf_offset_t new_offset = m->xref_table[exp_og].getOffset();
1481 QPDFObjectHandle result = 1481 QPDFObjectHandle result =
1482 readObjectAtOffset(false, new_offset, description, exp_og, og, false); 1482 readObjectAtOffset(false, new_offset, description, exp_og, og, false);
@@ -1522,7 +1522,7 @@ QPDF::readObjectAtOffset( @@ -1522,7 +1522,7 @@ QPDF::readObjectAtOffset(
1522 } 1522 }
1523 } 1523 }
1524 qpdf_offset_t end_after_space = m->file->tell(); 1524 qpdf_offset_t end_after_space = m->file->tell();
1525 - if (skip_cache_if_in_xref && m->xref_table.count(og)) { 1525 + if (skip_cache_if_in_xref && m->xref_table.contains(og)) {
1526 // Ordinarily, an object gets read here when resolved through xref table or stream. In 1526 // Ordinarily, an object gets read here when resolved through xref table or stream. In
1527 // the special case of the xref stream and linearization hint tables, the offset comes 1527 // the special case of the xref stream and linearization hint tables, the offset comes
1528 // from another source. For the specific case of xref streams, the xref stream is read 1528 // from another source. For the specific case of xref streams, the xref stream is read
@@ -1564,7 +1564,7 @@ QPDF::resolve(QPDFObjGen og) @@ -1564,7 +1564,7 @@ QPDF::resolve(QPDFObjGen og)
1564 return m->obj_cache[og].object; 1564 return m->obj_cache[og].object;
1565 } 1565 }
1566 1566
1567 - if (m->resolving.count(og)) { 1567 + if (m->resolving.contains(og)) {
1568 // This can happen if an object references itself directly or indirectly in some key that 1568 // This can happen if an object references itself directly or indirectly in some key that
1569 // has to be resolved during object parsing, such as stream length. 1569 // has to be resolved during object parsing, such as stream length.
1570 QTC::TC("qpdf", "QPDF recursion loop in resolve"); 1570 QTC::TC("qpdf", "QPDF recursion loop in resolve");
@@ -1574,7 +1574,7 @@ QPDF::resolve(QPDFObjGen og) @@ -1574,7 +1574,7 @@ QPDF::resolve(QPDFObjGen og)
1574 } 1574 }
1575 ResolveRecorder rr(this, og); 1575 ResolveRecorder rr(this, og);
1576 1576
1577 - if (m->xref_table.count(og) != 0) { 1577 + if (m->xref_table.contains(og)) {
1578 QPDFXRefEntry const& entry = m->xref_table[og]; 1578 QPDFXRefEntry const& entry = m->xref_table[og];
1579 try { 1579 try {
1580 switch (entry.getType()) { 1580 switch (entry.getType()) {
@@ -1628,7 +1628,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number) @@ -1628,7 +1628,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
1628 true}; 1628 true};
1629 }; 1629 };
1630 1630
1631 - if (m->resolved_object_streams.count(obj_stream_number)) { 1631 + if (m->resolved_object_streams.contains(obj_stream_number)) {
1632 return; 1632 return;
1633 } 1633 }
1634 m->resolved_object_streams.insert(obj_stream_number); 1634 m->resolved_object_streams.insert(obj_stream_number);
@@ -1791,7 +1791,7 @@ QPDF::updateCache( @@ -1791,7 +1791,7 @@ QPDF::updateCache(
1791 bool 1791 bool
1792 QPDF::isCached(QPDFObjGen og) 1792 QPDF::isCached(QPDFObjGen og)
1793 { 1793 {
1794 - return m->obj_cache.count(og) != 0; 1794 + return m->obj_cache.contains(og);
1795 } 1795 }
1796 1796
1797 bool 1797 bool
@@ -1807,7 +1807,7 @@ QPDF::nextObjGen() @@ -1807,7 +1807,7 @@ QPDF::nextObjGen()
1807 if (max_objid == std::numeric_limits<int>::max()) { 1807 if (max_objid == std::numeric_limits<int>::max()) {
1808 throw std::range_error("max object id is too high to create new objects"); 1808 throw std::range_error("max object id is too high to create new objects");
1809 } 1809 }
1810 - return QPDFObjGen(max_objid + 1, 0); 1810 + return {max_objid + 1, 0};
1811 } 1811 }
1812 1812
1813 QPDFObjectHandle 1813 QPDFObjectHandle
@@ -1835,7 +1835,7 @@ QPDF::getObjectForParser(int id, int gen, bool parse_pdf) @@ -1835,7 +1835,7 @@ QPDF::getObjectForParser(int id, int gen, bool parse_pdf)
1835 if (auto iter = m->obj_cache.find(og); iter != m->obj_cache.end()) { 1835 if (auto iter = m->obj_cache.find(og); iter != m->obj_cache.end()) {
1836 return iter->second.object; 1836 return iter->second.object;
1837 } 1837 }
1838 - if (m->xref_table.count(og) || !m->parsed) { 1838 + if (m->xref_table.contains(og) || !m->parsed) {
1839 return m->obj_cache.insert({og, QPDFObject::create<QPDF_Unresolved>(this, og)}) 1839 return m->obj_cache.insert({og, QPDFObject::create<QPDF_Unresolved>(this, og)})
1840 .first->second.object; 1840 .first->second.object;
1841 } 1841 }
@@ -1852,7 +1852,7 @@ QPDF::getObjectForJSON(int id, int gen) @@ -1852,7 +1852,7 @@ QPDF::getObjectForJSON(int id, int gen)
1852 auto [it, inserted] = m->obj_cache.try_emplace(og); 1852 auto [it, inserted] = m->obj_cache.try_emplace(og);
1853 auto& obj = it->second.object; 1853 auto& obj = it->second.object;
1854 if (inserted) { 1854 if (inserted) {
1855 - obj = (m->parsed && !m->xref_table.count(og)) 1855 + obj = (m->parsed && !m->xref_table.contains(og))
1856 ? QPDFObject::create<QPDF_Null>(this, og) 1856 ? QPDFObject::create<QPDF_Null>(this, og)
1857 : QPDFObject::create<QPDF_Unresolved>(this, og); 1857 : QPDFObject::create<QPDF_Unresolved>(this, og);
1858 } 1858 }
@@ -1864,7 +1864,7 @@ QPDF::getObject(QPDFObjGen og) @@ -1864,7 +1864,7 @@ QPDF::getObject(QPDFObjGen og)
1864 { 1864 {
1865 if (auto it = m->obj_cache.find(og); it != m->obj_cache.end()) { 1865 if (auto it = m->obj_cache.find(og); it != m->obj_cache.end()) {
1866 return {it->second.object}; 1866 return {it->second.object};
1867 - } else if (m->parsed && !m->xref_table.count(og)) { 1867 + } else if (m->parsed && !m->xref_table.contains(og)) {
1868 return QPDFObject::create<QPDF_Null>(); 1868 return QPDFObject::create<QPDF_Null>();
1869 } else { 1869 } else {
1870 auto result = 1870 auto result =
@@ -1932,8 +1932,8 @@ QPDF::tableSize() @@ -1932,8 +1932,8 @@ QPDF::tableSize()
1932 { 1932 {
1933 // If obj_cache is dense, accommodate all object in tables,else accommodate only original 1933 // If obj_cache is dense, accommodate all object in tables,else accommodate only original
1934 // objects. 1934 // objects.
1935 - auto max_xref = m->xref_table.size() ? m->xref_table.crbegin()->first.getObj() : 0;  
1936 - auto max_obj = m->obj_cache.size() ? m->obj_cache.crbegin()->first.getObj() : 0; 1935 + auto max_xref = !m->xref_table.empty() ? m->xref_table.crbegin()->first.getObj() : 0;
  1936 + auto max_obj = !m->obj_cache.empty() ? m->obj_cache.crbegin()->first.getObj() : 0;
1937 auto max_id = std::numeric_limits<int>::max() - 1; 1937 auto max_id = std::numeric_limits<int>::max() - 1;
1938 if (max_obj >= max_id || max_xref >= max_id) { 1938 if (max_obj >= max_id || max_xref >= max_id) {
1939 // Temporary fix. Long-term solution is 1939 // Temporary fix. Long-term solution is
libqpdf/QPDF_pages.cc
@@ -303,7 +303,7 @@ QPDF::insertPage(QPDFObjectHandle newpage, int pos) @@ -303,7 +303,7 @@ QPDF::insertPage(QPDFObjectHandle newpage, int pos)
303 : 2); // insert in middle 303 : 2); // insert in middle
304 304
305 auto og = newpage.getObjGen(); 305 auto og = newpage.getObjGen();
306 - if (m->pageobj_to_pages_pos.count(og)) { 306 + if (m->pageobj_to_pages_pos.contains(og)) {
307 QTC::TC("qpdf", "QPDF resolve duplicated page in insert"); 307 QTC::TC("qpdf", "QPDF resolve duplicated page in insert");
308 newpage = makeIndirectObject(QPDFObjectHandle(newpage).shallowCopy()); 308 newpage = makeIndirectObject(QPDFObjectHandle(newpage).shallowCopy());
309 } 309 }
libqpdf/QTC.cc
@@ -39,7 +39,7 @@ QTC::TC_real(char const* const scope, char const* const ccase, int n) @@ -39,7 +39,7 @@ QTC::TC_real(char const* const scope, char const* const ccase, int n)
39 } 39 }
40 #undef TC_ENV 40 #undef TC_ENV
41 41
42 - if (cache.count(std::make_pair(ccase, n))) { 42 + if (cache.contains(std::make_pair(ccase, n))) {
43 return; 43 return;
44 } 44 }
45 cache.insert(std::make_pair(ccase, n)); 45 cache.insert(std::make_pair(ccase, n));
libqpdf/QUtil.cc
@@ -1395,7 +1395,7 @@ QUtil::parse_numrange(char const* range, int max) @@ -1395,7 +1395,7 @@ QUtil::parse_numrange(char const* range, int max)
1395 work = last_group; 1395 work = last_group;
1396 last_group.clear(); 1396 last_group.clear();
1397 for (auto n: work) { 1397 for (auto n: work) {
1398 - if (exclusions.count(n) == 0) { 1398 + if (!exclusions.contains(n)) {
1399 last_group.emplace_back(n); 1399 last_group.emplace_back(n);
1400 } 1400 }
1401 } 1401 }
@@ -1886,7 +1886,7 @@ QUtil::possible_repaired_encodings(std::string supplied) @@ -1886,7 +1886,7 @@ QUtil::possible_repaired_encodings(std::string supplied)
1886 std::vector<std::string> t; 1886 std::vector<std::string> t;
1887 std::set<std::string> seen; 1887 std::set<std::string> seen;
1888 for (auto const& iter: result) { 1888 for (auto const& iter: result) {
1889 - if (!seen.count(iter)) { 1889 + if (!seen.contains(iter)) {
1890 seen.insert(iter); 1890 seen.insert(iter);
1891 t.push_back(iter); 1891 t.push_back(iter);
1892 } 1892 }
@@ -1988,7 +1988,7 @@ QUtil::get_max_memory_usage() @@ -1988,7 +1988,7 @@ QUtil::get_max_memory_usage()
1988 attrs[m2->str(1)] = m2->str(2); 1988 attrs[m2->str(1)] = m2->str(2);
1989 } 1989 }
1990 if (tag == "total") { 1990 if (tag == "total") {
1991 - if (attrs.count("size") > 0) { 1991 + if (attrs.contains("size")) {
1992 result += QIntC::to_size(QUtil::string_to_ull(attrs["size"].c_str())); 1992 result += QIntC::to_size(QUtil::string_to_ull(attrs["size"].c_str()));
1993 } 1993 }
1994 } else if (tag == "system" && attrs["type"] == "max") { 1994 } else if (tag == "system" && attrs["type"] == "max") {
libqpdf/ResourceFinder.cc
1 #include <qpdf/ResourceFinder.hh> 1 #include <qpdf/ResourceFinder.hh>
2 2
3 -ResourceFinder::ResourceFinder() :  
4 - last_name_offset(0)  
5 -{  
6 -}  
7 -  
8 void 3 void
9 ResourceFinder::handleObject(QPDFObjectHandle obj, size_t offset, size_t) 4 ResourceFinder::handleObject(QPDFObjectHandle obj, size_t offset, size_t)
10 { 5 {
libqpdf/qpdf/AES_PDF_native.hh
@@ -25,7 +25,7 @@ class AES_PDF_native @@ -25,7 +25,7 @@ class AES_PDF_native
25 unsigned char* cbc_block; 25 unsigned char* cbc_block;
26 std::unique_ptr<unsigned char[]> key; 26 std::unique_ptr<unsigned char[]> key;
27 std::unique_ptr<uint32_t[]> rk; 27 std::unique_ptr<uint32_t[]> rk;
28 - unsigned int nrounds; 28 + unsigned int nrounds{0};
29 }; 29 };
30 30
31 #endif // AES_PDF_NATIVE_HH 31 #endif // AES_PDF_NATIVE_HH
libqpdf/qpdf/BitWriter.hh
@@ -21,8 +21,8 @@ class BitWriter @@ -21,8 +21,8 @@ class BitWriter
21 21
22 private: 22 private:
23 Pipeline* pl; 23 Pipeline* pl;
24 - unsigned char ch;  
25 - size_t bit_offset; 24 + unsigned char ch{0};
  25 + size_t bit_offset{7};
26 }; 26 };
27 27
28 #endif // BITWRITER_HH 28 #endif // BITWRITER_HH
libqpdf/qpdf/ContentNormalizer.hh
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 class ContentNormalizer final: public QPDFObjectHandle::TokenFilter 6 class ContentNormalizer final: public QPDFObjectHandle::TokenFilter
7 { 7 {
8 public: 8 public:
9 - ContentNormalizer(); 9 + ContentNormalizer() = default;
10 ~ContentNormalizer() final = default; 10 ~ContentNormalizer() final = default;
11 void handleToken(QPDFTokenizer::Token const&) final; 11 void handleToken(QPDFTokenizer::Token const&) final;
12 12
@@ -22,8 +22,8 @@ class ContentNormalizer final: public QPDFObjectHandle::TokenFilter @@ -22,8 +22,8 @@ class ContentNormalizer final: public QPDFObjectHandle::TokenFilter
22 } 22 }
23 23
24 private: 24 private:
25 - bool any_bad_tokens;  
26 - bool last_token_was_bad; 25 + bool any_bad_tokens{false};
  26 + bool last_token_was_bad{false};
27 }; 27 };
28 28
29 #endif // CONTENTNORMALIZER_HH 29 #endif // CONTENTNORMALIZER_HH
libqpdf/qpdf/InsecureRandomDataProvider.hh
@@ -3,18 +3,18 @@ @@ -3,18 +3,18 @@
3 3
4 #include <qpdf/RandomDataProvider.hh> 4 #include <qpdf/RandomDataProvider.hh>
5 5
6 -class InsecureRandomDataProvider: public RandomDataProvider 6 +class InsecureRandomDataProvider final: public RandomDataProvider
7 { 7 {
8 public: 8 public:
9 - InsecureRandomDataProvider();  
10 - ~InsecureRandomDataProvider() override = default;  
11 - void provideRandomData(unsigned char* data, size_t len) override; 9 + InsecureRandomDataProvider() = default;
  10 + ~InsecureRandomDataProvider() final = default;
  11 + void provideRandomData(unsigned char* data, size_t len) final;
12 static RandomDataProvider* getInstance(); 12 static RandomDataProvider* getInstance();
13 13
14 private: 14 private:
15 long random(); 15 long random();
16 16
17 - bool seeded_random; 17 + bool seeded_random{false};
18 }; 18 };
19 19
20 #endif // INSECURERANDOMDATAPROVIDER_HH 20 #endif // INSECURERANDOMDATAPROVIDER_HH
libqpdf/qpdf/NNTree.hh
@@ -84,7 +84,7 @@ class NNTreeIterator @@ -84,7 +84,7 @@ class NNTreeIterator
84 NNTreeImpl& impl; 84 NNTreeImpl& impl;
85 std::list<PathElement> path; 85 std::list<PathElement> path;
86 QPDFObjectHandle node; 86 QPDFObjectHandle node;
87 - int item_number; 87 + int item_number{-1};
88 value_type ivalue; 88 value_type ivalue;
89 }; 89 };
90 90
@@ -123,7 +123,7 @@ class NNTreeImpl @@ -123,7 +123,7 @@ class NNTreeImpl
123 123
124 NNTreeDetails const& details; 124 NNTreeDetails const& details;
125 QPDF& qpdf; 125 QPDF& qpdf;
126 - int split_threshold; 126 + int split_threshold{32};
127 QPDFObjectHandle oh; 127 QPDFObjectHandle oh;
128 bool auto_repair; 128 bool auto_repair;
129 }; 129 };
libqpdf/qpdf/Pl_SHA2.hh
@@ -25,7 +25,7 @@ class Pl_SHA2 final: public Pipeline @@ -25,7 +25,7 @@ class Pl_SHA2 final: public Pipeline
25 std::string getRawDigest(); 25 std::string getRawDigest();
26 26
27 private: 27 private:
28 - bool in_progress; 28 + bool in_progress{false};
29 std::shared_ptr<QPDFCryptoImpl> crypto; 29 std::shared_ptr<QPDFCryptoImpl> crypto;
30 }; 30 };
31 31
libqpdf/qpdf/QPDFArgParser.hh
@@ -206,9 +206,9 @@ class QPDFArgParser @@ -206,9 +206,9 @@ class QPDFArgParser
206 char const* const* argv; 206 char const* const* argv;
207 std::string whoami; 207 std::string whoami;
208 std::string progname_env; 208 std::string progname_env;
209 - int cur_arg;  
210 - bool bash_completion;  
211 - bool zsh_completion; 209 + int cur_arg{0};
  210 + bool bash_completion{false};
  211 + bool zsh_completion{false};
212 std::string bash_prev; 212 std::string bash_prev;
213 std::string bash_cur; 213 std::string bash_cur;
214 std::string bash_line; 214 std::string bash_line;
@@ -216,13 +216,13 @@ class QPDFArgParser @@ -216,13 +216,13 @@ class QPDFArgParser
216 std::map<std::string, option_table_t> option_tables; 216 std::map<std::string, option_table_t> option_tables;
217 option_table_t main_option_table; 217 option_table_t main_option_table;
218 option_table_t help_option_table; 218 option_table_t help_option_table;
219 - option_table_t* option_table; 219 + option_table_t* option_table{nullptr};
220 std::string option_table_name; 220 std::string option_table_name;
221 - bare_arg_handler_t final_check_handler;  
222 - std::vector<std::shared_ptr<char const>> new_argv;  
223 - std::vector<std::shared_ptr<char const>> bash_argv;  
224 - std::shared_ptr<char const*> argv_ph;  
225 - std::shared_ptr<char const*> bash_argv_ph; 221 + bare_arg_handler_t final_check_handler{nullptr};
  222 + std::vector<std::string> new_argv;
  223 + std::vector<std::string> bash_argv;
  224 + std::vector<char const*> argv_ph;
  225 + std::vector<char const*> bash_argv_ph;
226 std::map<std::string, HelpTopic> help_topics; 226 std::map<std::string, HelpTopic> help_topics;
227 std::map<std::string, HelpTopic> option_help; 227 std::map<std::string, HelpTopic> option_help;
228 std::string help_footer; 228 std::string help_footer;
libqpdf/qpdf/QPDFCrypto_native.hh
@@ -8,37 +8,38 @@ @@ -8,37 +8,38 @@
8 #include <qpdf/SHA2_native.hh> 8 #include <qpdf/SHA2_native.hh>
9 #include <memory> 9 #include <memory>
10 10
11 -class QPDFCrypto_native: public QPDFCryptoImpl 11 +class QPDFCrypto_native final: public QPDFCryptoImpl
12 { 12 {
13 public: 13 public:
14 QPDFCrypto_native() = default; 14 QPDFCrypto_native() = default;
15 15
16 - virtual ~QPDFCrypto_native() = default; 16 + ~QPDFCrypto_native() final = default;
17 17
18 - virtual void provideRandomData(unsigned char* data, size_t len); 18 + void provideRandomData(unsigned char* data, size_t len) final;
19 19
20 - virtual void MD5_init();  
21 - virtual void MD5_update(unsigned char const* data, size_t len);  
22 - virtual void MD5_finalize();  
23 - virtual void MD5_digest(MD5_Digest); 20 + void MD5_init() final;
  21 + void MD5_update(unsigned char const* data, size_t len) final;
  22 + void MD5_finalize() final;
  23 + void MD5_digest(MD5_Digest) final;
24 24
25 - virtual void RC4_init(unsigned char const* key_data, int key_len = -1);  
26 - virtual void RC4_process(unsigned char const* in_data, size_t len, unsigned char* out_data = 0);  
27 - virtual void RC4_finalize(); 25 + void RC4_init(unsigned char const* key_data, int key_len = -1) final;
  26 + void
  27 + RC4_process(unsigned char const* in_data, size_t len, unsigned char* out_data = nullptr) final;
  28 + void RC4_finalize() final;
28 29
29 - virtual void SHA2_init(int bits);  
30 - virtual void SHA2_update(unsigned char const* data, size_t len);  
31 - virtual void SHA2_finalize();  
32 - virtual std::string SHA2_digest(); 30 + void SHA2_init(int bits) final;
  31 + void SHA2_update(unsigned char const* data, size_t len) final;
  32 + void SHA2_finalize() final;
  33 + std::string SHA2_digest() final;
33 34
34 - virtual void rijndael_init( 35 + void rijndael_init(
35 bool encrypt, 36 bool encrypt,
36 unsigned char const* key_data, 37 unsigned char const* key_data,
37 size_t key_len, 38 size_t key_len,
38 bool cbc_mode, 39 bool cbc_mode,
39 - unsigned char* cbc_block);  
40 - virtual void rijndael_process(unsigned char* in_data, unsigned char* out_data);  
41 - virtual void rijndael_finalize(); 40 + unsigned char* cbc_block) final;
  41 + void rijndael_process(unsigned char* in_data, unsigned char* out_data) final;
  42 + void rijndael_finalize() final;
42 43
43 private: 44 private:
44 std::shared_ptr<MD5_native> md5; 45 std::shared_ptr<MD5_native> md5;
libqpdf/qpdf/RC4_native.hh
@@ -10,7 +10,7 @@ class RC4_native @@ -10,7 +10,7 @@ class RC4_native
10 RC4_native(unsigned char const* key_data, int key_len = -1); 10 RC4_native(unsigned char const* key_data, int key_len = -1);
11 11
12 // out_data = 0 means to encrypt/decrypt in place 12 // out_data = 0 means to encrypt/decrypt in place
13 - void process(unsigned char const* in_data, size_t len, unsigned char* out_data = 0); 13 + void process(unsigned char const* in_data, size_t len, unsigned char* out_data = nullptr);
14 14
15 private: 15 private:
16 class RC4Key 16 class RC4Key
libqpdf/qpdf/ResourceFinder.hh
@@ -3,20 +3,20 @@ @@ -3,20 +3,20 @@
3 3
4 #include <qpdf/QPDFObjectHandle.hh> 4 #include <qpdf/QPDFObjectHandle.hh>
5 5
6 -class ResourceFinder: public QPDFObjectHandle::ParserCallbacks 6 +class ResourceFinder final: public QPDFObjectHandle::ParserCallbacks
7 { 7 {
8 public: 8 public:
9 - ResourceFinder();  
10 - ~ResourceFinder() override = default;  
11 - void handleObject(QPDFObjectHandle, size_t, size_t) override;  
12 - void handleEOF() override; 9 + ResourceFinder() = default;
  10 + ~ResourceFinder() final = default;
  11 + void handleObject(QPDFObjectHandle, size_t, size_t) final;
  12 + void handleEOF() final;
13 std::set<std::string> const& getNames() const; 13 std::set<std::string> const& getNames() const;
14 std::map<std::string, std::map<std::string, std::set<size_t>>> const& 14 std::map<std::string, std::map<std::string, std::set<size_t>>> const&
15 getNamesByResourceType() const; 15 getNamesByResourceType() const;
16 16
17 private: 17 private:
18 std::string last_name; 18 std::string last_name;
19 - size_t last_name_offset; 19 + size_t last_name_offset{0};
20 std::set<std::string> names; 20 std::set<std::string> names;
21 std::map<std::string, std::map<std::string, std::set<size_t>>> names_by_resource_type; 21 std::map<std::string, std::map<std::string, std::set<size_t>>> names_by_resource_type;
22 }; 22 };
libtests/aes.cc
@@ -11,15 +11,15 @@ @@ -11,15 +11,15 @@
11 static void 11 static void
12 usage() 12 usage()
13 { 13 {
14 - std::cerr << "Usage: aes options hex-key infile outfile" << std::endl  
15 - << " -cbc -- disable CBC mode" << std::endl  
16 - << " +cbc -- enable CBC mode" << std::endl  
17 - << " -encrypt -- encrypt" << std::endl  
18 - << " -decrypt -- decrypt CBC mode" << std::endl  
19 - << " -zero-iv -- use zero initialization vector" << std::endl  
20 - << " -static-iv -- use static initialization vector" << std::endl  
21 - << " -no-padding -- disable padding" << std::endl  
22 - << "Options must precede key and file names." << std::endl; 14 + std::cerr << "Usage: aes options hex-key infile outfile" << '\n'
  15 + << " -cbc -- disable CBC mode" << '\n'
  16 + << " +cbc -- enable CBC mode" << '\n'
  17 + << " -encrypt -- encrypt" << '\n'
  18 + << " -decrypt -- decrypt CBC mode" << '\n'
  19 + << " -zero-iv -- use zero initialization vector" << '\n'
  20 + << " -static-iv -- use static initialization vector" << '\n'
  21 + << " -no-padding -- disable padding" << '\n'
  22 + << "Options must precede key and file names." << '\n';
23 exit(2); 23 exit(2);
24 } 24 }
25 25
libtests/arg_parser.cc
@@ -82,7 +82,7 @@ void @@ -82,7 +82,7 @@ void
82 ArgParser::output(std::string const& msg) 82 ArgParser::output(std::string const& msg)
83 { 83 {
84 if (!this->ap.isCompleting()) { 84 if (!this->ap.isCompleting()) {
85 - std::cout << msg << std::endl; 85 + std::cout << msg << '\n';
86 } 86 }
87 } 87 }
88 88
@@ -160,7 +160,7 @@ ArgParser::test_exceptions() @@ -160,7 +160,7 @@ ArgParser::test_exceptions()
160 fn(); 160 fn();
161 assert(msg == nullptr); 161 assert(msg == nullptr);
162 } catch (std::exception& e) { 162 } catch (std::exception& e) {
163 - std::cout << msg << ": " << e.what() << std::endl; 163 + std::cout << msg << ": " << e.what() << '\n';
164 } 164 }
165 }; 165 };
166 166
@@ -196,10 +196,10 @@ main(int argc, char* argv[]) @@ -196,10 +196,10 @@ main(int argc, char* argv[])
196 try { 196 try {
197 ap.parseArgs(); 197 ap.parseArgs();
198 } catch (QPDFUsage& e) { 198 } catch (QPDFUsage& e) {
199 - std::cerr << "usage: " << e.what() << std::endl; 199 + std::cerr << "usage: " << e.what() << '\n';
200 exit(2); 200 exit(2);
201 } catch (std::exception& e) { 201 } catch (std::exception& e) {
202 - std::cerr << "exception: " << e.what() << std::endl; 202 + std::cerr << "exception: " << e.what() << '\n';
203 exit(3); 203 exit(3);
204 } 204 }
205 return 0; 205 return 0;
libtests/ascii85.cc
@@ -23,7 +23,7 @@ main() @@ -23,7 +23,7 @@ main()
23 } 23 }
24 decode.finish(); 24 decode.finish();
25 } catch (std::exception& e) { 25 } catch (std::exception& e) {
26 - std::cerr << e.what() << std::endl; 26 + std::cerr << e.what() << '\n';
27 exit(2); 27 exit(2);
28 } 28 }
29 29
libtests/base64.cc
@@ -20,7 +20,7 @@ write_some(FILE* f, size_t bytes, Pipeline* p) @@ -20,7 +20,7 @@ write_some(FILE* f, size_t bytes, Pipeline* p)
20 } 20 }
21 if (len < bytes) { 21 if (len < bytes) {
22 if (ferror(f)) { 22 if (ferror(f)) {
23 - std::cerr << "error reading file" << std::endl; 23 + std::cerr << "error reading file" << '\n';
24 exit(2); 24 exit(2);
25 } 25 }
26 p->finish(); 26 p->finish();
@@ -32,7 +32,7 @@ write_some(FILE* f, size_t bytes, Pipeline* p) @@ -32,7 +32,7 @@ write_some(FILE* f, size_t bytes, Pipeline* p)
32 static void 32 static void
33 usage() 33 usage()
34 { 34 {
35 - std::cerr << "Usage: base64 encode|decode" << std::endl; 35 + std::cerr << "Usage: base64 encode|decode" << '\n';
36 exit(2); 36 exit(2);
37 } 37 }
38 38
@@ -74,7 +74,7 @@ main(int argc, char* argv[]) @@ -74,7 +74,7 @@ main(int argc, char* argv[])
74 } 74 }
75 } 75 }
76 } catch (std::exception& e) { 76 } catch (std::exception& e) {
77 - std::cout << "exception: " << e.what() << std::endl; 77 + std::cout << "exception: " << e.what() << '\n';
78 exit(2); 78 exit(2);
79 } 79 }
80 80
libtests/bits.cc
@@ -16,7 +16,7 @@ static void @@ -16,7 +16,7 @@ static void
16 print_values(long long byte_offset, size_t bit_offset, size_t bits_available) 16 print_values(long long byte_offset, size_t bit_offset, size_t bits_available)
17 { 17 {
18 std::cout << "byte offset = " << byte_offset << ", " << "bit offset = " << bit_offset << ", " 18 std::cout << "byte offset = " << byte_offset << ", " << "bit offset = " << bit_offset << ", "
19 - << "bits available = " << bits_available << std::endl; 19 + << "bits available = " << bits_available << '\n';
20 } 20 }
21 21
22 static void 22 static void
@@ -29,7 +29,7 @@ test_read_bits( @@ -29,7 +29,7 @@ test_read_bits(
29 { 29 {
30 unsigned long result = QIntC::to_ulong(read_bits(p, bit_offset, bits_available, bits_wanted)); 30 unsigned long result = QIntC::to_ulong(read_bits(p, bit_offset, bits_available, bits_wanted));
31 31
32 - std::cout << "bits read: " << bits_wanted << ", result = " << result << std::endl; 32 + std::cout << "bits read: " << bits_wanted << ", result = " << result << '\n';
33 print_values(p - buf, bit_offset, bits_available); 33 print_values(p - buf, bit_offset, bits_available);
34 } 34 }
35 35
@@ -39,7 +39,7 @@ test_write_bits( @@ -39,7 +39,7 @@ test_write_bits(
39 { 39 {
40 write_bits(ch, bit_offset, val, bits, bp); 40 write_bits(ch, bit_offset, val, bits, bp);
41 std::cout << "ch = " << QUtil::uint_to_string_base(ch, 16, 2) << ", bit_offset = " << bit_offset 41 std::cout << "ch = " << QUtil::uint_to_string_base(ch, 16, 2) << ", bit_offset = " << bit_offset
42 - << std::endl; 42 + << '\n';
43 } 43 }
44 44
45 static void 45 static void
@@ -52,7 +52,7 @@ print_buffer(Pl_Buffer* bp) @@ -52,7 +52,7 @@ print_buffer(Pl_Buffer* bp)
52 for (unsigned long i = 0; i < l; ++i) { 52 for (unsigned long i = 0; i < l; ++i) {
53 std::cout << QUtil::uint_to_string_base(p[i], 16, 2) << ((i == l - 1) ? "\n" : " "); 53 std::cout << QUtil::uint_to_string_base(p[i], 16, 2) << ((i == l - 1) ? "\n" : " ");
54 } 54 }
55 - std::cout << std::endl; 55 + std::cout << '\n';
56 delete b; 56 delete b;
57 } 57 }
58 58
@@ -86,12 +86,12 @@ test() @@ -86,12 +86,12 @@ test()
86 try { 86 try {
87 test_read_bits(buf, p, bit_offset, bits_available, 4); 87 test_read_bits(buf, p, bit_offset, bits_available, 4);
88 } catch (std::exception& e) { 88 } catch (std::exception& e) {
89 - std::cout << "exception: " << e.what() << std::endl; 89 + std::cout << "exception: " << e.what() << '\n';
90 print_values(p - buf, bit_offset, bits_available); 90 print_values(p - buf, bit_offset, bits_available);
91 } 91 }
92 92
93 test_read_bits(buf, p, bit_offset, bits_available, 3); 93 test_read_bits(buf, p, bit_offset, bits_available, 3);
94 - std::cout << std::endl; 94 + std::cout << '\n';
95 95
96 // 11110101 00010101 01100101 01111001: 00010010 10001001 01110101 01001011 96 // 11110101 00010101 01100101 01111001: 00010010 10001001 01110101 01001011
97 97
@@ -101,29 +101,29 @@ test() @@ -101,29 +101,29 @@ test()
101 print_values(p - buf, bit_offset, bits_available); 101 print_values(p - buf, bit_offset, bits_available);
102 test_read_bits(buf, p, bit_offset, bits_available, 32); 102 test_read_bits(buf, p, bit_offset, bits_available, 32);
103 test_read_bits(buf, p, bit_offset, bits_available, 32); 103 test_read_bits(buf, p, bit_offset, bits_available, 32);
104 - std::cout << std::endl; 104 + std::cout << '\n';
105 105
106 BitStream b(buf, 8); 106 BitStream b(buf, 8);
107 - std::cout << b.getBits(32) << std::endl; 107 + std::cout << b.getBits(32) << '\n';
108 b.reset(); 108 b.reset();
109 - std::cout << b.getBits(32) << std::endl;  
110 - std::cout << b.getBits(32) << std::endl;  
111 - std::cout << std::endl; 109 + std::cout << b.getBits(32) << '\n';
  110 + std::cout << b.getBits(32) << '\n';
  111 + std::cout << '\n';
112 112
113 b.reset(); 113 b.reset();
114 - std::cout << b.getBits(6) << std::endl; 114 + std::cout << b.getBits(6) << '\n';
115 b.skipToNextByte(); 115 b.skipToNextByte();
116 - std::cout << b.getBits(8) << std::endl; 116 + std::cout << b.getBits(8) << '\n';
117 b.skipToNextByte(); 117 b.skipToNextByte();
118 - std::cout << b.getBits(8) << std::endl;  
119 - std::cout << std::endl; 118 + std::cout << b.getBits(8) << '\n';
  119 + std::cout << '\n';
120 b.reset(); 120 b.reset();
121 - std::cout << b.getBitsSigned(3) << std::endl;  
122 - std::cout << b.getBitsSigned(6) << std::endl;  
123 - std::cout << b.getBitsSigned(5) << std::endl;  
124 - std::cout << b.getBitsSigned(1) << std::endl;  
125 - std::cout << b.getBitsSigned(17) << std::endl;  
126 - std::cout << std::endl; 121 + std::cout << b.getBitsSigned(3) << '\n';
  122 + std::cout << b.getBitsSigned(6) << '\n';
  123 + std::cout << b.getBitsSigned(5) << '\n';
  124 + std::cout << b.getBitsSigned(1) << '\n';
  125 + std::cout << b.getBitsSigned(17) << '\n';
  126 + std::cout << '\n';
127 127
128 // Write tests 128 // Write tests
129 129
@@ -176,9 +176,9 @@ main() @@ -176,9 +176,9 @@ main()
176 try { 176 try {
177 test(); 177 test();
178 } catch (std::exception& e) { 178 } catch (std::exception& e) {
179 - std::cout << "unexpected exception: " << e.what() << std::endl; 179 + std::cout << "unexpected exception: " << e.what() << '\n';
180 exit(2); 180 exit(2);
181 } 181 }
182 - std::cout << "done" << std::endl; 182 + std::cout << "done" << '\n';
183 return 0; 183 return 0;
184 } 184 }
libtests/buffer.cc
@@ -85,22 +85,22 @@ main() @@ -85,22 +85,22 @@ main()
85 bp1.write(uc("12345"), 5); 85 bp1.write(uc("12345"), 5);
86 bp1.write(uc("67890"), 5); 86 bp1.write(uc("67890"), 5);
87 bp1.finish(); 87 bp1.finish();
88 - std::cout << "count: " << count.getCount() << std::endl; 88 + std::cout << "count: " << count.getCount() << '\n';
89 bp1.write(uc("abcde"), 5); 89 bp1.write(uc("abcde"), 5);
90 bp1.write(uc("fghij"), 6); 90 bp1.write(uc("fghij"), 6);
91 bp1.finish(); 91 bp1.finish();
92 - std::cout << "count: " << count.getCount() << std::endl; 92 + std::cout << "count: " << count.getCount() << '\n';
93 Buffer* b = bp1.getBuffer(); 93 Buffer* b = bp1.getBuffer();
94 - std::cout << "size: " << b->getSize() << std::endl;  
95 - std::cout << "data: " << b->getBuffer() << std::endl; 94 + std::cout << "size: " << b->getSize() << '\n';
  95 + std::cout << "data: " << b->getBuffer() << '\n';
96 delete b; 96 delete b;
97 bp1.write(uc("qwert"), 5); 97 bp1.write(uc("qwert"), 5);
98 bp1.write(uc("yuiop"), 6); 98 bp1.write(uc("yuiop"), 6);
99 bp1.finish(); 99 bp1.finish();
100 - std::cout << "count: " << count.getCount() << std::endl; 100 + std::cout << "count: " << count.getCount() << '\n';
101 b = bp1.getBuffer(); 101 b = bp1.getBuffer();
102 - std::cout << "size: " << b->getSize() << std::endl;  
103 - std::cout << "data: " << b->getBuffer() << std::endl; 102 + std::cout << "size: " << b->getSize() << '\n';
  103 + std::cout << "data: " << b->getBuffer() << '\n';
104 delete b; 104 delete b;
105 105
106 Pl_Buffer bp2("bp2"); 106 Pl_Buffer bp2("bp2");
@@ -109,12 +109,12 @@ main() @@ -109,12 +109,12 @@ main()
109 try { 109 try {
110 delete bp2.getBuffer(); 110 delete bp2.getBuffer();
111 } catch (std::exception& e) { 111 } catch (std::exception& e) {
112 - std::cout << e.what() << std::endl; 112 + std::cout << e.what() << '\n';
113 } 113 }
114 bp2.finish(); 114 bp2.finish();
115 b = bp2.getBuffer(); 115 b = bp2.getBuffer();
116 - std::cout << "size: " << b->getSize() << std::endl;  
117 - std::cout << "data: " << b->getBuffer() << std::endl; 116 + std::cout << "size: " << b->getSize() << '\n';
  117 + std::cout << "data: " << b->getBuffer() << '\n';
118 delete b; 118 delete b;
119 119
120 unsigned char lbuf[10]; 120 unsigned char lbuf[10];
@@ -125,17 +125,17 @@ main() @@ -125,17 +125,17 @@ main()
125 125
126 Pl_Buffer bp3("bp3"); 126 Pl_Buffer bp3("bp3");
127 b = bp3.getBuffer(); 127 b = bp3.getBuffer();
128 - std::cout << "size: " << b->getSize() << std::endl; 128 + std::cout << "size: " << b->getSize() << '\n';
129 delete b; 129 delete b;
130 // Should be able to call getBuffer again and get an empty buffer 130 // Should be able to call getBuffer again and get an empty buffer
131 b = bp3.getBuffer(); 131 b = bp3.getBuffer();
132 - std::cout << "size: " << b->getSize() << std::endl; 132 + std::cout << "size: " << b->getSize() << '\n';
133 delete b; 133 delete b;
134 // Also can write 0 and do it. 134 // Also can write 0 and do it.
135 bp3.write(uc(""), 0); 135 bp3.write(uc(""), 0);
136 bp3.finish(); 136 bp3.finish();
137 b = bp3.getBuffer(); 137 b = bp3.getBuffer();
138 - std::cout << "size: " << b->getSize() << std::endl; 138 + std::cout << "size: " << b->getSize() << '\n';
139 delete b; 139 delete b;
140 140
141 // Malloc buffer should behave similarly. 141 // Malloc buffer should behave similarly.
@@ -147,7 +147,7 @@ main() @@ -147,7 +147,7 @@ main()
147 bp4.getMallocBuffer(&mbuf, &len); 147 bp4.getMallocBuffer(&mbuf, &len);
148 assert(false); 148 assert(false);
149 } catch (std::logic_error& e) { 149 } catch (std::logic_error& e) {
150 - std::cout << "malloc buffer logic error: " << e.what() << std::endl; 150 + std::cout << "malloc buffer logic error: " << e.what() << '\n';
151 } 151 }
152 bp4.finish(); 152 bp4.finish();
153 bp4.getMallocBuffer(&mbuf, &len); 153 bp4.getMallocBuffer(&mbuf, &len);
@@ -160,10 +160,10 @@ main() @@ -160,10 +160,10 @@ main()
160 assert(mbuf == nullptr); 160 assert(mbuf == nullptr);
161 assert(len == 0); 161 assert(len == 0);
162 } catch (std::exception& e) { 162 } catch (std::exception& e) {
163 - std::cout << "unexpected exception: " << e.what() << std::endl; 163 + std::cout << "unexpected exception: " << e.what() << '\n';
164 exit(2); 164 exit(2);
165 } 165 }
166 166
167 - std::cout << "done" << std::endl; 167 + std::cout << "done" << '\n';
168 return 0; 168 return 0;
169 } 169 }
libtests/closed_file_input_source.cc
@@ -8,7 +8,7 @@ void @@ -8,7 +8,7 @@ void
8 check(std::string const& what, bool result) 8 check(std::string const& what, bool result)
9 { 9 {
10 if (!result) { 10 if (!result) {
11 - std::cout << "FAIL: " << what << std::endl; 11 + std::cout << "FAIL: " << what << '\n';
12 } 12 }
13 } 13 }
14 14
@@ -73,6 +73,6 @@ main() @@ -73,6 +73,6 @@ main()
73 std::cout << "testing with FileInputSource\n"; 73 std::cout << "testing with FileInputSource\n";
74 FileInputSource f("input"); 74 FileInputSource f("input");
75 do_tests(&f); 75 do_tests(&f);
76 - std::cout << "all assertions passed" << std::endl; 76 + std::cout << "all assertions passed" << '\n';
77 return 0; 77 return 0;
78 } 78 }
libtests/concatenate.cc
@@ -31,9 +31,9 @@ main(int argc, char* argv[]) @@ -31,9 +31,9 @@ main(int argc, char* argv[])
31 auto b2_buf = b2.getBufferSharedPointer(); 31 auto b2_buf = b2.getBufferSharedPointer();
32 std::string result(reinterpret_cast<char*>(b2_buf->getBuffer()), b2_buf->getSize()); 32 std::string result(reinterpret_cast<char*>(b2_buf->getBuffer()), b2_buf->getSize());
33 if (result == "-one--two-") { 33 if (result == "-one--two-") {
34 - std::cout << "concatenate test passed" << std::endl; 34 + std::cout << "concatenate test passed" << '\n';
35 } else { 35 } else {
36 - std::cout << "concatenate test failed: " << result << std::endl; 36 + std::cout << "concatenate test failed: " << result << '\n';
37 } 37 }
38 return 0; 38 return 0;
39 } 39 }
libtests/crypto_provider.cc
@@ -47,7 +47,7 @@ class Potato: public QPDFCryptoImpl @@ -47,7 +47,7 @@ class Potato: public QPDFCryptoImpl
47 std::string 47 std::string
48 SHA2_digest() override 48 SHA2_digest() override
49 { 49 {
50 - return std::string(); 50 + return {};
51 } 51 }
52 void 52 void
53 RC4_init(const unsigned char* key_data, int key_len) override 53 RC4_init(const unsigned char* key_data, int key_len) override
libtests/dct_compress.cc
@@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@
12 static void 12 static void
13 usage() 13 usage()
14 { 14 {
15 - std::cerr << "Usage: dct_compress infile outfile width height {rgb|cmyk|gray}" << std::endl; 15 + std::cerr << "Usage: dct_compress infile outfile width height {rgb|cmyk|gray}" << '\n';
16 exit(2); 16 exit(2);
17 } 17 }
18 18
libtests/dct_uncompress.cc
@@ -10,7 +10,7 @@ int @@ -10,7 +10,7 @@ int
10 main(int argc, char* argv[]) 10 main(int argc, char* argv[])
11 { 11 {
12 if (argc != 3) { 12 if (argc != 3) {
13 - std::cerr << "Usage: dct_uncompress infile outfile" << std::endl; 13 + std::cerr << "Usage: dct_uncompress infile outfile" << '\n';
14 exit(2); 14 exit(2);
15 } 15 }
16 16
libtests/flate.cc
@@ -53,7 +53,7 @@ run(char const* filename) @@ -53,7 +53,7 @@ run(char const* filename)
53 53
54 def3->finish(); 54 def3->finish();
55 55
56 - std::cout << "bytes written to o3: " << count3->getCount() << std::endl; 56 + std::cout << "bytes written to o3: " << count3->getCount() << '\n';
57 57
58 delete def3; 58 delete def3;
59 delete inf3; 59 delete inf3;
@@ -76,14 +76,14 @@ run(char const* filename) @@ -76,14 +76,14 @@ run(char const* filename)
76 // At this point, filename, filename.2, and filename.3 should have 76 // At this point, filename, filename.2, and filename.3 should have
77 // identical contents. filename.1 should be a compressed version. 77 // identical contents. filename.1 should be a compressed version.
78 78
79 - std::cout << "done" << std::endl; 79 + std::cout << "done" << '\n';
80 } 80 }
81 81
82 int 82 int
83 main(int argc, char* argv[]) 83 main(int argc, char* argv[])
84 { 84 {
85 if (argc != 2) { 85 if (argc != 2) {
86 - std::cerr << "Usage: pipeline filename" << std::endl; 86 + std::cerr << "Usage: pipeline filename" << '\n';
87 exit(2); 87 exit(2);
88 } 88 }
89 char* filename = argv[1]; 89 char* filename = argv[1];
@@ -91,7 +91,7 @@ main(int argc, char* argv[]) @@ -91,7 +91,7 @@ main(int argc, char* argv[])
91 try { 91 try {
92 run(filename); 92 run(filename);
93 } catch (std::exception& e) { 93 } catch (std::exception& e) {
94 - std::cout << e.what() << std::endl; 94 + std::cout << e.what() << '\n';
95 } 95 }
96 return 0; 96 return 0;
97 } 97 }
libtests/hex.cc
@@ -23,7 +23,7 @@ main() @@ -23,7 +23,7 @@ main()
23 } 23 }
24 decode.finish(); 24 decode.finish();
25 } catch (std::exception& e) { 25 } catch (std::exception& e) {
26 - std::cerr << e.what() << std::endl; 26 + std::cerr << e.what() << '\n';
27 exit(2); 27 exit(2);
28 } 28 }
29 29
libtests/input_source.cc
@@ -47,7 +47,7 @@ Finder::check() @@ -47,7 +47,7 @@ Finder::check()
47 void 47 void
48 check(char const* description, bool expected, bool actual) 48 check(char const* description, bool expected, bool actual)
49 { 49 {
50 - std::cout << description << ": " << ((actual == expected) ? "PASS" : "FAIL") << std::endl; 50 + std::cout << description << ": " << ((actual == expected) ? "PASS" : "FAIL") << '\n';
51 } 51 }
52 52
53 int 53 int
libtests/json.cc
@@ -186,12 +186,12 @@ static void @@ -186,12 +186,12 @@ static void
186 check_schema(JSON& obj, JSON& schema, unsigned long flags, bool exp, std::string const& description) 186 check_schema(JSON& obj, JSON& schema, unsigned long flags, bool exp, std::string const& description)
187 { 187 {
188 std::list<std::string> errors; 188 std::list<std::string> errors;
189 - std::cout << "--- " << description << std::endl; 189 + std::cout << "--- " << description << '\n';
190 assert(exp == obj.checkSchema(schema, flags, errors)); 190 assert(exp == obj.checkSchema(schema, flags, errors));
191 for (auto const& error: errors) { 191 for (auto const& error: errors) {
192 - std::cout << error << std::endl; 192 + std::cout << error << '\n';
193 } 193 }
194 - std::cout << "---" << std::endl; 194 + std::cout << "---" << '\n';
195 } 195 }
196 196
197 static void 197 static void
libtests/json_handler.cc
@@ -8,43 +8,43 @@ @@ -8,43 +8,43 @@
8 static void 8 static void
9 print_null(std::string const& path) 9 print_null(std::string const& path)
10 { 10 {
11 - std::cout << path << ": null" << std::endl; 11 + std::cout << path << ": null" << '\n';
12 } 12 }
13 13
14 static void 14 static void
15 print_string(std::string const& path, std::string const& value) 15 print_string(std::string const& path, std::string const& value)
16 { 16 {
17 - std::cout << path << ": string: " << value << std::endl; 17 + std::cout << path << ": string: " << value << '\n';
18 } 18 }
19 19
20 static void 20 static void
21 print_number(std::string const& path, std::string const& value) 21 print_number(std::string const& path, std::string const& value)
22 { 22 {
23 - std::cout << path << ": number: " << value << std::endl; 23 + std::cout << path << ": number: " << value << '\n';
24 } 24 }
25 25
26 static void 26 static void
27 print_bool(std::string const& path, bool value) 27 print_bool(std::string const& path, bool value)
28 { 28 {
29 - std::cout << path << ": bool: " << (value ? "true" : "false") << std::endl; 29 + std::cout << path << ": bool: " << (value ? "true" : "false") << '\n';
30 } 30 }
31 31
32 static void 32 static void
33 print_json(std::string const& path, JSON value) 33 print_json(std::string const& path, JSON value)
34 { 34 {
35 - std::cout << path << ": json: " << value.unparse() << std::endl; 35 + std::cout << path << ": json: " << value.unparse() << '\n';
36 } 36 }
37 37
38 static JSONHandler::void_handler_t 38 static JSONHandler::void_handler_t
39 make_print_message(std::string msg) 39 make_print_message(std::string msg)
40 { 40 {
41 - return [msg](std::string const& path) { std::cout << path << ": json: " << msg << std::endl; }; 41 + return [msg](std::string const& path) { std::cout << path << ": json: " << msg << '\n'; };
42 } 42 }
43 43
44 static void 44 static void
45 test_scalar() 45 test_scalar()
46 { 46 {
47 - std::cout << "-- scalar --" << std::endl; 47 + std::cout << "-- scalar --" << '\n';
48 JSONHandler h; 48 JSONHandler h;
49 h.addStringHandler(print_string); 49 h.addStringHandler(print_string);
50 JSON j = JSON::parse("\"potato\""); 50 JSON j = JSON::parse("\"potato\"");
@@ -97,7 +97,7 @@ make_all_handler() @@ -97,7 +97,7 @@ make_all_handler()
97 static void 97 static void
98 test_all() 98 test_all()
99 { 99 {
100 - std::cout << "-- all --" << std::endl; 100 + std::cout << "-- all --" << '\n';
101 auto h = make_all_handler(); 101 auto h = make_all_handler();
102 /* cSpell: ignore phour */ 102 /* cSpell: ignore phour */
103 JSON j = JSON::parse(R"({ 103 JSON j = JSON::parse(R"({
@@ -110,7 +110,7 @@ test_all() @@ -110,7 +110,7 @@ test_all()
110 "six": {"a": {"b": "quack", "Q": "baaa"}, "b": "moo"} 110 "six": {"a": {"b": "quack", "Q": "baaa"}, "b": "moo"}
111 })"); 111 })");
112 h->handle(".", j); 112 h->handle(".", j);
113 - std::cerr << "-- fallback --" << std::endl; 113 + std::cerr << "-- fallback --" << '\n';
114 j = JSON::parse(R"({ 114 j = JSON::parse(R"({
115 "five": "not-array" 115 "five": "not-array"
116 })"); 116 })");
@@ -120,14 +120,14 @@ test_all() @@ -120,14 +120,14 @@ test_all()
120 static void 120 static void
121 test_errors() 121 test_errors()
122 { 122 {
123 - std::cout << "-- errors --" << std::endl; 123 + std::cout << "-- errors --" << '\n';
124 auto h = make_all_handler(); 124 auto h = make_all_handler();
125 auto t = [h](std::string const& msg, std::function<void()> fn) { 125 auto t = [h](std::string const& msg, std::function<void()> fn) {
126 try { 126 try {
127 fn(); 127 fn();
128 assert(false); 128 assert(false);
129 } catch (QPDFUsage& e) { 129 } catch (QPDFUsage& e) {
130 - std::cout << msg << ": " << e.what() << std::endl; 130 + std::cout << msg << ": " << e.what() << '\n';
131 } 131 }
132 }; 132 };
133 133
libtests/json_parse.cc
@@ -26,13 +26,13 @@ namespace @@ -26,13 +26,13 @@ namespace
26 void 26 void
27 Reactor::dictionaryStart() 27 Reactor::dictionaryStart()
28 { 28 {
29 - std::cout << "dictionary start" << std::endl; 29 + std::cout << "dictionary start" << '\n';
30 } 30 }
31 31
32 void 32 void
33 Reactor::arrayStart() 33 Reactor::arrayStart()
34 { 34 {
35 - std::cout << "array start" << std::endl; 35 + std::cout << "array start" << '\n';
36 } 36 }
37 37
38 void 38 void
@@ -45,7 +45,7 @@ Reactor::containerEnd(JSON const&amp; value) @@ -45,7 +45,7 @@ Reactor::containerEnd(JSON const&amp; value)
45 void 45 void
46 Reactor::topLevelScalar() 46 Reactor::topLevelScalar()
47 { 47 {
48 - std::cout << "top-level scalar" << std::endl; 48 + std::cout << "top-level scalar" << '\n';
49 } 49 }
50 50
51 bool 51 bool
@@ -74,13 +74,13 @@ Reactor::arrayItem(JSON const&amp; value) @@ -74,13 +74,13 @@ Reactor::arrayItem(JSON const&amp; value)
74 void 74 void
75 Reactor::printItem(JSON const& j) 75 Reactor::printItem(JSON const& j)
76 { 76 {
77 - std::cout << "[" << j.getStart() << ", " << j.getEnd() << "): " << j.unparse() << std::endl; 77 + std::cout << "[" << j.getStart() << ", " << j.getEnd() << "): " << j.unparse() << '\n';
78 } 78 }
79 79
80 static void 80 static void
81 usage() 81 usage()
82 { 82 {
83 - std::cerr << "Usage: json_parse file [--react]" << std::endl; 83 + std::cerr << "Usage: json_parse file [--react]" << '\n';
84 exit(2); 84 exit(2);
85 } 85 }
86 86
@@ -102,9 +102,9 @@ main(int argc, char* argv[]) @@ -102,9 +102,9 @@ main(int argc, char* argv[])
102 } 102 }
103 try { 103 try {
104 FileInputSource is(filename); 104 FileInputSource is(filename);
105 - std::cout << JSON::parse(is, reactor.get()).unparse() << std::endl; 105 + std::cout << JSON::parse(is, reactor.get()).unparse() << '\n';
106 } catch (std::exception& e) { 106 } catch (std::exception& e) {
107 - std::cerr << "exception: " << filename << ": " << e.what() << std::endl; 107 + std::cerr << "exception: " << filename << ": " << e.what() << '\n';
108 return 2; 108 return 2;
109 } 109 }
110 return 0; 110 return 0;
libtests/lzw.cc
@@ -15,7 +15,7 @@ main(int argc, char* argv[]) @@ -15,7 +15,7 @@ main(int argc, char* argv[])
15 } 15 }
16 16
17 if (argc < 3) { 17 if (argc < 3) {
18 - std::cerr << "Usage: lzw infile outfile [ --no-early-code-change ]" << std::endl; 18 + std::cerr << "Usage: lzw infile outfile [ --no-early-code-change ]" << '\n';
19 exit(2); 19 exit(2);
20 } 20 }
21 21
@@ -41,7 +41,7 @@ main(int argc, char* argv[]) @@ -41,7 +41,7 @@ main(int argc, char* argv[])
41 } 41 }
42 decode.finish(); 42 decode.finish();
43 } catch (std::exception& e) { 43 } catch (std::exception& e) {
44 - std::cerr << e.what() << std::endl; 44 + std::cerr << e.what() << '\n';
45 exit(2); 45 exit(2);
46 } 46 }
47 47
libtests/main_from_wmain.cc
@@ -8,7 +8,7 @@ wmain_test() @@ -8,7 +8,7 @@ wmain_test()
8 // writable args and function args 8 // writable args and function args
9 auto realmain = [](int argc, char* argv[]) { 9 auto realmain = [](int argc, char* argv[]) {
10 for (int i = 0; i < argc; ++i) { 10 for (int i = 0; i < argc; ++i) {
11 - std::cout << argv[i] << std::endl; 11 + std::cout << argv[i] << '\n';
12 } 12 }
13 return 0; 13 return 0;
14 }; 14 };
@@ -28,7 +28,7 @@ cwmain_test() @@ -28,7 +28,7 @@ cwmain_test()
28 // const args and function args 28 // const args and function args
29 auto realmain = [](int argc, char const* const argv[]) { 29 auto realmain = [](int argc, char const* const argv[]) {
30 for (int i = 0; i < argc; ++i) { 30 for (int i = 0; i < argc; ++i) {
31 - std::cout << "const " << argv[i] << std::endl; 31 + std::cout << "const " << argv[i] << '\n';
32 } 32 }
33 return 0; 33 return 0;
34 }; 34 };
@@ -49,7 +49,7 @@ main(int argc, char* argv[]) @@ -49,7 +49,7 @@ main(int argc, char* argv[])
49 wmain_test(); 49 wmain_test();
50 cwmain_test(); 50 cwmain_test();
51 } catch (std::exception& e) { 51 } catch (std::exception& e) {
52 - std::cout << "unexpected exception: " << e.what() << std::endl; 52 + std::cout << "unexpected exception: " << e.what() << '\n';
53 } 53 }
54 #endif // QPDF_NO_WCHAR_T 54 #endif // QPDF_NO_WCHAR_T
55 55