diff --git a/ChangeLog b/ChangeLog index 95ed40c7..4a8122fc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2022-05-18 Jay Berkenbilt + + * Add QUtil::FileCloser to the public API. This is a simple inline + class to help with automatic file closing. + 2022-05-17 Jay Berkenbilt * Allow passing *uninitialized* (not null) objects to diff --git a/include/qpdf/QUtil.hh b/include/qpdf/QUtil.hh index 5d33b2a5..283db861 100644 --- a/include/qpdf/QUtil.hh +++ b/include/qpdf/QUtil.hh @@ -114,6 +114,33 @@ namespace QUtil QPDF_DLL FILE* fopen_wrapper(std::string const&, FILE*); + // This is a little class to help with automatic closing files. + // You can do something like + // + // QUtil::FileCloser fc(QUtil::safe_fopen(filename, "rb")); + // + // and then use fc.f to the file. Be sure to actually declare a + // variable of type FileCloser. Using it as a temporary won't work + // because it will close the file as soon as it goes out of scope. + class FileCloser + { + public: + FileCloser(FILE* f) : + f(f) + { + } + + ~FileCloser() + { + if (f) { + fclose(f); + f = nullptr; + } + } + + FILE* f; + }; + // Attempt to open the file read only and then close again QPDF_DLL bool file_can_be_opened(char const* filename); diff --git a/libqpdf/QUtil.cc b/libqpdf/QUtil.cc index 8edfadae..3e68d95e 100644 --- a/libqpdf/QUtil.cc +++ b/libqpdf/QUtil.cc @@ -305,26 +305,6 @@ static std::map unicode_to_pdf_doc = { {0x20ac, 0xa0}, }; -namespace -{ - class FileCloser - { - public: - FileCloser(FILE* f) : - f(f) - { - } - - ~FileCloser() - { - fclose(f); - } - - private: - FILE* f; - }; -} // namespace - template static std::string int_to_string_base_internal(T num, int base, int length)