MiKTeX 23.10-next
A scalable TeX distribution
Loading...
Searching...
No Matches
TeXMFApp.h
Go to the documentation of this file.
1
14#pragma once
15
16#include <miktex/TeXAndFriends/config.h>
17
18#include <memory>
19#include <string>
20
21#include <cstddef>
22
23#include <miktex/Core/BufferSizes>
24#include <miktex/Core/Debug>
25#include <miktex/Core/CommandLineBuilder>
26#include <miktex/Core/FileType>
27#include <miktex/Util/PathName>
28#include <miktex/Core/Quoter>
29
30#include <miktex/Trace/TraceStream>
31
32#include <miktex/Util/CharBuffer>
33#include <miktex/Util/StringUtil>
34#include <miktex/Util/inliners.h>
35
36#include "WebAppInputLine.h"
37
38MIKTEX_TEXMF_BEGIN_NAMESPACE;
39
40enum class Feature
41{
42 EightBitChars,
43 TCX
44};
45
47{
48public:
49 virtual char* strpool() = 0;
50 virtual char16_t* strpool16() = 0;
51 virtual C4P::C4P_signed32& strptr() = 0;
52 virtual C4P::C4P_signed32* strstart() = 0;
53 virtual C4P::C4P_signed32& poolsize() = 0;
54 virtual C4P::C4P_signed32& poolptr() = 0;
55 virtual C4P::C4P_signed32 makestring() = 0;
56};
57
59{
60public:
61 virtual C4P::C4P_integer& interrupt() = 0;
62};
63
65{
66public:
67 virtual void Allocate(const std::unordered_map<std::string, int>& userParams) = 0;
68 virtual void Free() = 0;
69 virtual void Check() = 0;
70 virtual void* ReallocateArray(const std::string& arrayName, void* ptr, std::size_t elemSize, std::size_t numElem, const MiKTeX::Core::SourceLocation& sourceLocation) = 0;
71};
72
73class MIKTEXMFTYPEAPI(TeXMFApp) :
74 public WebAppInputLine
75{
76
77public:
78
79 MIKTEXMFEXPORT MIKTEXTHISCALL TeXMFApp();
80 TeXMFApp(const TeXMFApp& other) = delete;
81 TeXMFApp& operator=(const TeXMFApp& other) = delete;
82 TeXMFApp(TeXMFApp&& other) = delete;
83 TeXMFApp& operator=(TeXMFApp&& other) = delete;
84 virtual MIKTEXMFEXPORT MIKTEXTHISCALL ~TeXMFApp() noexcept;
85
86 typedef std::unordered_map<std::string, int> UserParams;
87
88 MIKTEXMFTHISAPI(IErrorHandler*) GetErrorHandler() const;
89 MIKTEXMFTHISAPI(IStringHandler*) GetStringHandler() const;
90 MIKTEXMFTHISAPI(ITeXMFMemoryHandler*) GetTeXMFMemoryHandler() const;
91 MIKTEXMFTHISAPI(MiKTeX::Util::PathName) GetDefaultMemoryDumpFileName() const;
92 MIKTEXMFTHISAPI(MiKTeX::Util::PathName) GetTcxFileName() const;
93 MIKTEXMFTHISAPI(UserParams&) GetUserParams() const;
94 MIKTEXMFTHISAPI(bool) CStyleErrorMessagesP() const;
95 MIKTEXMFTHISAPI(bool) Enable8BitCharsP() const;
96 MIKTEXMFTHISAPI(bool) HaltOnErrorP() const;
97 MIKTEXMFTHISAPI(void) InitializeCharTables() const;
98 MIKTEXMFTHISAPI(bool) IsFeatureEnabled(Feature f) const;
99 MIKTEXMFTHISAPI(bool) IsInitProgram() const;
100 MIKTEXMFTHISAPI(bool) OpenFontFile(C4P::BufferedFile<unsigned char>* file, const std::string& fontName, MiKTeX::Core::FileType filetype, const char* generator);
101 MIKTEXMFTHISAPI(bool) OpenMemoryDumpFile(const MiKTeX::Util::PathName& fileName, FILE** file, void* buf, std::size_t size, bool renew);
102 MIKTEXMFTHISAPI(bool) ParseFirstLineP() const;
103 MIKTEXMFTHISAPI(int) GetInteraction() const;
104 MIKTEXMFTHISAPI(int) GetTeXStringLength(int stringNumber) const;
105 MIKTEXMFTHISAPI(int) GetTeXStringStart(int stringNumber) const;
106 MIKTEXMFTHISAPI(int) MakeTeXString(const char* lpsz) const;
107 MIKTEXMFTHISAPI(std::string) GetTeXString(int stringStart, int stringLength) const;
108 MIKTEXMFTHISAPI(void) AddOptions() override;
109 MIKTEXMFTHISAPI(void) EnableFeature(Feature f);
110 MIKTEXMFTHISAPI(void) Finalize() override;
111 MIKTEXMFTHISAPI(void) Init(std::vector<char*>& args) override;
112 MIKTEXMFTHISAPI(void) InitializeBuffer() const;
113 MIKTEXMFTHISAPI(void) InvokeEditor(int editFileName, int editFileNameLength, int editLineNumber, int transcriptFileName, int transcriptFileNameLength) const;
114 MIKTEXMFTHISAPI(void) ProcessCommandLineOptions() override;
115 MIKTEXMFTHISAPI(void) SetErrorHandler(IErrorHandler* errorHandler);
116 MIKTEXMFTHISAPI(void) SetStringHandler(IStringHandler* stringHandler);
117 MIKTEXMFTHISAPI(void) SetTcxFileName(const MiKTeX::Util::PathName& tcxFileName);
118 MIKTEXMFTHISAPI(void) SetTeXMFMemoryHandler(ITeXMFMemoryHandler* memoryHandler);
119 MIKTEXMFTHISAPI(void) TouchJobOutputFile(FILE* file) const override;
120 virtual MIKTEXMFTHISAPI(int) GetJobName(int fallbackJobName) const;
121 virtual MIKTEXMFTHISAPI(void) OnTeXMFFinishJob();
122 virtual MIKTEXMFTHISAPI(void) OnTeXMFStartJob();
123
124 virtual std::string GetMemoryDumpFileExtension() const
125 {
126 // must be implemented in sub-classes
127 MIKTEX_UNEXPECTED();
128 }
129
130 virtual MiKTeX::Core::FileType GetMemoryDumpFileType() const
131 {
132 // must be implemented in sub-classes
133 MIKTEX_UNEXPECTED();
134 }
135
136 void SetNameOfFile(const MiKTeX::Util::PathName& fileName) override
137 {
138 IInputOutput* inputOutput = GetInputOutput();
139 ITeXMFMemoryHandler* texmfMemoryHandler = GetTeXMFMemoryHandler();
140 inputOutput->nameoffile() = reinterpret_cast<char*>(texmfMemoryHandler->ReallocateArray("nameoffile", inputOutput->nameoffile(), sizeof(inputOutput->nameoffile()[0]), fileName.GetLength() + 1, MIKTEX_SOURCE_LOCATION()));
141 MiKTeX::Util::StringUtil::CopyString(inputOutput->nameoffile(), fileName.GetLength() + 1, fileName.GetData());
142 inputOutput->namelength() = static_cast<C4P::C4P_signed32>(fileName.GetLength());
143 }
144
145 virtual void OnTeXMFInitialize() const
146 {
147 signal(SIGINT, OnKeybordInterrupt);
148 }
149
150
151#if defined(MIKTEX_DEBUG)
152 virtual void CheckMemory()
153 {
154 GetTeXMFMemoryHandler()->Check();
155 }
156#endif
157
158 virtual void AllocateMemory()
159 {
160 GetTeXMFMemoryHandler()->Allocate(GetUserParams());
161 }
162
163 virtual void FreeMemory()
164 {
165 GetTeXMFMemoryHandler()->Free();
166 }
167
168 std::string GetTeXString(int stringNumber) const
169 {
170 return GetTeXString(GetTeXStringStart(stringNumber), GetTeXStringLength(stringNumber));
171 }
172
173 void InvokeEditor(const MiKTeX::Util::PathName& editFileName, int editLineNumber, const MiKTeX::Util::PathName& transcriptFileName) const
174 {
175 Application::InvokeEditor(editFileName, editLineNumber, GetInputFileType(), transcriptFileName);
176 }
177
178 int MakeFullNameString()
179 {
180 return MakeTeXString(GetFoundFile().GetData());
181 }
182
183 template<class T> bool OpenMemoryDumpFile(T& f, bool renew = false)
184 {
185 FILE* file;
186 if (!OpenMemoryDumpFile(GetNameOfFile(), &file, nullptr, sizeof(*f), renew))
187 {
188 return false;
189 }
190 f.Attach(file, true);
191 f.PascalFileIO(false);
192 return true;
193 }
194
195 template<typename FILE_, typename ELETYPE_> void Dump(FILE_& f, const ELETYPE_& e, std::size_t n)
196 {
197 if (fwrite(&e, sizeof(e), n, static_cast<FILE*>(f)) != n)
198 {
199 MIKTEX_FATAL_CRT_ERROR("fwrite");
200 }
201 }
202
203 template<typename FILE_, typename ELETYPE_> void Dump(FILE_& f, const ELETYPE_& e)
204 {
205 Dump(f, e, 1);
206 }
207
208 template<typename FILE_, typename ELETYPE_> void Undump(FILE_& f, ELETYPE_& e, std::size_t n)
209 {
210 f.PascalFileIO(false);
211 if (fread(&e, sizeof(e), n, static_cast<FILE*>(f)) != n)
212 {
213 MIKTEX_FATAL_CRT_ERROR("fread");
214 }
215 }
216
217 template<typename FILE_, typename ELETYPE_> void Undump(FILE_& f, ELETYPE_& e)
218 {
219 Undump(f, e, 1);
220 }
221
222 template<typename FILE_, typename ELETYPE_> void Undump(FILE_& f, ELETYPE_ low, ELETYPE_ high, ELETYPE_& e, std::size_t n)
223 {
224 Undump(f, e, n);
225 for (std::size_t idx = 0; idx < n; ++idx)
226 {
227 if ((&e)[idx] < low || (&e)[idx] > high)
228 {
229 MIKTEX_FATAL_ERROR(MIKTEXTEXT("Bad format file."));
230 }
231 }
232 }
233
234 template<typename FILE_, typename ELETYPE_> void Undump(FILE_ &f, ELETYPE_ high, ELETYPE_& e, std::size_t n)
235 {
236 Undump(f, e, n);
237 for (std::size_t idx = 0; idx < n; ++idx)
238 {
239 if ((&e)[idx] > high)
240 {
241 MIKTEX_FATAL_ERROR(MIKTEXTEXT("Bad format file."));
242 }
243 }
244 }
245
246 static MIKTEXMFCEEAPI(MiKTeX::Core::Argv) ParseFirstLine(const MiKTeX::Util::PathName& path);
247 static MIKTEXMFCEEAPI(void) OnKeybordInterrupt(int);
248
249 static TeXMFApp* GetTeXMFApp()
250 {
251 MIKTEX_ASSERT(dynamic_cast<TeXMFApp*>(Application::GetApplication()) != nullptr);
252 return (TeXMFApp*)Application::GetApplication();
253 }
254
255protected:
256
257 MIKTEXMFTHISAPI(void) Enable8BitChars(bool enable8BitChars);
258 MIKTEXMFTHISAPI(bool) ProcessOption(int opt, const std::string& optArg) override;
259
260 std::string GetUsage() const override
261 {
262 return MIKTEXTEXT("[OPTION...] [COMMAND...]");
263 }
264
265 virtual MiKTeX::Util::PathName GetMemoryDumpFileName() const
266 {
267 // must be implemented in sub-classes
268 MIKTEX_UNEXPECTED();
269 }
270
271 virtual std::string GetInitProgramName() const
272 {
273 // must be implemented in sub-classes
274 MIKTEX_UNEXPECTED();
275 }
276
277 virtual std::string GetVirginProgramName() const
278 {
279 // must be implemented in sub-classes
280 MIKTEX_UNEXPECTED();
281 }
282
283 MIKTEXMFTHISAPI(void) CheckPoolPointer(int poolptr, std::size_t len) const;
284 MIKTEXMFTHISAPI(bool) IsVirgin() const;
285
286private:
287
288 MIKTEXMFTHISAPI(void) CheckFirstLine(const MiKTeX::Util::PathName& fileName);
289
290private:
291
292 class impl;
293 std::unique_ptr<impl> pimpl;
294};
295
296inline bool miktexcstyleerrormessagesp()
297{
298 return TeXMFApp::GetTeXMFApp()->CStyleErrorMessagesP();
299}
300
301inline bool miktexparsefirstlinep()
302{
303 return TeXMFApp::GetTeXMFApp()->ParseFirstLineP();
304}
305
306inline void miktexgetdefaultdumpfilename(char* dest)
307{
308 MiKTeX::Util::StringUtil::CopyString(dest, MiKTeX::Core::BufferSizes::MaxPath, TeXMFApp::GetTeXMFApp()->GetDefaultMemoryDumpFileName().GetData());
309}
310
311inline int miktexgetinteraction()
312{
313 return TeXMFApp::GetTeXMFApp()->GetInteraction();
314}
315
316inline int miktexgetjobname(int fallbackJobName)
317{
318 return TeXMFApp::GetTeXMFApp()->GetJobName(fallbackJobName);
319}
320
321inline bool miktexhaltonerrorp()
322{
323 return TeXMFApp::GetTeXMFApp()->HaltOnErrorP();
324}
325
326inline void miktexinitializebuffer()
327{
328 TeXMFApp::GetTeXMFApp()->InitializeBuffer();
329}
330
331inline void miktexinvokeeditor(int editFileName, int editFileNameLength, int editLineNumber, int transcriptFileName, int transcriptFileNameLength)
332{
333 TeXMFApp::GetTeXMFApp()->InvokeEditor(editFileName, editFileNameLength, editLineNumber, transcriptFileName, transcriptFileNameLength);
334}
335
336inline void miktexinvokeeditor(int editFileName, int editFileNameLength, int editLineNumber)
337{
338 TeXMFApp::GetTeXMFApp()->InvokeEditor(editFileName, editFileNameLength, editLineNumber, 0, 0);
339}
340
341inline bool miktexisinitprogram()
342{
343 return TeXMFApp::GetTeXMFApp()->IsInitProgram();
344}
345
346inline int miktexmakefullnamestring()
347{
348 return TeXMFApp::GetTeXMFApp()->MakeFullNameString();
349}
350
351inline void miktexontexmffinishjob()
352{
353 TeXMFApp::GetTeXMFApp()->OnTeXMFFinishJob();
354}
355
356inline void miktexontexmfinitialize()
357{
358 TeXMFApp::GetTeXMFApp()->OnTeXMFInitialize();
359}
360
361inline void miktexontexmfstartjob()
362{
363 TeXMFApp::GetTeXMFApp()->OnTeXMFStartJob();
364}
365
366#define miktexreallocate(p, n) miktexreallocate_(#p, p, n, MIKTEX_SOURCE_LOCATION_DEBUG())
367
368template<typename T> T* miktexreallocate_(const std::string& arrayName, T* p, size_t n, const MiKTeX::Core::SourceLocation& sourceLocation)
369{
370 return (T*)TeXMFApp::GetTeXMFApp()->GetTeXMFMemoryHandler()->ReallocateArray(arrayName, p, sizeof(*p), n, sourceLocation);
371}
372
373template<typename FileType, typename EleType> inline void miktexdump(FileType& f, const EleType& e, std::size_t n)
374{
375 TeXMFApp::GetTeXMFApp()->Dump(f, e, n);
376}
377
378template<typename FileType, typename EleType> inline void miktexdump(FileType& f, const EleType& e)
379{
380 TeXMFApp::GetTeXMFApp()->Dump(f, e);
381}
382
383template<typename FileType> inline void miktexdumpint(FileType& f, int val)
384{
385 miktexdump(f, val);
386}
387
388template<typename FileType, typename EleType> inline void miktexundump(FileType& f, EleType& e, std::size_t n)
389{
390 TeXMFApp::GetTeXMFApp()->Undump(f, e, n);
391}
392
393template<typename FileType, typename EleType> inline void miktexundump(FileType& f, EleType& e)
394{
395 TeXMFApp::GetTeXMFApp()->Undump(f, e);
396}
397
398template<typename FileType, typename LowType, typename HighType, typename EleType> inline void miktexundump(FileType& f, LowType low, HighType high, EleType& e, std::size_t n)
399{
400 TeXMFApp::GetTeXMFApp()->Undump(f, static_cast<EleType>(low), static_cast<EleType>(high), e, n);
401}
402
403template<typename FileType, typename HighType, typename EleType> inline void miktexundump(FileType& f, HighType high, EleType& e, std::size_t n)
404{
405 TeXMFApp::GetTeXMFApp()->Undump(f, static_cast<EleType>(high), e, n);
406}
407
408template<typename FileType> inline void miktexundumpint(FileType& f, int& val)
409{
410 miktexundump(f, val);
411}
412
413inline void miktexcheckmemoryifdebug()
414{
415#if defined(MIKTEX_DEBUG)
416 TeXMFApp::GetTeXMFApp()->CheckMemory();
417#endif
418}
419
420inline void miktexinitializechartables()
421{
422 TeXMFApp::GetTeXMFApp()->InitializeCharTables();
423}
424
425inline bool miktexenableeightbitcharsp()
426{
427 return TeXMFApp::GetTeXMFApp()->Enable8BitCharsP();
428}
429
430inline bool miktexhavetcxfilename()
431{
432 return !TeXMFApp::GetTeXMFApp()->GetTcxFileName().Empty();
433}
434
435inline void miktexprinttcxfilename(FILE* f)
436{
437 fprintf(f, " (%s)", TeXMFApp::GetTeXMFApp()->GetTcxFileName().GetData());
438}
439
440
441MIKTEX_TEXMF_END_NAMESPACE;
MiKTeX WebApp input line base implementation.
void InvokeEditor(const MiKTeX::Util::PathName &editFileName, int editLineNumber, MiKTeX::Core::FileType editFileType, const MiKTeX::Util::PathName &transcriptFileName) const
An argv wrapper class.
Definition: CommandLineBuilder.h:44
Definition: TeXMFApp.h:59
Definition: TeXMFApp.h:47
Definition: TeXMFApp.h:75
void Init(std::vector< char * > &args) override
void Finalize() override
Frees application resources.
Definition: WebAppInputLine.h:69
Instances of this class can be used to store path names.
Definition: PathName.h:73
FileType
File type enum class.
Definition: FileType.h:33
Definition: C4P.h:132
static const std::size_t MaxPath
Initial capacity of a path name (including the terminating null-byte).
Definition: BufferSizes.h:38
Definition: Exceptions.h:38