1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
|
/* mainbody.h
Copyright 2009 Taco Hoekwater <taco@luatex.org>
This file is part of LuaTeX.
LuaTeX is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your
option) any later version.
LuaTeX is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU General Public License along
with LuaTeX; if not, see <http://www.gnu.org/licenses/>. */
/* $Id: mainbody.h 3612 2010-04-13 09:29:42Z taco $ */
#ifndef MAINBODY_H
# define MAINBODY_H
extern int luatex_svn;
extern int luatex_version;
extern int luatex_revision;
extern int luatex_date_info;
extern const char *luatex_version_string;
extern const char *engine_name;
/*
The following parameters can be changed at compile time to extend or
reduce \TeX's capacity. They may have different values in \.{INITEX} and
in production versions of \TeX.
@.INITEX@>
@^system dependencies@>
*/
# define ssup_max_strings 262143
# define inf_max_strings 100000
# define sup_max_strings ssup_max_strings
# define inf_strings_free 100
# define sup_strings_free sup_max_strings
# define inf_buf_size 500
# define sup_buf_size 100000000
# define inf_nest_size 40
# define sup_nest_size 4000
# define inf_max_in_open 6
# define sup_max_in_open 127
# define inf_param_size 60
# define sup_param_size 6000
# define inf_save_size 600
# define sup_save_size 80000
# define inf_stack_size 200
# define sup_stack_size 30000
# define inf_dvi_buf_size 800
# define sup_dvi_buf_size 65536
# define sup_hash_extra sup_max_strings
# define inf_hash_extra 0
# define sup_ocp_list_size 1000000
# define inf_ocp_list_size 1000
# define sup_ocp_buf_size 100000000
# define inf_ocp_buf_size 1000
# define sup_ocp_stack_size 1000000
# define inf_ocp_stack_size 1000
# define inf_expand_depth 100
# define sup_expand_depth 1000000
# include <stdio.h>
/* Types in the outer block */
typedef int ASCII_code; /* characters */
typedef unsigned char eight_bits; /* unsigned one-byte quantity */
typedef FILE *alpha_file; /* files that contain textual data */
typedef FILE *byte_file; /* files that contain binary data */
typedef int str_number;
typedef int pool_pointer;
typedef unsigned char packed_ASCII_code;
typedef int scaled; /* this type is used for scaled integers */
typedef char small_number; /* this type is self-explanatory */
typedef float glue_ratio; /* one-word representation of a glue expansion factor */
typedef unsigned short quarterword;
typedef int halfword;
typedef unsigned char glue_ord; /* infinity to the 0, 1, 2, 3, or 4 power */
typedef unsigned short group_code; /* |save_level| for a level boundary */
typedef int internal_font_number; /* |font| in a |char_node| */
typedef int font_index; /* index into |font_info| */
typedef int save_pointer;
/*
Characters of text that have been converted to \TeX's internal form
are said to be of type |ASCII_code|, which is a subrange of the integers.
We are assuming that our runtime system is able to read and write UTF-8.
Some of the ASCII codes without visible characters have been given symbolic
names in this program because they are used with a special meaning.
*/
# define null_code '\0' /* ASCII code that might disappear */
# define carriage_return '\r' /* ASCII code used at end of line */
/* Global variables */
extern int bad; /* is some ``constant'' wrong? */
extern boolean luainit; /* are we using lua for initializations */
extern boolean tracefilenames; /* print file open-close info? */
extern boolean ini_version; /* are we \.{INITEX}? */
extern boolean dump_option;
extern boolean dump_line;
extern int bound_default;
extern char *bound_name;
extern int error_line;
extern int half_error_line;
extern int max_print_line;
extern int ocp_list_size;
extern int ocp_buf_size;
extern int ocp_stack_size;
extern int max_strings;
extern int strings_free;
extern int font_k;
extern int buf_size;
extern int stack_size;
extern int max_in_open;
extern int param_size;
extern int nest_size;
extern int save_size;
extern int expand_depth;
extern int parsefirstlinep;
extern int filelineerrorstylep;
extern int haltonerrorp;
extern boolean quoted_filename;
/*
In order to make efficient use of storage space, \TeX\ bases its major data
structures on a |memory_word|, which contains either a (signed) integer,
possibly scaled, or a (signed) |glue_ratio|, or a small number of
fields that are one half or one quarter of the size used for storing
integers.
If |x| is a variable of type |memory_word|, it contains up to four
fields that can be referred to as follows:
$$\vbox{\halign{\hfil#&#\hfil&#\hfil\cr
|x|&.|int|&(an |integer|)\cr
|x|&.|sc|\qquad&(a |scaled| integer)\cr
|x|&.|gr|&(a |glue_ratio|)\cr
|x.hh.lh|, |x.hh|&.|rh|&(two halfword fields)\cr
|x.hh.b0|, |x.hh.b1|, |x.hh|&.|rh|&(two quarterword fields, one halfword
field)\cr
|x.qqqq.b0|, |x.qqqq.b1|, |x.qqqq|&.|b2|, |x.qqqq.b3|\hskip-100pt
&\qquad\qquad\qquad(four quarterword fields)\cr}}$$
This is somewhat cumbersome to write, and not very readable either, but
macros will be used to make the notation shorter and more transparent.
The \PASCAL\ code below gives a formal definition of |memory_word| and
its subsidiary types, using packed variant records. \TeX\ makes no
assumptions about the relative positions of the fields within a word.
We are assuming 32-bit integers, a halfword must contain at least
32 bits, and a quarterword must contain at least 16 bits.
@^system dependencies@>
N.B.: Valuable memory space will be dreadfully wasted unless \TeX\ is compiled
by a \PASCAL\ that packs all of the |memory_word| variants into
the space of a single integer. This means, for example, that |glue_ratio|
words should be |short_real| instead of |real| on some computers. Some
\PASCAL\ compilers will pack an integer whose subrange is `|0..255|' into
an eight-bit field, but others insist on allocating space for an additional
sign bit; on such systems you can get 256 values into a quarterword only
if the subrange is `|-128..127|'.
The present implementation tries to accommodate as many variations as possible,
so it makes few assumptions. If integers having the subrange
`|min_quarterword..max_quarterword|' can be packed into a quarterword,
and if integers having the subrange `|min_halfword..max_halfword|'
can be packed into a halfword, everything should work satisfactorily.
It is usually most efficient to have |min_quarterword=min_halfword=0|,
so one should try to achieve this unless it causes a severe problem.
The values defined here are recommended for most 32-bit computers.
We cannot use the full range of 32 bits in a halfword, because we have
to allow negative values for potential backend tricks like web2c's
dynamic allocation, and parshapes pointers have to be able to store at
least twice the value |max_halfword| (see below). Therefore,
|max_halfword| is $2^{30}-1$
*/
# include "tex/memoryword.h"
# define min_quarterword 0 /*smallest allowable value in a |quarterword| */
# define max_quarterword 65535 /* largest allowable value in a |quarterword| */
# define min_halfword -0x3FFFFFFF /* smallest allowable value in a |halfword| */
# define max_halfword 0x3FFFFFFF
/* largest allowable value in a |halfword| */
/*
The following procedure, which is called just before \TeX\ initializes its
input and output, establishes the initial values of the date and time.
It calls a macro-defined |dateandtime| routine. |dateandtime| in turn is
also a C macro, which calls |get_date_and_time|, passing it the addresses of
the day, month, etc., so they can be set by the routine.
|get_date_and_time| also sets up interrupt catching if that
is conditionally compiled in the C code.
@^system dependencies@>
*/
# define fix_date_and_time() dateandtime(int_par(time_code),int_par(day_code),int_par(month_code),int_par(year_code))
extern int get_luatexsvn(void);
extern int get_luatexversion(void);
extern str_number get_luatexrevision(void);
extern int get_luatex_date_info(void);
extern int ready_already;
extern void main_body(void);
extern void close_files_and_terminate(void);
extern void final_cleanup(void);
extern void debug_help(void); /* routine to display various things */
extern int main_initialize(void);
/* lazy me */
# define get_cur_font() equiv(cur_font_loc)
# define zset_cur_font set_cur_font
#endif
|