aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/qpdfjob-c.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2022-06-19 14:20:43 +0200
committerJay Berkenbilt <ejb@ql.org>2022-06-19 14:46:58 +0200
commitdaef4e8fb856e84e2a9151cd7715a941a0ae9c6c (patch)
tree87882b3455a61c867300e5a157c078f2f7addc21 /libqpdf/qpdfjob-c.cc
parent28cc3692e37b9f231d58c0c24e5e90674988ef64 (diff)
downloadqpdf-daef4e8fb856e84e2a9151cd7715a941a0ae9c6c.tar.zst
Add more flexible funtions to qpdfjob C API
Diffstat (limited to 'libqpdf/qpdfjob-c.cc')
-rw-r--r--libqpdf/qpdfjob-c.cc112
1 files changed, 88 insertions, 24 deletions
diff --git a/libqpdf/qpdfjob-c.cc b/libqpdf/qpdfjob-c.cc
index 4e6666be..81433661 100644
--- a/libqpdf/qpdfjob-c.cc
+++ b/libqpdf/qpdfjob-c.cc
@@ -8,51 +8,115 @@
#include <cstdio>
#include <cstring>
-int
-qpdfjob_run_from_argv(char const* const argv[])
+struct _qpdfjob_handle
{
- auto whoami_p = QUtil::make_unique_cstr(argv[0]);
- auto whoami = QUtil::getWhoami(whoami_p.get());
- QUtil::setLineBuf(stdout);
+ _qpdfjob_handle() = default;
+ ~_qpdfjob_handle() = default;
QPDFJob j;
+};
+
+qpdfjob_handle
+qpdfjob_init()
+{
+ return new _qpdfjob_handle;
+}
+
+void
+qpdfjob_cleanup(qpdfjob_handle* j)
+{
+ delete *j;
+ *j = nullptr;
+}
+
+static int
+wrap_qpdfjob(qpdfjob_handle j, std::function<int(qpdfjob_handle j)> fn)
+{
try {
- j.initializeFromArgv(argv);
- j.run();
+ return fn(j);
} catch (std::exception& e) {
- *QPDFLogger::defaultLogger()->getError()
- << whoami << ": " << e.what() << "\n";
- return QPDFJob::EXIT_ERROR;
+ *j->j.getLogger()->getError()
+ << j->j.getMessagePrefix() << ": " << e.what() << "\n";
}
- return j.getExitCode();
+ return QPDFJob::EXIT_ERROR;
+}
+
+int
+qpdfjob_initialize_from_argv(qpdfjob_handle j, char const* const argv[])
+{
+ return wrap_qpdfjob(j, [argv](qpdfjob_handle jh) {
+ jh->j.initializeFromArgv(argv);
+ return 0;
+ });
}
#ifndef QPDF_NO_WCHAR_T
int
-qpdfjob_run_from_wide_argv(wchar_t const* const argv[])
+qpdfjob_initialize_from_wide_argv(qpdfjob_handle j, wchar_t const* const argv[])
{
int argc = 0;
for (auto k = argv; *k; ++k) {
++argc;
}
return QUtil::call_main_from_wmain(
- argc, argv, [](int, char const* const new_argv[]) {
- return qpdfjob_run_from_argv(new_argv);
+ argc, argv, [j](int, char const* const new_argv[]) {
+ return qpdfjob_initialize_from_argv(j, new_argv);
});
}
#endif // QPDF_NO_WCHAR_T
int
-qpdfjob_run_from_json(char const* json)
+qpdfjob_initialize_from_json(qpdfjob_handle j, char const* json)
{
- QPDFJob j;
- try {
- j.initializeFromJson(json);
- j.run();
- } catch (std::exception& e) {
- *QPDFLogger::defaultLogger()->getError()
- << "qpdfjob json: " << e.what() << "\n";
- return QPDFJob::EXIT_ERROR;
+ return wrap_qpdfjob(j, [json](qpdfjob_handle jh) {
+ jh->j.setMessagePrefix("qpdfjob json");
+ jh->j.initializeFromJson(json);
+ return 0;
+ });
+}
+
+int
+qpdfjob_run(qpdfjob_handle j)
+{
+ QUtil::setLineBuf(stdout);
+ return wrap_qpdfjob(j, [](qpdfjob_handle jh) {
+ jh->j.run();
+ return jh->j.getExitCode();
+ });
+}
+
+static int run_with_handle(std::function<int(qpdfjob_handle)> fn)
+{
+ auto j = qpdfjob_init();
+ int status = fn(j);
+ if (status == 0) {
+ status = qpdfjob_run(j);
}
- return j.getExitCode();
+ qpdfjob_cleanup(&j);
+ return status;
}
+
+int qpdfjob_run_from_argv(char const* const argv[])
+{
+ return run_with_handle([argv](qpdfjob_handle j) {
+ return qpdfjob_initialize_from_argv(j, argv);
+ });
+}
+
+#ifndef QPDF_NO_WCHAR_T
+int
+qpdfjob_run_from_wide_argv(wchar_t const* const argv[])
+{
+ return run_with_handle([argv](qpdfjob_handle j) {
+ return qpdfjob_initialize_from_wide_argv(j, argv);
+ });
+}
+#endif /* QPDF_NO_WCHAR_T */
+
+int qpdfjob_run_from_json(char const* json)
+{
+ return run_with_handle([json](qpdfjob_handle j) {
+ return qpdfjob_initialize_from_json(j, json);
+ });
+}
+