beta-0.89.2
[luatex.git] / source / texk / web2c / texmfmp.h
blob571382294a67f91ee7f7c252b8b944b2e9dc683f
1 /* texmfmp.h: Main include file for TeX and MF in C. This file is
2 included by {tex,mf}d.h, which is the first include in the C files
3 output by web2c. */
5 #include "cpascal.h"
6 #include <kpathsea/c-pathch.h> /* for IS_DIR_SEP, used in the change files */
7 #include <kpathsea/tex-make.h> /* for kpse_make_tex_discard_errors */
9 #ifdef XeTeX
10 #ifdef XETEX_MAC
11 /* include this here to avoid conflict between clang's emmintrin.h and
12 * texmfmem.h. Should be removed once a fixed clang is widely available
13 * http://llvm.org/bugs/show_bug.cgi?id=14964 */
14 #include <ApplicationServices/ApplicationServices.h>
15 #endif
16 /* added typedefs for unicodefile and voidpointer */
17 #define XETEX_UNICODE_FILE_DEFINED 1
18 typedef struct {
19 FILE *f;
20 long savedChar;
21 short skipNextLF;
22 short encodingMode;
23 void *conversionData;
24 } UFILE;
25 typedef UFILE* unicodefile;
27 typedef void* voidpointer;
28 #endif
30 /* If we have these macros, use them, as they provide a better guide to
31 the endianess when cross-compiling. */
32 #if defined (BYTE_ORDER) && defined (BIG_ENDIAN) && defined (LITTLE_ENDIAN)
33 #ifdef WORDS_BIGENDIAN
34 #undef WORDS_BIGENDIAN
35 #endif
36 #if BYTE_ORDER == BIG_ENDIAN
37 #define WORDS_BIGENDIAN
38 #endif
39 #endif
40 /* More of the same, but now NeXT-specific. */
41 #ifdef NeXT
42 #ifdef WORDS_BIGENDIAN
43 #undef WORDS_BIGENDIAN
44 #endif
45 #ifdef __BIG_ENDIAN__
46 #define WORDS_BIGENDIAN
47 #endif
48 #endif
50 /* Some things are the same except for the name. */
51 #ifdef TeX
52 #if defined (pdfTeX)
53 #define TEXMFPOOLNAME "pdftex.pool"
54 #define TEXMFENGINENAME "pdftex"
55 #elif defined (eTeX)
56 #define TEXMFPOOLNAME "etex.pool"
57 #define TEXMFENGINENAME "etex"
58 #elif defined (XeTeX)
59 #define TEXMFPOOLNAME "xetex.pool"
60 #define TEXMFENGINENAME "xetex"
61 #elif defined (Aleph)
62 #define TEXMFPOOLNAME "aleph.pool"
63 #define TEXMFENGINENAME "aleph"
64 #elif defined (pTeX)
65 #define TEXMFPOOLNAME "ptex.pool"
66 #define TEXMFENGINENAME "ptex"
67 #include "ptexdir/kanji.h"
68 #elif defined (epTeX)
69 #define TEXMFPOOLNAME "eptex.pool"
70 #define TEXMFENGINENAME "eptex"
71 #include "ptexdir/kanji.h"
72 #elif defined (upTeX)
73 #define TEXMFPOOLNAME "uptex.pool"
74 #define TEXMFENGINENAME "uptex"
75 #include "uptexdir/kanji.h"
76 #elif defined (eupTeX)
77 #define TEXMFPOOLNAME "euptex.pool"
78 #define TEXMFENGINENAME "euptex"
79 #include "uptexdir/kanji.h"
80 #else
81 #define TEXMFPOOLNAME "tex.pool"
82 #define TEXMFENGINENAME "tex"
83 #endif
84 #define DUMP_FILE fmtfile
85 #define DUMP_FORMAT kpse_fmt_format
86 #define writedvi WRITE_OUT
87 #define flushdvi flush_out
88 #define OUT_FILE dvifile
89 #define OUT_BUF dvibuf
90 #endif /* TeX */
91 #ifdef MF
92 #if defined(MFLua)
93 #define TEXMFPOOLNAME "mflua.pool"
94 #define TEXMFENGINENAME "mflua"
95 #elif defined(MFLuaJIT)
96 #define TEXMFPOOLNAME "mfluajit.pool"
97 #define TEXMFENGINENAME "mfluajit"
98 #else
99 #define TEXMFPOOLNAME "mf.pool"
100 #define TEXMFENGINENAME "metafont"
101 #endif
102 #define DUMP_FILE basefile
103 #define DUMP_FORMAT kpse_base_format
104 #define writegf WRITE_OUT
105 #define OUT_FILE gffile
106 #define OUT_BUF gfbuf
107 #endif /* MF */
109 /* Restore underscores. */
110 #define dumpname dump_name
111 #define kpsedvipsconfigformat kpse_dvips_config_format
112 #define kpsefontmapformat kpse_fontmap_format
113 #define kpsemfpoolformat kpse_mfpool_format
114 #define kpsempformat kpse_mp_format
115 #define kpsemppoolformat kpse_mppool_format
116 #define kpsetexpoolformat kpse_texpool_format
117 #define kpsetexformat kpse_tex_format
119 /* Hacks for TeX that are better not to #ifdef, see lib/openclose.c. */
120 extern int tfmtemp, texinputtype;
122 /* pdfTeX routines also used for e-pTeX, e-upTeX, and XeTeX */
123 #if defined (pdfTeX) || defined (epTeX) || defined (eupTeX) || defined(XeTeX)
124 #if !defined (pdfTeX)
125 extern void pdftex_fail(const char *fmt, ...);
126 #endif
127 #if !defined(XeTeX)
128 extern char start_time_str[];
129 extern void initstarttime(void);
130 extern char *makecstring(integer s);
131 extern char *makecfilename(integer s);
132 extern void getcreationdate(void);
133 extern void getfilemoddate(integer s);
134 extern void getfilesize(integer s);
135 extern void getfiledump(integer s, int offset, int length);
136 #endif
137 extern void convertStringToHexString(const char *in, char *out, int lin);
138 extern void getmd5sum(integer s, int file);
139 #endif
141 /* pdftex etc. except for tex use these for pipe support */
142 #if defined(TeX) && !defined(onlyTeX)
143 extern boolean open_in_or_pipe (FILE **, int, const_string fopen_mode);
144 extern boolean open_out_or_pipe (FILE **, const_string fopen_mode);
145 extern void close_file_or_pipe (FILE *);
146 #define ENABLE_PIPES 1
147 #else
148 #define ENABLE_PIPES 0
149 #endif
151 /* Executing shell commands. */
152 extern int runsystem (const char *cmd);
154 /* The entry point. */
155 extern void maininit (int ac, string *av);
156 #if defined(WIN32) && !defined(__MINGW32__) && defined(DLLPROC)
157 extern __declspec(dllexport) int DLLPROC (int ac, string *av);
158 #else
159 #undef DLLPROC
160 #endif
162 /* All but the Omega family use this. */
163 #if !defined(Aleph)
164 extern void readtcxfile (void);
165 extern string translate_filename;
166 #define translatefilename translate_filename
167 #endif
169 #ifdef TeX
170 /* The type `glueratio' should be a floating point type which won't
171 unnecessarily increase the size of the memoryword structure. This is
172 the basic requirement. On most machines, if you're building a
173 normal-sized TeX, then glueratio must probably meet the following
174 restriction: sizeof(glueratio) <= sizeof(integer). Usually, then,
175 glueratio must be `float'. But if you build a big TeX, you can (on
176 most machines) and should make it `double' to avoid loss of precision
177 and conversions to and from double during calculations. (All this
178 also goes for Metafont.) Furthermore, if you have enough memory, it
179 won't hurt to have this defined to be `double' for running the
180 trip/trap tests.
182 This type is set automatically to `float' by configure if a small TeX
183 is built. */
184 #ifndef GLUERATIO_TYPE
185 #define GLUERATIO_TYPE double
186 #endif
187 typedef GLUERATIO_TYPE glueratio;
189 #if defined(__DJGPP__) && defined (IPC)
190 #undef IPC
191 #endif
193 #ifdef IPC
194 extern void ipcpage (int);
195 #endif /* IPC */
196 #endif /* TeX */
198 /* How to flush the DVI file. */
199 #define flush_out() fflush (OUT_FILE)
201 /* Used to write to a TFM file. */
202 #define put2bytes(f, h) do { \
203 integer v = (integer) (h); putbyte (v >> 8, f); putbyte (v & 0xff, f); \
204 } while (0)
205 #define put4bytes(f, w) do { \
206 integer v = (integer) (w); \
207 putbyte (v >> 24, f); putbyte (v >> 16, f); \
208 putbyte (v >> 8, f); putbyte (v & 0xff, f); \
209 } while (0)
211 /* Read a line of input as quickly as possible. */
212 #define inputln(stream, flag) input_line (stream)
213 #ifdef XeTeX
214 extern boolean input_line (UFILE *);
215 #else
216 extern boolean input_line (FILE *);
217 #endif
219 /* This routine has to return four values. */
220 #define dateandtime(i,j,k,l) get_date_and_time (&(i), &(j), &(k), &(l))
221 extern void get_date_and_time (integer *, integer *, integer *, integer *);
223 #if defined(pdfTeX)
224 /* Get high-res time info. */
225 #define secondsandmicros(i,j) get_seconds_and_micros (&(i), &(j))
226 extern void get_seconds_and_micros (integer *, integer *);
227 #endif
229 /* Copy command-line arguments into the buffer, despite the name. */
230 extern void topenin (void);
232 /* Can't prototype this since it uses poolpointer and ASCIIcode, which
233 are defined later in mfd.h, and mfd.h uses stuff from here. */
234 /* Therefore the department of ugly hacks decided to move this declaration
235 to the *coerce.h files. */
236 /* extern void calledit (); */
238 /* These defines reroute the file i/o calls to the new pipe-enabled
239 functions in texmfmp.c*/
241 #if ENABLE_PIPES
242 #undef aopenin
243 #undef aopenout
244 #undef aclose
245 #define aopenin(f,p) open_in_or_pipe(&(f),p,FOPEN_RBIN_MODE)
246 #define aopenout(f) open_out_or_pipe(&(f),FOPEN_W_MODE)
247 #define aclose(f) close_file_or_pipe(f)
248 #endif
250 /* `bopenin' (and out) is used only for reading (and writing) .tfm
251 files; `wopenin' (and out) only for dump files. The filenames are
252 passed in as a global variable, `nameoffile'. */
253 #define bopenin(f) open_input (&(f), kpse_tfm_format, FOPEN_RBIN_MODE)
254 #define ocpopenin(f) open_input (&(f), kpse_ocp_format, FOPEN_RBIN_MODE)
255 #define ofmopenin(f) open_input (&(f), kpse_ofm_format, FOPEN_RBIN_MODE)
257 #define bopenout(f) open_output (&(f), FOPEN_WBIN_MODE)
258 #define bclose aclose
259 #ifdef XeTeX
260 /* f is declared as gzFile, but we temporarily use it for a FILE *
261 so that we can use the standard open calls */
262 #define wopenin(f) (open_input ((FILE**)&(f), DUMP_FORMAT, FOPEN_RBIN_MODE) \
263 && (f = gzdopen(fileno((FILE*)f), FOPEN_RBIN_MODE)))
264 #define wopenout(f) (open_output ((FILE**)&(f), FOPEN_WBIN_MODE) \
265 && (f = gzdopen(fileno((FILE*)f), FOPEN_WBIN_MODE)) \
266 && (gzsetparams(f, 1, Z_DEFAULT_STRATEGY) == Z_OK))
267 #define wclose(f) gzclose(f)
268 #else
269 #define wopenin(f) open_input (&(f), DUMP_FORMAT, FOPEN_RBIN_MODE)
270 #define wopenout bopenout
271 #define wclose aclose
272 #endif
274 #ifdef XeTeX
275 #if ENABLE_PIPES
276 extern boolean u_open_in_or_pipe(unicodefile* f, integer filefmt, const_string fopen_mode, integer mode, integer encodingData);
277 #define uopenin(f,p,m,d) u_open_in_or_pipe(&(f), p, FOPEN_RBIN_MODE, m, d)
278 #else
279 #define uopenin(f,p,m,d) u_open_in(&(f), p, FOPEN_RBIN_MODE, m, d)
280 #endif
281 #endif
283 /* Used in tex.ch (section 1338) to get a core dump in debugging mode. */
284 #ifdef unix
285 #define dumpcore abort
286 #else
287 #define dumpcore uexit (1)
288 #endif
290 #ifdef MF
291 extern boolean initscreen (void);
292 extern void updatescreen (void);
293 /* Can't prototype these for same reason as `calledit' above. */
294 #if 0 /* Therefore the real declaration is found in the coerce.h files. */
295 extern void blankrectangle (/*screencol, screencol, screenrow, screenrow*/);
296 extern void paintrow (/*screenrow, pixelcolor, transspec, screencol*/);
297 #endif
298 #endif /* MF */
301 /* (Un)dumping. These are called from the change file. */
302 #define dumpthings(base, len) \
303 do_dump ((char *) &(base), sizeof (base), (int) (len), DUMP_FILE)
304 #define undumpthings(base, len) \
305 do_undump ((char *) &(base), sizeof (base), (int) (len), DUMP_FILE)
307 #ifndef PRIdPTR
308 #define PRIdPTR "ld"
309 #endif
310 #ifndef PRIxPTR
311 #define PRIxPTR "lx"
312 #endif
314 /* Like do_undump, but check each value against LOW and HIGH. The
315 slowdown isn't significant, and this improves the chances of
316 detecting incompatible format files. In fact, Knuth himself noted
317 this problem with Web2c some years ago, so it seems worth fixing. We
318 can't make this a subroutine because then we lose the type of BASE. */
319 #define undumpcheckedthings(low, high, base, len) \
320 do { \
321 unsigned i; \
322 undumpthings (base, len); \
323 for (i = 0; i < (len); i++) { \
324 if ((&(base))[i] < (low) || (&(base))[i] > (high)) { \
325 FATAL5 ("Item %u (=%" PRIdPTR ") of .fmt array at %" PRIxPTR \
326 " <%" PRIdPTR " or >%" PRIdPTR, \
327 i, (uintptr_t) (&(base))[i], (uintptr_t) &(base), \
328 (uintptr_t) low, (uintptr_t) high); \
331 } while (0)
333 /* Like undump_checked_things, but only check the upper value. We use
334 this when the base type is unsigned, and thus all the values will be
335 greater than zero by definition. */
336 #define undumpuppercheckthings(high, base, len) \
337 do { \
338 unsigned i; \
339 undumpthings (base, len); \
340 for (i = 0; i < (len); i++) { \
341 if ((&(base))[i] > (high)) { \
342 FATAL4 ("Item %u (=%" PRIdPTR ") of .fmt array at %" PRIxPTR \
343 " >%" PRIdPTR, \
344 i, (uintptr_t) (&(base))[i], (uintptr_t) &(base), \
345 (uintptr_t) high); \
348 } while (0)
350 /* We define the routines to do the actual work in texmfmp.c. */
351 #ifdef XeTeX
352 #include <zlib.h>
353 extern void do_dump (char *, int, int, gzFile);
354 extern void do_undump (char *, int, int, gzFile);
355 #else
356 extern void do_dump (char *, int, int, FILE *);
357 extern void do_undump (char *, int, int, FILE *);
358 #endif
360 /* Use the above for all the other dumping and undumping. */
361 #define generic_dump(x) dumpthings (x, 1)
362 #define generic_undump(x) undumpthings (x, 1)
364 #define dumpwd generic_dump
365 #define dumphh generic_dump
366 #define dumpqqqq generic_dump
367 #define undumpwd generic_undump
368 #define undumphh generic_undump
369 #define undumpqqqq generic_undump
371 /* `dump_int' is called with constant integers, so we put them into a
372 variable first. */
373 #define dumpint(x) \
374 do \
376 integer x_val = (x); \
377 generic_dump (x_val); \
379 while (0)
381 /* web2c/regfix puts variables in the format file loading into
382 registers. Some compilers aren't willing to take addresses of such
383 variables. So we must kludge. */
384 #if defined(REGFIX) || defined(WIN32)
385 #define undumpint(x) \
386 do \
388 integer x_val; \
389 generic_undump (x_val); \
390 x = x_val; \
392 while (0)
393 #else
394 #define undumpint generic_undump
395 #endif
397 /* Handle SyncTeX, if requested */
398 #if defined(TeX)
399 # if defined(__SyncTeX__)
400 # include "synctexdir/synctex-common.h"
401 extern char *generic_synctex_get_current_name(void);
402 # endif
403 #endif