16#include <miktex/TeXAndFriends/config.h>
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>
30#include <miktex/Trace/TraceStream>
32#include <miktex/Util/CharBuffer>
33#include <miktex/Util/StringUtil>
34#include <miktex/Util/inliners.h>
38MIKTEX_TEXMF_BEGIN_NAMESPACE;
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;
61 virtual C4P::C4P_integer& interrupt() = 0;
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;
73class MIKTEXMFTYPEAPI(TeXMFApp) :
79 MIKTEXMFEXPORT MIKTEXTHISCALL
TeXMFApp();
84 virtual MIKTEXMFEXPORT MIKTEXTHISCALL
~TeXMFApp()
noexcept;
86 typedef std::unordered_map<std::string, int> UserParams;
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;
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);
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);
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();
124 virtual std::string GetMemoryDumpFileExtension()
const
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());
145 virtual void OnTeXMFInitialize()
const
147 signal(SIGINT, OnKeybordInterrupt);
151#if defined(MIKTEX_DEBUG)
152 virtual void CheckMemory()
154 GetTeXMFMemoryHandler()->Check();
158 virtual void AllocateMemory()
160 GetTeXMFMemoryHandler()->Allocate(GetUserParams());
163 virtual void FreeMemory()
165 GetTeXMFMemoryHandler()->Free();
168 std::string GetTeXString(
int stringNumber)
const
170 return GetTeXString(GetTeXStringStart(stringNumber), GetTeXStringLength(stringNumber));
175 Application::InvokeEditor(editFileName, editLineNumber, GetInputFileType(), transcriptFileName);
178 int MakeFullNameString()
180 return MakeTeXString(GetFoundFile().GetData());
183 template<
class T>
bool OpenMemoryDumpFile(T& f,
bool renew =
false)
186 if (!OpenMemoryDumpFile(GetNameOfFile(), &file,
nullptr,
sizeof(*f), renew))
190 f.Attach(file,
true);
191 f.PascalFileIO(
false);
195 template<
typename FILE_,
typename ELETYPE_>
void Dump(FILE_& f,
const ELETYPE_& e, std::size_t n)
197 if (fwrite(&e,
sizeof(e), n,
static_cast<FILE*
>(f)) != n)
199 MIKTEX_FATAL_CRT_ERROR(
"fwrite");
203 template<
typename FILE_,
typename ELETYPE_>
void Dump(FILE_& f,
const ELETYPE_& e)
208 template<
typename FILE_,
typename ELETYPE_>
void Undump(FILE_& f, ELETYPE_& e, std::size_t n)
210 f.PascalFileIO(
false);
211 if (fread(&e,
sizeof(e), n,
static_cast<FILE*
>(f)) != n)
213 MIKTEX_FATAL_CRT_ERROR(
"fread");
217 template<
typename FILE_,
typename ELETYPE_>
void Undump(FILE_& f, ELETYPE_& e)
222 template<
typename FILE_,
typename ELETYPE_>
void Undump(FILE_& f, ELETYPE_ low, ELETYPE_ high, ELETYPE_& e, std::size_t n)
225 for (std::size_t idx = 0; idx < n; ++idx)
227 if ((&e)[idx] < low || (&e)[idx] > high)
229 MIKTEX_FATAL_ERROR(MIKTEXTEXT(
"Bad format file."));
234 template<
typename FILE_,
typename ELETYPE_>
void Undump(FILE_ &f, ELETYPE_ high, ELETYPE_& e, std::size_t n)
237 for (std::size_t idx = 0; idx < n; ++idx)
239 if ((&e)[idx] > high)
241 MIKTEX_FATAL_ERROR(MIKTEXTEXT(
"Bad format file."));
247 static MIKTEXMFCEEAPI(
void) OnKeybordInterrupt(
int);
249 static TeXMFApp* GetTeXMFApp()
251 MIKTEX_ASSERT(
dynamic_cast<TeXMFApp*
>(Application::GetApplication()) !=
nullptr);
252 return (TeXMFApp*)Application::GetApplication();
257 MIKTEXMFTHISAPI(
void) Enable8BitChars(
bool enable8BitChars);
258 MIKTEXMFTHISAPI(
bool) ProcessOption(
int opt,
const std::string& optArg)
override;
260 std::string GetUsage()
const override
262 return MIKTEXTEXT(
"[OPTION...] [COMMAND...]");
271 virtual std::string GetInitProgramName()
const
277 virtual std::string GetVirginProgramName()
const
283 MIKTEXMFTHISAPI(
void) CheckPoolPointer(
int poolptr, std::size_t len)
const;
284 MIKTEXMFTHISAPI(
bool) IsVirgin()
const;
293 std::unique_ptr<impl> pimpl;
296inline bool miktexcstyleerrormessagesp()
298 return TeXMFApp::GetTeXMFApp()->CStyleErrorMessagesP();
301inline bool miktexparsefirstlinep()
303 return TeXMFApp::GetTeXMFApp()->ParseFirstLineP();
306inline void miktexgetdefaultdumpfilename(
char* dest)
311inline int miktexgetinteraction()
313 return TeXMFApp::GetTeXMFApp()->GetInteraction();
316inline int miktexgetjobname(
int fallbackJobName)
318 return TeXMFApp::GetTeXMFApp()->GetJobName(fallbackJobName);
321inline bool miktexhaltonerrorp()
323 return TeXMFApp::GetTeXMFApp()->HaltOnErrorP();
326inline void miktexinitializebuffer()
328 TeXMFApp::GetTeXMFApp()->InitializeBuffer();
331inline void miktexinvokeeditor(
int editFileName,
int editFileNameLength,
int editLineNumber,
int transcriptFileName,
int transcriptFileNameLength)
333 TeXMFApp::GetTeXMFApp()->InvokeEditor(editFileName, editFileNameLength, editLineNumber, transcriptFileName, transcriptFileNameLength);
336inline void miktexinvokeeditor(
int editFileName,
int editFileNameLength,
int editLineNumber)
338 TeXMFApp::GetTeXMFApp()->InvokeEditor(editFileName, editFileNameLength, editLineNumber, 0, 0);
341inline bool miktexisinitprogram()
343 return TeXMFApp::GetTeXMFApp()->IsInitProgram();
346inline int miktexmakefullnamestring()
348 return TeXMFApp::GetTeXMFApp()->MakeFullNameString();
351inline void miktexontexmffinishjob()
353 TeXMFApp::GetTeXMFApp()->OnTeXMFFinishJob();
356inline void miktexontexmfinitialize()
358 TeXMFApp::GetTeXMFApp()->OnTeXMFInitialize();
361inline void miktexontexmfstartjob()
363 TeXMFApp::GetTeXMFApp()->OnTeXMFStartJob();
366#define miktexreallocate(p, n) miktexreallocate_(#p, p, n, MIKTEX_SOURCE_LOCATION_DEBUG())
368template<
typename T> T* miktexreallocate_(
const std::string& arrayName, T* p,
size_t n,
const MiKTeX::Core::SourceLocation& sourceLocation)
370 return (T*)TeXMFApp::GetTeXMFApp()->GetTeXMFMemoryHandler()->ReallocateArray(arrayName, p,
sizeof(*p), n, sourceLocation);
373template<
typename FileType,
typename EleType>
inline void miktexdump(FileType& f,
const EleType& e, std::size_t n)
375 TeXMFApp::GetTeXMFApp()->Dump(f, e, n);
378template<
typename FileType,
typename EleType>
inline void miktexdump(FileType& f,
const EleType& e)
380 TeXMFApp::GetTeXMFApp()->Dump(f, e);
383template<
typename FileType>
inline void miktexdumpint(FileType& f,
int val)
388template<
typename FileType,
typename EleType>
inline void miktexundump(FileType& f, EleType& e, std::size_t n)
390 TeXMFApp::GetTeXMFApp()->Undump(f, e, n);
393template<
typename FileType,
typename EleType>
inline void miktexundump(FileType& f, EleType& e)
395 TeXMFApp::GetTeXMFApp()->Undump(f, e);
398template<
typename FileType,
typename LowType,
typename HighType,
typename EleType>
inline void miktexundump(FileType& f, LowType low, HighType high, EleType& e, std::size_t n)
400 TeXMFApp::GetTeXMFApp()->Undump(f,
static_cast<EleType
>(low),
static_cast<EleType
>(high), e, n);
403template<
typename FileType,
typename HighType,
typename EleType>
inline void miktexundump(FileType& f, HighType high, EleType& e, std::size_t n)
405 TeXMFApp::GetTeXMFApp()->Undump(f,
static_cast<EleType
>(high), e, n);
408template<
typename FileType>
inline void miktexundumpint(FileType& f,
int& val)
410 miktexundump(f, val);
413inline void miktexcheckmemoryifdebug()
415#if defined(MIKTEX_DEBUG)
416 TeXMFApp::GetTeXMFApp()->CheckMemory();
420inline void miktexinitializechartables()
422 TeXMFApp::GetTeXMFApp()->InitializeCharTables();
425inline bool miktexenableeightbitcharsp()
427 return TeXMFApp::GetTeXMFApp()->Enable8BitCharsP();
430inline bool miktexhavetcxfilename()
432 return !TeXMFApp::GetTeXMFApp()->GetTcxFileName().Empty();
435inline void miktexprinttcxfilename(FILE* f)
437 fprintf(f,
" (%s)", TeXMFApp::GetTeXMFApp()->GetTcxFileName().GetData());
441MIKTEX_TEXMF_END_NAMESPACE;
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:65
Definition: TeXMFApp.h:75
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
FileType
File type enum class.
Definition: FileType.h:33
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