MiKTeX 23.10-next
A scalable TeX distribution
Loading...
Searching...
No Matches
TeXApp.h
Go to the documentation of this file.
1
14#pragma once
15
16#include <miktex/TeXAndFriends/config.h>
17
18#include <cstddef>
19
20#include <memory>
21#include <string>
22
23#include <miktex/Core/BufferSizes>
24#include <miktex/Core/FileType>
25#include <miktex/Util/PathName>
26
27#include <miktex/Util/CharBuffer>
28#include <miktex/Util/inliners.h>
29
30#include "TeXMFApp.h"
31
32MIKTEX_TEXMF_BEGIN_NAMESPACE;
33
35{
36public:
37 virtual C4P::C4P_signed32& formatident() = 0;
38};
39
40enum class SourceSpecial
41{
42 Auto,
43 CarriageReturn,
44 Display,
45 HorizontalBox,
46 Math,
47 Paragraph,
48 ParagraphEnd,
49 VerticalBox,
50};
51
52class MIKTEXMFTYPEAPI(TeXApp) :
53 public TeXMFApp
54{
55
56public:
57
58 MIKTEXMFEXPORT MIKTEXTHISCALL TeXApp();
59 TeXApp(const TeXApp& other) = delete;
60 TeXApp& operator=(const TeXApp& other) = delete;
61 TeXApp(TeXApp&& other) = delete;
62 TeXApp& operator=(TeXApp&& other) = delete;
63 virtual MIKTEXMFEXPORT MIKTEXTHISCALL ~TeXApp() noexcept;
64
65 enum class Write18Result
66 {
67 QuotationError = -1,
68 Disallowed = 0,
69 Executed = 1,
70 ExecutedAllowed = 2
71 };
72
73 MIKTEXMFTHISAPI(IFormatHandler*) GetFormatHandler() const;
74 MIKTEXMFTHISAPI(MiKTeX::Core::ShellCommandMode) GetWrite18Mode() const;
75 MIKTEXMFTHISAPI(Write18Result) Write18(const std::string& command, int& exitCode) const;
76 MIKTEXMFTHISAPI(bool) EncTeXP() const;
77 MIKTEXMFTHISAPI(bool) IsNewSource(int sourceFileName, int line) const;
78 MIKTEXMFTHISAPI(bool) IsSourceSpecialOn(SourceSpecial s) const;
79 MIKTEXMFTHISAPI(bool) MLTeXP() const;
80 MIKTEXMFTHISAPI(bool) SourceSpecialsP() const;
81 MIKTEXMFTHISAPI(bool) Write18P() const;
82 MIKTEXMFTHISAPI(int) GetSynchronizationOptions() const;
83 MIKTEXMFTHISAPI(int) MakeSrcSpecial(int sourceFileName, int line) const;
84 MIKTEXMFTHISAPI(void) Finalize() override;
85 MIKTEXMFTHISAPI(void) OnTeXMFStartJob() override;
86 MIKTEXMFTHISAPI(void) RememberSourceInfo(int sourceFileName, int line) const;
87 MIKTEXMFTHISAPI(void) SetFormatHandler(IFormatHandler* formatHandler);
88
89 MiKTeX::Core::FileType GetInputFileType() const override
90 {
92 }
93
94 int GetFormatIdent() const override
95 {
96 return GetFormatHandler()->formatident();
97 }
98
99 std::string GetMemoryDumpFileExtension() const override
100 {
101 return ".fmt";
102 }
103
104 MiKTeX::Core::FileType GetMemoryDumpFileType() const override
105 {
107 }
108
109 static TeXApp* GetTeXApp()
110 {
111 MIKTEX_ASSERT(dynamic_cast<TeXApp*>(Application::GetApplication()) != nullptr);
112 return (TeXApp*)Application::GetApplication();
113 }
114
115protected:
116
117 MIKTEXMFTHISAPI(bool) ProcessOption(int c, const std::string& optArg) override;
118 MIKTEXMFTHISAPI(void) AddOptions() override;
119 MIKTEXMFTHISAPI(void) Init(std::vector<char*>& args) override;
120
121private:
122
123 class impl;
124 std::unique_ptr<impl> pimpl;
125};
126
127inline void miktexallocatememory()
128{
129 TeXApp::GetTeXApp()->AllocateMemory();
130}
131
132template<class FileType> void miktexclosedvifile(FileType& f)
133{
134 TeXApp::GetTeXApp()->CloseFile(f);
135}
136
137template<class FileType> void miktexclosepdffile(FileType& f)
138{
139 TeXApp::GetTeXApp()->CloseFile(f);
140}
141
142inline void miktexfreememory()
143{
144 TeXApp::GetTeXApp()->FreeMemory();
145}
146
147inline bool miktexinsertsrcspecialauto()
148{
149 return TeXApp::GetTeXApp()->IsSourceSpecialOn(SourceSpecial::Auto);
150}
151
152inline bool miktexinsertsrcspecialeverycr()
153{
154 return TeXApp::GetTeXApp()->IsSourceSpecialOn(SourceSpecial::CarriageReturn);
155}
156
157inline bool miktexinsertsrcspecialeverydisplay()
158{
159 return TeXApp::GetTeXApp()->IsSourceSpecialOn(SourceSpecial::Display);
160}
161
162inline bool miktexinsertsrcspecialeveryhbox()
163{
164 return TeXApp::GetTeXApp()->IsSourceSpecialOn(SourceSpecial::HorizontalBox);
165}
166
167inline bool miktexinsertsrcspecialeverymath()
168{
169 return TeXApp::GetTeXApp()->IsSourceSpecialOn(SourceSpecial::Math);
170}
171
172inline bool miktexinsertsrcspecialeverypar()
173{
174 return TeXApp::GetTeXApp()->IsSourceSpecialOn(SourceSpecial::Paragraph);
175}
176
177inline bool miktexinsertsrcspecialeveryparend()
178{
179 return TeXApp::GetTeXApp()->IsSourceSpecialOn(SourceSpecial::ParagraphEnd);
180}
181
182inline bool miktexinsertsrcspecialeveryvbox()
183{
184 return TeXApp::GetTeXApp()->IsSourceSpecialOn(SourceSpecial::VerticalBox);
185}
186
187inline bool miktexisnewsource(int fileName, int lineNo)
188{
189 return TeXApp::GetTeXApp()->IsNewSource(fileName, lineNo);
190}
191
192inline int miktexmakesrcspecial(int fileName, int lineNo)
193{
194 return TeXApp::GetTeXApp()->MakeSrcSpecial(fileName, lineNo);
195}
196
197template<class FileType> inline bool miktexopendvifile(FileType& f)
198{
200 bool done = TeXApp::GetTeXApp()->OpenOutputFile(*reinterpret_cast<C4P::FileRoot*>(&f), TeXApp::GetTeXApp()->GetNameOfFile(), false, outPath);
201 if (done)
202 {
203 TeXApp::GetTeXApp()->SetNameOfFile(outPath);
204 }
205 return done;
206}
207
208template<class FileType> inline bool miktexopenpdffile(FileType& f)
209{
211 bool done = TeXApp::GetTeXApp()->OpenOutputFile(*reinterpret_cast<C4P::FileRoot*>(&f), TeXApp::GetTeXApp()->GetNameOfFile(), false, outPath);
212 if (done)
213 {
214 TeXApp::GetTeXApp()->SetNameOfFile(outPath);
215 }
216 return done;
217}
218
219template<class FileType> inline bool miktexopenformatfile(FileType& f, bool renew = false)
220{
221 return TeXApp::GetTeXApp()->OpenMemoryDumpFile(f, renew);
222}
223
224inline void miktexremembersourceinfo(int fileName, int lineNo)
225{
226 TeXApp::GetTeXApp()->RememberSourceInfo(fileName, lineNo);
227}
228
229inline bool miktexwrite18p()
230{
231 return TeXApp::GetTeXApp()->Write18P();
232}
233
234inline bool miktexenctexp()
235{
236 return TeXApp::GetTeXApp()->EncTeXP();
237}
238
239inline bool miktexmltexp()
240{
241 return TeXApp::GetTeXApp()->MLTeXP();
242}
243
244inline int miktexgetsynchronizationoptions()
245{
246 return TeXApp::GetTeXApp()->GetSynchronizationOptions();
247}
248
249inline bool miktexsourcespecialsp()
250{
251 return TeXApp::GetTeXApp()->SourceSpecialsP();
252}
253
254inline bool miktexiscompatible()
255{
256 return !TeXApp::GetTeXApp()->SourceSpecialsP() && !TeXApp::GetTeXApp()->CStyleErrorMessagesP() && !TeXApp::GetTeXApp()->ParseFirstLineP();
257}
258
259// web2c shim
260inline bool restrictedshell()
261{
262 return TeXApp::GetTeXApp()->GetWrite18Mode() == MiKTeX::Core::ShellCommandMode::Restricted || TeXApp::GetTeXApp()->GetWrite18Mode() == MiKTeX::Core::ShellCommandMode::Query;
263}
264
265// web2c shim
266inline bool shellenabledp()
267{
268 return miktexwrite18p();
269}
270
271// web2c shim
272inline bool srcspecialsp()
273{
274 return TeXApp::GetTeXApp()->SourceSpecialsP();
275}
276
277MIKTEX_TEXMF_END_NAMESPACE;
MiKTeX TeXMF base implementation.
Definition: TeXApp.h:54
void Finalize() override
Frees application resources.
void Init(std::vector< char * > &args) override
Definition: TeXMFApp.h:75
Instances of this class can be used to store path names.
Definition: PathName.h:73
ShellCommandMode
Shell command mode.
Definition: Session.h:357
@ Restricted
Only some shell commands are allowed.
FileType
File type enum class.
Definition: FileType.h:33
@ FMT
TeX format files (*.fmt).
@ TEX
TeX input files (*.tex).
Definition: C4P.h:73