Commit 23fc6756f1894e1af35853eb2251f08d5b25cf30

Authored by Jay Berkenbilt
1 parent 0fe8d447

Add QUtil::FileCloser to the public API

ChangeLog
  1 +2022-05-18 Jay Berkenbilt <ejb@ql.org>
  2 +
  3 + * Add QUtil::FileCloser to the public API. This is a simple inline
  4 + class to help with automatic file closing.
  5 +
1 6 2022-05-17 Jay Berkenbilt <ejb@ql.org>
2 7  
3 8 * Allow passing *uninitialized* (not null) objects to
... ...
include/qpdf/QUtil.hh
... ... @@ -114,6 +114,33 @@ namespace QUtil
114 114 QPDF_DLL
115 115 FILE* fopen_wrapper(std::string const&, FILE*);
116 116  
  117 + // This is a little class to help with automatic closing files.
  118 + // You can do something like
  119 + //
  120 + // QUtil::FileCloser fc(QUtil::safe_fopen(filename, "rb"));
  121 + //
  122 + // and then use fc.f to the file. Be sure to actually declare a
  123 + // variable of type FileCloser. Using it as a temporary won't work
  124 + // because it will close the file as soon as it goes out of scope.
  125 + class FileCloser
  126 + {
  127 + public:
  128 + FileCloser(FILE* f) :
  129 + f(f)
  130 + {
  131 + }
  132 +
  133 + ~FileCloser()
  134 + {
  135 + if (f) {
  136 + fclose(f);
  137 + f = nullptr;
  138 + }
  139 + }
  140 +
  141 + FILE* f;
  142 + };
  143 +
117 144 // Attempt to open the file read only and then close again
118 145 QPDF_DLL
119 146 bool file_can_be_opened(char const* filename);
... ...
libqpdf/QUtil.cc
... ... @@ -305,26 +305,6 @@ static std::map&lt;unsigned long, unsigned char&gt; unicode_to_pdf_doc = {
305 305 {0x20ac, 0xa0},
306 306 };
307 307  
308   -namespace
309   -{
310   - class FileCloser
311   - {
312   - public:
313   - FileCloser(FILE* f) :
314   - f(f)
315   - {
316   - }
317   -
318   - ~FileCloser()
319   - {
320   - fclose(f);
321   - }
322   -
323   - private:
324   - FILE* f;
325   - };
326   -} // namespace
327   -
328 308 template <typename T>
329 309 static std::string
330 310 int_to_string_base_internal(T num, int base, int length)
... ...