MiKTeX 26.5-next
A scalable TeX distribution
Loading...
Searching...
No Matches
Utils.h
1/* miktex/Core/Utils.h: -*- C++ -*-
2
3 Copyright (C) 1996-2022 Christian Schenk
4
5 This file is part of the MiKTeX Core Library.
6
7 The MiKTeX Core Library is free software; you can redistribute it
8 and/or modify it under the terms of the GNU General Public License
9 as published by the Free Software Foundation; either version 2, or
10 (at your option) any later version.
11
12 The MiKTeX Core Library is distributed in the hope that it will be
13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty
14 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with the MiKTeX Core Library; if not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
21
22#pragma once
23
24#if !defined(EF1EA09F9E944352B856B3ECD37303CE)
25#define EF1EA09F9E944352B856B3ECD37303CE
26
27#include <miktex/Core/config.h>
28
29#include <cstddef>
30#include <cstdio>
31#include <cstring>
32#include <ctime>
33
34#include <algorithm>
35#include <chrono>
36#include <exception>
37#include <ostream>
38#include <string>
39#include <utility>
40#include <vector>
41
42#include <miktex/Util/PathName>
43
44#include "Debug.h"
45#include "Exceptions.h"
46#include "VersionNumber.h"
47
48MIKTEX_CORE_BEGIN_NAMESPACE;
49
52{
54 std::string texName;
56 std::string psName;
60 std::string encFile;
62 std::string fontFile;
64 std::string headerList;
65};
66
67inline bool operator<(const DvipsFontMapEntry& lhs, const DvipsFontMapEntry& rhs)
68{
69 return lhs.texName < rhs.texName;
70}
71
72struct GitInfo
73{
74 std::string commit;
75 std::string commitAbbrev;
76 std::chrono::time_point<std::chrono::system_clock> authorDate;
77 MIKTEXCORETHISAPI(std::string) ToString() const;
78};
79
80inline std::ostream& operator<<(std::ostream& os, const GitInfo& gitInfo)
81{
82 return os << gitInfo.ToString();
83}
84
86class MIKTEXNOVTABLE Utils
87{
88public:
89 Utils() = delete;
90
91public:
92 Utils(const Utils& other) = delete;
93
94public:
95 Utils& operator=(const Utils& other) = delete;
96
97public:
98 Utils(Utils&& other) = delete;
99
100public:
101 Utils& operator=(Utils&& other) = delete;
102
103public:
104 ~Utils() = delete;
105
106public:
111public:
112 static MIKTEXCORECEEAPI(bool) GetEnvironmentString(const std::string& name, std::string& str);
113
114public:
115 static MIKTEXCORECEEAPI(bool) GetEnvironmentString(const std::string& name, MiKTeX::Util::PathName& path);
116
117public:
118 static MIKTEXCORECEEAPI(bool) FindProgram(const std::string& programName, MiKTeX::Util::PathName& path);
119
120#if defined(MIKTEX_WINDOWS)
121public:
122 static MIKTEXCORECEEAPI(bool) GetDefPrinter(std::string& printerName);
123#endif
124
125public:
126 static MIKTEXCORECEEAPI(MiKTeX::Util::PathName) GetExe();
127
128public:
129 static MIKTEXCORECEEAPI(std::string) GetExeName();
130
132public:
133 static MIKTEXCORECEEAPI(std::string) GetMiKTeXVersionString();
134
138public:
139 static MIKTEXCORECEEAPI(std::string) GetMiKTeXBannerString();
140
141public:
142 static MIKTEXCORECEEAPI(std::string) MakeProgramVersionString(const std::string& programName, const VersionNumber& versionNumber);
143
144public:
145 static MIKTEXCORECEEAPI(std::string) GetOSVersionString();
146
147public:
148 static MIKTEXCORECEEAPI(GitInfo) GetGitInfo();
149
150public:
151 static MIKTEXCORECEEAPI(bool) HaveGetGitInfo();
152
153public:
154 static MIKTEXCORECEEAPI(void) UncompressFile(const MiKTeX::Util::PathName& pathIn, MiKTeX::Util::PathName& pathOut);
155
156public:
157 // FIXME: bad interface
158 static MIKTEXCORECEEAPI(const char*) GetRelativizedPath(const char* lpszPath, const char* lpszRoot);
159
160public:
161 static MIKTEXCORECEEAPI(bool) GetUncRootFromPath(const MiKTeX::Util::PathName& path, MiKTeX::Util::PathName& uncRoot);
162
163public:
164 static MIKTEXCORECEEAPI(bool) IsSafeFileName(const MiKTeX::Util::PathName& path);
165
166public:
167 static MIKTEXCORECEEAPI(bool) IsParentDirectoryOf(const MiKTeX::Util::PathName& parentDir, const MiKTeX::Util::PathName& fileName);
168
169public:
170 static MIKTEXCORECEEAPI(bool) SupportsHardLinks(const MiKTeX::Util::PathName& path);
171
172public:
173 static MIKTEXCORECEEAPI(void) SetEnvironmentString(const std::string& valueName, const std::string& value);
174
175public:
176 static MIKTEXCORECEEAPI(void) RemoveEnvironmentString(const std::string& valueName);
177
178public:
179 static MIKTEXCORECEEAPI(void) PrintException(const std::exception& e);
180
183public:
184 static MIKTEXCORECEEAPI(void) PrintException(const MiKTeXException& e);
185
186public:
187 static MIKTEXCORECEEAPI(bool) ReadLine(std::string& str, FILE* stream, bool keepLineEnding);
188
189public:
190 static MIKTEXCORECEEAPI(std::string) Hexify(const void* pv, std::size_t nBytes, bool lowerCase);
191
192public:
193 static MIKTEXCORECEEAPI(std::string) Hexify(const void* pv, std::size_t nBytes);
194
195public:
196 static MIKTEXCORECEEAPI(bool) ParseDvipsFontMapLine(const std::string& line, DvipsFontMapEntry& fontMapEntry);
197
198public:
199 static MIKTEXCORECEEAPI(bool) IsMiKTeXDirectRoot(const MiKTeX::Util::PathName& root);
200
201#if !HAVE_MIKTEX_USER_INFO
202public:
203 static MIKTEXCORECEEAPI(void) RegisterMiKTeXUser();
204#endif
205
206#if !HAVE_MIKTEX_USER_INFO
207public:
208 static MIKTEXCORECEEAPI(bool) IsRegisteredMiKTeXUser();
209#endif
210
211public:
212 static MIKTEXCORECEEAPI(void) ShowWebPage(const std::string& url);
213
214public:
215#if defined(MIKTEX_WINDOWS)
216 static MIKTEXCORECEEAPI(MiKTeX::Util::PathName) GetFolderPath(int nFolder, int nFallbackFolder, bool getCurrentPath);
217#endif
218
219public:
220 static MIKTEXCORECEEAPI(void) CheckHeap();
221
222public:
223 static MIKTEXCORECEEAPI(bool) GetPathNamePrefix(const MiKTeX::Util::PathName& path, const MiKTeX::Util::PathName& suffix, MiKTeX::Util::PathName& prefix);
224
225public:
226 static MIKTEXCOREEXPORT std::pair<bool, MiKTeX::Util::PathName> MIKTEXCEECALL ExpandTilde(const std::string& s);
227
228public:
229 static bool IsPureAscii(const char* lpsz)
230 {
231 MIKTEX_ASSERT_STRING(lpsz);
232 for (; *lpsz != 0; ++lpsz)
233 {
234 if (static_cast<unsigned>(*lpsz) > 127)
235 {
236 return false;
237 }
238 }
239 return true;
240 }
241
242public:
243 static bool IsPureAscii(const std::string& str)
244 {
245 return IsPureAscii(str.c_str());
246 }
247
248public:
249 static MIKTEXCORECEEAPI(bool) IsUTF8(const char* lpsz, bool allowPureAscii);
250
251public:
252 static bool IsUTF8(const char* lpsz)
253 {
254 return IsUTF8(lpsz, true);
255 }
256
257public:
258 static bool Equals(const char* str1, const char* str2)
259 {
260 return strcmp(str1, str2) == 0;
261 }
262
263public:
264 static bool EqualsIgnoreCase(const char* str1, const char* str2)
265 {
266 MIKTEX_ASSERT(IsPureAscii(str1) && IsPureAscii(str2));
267#if defined(_MSC_VER)
268 return _stricmp(str1, str2) == 0;
269#else
270 return strcasecmp(str1, str2) == 0;
271#endif
272 }
273
274public:
275 static bool EqualsIgnoreCase(const std::string& str1, const std::string& str2)
276 {
277 return EqualsIgnoreCase(str1.c_str(), str2.c_str());
278 }
279
280public:
281 static std::string MakeLower(const std::string& str)
282 {
283 MIKTEX_ASSERT(IsPureAscii(str));
284 std::string str2(str.size(), 0);
285 std::transform(str.begin(), str.end(), str2.begin(), ::tolower);
286 return str2;
287 }
288
289public:
290 static MIKTEXCORECEEAPI(unsigned long long) ToUnsignedLongLong(const std::string& s);
291
292public:
293 static MIKTEXCORECEEAPI(std::size_t) ToSizeT(const std::string& s);
294
295public:
296 static MIKTEXCORECEEAPI(std::time_t) ToTimeT(const std::string& s);
297
298public:
299 static MIKTEXCOREEXPORT std::pair<bool, bool> MIKTEXCEECALL CheckPath();
300
301public:
302 static MIKTEXCORECEEAPI(bool) CheckPath(bool repair);
303
304#if defined(MIKTEX_WINDOWS)
305public:
306 static MIKTEXCORECEEAPI(void) RegisterShellFileAssoc(const std::string& extension, const std::string& progId, bool takeOwnership);
307#endif
308
309#if defined(MIKTEX_WINDOWS)
310public:
311 static MIKTEXCORECEEAPI(void) UnregisterShellFileAssoc(const std::string& extension, const std::string& progId);
312#endif
313
314#if defined(MIKTEX_WINDOWS)
315public:
316 static MIKTEXCORECEEAPI(void) RegisterShellFileType(const std::string& progId, const std::string& userFriendlyName, const std::string& iconPath);
317#endif
318
319#if defined(MIKTEX_WINDOWS)
320public:
321 static MIKTEXCORECEEAPI(void) UnregisterShellFileType(const std::string& progId);
322#endif
323
324#if defined(MIKTEX_WINDOWS)
325public:
326 static MIKTEXCORECEEAPI(void) RegisterShellVerb(const std::string& progId, const std::string& verb, const std::string& command, const std::string& ddeExec);
327#endif
328
329#if defined(MIKTEX_WINDOWS)
330public:
331 static MIKTEXCORECEEAPI(std::string) MakeProgId(const std::string& progId);
332#endif
333};
334
335MIKTEX_CORE_END_NAMESPACE;
336
337#endif
static void PrintException(const MiKTeXException &e)
static std::string GetMiKTeXBannerString()
static std::string GetMiKTeXVersionString()
Gets the MiKTeX version information as a string.
static bool GetEnvironmentString(const std::string &name, std::string &str)
Instances of this class can be used to store path names.
Definition PathName.h:64
@ MakeLower
Replaces capital letters with their small letter counterpart.
Definition PathName.h:37
Information about an entry in a Dvips font map file.
Definition Utils.h:52
std::string psName
Name of the PostScript font.
Definition Utils.h:56
std::string specialInstructions
Special instructions to be embedded into the PostScript document.
Definition Utils.h:58
std::string texName
Name of the TeX font.
Definition Utils.h:54
std::string headerList
List of header files.
Definition Utils.h:64
std::string fontFile
Name of the font file.
Definition Utils.h:62
std::string encFile
Name of the encoding vector file.
Definition Utils.h:60
Definition Utils.h:73
An instance of this struct represents a version number.
Definition VersionNumber.h:36