aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--include/qpdf/QUtil.hh27
-rw-r--r--libqpdf/QUtil.cc20
3 files changed, 32 insertions, 20 deletions
diff --git a/ChangeLog b/ChangeLog
index 95ed40c7..4a8122fc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2022-05-18 Jay Berkenbilt <ejb@ql.org>
+
+ * Add QUtil::FileCloser to the public API. This is a simple inline
+ class to help with automatic file closing.
+
2022-05-17 Jay Berkenbilt <ejb@ql.org>
* 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<unsigned long, unsigned char> unicode_to_pdf_doc = {
{0x20ac, 0xa0},
};
-namespace
-{
- class FileCloser
- {
- public:
- FileCloser(FILE* f) :
- f(f)
- {
- }
-
- ~FileCloser()
- {
- fclose(f);
- }
-
- private:
- FILE* f;
- };
-} // namespace
-
template <typename T>
static std::string
int_to_string_base_internal(T num, int base, int length)