1
4
5# include "luametatex.h"
6
7dump_state_info lmt_dump_state = {
8 .fingerprint = luametatex_format_fingerprint,
9 .padding = 0
10};
11
12
34
35
49
50# define MAGIC_FORMAT_NUMBER_LE_1 0x58544D4C
51# define MAGIC_FORMAT_NUMBER_LE_2 0x5845542D
52# define MAGIC_FORMAT_NUMBER_LE_3 0x544D462D
53
54static int tex_aux_report_dump_state(dumpstream f, int pos, const char *what)
55{
56 int tmp = ftell(f);
57 tex_print_format("%i %s", tmp - pos, what);
58 fflush(stdout);
59 return tmp;
60}
61
62
63
64static void tex_aux_dump_fingerprint(dumpstream f)
65{
66 dump_via_int(f, MAGIC_FORMAT_NUMBER_LE_1);
67 dump_via_int(f, MAGIC_FORMAT_NUMBER_LE_2);
68 dump_via_int(f, MAGIC_FORMAT_NUMBER_LE_3);
69 dump_via_int(f, luametatex_format_fingerprint);
70}
71
72static void tex_aux_undump_fingerprint(dumpstream f)
73{
74 int x;
75 undump_int(f, x);
76 if (x == MAGIC_FORMAT_NUMBER_LE_1) {
77 undump_int(f, x);
78 if (x == MAGIC_FORMAT_NUMBER_LE_2) {
79 undump_int(f, x);
80 if (x == MAGIC_FORMAT_NUMBER_LE_3) {
81 undump_int(f, x);
82 if (x == luametatex_format_fingerprint) {
83 return;
84 } else {
85 tex_fatal_undump_error("version id");
86 }
87 }
88 }
89 }
90 tex_fatal_undump_error("initial fingerprint");
91}
92
93static void tex_aux_dump_final_check(dumpstream f)
94{
95 dump_via_int(f, luametatex_format_fingerprint);
96}
97
98static void tex_aux_undump_final_check(dumpstream f)
99{
100 int x;
101 undump_int(f, x);
102 if (x == luametatex_format_fingerprint) {
103 return;
104 } else {
105 tex_fatal_undump_error("final fingerprint");
106 }
107}
108
109static void tex_aux_create_fmt_name(void)
110{
111 lmt_print_state.selector = new_string_selector_code;
112 tex_print_format("%s %i.%i.%i %s", lmt_fileio_state.fmt_name, year_par, month_par, day_par, lmt_fileio_state.job_name);
113 lmt_print_state.selector = terminal_and_logfile_selector_code;
114}
115
116
120
121static void tex_aux_dump_preamble(dumpstream f)
122{
123 dump_via_int(f, hash_size);
124 dump_via_int(f, hash_prime);
125 dump_via_int(f, prim_size);
126 dump_via_int(f, prim_prime);
127 dump_via_int(f, number_tex_commands);
128 dump_int(f, lmt_hash_state.hash_data.allocated);
129 dump_int(f, lmt_hash_state.hash_data.ptr);
130 dump_int(f, lmt_hash_state.hash_data.top);
131}
132
133static void tex_aux_undump_preamble(dumpstream f)
134{
135 int x;
136 undump_int(f, x);
137 if (x != hash_size) {
138 goto BAD;
139 }
140 undump_int(f, x);
141 if (x != hash_prime) {
142 goto BAD;
143 }
144 undump_int(f, x);
145 if (x != prim_size) {
146 goto BAD;
147 }
148 undump_int(f, x);
149 if (x != prim_prime) {
150 goto BAD;
151 }
152 undump_int(f, x);
153 if (x != number_tex_commands) {
154 goto BAD;
155 }
156 undump_int(f, lmt_hash_state.hash_data.allocated);
157 undump_int(f, lmt_hash_state.hash_data.ptr);
158 undump_int(f, lmt_hash_state.hash_data.top);
159
162 tex_initialize_hash_mem();
163 return;
164 BAD:
165 tex_fatal_undump_error("preamble");
166}
167
168void tex_store_fmt_file(void)
169{
170 int pos = 0;
171 dumpstream f = NULL;
172
173
178
179 if (lmt_save_state.save_stack_data.ptr != 0) {
180 tex_handle_error(
181 succumb_error_type,
182 "You can't dump inside a group",
183 "'{...\\dump}' is a no-no."
184 );
185 }
186
187
190
191 tex_dispose_specification_nodes();
192
193
196
197 {
198 int callback_id = lmt_callback_defined(pre_dump_callback);
199 if (callback_id > 0) {
200 (void) lmt_run_callback(lmt_lua_state.lua_instance, callback_id, "->");
201 }
202 }
203
204
209
210 tex_aux_create_fmt_name();
211
212 f = tex_open_fmt_file(1);
213 if (! f) {
214 tex_formatted_error("system", "format file '%s' cannot be opened for writing", lmt_fileio_state.fmt_name);
215 return;
216 }
217
218 tex_print_nlp();
219 tex_print_format("Dumping format in file '%s': ", lmt_fileio_state.fmt_name);
220 fflush(stdout);
221
222 tex_compact_tokens();
223 tex_compact_string_pool();
224
225 tex_aux_dump_fingerprint(f); pos = tex_aux_report_dump_state(f, pos, "fingerprint + ");
226 lmt_dump_engine_info(f); pos = tex_aux_report_dump_state(f, pos, "engine + ");
227 tex_aux_dump_preamble(f); pos = tex_aux_report_dump_state(f, pos, "preamble + ");
228 tex_dump_constants(f); pos = tex_aux_report_dump_state(f, pos, "constants + ");
229 tex_dump_string_pool(f); pos = tex_aux_report_dump_state(f, pos, "stringpool + ");
230
231 tex_dump_node_mem(f); pos = tex_aux_report_dump_state(f, pos, "nodes + ");
232
233 tex_dump_token_mem(f); pos = tex_aux_report_dump_state(f, pos, "tokens + ");
234 tex_dump_equivalents_mem(f); pos = tex_aux_report_dump_state(f, pos, "equivalents + ");
235 tex_dump_specification_data(f); pos = tex_aux_report_dump_state(f, pos, "specifications + ");
236 tex_dump_math_codes(f); pos = tex_aux_report_dump_state(f, pos, "math codes + ");
237 tex_dump_text_codes(f); pos = tex_aux_report_dump_state(f, pos, "text codes + ");
238 tex_dump_primitives(f); pos = tex_aux_report_dump_state(f, pos, "primitives + ");
239 tex_dump_hashtable(f); pos = tex_aux_report_dump_state(f, pos, "hashtable + ");
240 tex_dump_font_data(f); pos = tex_aux_report_dump_state(f, pos, "fonts + ");
241 tex_dump_math_data(f); pos = tex_aux_report_dump_state(f, pos, "math + ");
242 tex_dump_language_data(f); pos = tex_aux_report_dump_state(f, pos, "language + ");
243 tex_dump_insert_data(f); pos = tex_aux_report_dump_state(f, pos, "insert + ");
244 lmt_dump_registers(f); pos = tex_aux_report_dump_state(f, pos, "bytecodes + ");
245 tex_aux_dump_final_check(f); pos = tex_aux_report_dump_state(f, pos, "housekeeping = ");
246
247 tex_aux_report_dump_state(f, 0, "total.");
248 tex_close_fmt_file(f);
249 tex_print_ln();
250
251}
252
253
264
265int tex_fatal_undump_error(const char *s)
266{
267 tex_emergency_message("system", "fatal format error, loading file '%s' failed with bad '%s' data, remake the format", emergency_fmt_name, s);
268 return tex_emergency_exit();
269}
270
271
272# define undumping(s)
273
274static void tex_aux_undump_fmt_data(dumpstream f)
275{
276 undumping("warmingup")
277
278 undumping("fingerprint") tex_aux_undump_fingerprint(f);
279 undumping("engineinfo") lmt_undump_engine_info(f);
280 undumping("preamble") tex_aux_undump_preamble(f);
281 undumping("constants") tex_undump_constants(f);
282 undumping("strings") tex_undump_string_pool(f);
283 undumping("nodes") tex_undump_node_mem(f);
284 undumping("tokens") tex_undump_token_mem(f);
285 undumping("equivalents") tex_undump_equivalents_mem(f);
286 undumping("specifications") tex_undump_specification_data(f);
287 undumping("mathcodes") tex_undump_math_codes(f);
288 undumping("textcodes") tex_undump_text_codes(f);
289 undumping("primitives") tex_undump_primitives(f);
290 undumping("hashtable") tex_undump_hashtable(f);
291 undumping("fonts") tex_undump_font_data(f);
292 undumping("math") tex_undump_math_data(f);
293 undumping("languages") tex_undump_language_data(f);
294 undumping("inserts") tex_undump_insert_data(f);
295 undumping("bytecodes") lmt_undump_registers(f);
296 undumping("finalcheck") tex_aux_undump_final_check(f);
297
298 undumping("done")
299
300
301
302 cur_list.prev_depth = ignore_depth_criterion_par;
303}
304
305
309
310int tex_load_fmt_file(void)
311{
312 dumpstream f = tex_open_fmt_file(0);
313 if (f) {
314 tex_aux_undump_fmt_data(f);
315 tex_close_fmt_file(f);
316 return 1;
317 } else {
318 return tex_fatal_undump_error("filehandle");
319 }
320}
321
322void tex_initialize_dump_state(void)
323{
324 if (! lmt_engine_state.dump_name) {
325 lmt_engine_state.dump_name = lmt_memory_strdup("initex");
326 }
327}
328 |