From daef4e8fb856e84e2a9151cd7715a941a0ae9c6c Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sun, 19 Jun 2022 08:20:43 -0400 Subject: Add more flexible funtions to qpdfjob C API --- libqpdf/qpdfjob-c.cc | 112 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 88 insertions(+), 24 deletions(-) (limited to 'libqpdf/qpdfjob-c.cc') 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 #include -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 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 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); + }); +} + -- cgit v1.2.3-54-g00ecf