16#include <miktex/TeXAndFriends/config.h>
18#include "Prototypes.h"
25#include <miktex/C4P/C4P>
27#include <miktex/Core/Exceptions>
28#include <miktex/Core/FileType>
29#include <miktex/Util/OptionSet>
30#include <miktex/Util/PathName>
31#include <miktex/Core/Utils>
33#include <miktex/Util/StringUtil>
35#include <miktex/Wrappers/PoptWrapper>
42 class Exception9932 {};
43 class Exception9998 {};
44 class Exception9999 {};
48MIKTEX_TEXMF_BEGIN_NAMESPACE;
50constexpr const char* TeXEngine =
"TeXEngine";
51constexpr const char* METAFONTEngine =
"METAFONTEngine";
52constexpr const char* TeXjpEngine =
"TeXjpEngine";
57 virtual C4P::C4P_signed8& history() = 0;
60template<
class FileType>
inline bool miktexopentfmfile(FileType& f,
const char* fileName)
65template<
class FileType>
inline bool miktexopenvffile(FileType& f,
const char* fileName)
70template<
class FileType>
inline int miktexopenxfmfile(FileType& f,
const char* fileName)
75template<
class FileType>
inline bool miktexopenxvffile(FileType& f,
const char* fileName)
80template<
class FileType>
inline void miktexprintmiktexbanner(FileType& f)
85class MIKTEXMFTYPEAPI(WebApp) :
91 MIKTEXMFEXPORT MIKTEXTHISCALL
WebApp();
96 virtual MIKTEXMFEXPORT MIKTEXTHISCALL
~WebApp()
noexcept;
98 MIKTEXMFTHISAPI(C4P::ProgramBase*) GetProgram()
const;
100 MIKTEXMFTHISAPI(
bool) AmI(
const std::string& name)
const;
101 MIKTEXMFTHISAPI(
bool) GetVerboseFlag()
const;
102 MIKTEXMFTHISAPI(
void) IAm(
const std::string& name);
103 MIKTEXMFTHISAPI(std::string) GetProgramName()
const;
105 MIKTEXMFTHISAPI(
void)
Init(std::vector<char*>&args)
override;
106 MIKTEXMFTHISAPI(
void) SetInitFinalize(
IInitFinalize* initFinalize);
107 MIKTEXMFTHISAPI(
void) SetProgram(C4P::ProgramBase* program,
const std::string& programName,
const std::string& version,
const std::string& copyright,
const std::string& trademarks);
108 virtual MIKTEXMFTHISAPI(std::string) TheNameOfTheGame()
const;
109 virtual MIKTEXMFTHISAPI(
void) ProcessCommandLineOptions();
111 virtual unsigned long GetHelpId()
const
122 static WebApp* GetWebApp()
124 MIKTEX_ASSERT(
dynamic_cast<WebApp*
>(Application::GetApplication()) !=
nullptr);
132 OPT_UNSUPPORTED = INT_MAX - 100,
136 MIKTEXMFTHISAPI(std::string) Translate(
const char* msgId);
137 MIKTEXMFTHISAPI(std::vector<poptOption>) GetOptions()
const;
138 MIKTEXMFTHISAPI(
void) AddOption(
const std::string& aliasName,
const std::string& name);
139 MIKTEXMFTHISAPI(
void) AddOption(
const std::string& name,
const std::string& help,
int opt,
int argInfo = POPT_ARG_NONE,
const std::string& argDescription =
"",
void* arg =
nullptr,
char shortName = 0);
140 MIKTEXMFTHISAPI(
void) AddOptionShortcut(
const std::string& longName,
const std::vector<std::string>& args);
141 MIKTEXMFTHISAPI(
void) BadUsage();
142 MIKTEXMFTHISAPI(
void) ShowHelp(
bool usageOnly =
false)
const;
143 MIKTEXMFTHISAPI(
void) ShowProgramVersion()
const;
144 virtual MIKTEXMFTHISAPI(
bool) ProcessOption(
int opt,
const std::string& optArg);
145 virtual MIKTEXMFTHISAPI(
void) AddOptions();
147 void AddOption(
const std::string& name,
int opt,
int argInfo = POPT_ARG_NONE,
const std::string& argDescription =
"",
void* arg =
nullptr,
char shortName = 0)
149 AddOption(name,
"", opt, argInfo, argDescription, arg, shortName);
152 virtual std::string GetUsage()
const
161 std::unique_ptr<impl> pimpl;
164inline bool miktexgetverboseflag()
166 return WebApp::GetWebApp()->GetVerboseFlag();
169inline bool miktexgetquietflag()
171 return WebApp::GetWebApp()->GetQuietFlag();
174inline void miktexprocesscommandlineoptions()
176 WebApp::GetWebApp()->ProcessCommandLineOptions();
184 int Run(PROGRAM_CLASS& prog, WEBAPP_CLASS& app,
const std::string& progName,
int argc,
char* argv[])
186 std::string componentVersion;
187#if defined(MIKTEX_COMPONENT_VERSION_STR)
188 componentVersion = MIKTEX_COMPONENT_VERSION_STR;
190 std::string componentCopyright;
191#if defined(MIKTEX_COMP_COPYRIGHT_STR)
192 componentCopyright = MIKTEX_COMP_COPYRIGHT_STR;
194 std::string componentTrademark;
195#if defined(MIKTEX_COMP_TM_STR)
196 componentTrademark = MIKTEX_COMP_TM_STR;
198 app.SetProgram(&prog, progName, componentVersion, componentCopyright, componentTrademark);
199 prog.SetParent(&app);
202 MIKTEX_ASSERT(argv !=
nullptr && argv[argc] ==
nullptr);
203 std::vector<char*> newargv(argv, argv + argc + 1);
205 MIKTEX_ASSERT(!newargv.empty() && newargv.back() ==
nullptr);
206 int exitCode = prog.Run(newargv.size() - 1, &newargv[0]);
207 app.Finalize2(exitCode);
210 catch (
const MiKTeX::Core::MiKTeXException& ex)
212 app.Sorry(argv[0], ex);
217 catch (
const std::exception& ex)
219 app.Sorry(argv[0], ex);
225 app.Finalize2(exitCode);
232#define MIKTEX_DEFINE_WEBAPP(functionname, webappclass, webappinstance, programclass, programinstance) \
233programclass programinstance; \
234webappclass webappinstance; \
235extern "C" int MIKTEXCEECALL functionname(int argc, char* argv[]) \
237 MiKTeX::TeXAndFriends::ProgramRunner<programclass, webappclass> p; \
238 std::string programName = #webappclass; \
239 return p.Run(programinstance, webappinstance, programName, argc, argv); \
242MIKTEX_TEXMF_END_NAMESPACE;
An instance of this class controls the run-time behaviour of a MiKTeX application.
Definition: Application.h:37
static Application * GetApplication()
static std::string GetMiKTeXBannerString()
void Init(std::vector< char * > &args) override
void Finalize() override
Frees application resources.
Instances of this class can be used to store path names.
Definition: PathName.h:73
The "C/C++ for Pascal" namespace.
FileType
File type enum class.
Definition: FileType.h:33