OSDN Git Service

updated headers.
[putex/putex.git] / src / texsourc / tex8.c
1 /*\r
2    Copyright 2014 Clerk Ma\r
3 \r
4    This program is free software; you can redistribute it and/or modify\r
5    it under the terms of the GNU General Public License as published by\r
6    the Free Software Foundation; either version 2 of the License, or\r
7    (at your option) any later version.\r
8 \r
9    This program is distributed in the hope that it will be useful, but\r
10    WITHOUT ANY WARRANTY; without even the implied warranty of\r
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
12    General Public License for more details.\r
13 \r
14    You should have received a copy of the GNU General Public License\r
15    along with this program; if not, write to the Free Software\r
16    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
17    02110-1301 USA.\r
18 */\r
19 \r
20 #define EXTERN extern\r
21 \r
22 #include "yandytex.h"\r
23 \r
24 /* sec 1181 */\r
25 void math_fraction (void)\r
26 {\r
27   small_number c;\r
28 \r
29   c = cur_chr;\r
30 \r
31   if (incompleat_noad != 0)\r
32   {\r
33     if (c >= delimited_code)\r
34     {\r
35       scan_delimiter(garbage, false);\r
36       scan_delimiter(garbage, false);\r
37     }\r
38 \r
39     if (c % delimited_code == 0)\r
40       scan_dimen(false, false, false);\r
41 \r
42     print_err("Ambiguous; you need another { and }");\r
43     help3("I'm ignoring this fraction specification, since I don't",\r
44       "know whether a construction like `x \\over y \\over z'",\r
45       "means `{x \\over y} \\over z' or `x \\over {y \\over z}'.");\r
46     error();\r
47   }\r
48   else\r
49   {\r
50     incompleat_noad = get_node(fraction_noad_size);\r
51     type(incompleat_noad) = fraction_noad;\r
52     subtype(incompleat_noad) = normal;\r
53     math_type(numerator(incompleat_noad)) = sub_mlist;\r
54     info(numerator(incompleat_noad)) = link(head);\r
55     mem[denominator(incompleat_noad)].hh = empty_field;\r
56     mem[left_delimiter(incompleat_noad)].qqqq = null_delimiter;\r
57     mem[right_delimiter(incompleat_noad)].qqqq = null_delimiter;\r
58     link(head) = 0;\r
59     tail = head;\r
60 \r
61     if (c >= delimited_code)\r
62     {\r
63       scan_delimiter(left_delimiter(incompleat_noad), false);\r
64       scan_delimiter(right_delimiter(incompleat_noad), false);\r
65     }\r
66 \r
67     switch (c % delimited_code)\r
68     {\r
69       case above_code:\r
70         scan_dimen(false, false, false);\r
71         thickness(incompleat_noad) = cur_val;\r
72         break;\r
73 \r
74       case over_code:\r
75         thickness(incompleat_noad) = default_code;\r
76         break;\r
77 \r
78       case atop_code:\r
79         thickness(incompleat_noad) = 0;\r
80         break;\r
81     }\r
82   }\r
83 }\r
84 /* sec 1191 */\r
85 void math_left_right (void)\r
86 {\r
87   small_number t;\r
88   pointer p;\r
89 \r
90   t = cur_chr;\r
91 \r
92   if ((t == right_noad) && (cur_group != math_left_group))\r
93   {\r
94     if (cur_group == math_shift_group)\r
95     {\r
96       scan_delimiter(garbage, false);\r
97       print_err("Extra ");\r
98       print_esc("right");\r
99       help1("I'm ignoring a \\right that had no matching \\left.");\r
100       error();\r
101     }\r
102     else\r
103       off_save();\r
104   }\r
105   else\r
106   {\r
107     p = new_noad();\r
108     type(p) = t;\r
109     scan_delimiter(delimiter(p), false);\r
110 \r
111     if (t == left_noad)\r
112     {\r
113       push_math(math_left_group);\r
114       link(tail) = p;\r
115       tail = p;\r
116     }\r
117     else\r
118     {\r
119       p = fin_mlist(p);\r
120       unsave();\r
121       tail_append(new_noad());\r
122       type(tail) = inner_noad;\r
123       math_type(nucleus(tail)) = sub_mlist;\r
124       info(nucleus(tail)) = p;\r
125     }\r
126   }\r
127 }\r
128 /* sec 1194 */\r
129 void after_math (void)\r
130 {\r
131   boolean l;\r
132   boolean danger;\r
133   integer m;\r
134   pointer p;\r
135   pointer a;\r
136   pointer b;\r
137   scaled w;\r
138   scaled z;\r
139   scaled e;\r
140   scaled q;\r
141   scaled d;\r
142   scaled s;\r
143   small_number g1, g2;\r
144   pointer r;\r
145   pointer t;\r
146 \r
147   danger = false;\r
148   \r
149   if ((font_params[fam_fnt(2 + text_size)] < total_mathsy_params) ||\r
150     (font_params[fam_fnt(2 + script_size)] < total_mathsy_params) ||\r
151     (font_params[fam_fnt(2 + script_script_size)] < total_mathsy_params))\r
152   {\r
153     print_err("Math formula deleted: Insufficient symbol fonts");\r
154     help3("Sorry, but I can't typeset math unless \\textfont 2",\r
155         "and \\scriptfont 2 and \\scriptscriptfont 2 have all",\r
156         "the \\fontdimen values needed in math symbol fonts.");\r
157     error();\r
158     flush_math();\r
159     danger = true;\r
160   }\r
161   else if ((font_params[fam_fnt(3 + text_size)] < total_mathex_params) ||\r
162     (font_params[fam_fnt(3 + script_size)] < total_mathex_params) ||\r
163     (font_params[fam_fnt(3 + script_script_size)] < total_mathex_params))\r
164   {\r
165     print_err("Math formula deleted: Insufficient extension fonts");\r
166     help3("Sorry, but I can't typeset math unless \\textfont 3",\r
167         "and \\scriptfont 3 and \\scriptscriptfont 3 have all",\r
168         "the \\fontdimen values needed in math extension fonts.");\r
169     error();\r
170     flush_math();\r
171     danger = true;\r
172   }\r
173 \r
174   m = mode;\r
175   l = false;\r
176   p = fin_mlist(0);\r
177 \r
178   if (mode == -m)\r
179   {\r
180     {\r
181       get_x_token();\r
182 \r
183       if (cur_cmd != math_shift)\r
184       {\r
185         print_err("Display math should end with $$");\r
186         help2("The `$' that I just saw supposedly matches a previous `$$'.",\r
187             "So I shall assume that you typed `$$' both times.");\r
188         back_error();\r
189       }\r
190     }\r
191 \r
192     cur_mlist = p;\r
193     cur_style = text_style;\r
194     mlist_penalties = false;\r
195     mlist_to_hlist();\r
196     a = hpack(link(temp_head), 0, 1);\r
197     unsave();\r
198     decr(save_ptr);\r
199 \r
200     if (saved(0) == 1)\r
201       l = true;\r
202 \r
203     danger = false;\r
204 \r
205     if ((font_params[fam_fnt(2 + text_size)] < total_mathsy_params) ||\r
206       (font_params[fam_fnt(2 + script_size)] < total_mathsy_params) ||\r
207       (font_params[fam_fnt(2 + script_script_size)] < total_mathsy_params))\r
208     {\r
209       print_err("Math formula deleted: Insufficient symbol fonts");\r
210       help3("Sorry, but I can't typeset math unless \\textfont 2",\r
211           "and \\scriptfont 2 and \\scriptscriptfont 2 have all",\r
212           "the \\fontdimen values needed in math symbol fonts.");\r
213       error();\r
214       flush_math();\r
215       danger = true;\r
216     }\r
217     else if ((font_params[fam_fnt(3 + text_size)] < total_mathex_params) ||\r
218       (font_params[fam_fnt(3 + script_size)] < total_mathex_params) ||\r
219       (font_params[fam_fnt(3 + script_script_size)] < total_mathex_params))\r
220     {\r
221       print_err("Math formula deleted: Insufficient extension fonts");\r
222       help3("Sorry, but I can't typeset math unless \\textfont 3",\r
223         "and \\scriptfont 3 and \\scriptscriptfont 3 have all",\r
224         "the \\fontdimen values needed in math extension fonts.");\r
225       error();\r
226       flush_math();\r
227       danger = true;\r
228     }\r
229 \r
230     m = mode;\r
231     p = fin_mlist(0);\r
232   }\r
233   else\r
234     a = 0;\r
235 \r
236   if (m < 0)\r
237   {\r
238     tail_append(new_math(math_surround, before));\r
239     cur_mlist = p;\r
240     cur_style = text_style;\r
241     mlist_penalties = (mode > 0);\r
242     mlist_to_hlist();\r
243     link(tail) = link(temp_head);\r
244 \r
245     while (link(tail) != 0)\r
246       tail = link(tail);\r
247 \r
248     tail_append(new_math(math_surround, after));\r
249     space_factor = 1000;\r
250     unsave();\r
251   }\r
252   else\r
253   {\r
254     if (a == 0)\r
255     {\r
256       get_x_token();\r
257 \r
258       if (cur_cmd != math_shift)\r
259       {\r
260         print_err("Display math should end with $$");\r
261         help2("The `$' that I just saw supposedly matches a previous `$$'.",\r
262             "So I shall assume that you typed `$$' both times.");\r
263         back_error();\r
264       }\r
265     }\r
266 \r
267     cur_mlist = p;\r
268     cur_style = display_style;\r
269     mlist_penalties = false;\r
270     mlist_to_hlist();\r
271     p = link(temp_head);\r
272     adjust_tail = adjust_head;\r
273     b = hpack(p, 0, 1);\r
274     p = list_ptr(b);\r
275     t = adjust_tail;\r
276     adjust_tail = 0;\r
277     w = width(b);\r
278     z = display_width;\r
279     s = display_indent;\r
280 \r
281     if ((a == 0) || danger)\r
282     {\r
283       e = 0;\r
284       q = 0;\r
285     }\r
286     else\r
287     {\r
288       e = width(a);\r
289       q = e + math_quad(text_size);\r
290     }\r
291 \r
292     if (w + q > z)\r
293     {\r
294       if ((e != 0) && ((w - total_shrink[normal] + q <= z) || (total_shrink[fil] != 0) ||\r
295         (total_shrink[fill] != 0) || (total_shrink[filll] != 0)))\r
296       {\r
297         free_node(b, box_node_size);\r
298         b = hpack(p, z - q, 0);\r
299       }\r
300       else\r
301       {\r
302         e = 0;\r
303 \r
304         if (w > z)\r
305         {\r
306           free_node(b, box_node_size);\r
307           b = hpack(p, z, 0);\r
308         }\r
309       }\r
310       w = width(b);\r
311     }\r
312 \r
313     d = half(z - w);\r
314 \r
315     if ((e > 0) && (d < 2 * e))\r
316     {\r
317       d = half(z - w - e);\r
318 \r
319       if (p != 0)\r
320         if (!is_char_node(p))\r
321           if (type(p) == glue_node)\r
322             d = 0;\r
323     }\r
324 \r
325     tail_append(new_penalty(pre_display_penalty));\r
326 \r
327     if ((d + s <= pre_display_size) || l)\r
328     {\r
329       g1 = above_display_skip_code;\r
330       g2 = below_display_skip_code;\r
331     }\r
332     else\r
333     {\r
334       g1 = above_display_short_skip_code;\r
335       g2 = below_display_short_skip_code;\r
336     }\r
337     if (l && (e == 0))\r
338     {\r
339       shift_amount(a) = s;\r
340       append_to_vlist(a);\r
341       tail_append(new_penalty(10000));\r
342     }\r
343     else\r
344     {\r
345       tail_append(new_param_glue(g1));\r
346     }\r
347 \r
348     if (e != 0)\r
349     {\r
350       r = new_kern(z - w - e - d);\r
351 \r
352       if (l)\r
353       {\r
354         link(a) = r;\r
355         link(r) = b;\r
356         b = a;\r
357         d = 0;\r
358       }\r
359       else\r
360       {\r
361         link(b) = r;\r
362         link(r) = a;\r
363       }\r
364       b = hpack(b, 0, 1);\r
365     }\r
366 \r
367     shift_amount(b) = s + d;\r
368     append_to_vlist(b);\r
369 \r
370     if ((a != 0) && (e == 0) && !l)\r
371     {\r
372       tail_append(new_penalty(10000));\r
373       shift_amount(a) = s + z - width(a);\r
374       append_to_vlist(a);\r
375       g2 = 0;\r
376     }\r
377 \r
378     if (t != adjust_head)\r
379     {\r
380       link(tail) = link(adjust_head);\r
381       tail = t;\r
382     }\r
383 \r
384     tail_append(new_penalty(post_display_penalty));\r
385 \r
386     if (g2 > 0)\r
387     {\r
388       tail_append(new_param_glue(g2));\r
389     }\r
390 \r
391     resume_after_display();\r
392   }\r
393 }\r
394 /* sec 1200 */\r
395 void resume_after_display (void)\r
396 {\r
397   if (cur_group != math_shift_group)\r
398   {\r
399     confusion("display");\r
400     return;\r
401   }\r
402 \r
403   unsave();\r
404   prev_graf = prev_graf + 3;\r
405   push_nest();\r
406   mode = hmode;\r
407   space_factor = 1000;\r
408   set_cur_lang();\r
409   clang = cur_lang;\r
410   prev_graf =(norm_min(left_hyphen_min) * 64 + norm_min(right_hyphen_min)) * 65536L + cur_lang;\r
411 \r
412   {\r
413     get_x_token();\r
414 \r
415     if (cur_cmd != spacer)\r
416       back_input();\r
417   }\r
418 \r
419   if (nest_ptr == 1)\r
420     build_page();\r
421 }\r
422 /* sec 1215 */\r
423 void get_r_token (void)\r
424 {\r
425 restart:\r
426   do\r
427     {\r
428       get_token();\r
429     }\r
430   while (!(cur_tok != space_token));\r
431 \r
432   if ((cur_cs == 0) || (cur_cs > frozen_control_sequence))\r
433   {\r
434     print_err("Missing control sequence inserted");\r
435     help5("Please don't say `\\def cs{...}', say `\\def\\cs{...}'.",\r
436       "I've inserted an inaccessible control sequence so that your",\r
437       "definition will be completed without mixing me up too badly.",\r
438       "You can recover graciously from this error, if you're",\r
439       "careful; see exercise 27.2 in The TeXbook.");\r
440 \r
441     if (cur_cs == 0)\r
442       back_input();\r
443 \r
444     cur_tok = cs_token_flag + frozen_protection;\r
445     ins_error();\r
446     goto restart;\r
447   }\r
448 }\r
449 /* sec 1229 */\r
450 void trap_zero_glue (void)\r
451 {\r
452   if ((width(cur_val) == 0) && (stretch(cur_val) == 0) && (shrink(cur_val) == 0))\r
453   {\r
454     add_glue_ref(zero_glue);\r
455     delete_glue_ref(cur_val);\r
456     cur_val = 0;\r
457   }\r
458 }\r
459 /* sec 1236 */\r
460 void do_register_command (small_number a)\r
461 {\r
462   pointer l, q, r, s;\r
463   char p;\r
464 \r
465   q = cur_cmd;\r
466 \r
467   {\r
468     if (q != tex_register)\r
469     {\r
470       get_x_token();\r
471 \r
472       if ((cur_cmd >= assign_int) && (cur_cmd <= assign_mu_glue))\r
473       {\r
474         l = cur_chr;\r
475         p = cur_cmd - assign_int;\r
476         goto found;\r
477       }\r
478 \r
479       if (cur_cmd != tex_register)\r
480       {\r
481         print_err("You can't use `");\r
482         print_cmd_chr(cur_cmd, cur_chr);\r
483         prints("' after ");\r
484         print_cmd_chr(q, 0);\r
485         help1("I'm forgetting what you said and not changing anything.");\r
486         error();\r
487         return;\r
488       }\r
489     }\r
490 \r
491     p = cur_chr;\r
492     scan_eight_bit_int();\r
493 \r
494     switch (p)\r
495     {\r
496       case int_val:\r
497         l = cur_val + count_base;\r
498         break;\r
499 \r
500       case dimen_val:\r
501         l = cur_val + scaled_base;\r
502         break;\r
503 \r
504       case glue_val:\r
505         l = cur_val + skip_base;\r
506         break;\r
507 \r
508       case mu_val:\r
509         l = cur_val + mu_skip_base;\r
510         break;\r
511     }\r
512   }\r
513 \r
514 found:\r
515   if (q == tex_register)\r
516     scan_optional_equals();\r
517   else if (scan_keyword("by"))\r
518     do_nothing();\r
519 \r
520   arith_error = false;\r
521 \r
522   if (q < multiply)\r
523     if (p < glue_val)\r
524     {\r
525       if (p == int_val)\r
526         scan_int();\r
527       else\r
528         scan_dimen(false, false, false);\r
529 \r
530       if (q == advance)\r
531         cur_val = cur_val + eqtb[l].cint;\r
532     }\r
533     else\r
534     {\r
535       scan_glue(p);\r
536 \r
537       if (q == advance)\r
538       {\r
539         q = new_spec(cur_val);\r
540         r = equiv(l);\r
541         delete_glue_ref(cur_val);\r
542         width(q) = width(q) + width(r);\r
543 \r
544         if (stretch(q) == 0)\r
545           stretch_order(q) = normal;\r
546 \r
547         if (stretch_order(q) == stretch_order(r))\r
548           stretch(q) = stretch(q) + stretch(r);\r
549         else if ((stretch_order(q) < stretch_order(r)) && (stretch(r) != 0))\r
550         {\r
551           stretch(q) = stretch(r);\r
552           stretch_order(q) = stretch_order(r);\r
553         }\r
554 \r
555         if (shrink(q) == 0)\r
556           shrink_order(q) = normal;\r
557 \r
558         if (shrink_order(q) == shrink_order(r))\r
559           shrink(q) = shrink(q) + shrink(r);\r
560         else if ((shrink_order(q) < shrink_order(r)) && (shrink(r) != 0))\r
561         {\r
562           shrink(q) = shrink(r);\r
563           shrink_order(q) = shrink_order(r);\r
564         }\r
565         cur_val = q;\r
566       }\r
567     }\r
568   else\r
569   {\r
570     scan_int();\r
571 \r
572     if (p < glue_val)\r
573       if (q == multiply)\r
574         if (p == int_val)\r
575           cur_val = mult_integers(eqtb[l].cint, cur_val);\r
576         else\r
577           cur_val = nx_plus_y(eqtb[l].cint, cur_val, 0);\r
578       else\r
579         cur_val = x_over_n(eqtb[l].cint, cur_val);\r
580     else\r
581     {\r
582       s = equiv(l);\r
583       r = new_spec(s);\r
584 \r
585       if (q == multiply)\r
586       {\r
587         width(r) = nx_plus_y(width(s), cur_val, 0);\r
588         stretch(r) = nx_plus_y(stretch(s), cur_val, 0);\r
589         shrink(r) = nx_plus_y(shrink(s), cur_val, 0);\r
590       }\r
591       else\r
592       {\r
593         width(r) = x_over_n(width(s), cur_val);\r
594         stretch(r) = x_over_n(stretch(s), cur_val);\r
595         shrink(r) = x_over_n(shrink(s), cur_val);\r
596       }\r
597       cur_val = r;\r
598     }\r
599   }\r
600 \r
601   if (arith_error)\r
602   {\r
603     print_err("Arithmetic overflow");\r
604     help2("I can't carry out that multiplication or division,",\r
605         "since the result is out of range.");\r
606 \r
607     if (p >= glue_val)\r
608       delete_glue_ref(cur_val);\r
609 \r
610     error();\r
611     return;\r
612   }\r
613 \r
614   if (p < glue_val)\r
615     word_define(l, cur_val);\r
616   else\r
617   {\r
618     trap_zero_glue();\r
619     define(l, glue_ref, cur_val);\r
620   }\r
621 }\r
622 /* sec 1243 */\r
623 void alter_aux (void)\r
624 {\r
625   halfword c;\r
626 \r
627   if (cur_chr != abs(mode))\r
628     report_illegal_case();\r
629   else\r
630   {\r
631     c = cur_chr;\r
632     scan_optional_equals();\r
633 \r
634     if (c == vmode)\r
635     {\r
636       scan_dimen(false, false, false);\r
637       prev_depth = cur_val;\r
638     }\r
639     else\r
640     {\r
641       scan_int();\r
642 \r
643       if ((cur_val <= 0) || (cur_val > 32767))\r
644       {\r
645         print_err("Bad space factor");\r
646         help1("I allow only values in the range 1..32767 here.");\r
647         int_error(cur_val);\r
648       }\r
649       else\r
650         space_factor = cur_val;\r
651     }\r
652   }\r
653 }\r
654 /* sec 1244 */\r
655 void alter_prev_graf (void)\r
656 {\r
657   integer p;\r
658 \r
659   nest[nest_ptr] = cur_list;\r
660   p = nest_ptr;\r
661 \r
662   while (abs(nest[p].mode_field) != vmode)\r
663     decr(p);\r
664 \r
665   scan_optional_equals();\r
666   scan_int();\r
667 \r
668   if (cur_val < 0)\r
669   {\r
670     print_err("Bad ");\r
671     print_esc("prevgraf");\r
672     help1("I allow only nonnegative values here.");\r
673     int_error(cur_val);\r
674   }\r
675   else\r
676   {\r
677     nest[p].pg_field = cur_val;\r
678     cur_list = nest[nest_ptr];\r
679   }\r
680 }\r
681 /* sec 1245 */\r
682 void alter_page_so_far (void)\r
683 {\r
684   char c;\r
685 \r
686   c = cur_chr;\r
687   scan_optional_equals();\r
688   scan_dimen(false, false, false);\r
689   page_so_far[c] = cur_val;\r
690 }\r
691 /* sec 1246 */\r
692 void alter_integer (void)\r
693 {\r
694   char c;\r
695 \r
696   c = cur_chr;\r
697   scan_optional_equals();\r
698   scan_int();\r
699 \r
700   if (c == 0)\r
701     dead_cycles = cur_val;\r
702   else\r
703     insert_penalties = cur_val;\r
704 }\r
705 /* sec 1247 */\r
706 void alter_box_dimen (void)\r
707 {\r
708   small_number c;\r
709   eight_bits b;\r
710 \r
711   c = cur_chr;\r
712   scan_eight_bit_int();\r
713   b = cur_val;\r
714   scan_optional_equals();\r
715   scan_dimen(false, false, false);\r
716 \r
717   if (box(b) != 0)\r
718     mem[box(b) + c].cint = cur_val;\r
719 }\r
720 /* sec 1257 */\r
721 void new_font (small_number a)\r
722 {\r
723   pointer u;\r
724   scaled s;\r
725   internal_font_number f;\r
726   str_number t;\r
727   char old_setting;\r
728   str_number flushable_string;\r
729 \r
730   if (job_name == 0)\r
731     open_log_file();\r
732 \r
733   get_r_token();\r
734   u = cur_cs;\r
735 \r
736   if (u >= hash_base)\r
737     t = text(u);\r
738   else if (u >= single_base)\r
739     if (u == null_cs)\r
740       t = 1213; /* FONT */\r
741     else\r
742       t = u - single_base;\r
743   else\r
744   {\r
745     old_setting = selector;\r
746     selector = new_string;\r
747     prints("FONT");\r
748     print(u - active_base);\r
749     selector = old_setting;\r
750     str_room(1);\r
751     t = make_string();\r
752   }\r
753 \r
754   define(u, set_font, null_font);\r
755   scan_optional_equals();\r
756   scan_file_name();\r
757 \r
758   name_in_progress = true;\r
759 \r
760   if (scan_keyword("at"))\r
761   {\r
762     scan_dimen(false, false, false);\r
763     s = cur_val; \r
764 \r
765     if ((s <= 0) || (s >= 134217728L)) /* 2^27 */\r
766     {\r
767       print_err("Improper `at' size (");\r
768       print_scaled(s);\r
769       prints("pt), replaced by 10pt");\r
770       help2("I can only handle fonts at positive sizes that are",\r
771         "less than 2048pt, so I've changed what you said to 10pt.");\r
772       error();\r
773       s = 10 * unity;\r
774     }\r
775   }\r
776   else if (scan_keyword("scaled"))\r
777   {\r
778     scan_int();\r
779     s = -cur_val;\r
780 \r
781     if ((cur_val <= 0) || (cur_val > 32768L))\r
782     {\r
783       print_err("Illegal magnification has been changed to 1000");\r
784       help1("The magnification ratio must be between 1 and 32768.");\r
785       int_error(cur_val);\r
786       s = -1000;\r
787     }\r
788   }\r
789   else\r
790     s = -1000;\r
791 \r
792   name_in_progress = false;\r
793 \r
794   flushable_string = str_ptr - 1;\r
795 \r
796   if (trace_flag)\r
797   {\r
798     int i, k1, k2, l1, l2;\r
799     char *sch = log_line;\r
800     k1 = str_start[cur_area];\r
801     k2 = str_start[cur_name];\r
802     l1 = length(cur_area);\r
803     l2 = length(cur_name);\r
804     wterm_cr();\r
805     puts("FONT ");\r
806 \r
807     for (i = 0; i < l1; i++)\r
808     {\r
809       *sch++ = str_pool[i + k1];\r
810     }\r
811 \r
812     for (i = 0; i < l2; i++)\r
813     {\r
814       *sch++ = str_pool[i + k2];\r
815     }\r
816 \r
817     *sch++ = ' ';\r
818     *sch++ = '\0';\r
819     show_line(log_line, 0);\r
820   }\r
821 \r
822   for (f = font_base + 1; f < font_ptr; f++)\r
823   {\r
824     if (str_eq_str(font_name[f], cur_name) && str_eq_str(font_area[f], cur_area))\r
825     {\r
826       if (cur_name == flushable_string)\r
827       {\r
828         flush_string();\r
829         cur_name = font_name[f];\r
830       }\r
831 \r
832       if (s > 0)\r
833       {\r
834         if (s == font_size[f])\r
835         {\r
836           if (ignore_frozen == 0 || f > frozen_font_ptr)\r
837           {\r
838             if (trace_flag)\r
839               printf("SKIPPING %lld ", s);\r
840 \r
841             goto common_ending;\r
842           }\r
843         }\r
844       }\r
845       else if (font_size[f] == xn_over_d(font_dsize[f], - (integer) s, 1000))\r
846       {\r
847         if (ignore_frozen == 0 || f > frozen_font_ptr)\r
848         {\r
849           if (trace_flag)\r
850             printf("SKIPPING %lld ", s);\r
851           goto common_ending;\r
852         }\r
853       }\r
854     }\r
855   }\r
856 \r
857   if (trace_flag)\r
858     show_line("READING ", 0);\r
859 \r
860   f = read_font_info(u, cur_name, cur_area, s); \r
861 \r
862 common_ending:\r
863   if (trace_flag)\r
864     printf("NEW FONT %lld ", f);\r
865 \r
866   equiv(u) = f;\r
867   eqtb[font_id_base + f] = eqtb[u];\r
868   font_id_text(f) = t;\r
869 }\r
870 /* sec 1265 */\r
871 void new_interaction (void)\r
872 {\r
873   print_ln();\r
874   interaction = cur_chr;\r
875 \r
876   if (interaction == batch_mode)\r
877     selector = no_print;\r
878   else\r
879     selector = term_only;\r
880 \r
881   if (log_opened)\r
882     selector = selector + 2;\r
883 }\r
884 /* sec 1270 */\r
885 void do_assignments (void)\r
886 {\r
887   while (true)\r
888   {\r
889     do\r
890       {\r
891         get_x_token();\r
892       }\r
893     while (!((cur_cmd != spacer) && (cur_cmd != relax)));\r
894 \r
895     if (cur_cmd <= max_non_prefixed_command)\r
896       return;\r
897 \r
898     set_box_allowed = false;\r
899     prefixed_command();\r
900     set_box_allowed = true;\r
901   }\r
902 }\r
903 /* sec 1275 */\r
904 void open_or_close_in (void)\r
905 {\r
906   char c;\r
907   char n;\r
908 \r
909   c = cur_chr;\r
910   scan_four_bit_int();\r
911   n = cur_val;\r
912 \r
913   if (read_open[n] != closed)\r
914   {\r
915     a_close(read_file[n]);\r
916     read_open[n] = closed;\r
917   }\r
918 \r
919   if (c != 0)\r
920   {\r
921     scan_optional_equals();\r
922     scan_file_name();\r
923     pack_file_name(cur_name, cur_area, cur_ext);\r
924 \r
925     if ((cur_ext != 335) && a_open_in(read_file[n], kpse_tex_format))\r
926       read_open[n] = 1;\r
927     else if ((cur_ext != 785) && (name_length + 5 < file_name_size))\r
928     {\r
929       strncpy((char *) name_of_file + name_length + 1, ".tex ", 5);\r
930       name_length = name_length + 4;\r
931 \r
932       if (a_open_in(read_file[n], kpse_tex_format))\r
933         read_open[n] = just_open;\r
934       else\r
935       {\r
936         name_length = name_length - 4;\r
937         name_of_file[name_length + 1] = ' ';\r
938 \r
939         if ((cur_ext == 335) && a_open_in(read_file[n], kpse_tex_format))\r
940           read_open[n] = just_open;\r
941       }\r
942     }\r
943   }\r
944 }\r
945 /* sec 1279 */\r
946 void issue_message (void)\r
947 {\r
948   char old_setting;\r
949   char c;\r
950   str_number s;\r
951 \r
952   c = cur_chr;\r
953   link(garbage) = scan_toks(false, true);\r
954   old_setting = selector;\r
955   selector = new_string;\r
956   token_show(def_ref);\r
957   selector = old_setting;\r
958   flush_list(def_ref);\r
959   str_room(1);\r
960   s = make_string();\r
961 \r
962   if (c == 0)\r
963   {\r
964     if (term_offset + length(s) > max_print_line - 2)\r
965       print_ln();\r
966     else if ((term_offset > 0) || (file_offset > 0))\r
967       print_char(' ');\r
968 \r
969     slow_print(s);\r
970     update_terminal();\r
971   }\r
972   else\r
973   {\r
974     print_err("");\r
975     slow_print(s);\r
976 \r
977     if (err_help != 0)\r
978       use_err_help = true;\r
979     else if (long_help_seen)\r
980       help1("(That was another \\errmessage.)");\r
981     else\r
982     {\r
983       if (interaction < error_stop_mode)\r
984         long_help_seen = true;\r
985 \r
986       help4("This error message was generated by an \\errmessage",\r
987         "command, so I can't give any explicit help.",\r
988         "Pretend that you're Hercule Poirot: Examine all clues,",\r
989         "and deduce the truth by order and method.");\r
990     }\r
991 \r
992     error();\r
993     use_err_help = false;\r
994   }\r
995 \r
996   flush_string();\r
997 }\r
998 /* sec 1288 */\r
999 void shift_case (void)\r
1000 {\r
1001   pointer b;\r
1002   pointer p;\r
1003   halfword t;\r
1004   eight_bits c;\r
1005 \r
1006   b = cur_chr;\r
1007   p = scan_toks(false, false);\r
1008   p = link(def_ref);\r
1009 \r
1010   while (p != 0)\r
1011   {\r
1012     t = info(p); \r
1013 \r
1014     if (t < cs_token_flag + single_base)\r
1015     {\r
1016       c = t % 256;\r
1017 \r
1018       if (equiv(b + c) != 0)\r
1019         info(p) = t - c + equiv(b + c);\r
1020     }\r
1021 \r
1022     p = link(p);\r
1023   }\r
1024 \r
1025   begin_token_list(link(def_ref), 3);\r
1026   free_avail(def_ref);\r
1027 }\r
1028 /* sec 1293 */\r
1029 void show_whatever (void)\r
1030 {\r
1031   pointer p;\r
1032 \r
1033   switch (cur_chr)\r
1034   {\r
1035     case show_lists:\r
1036       {\r
1037         begin_diagnostic();\r
1038         show_activities();\r
1039       }\r
1040       break;\r
1041 \r
1042     case show_box_code:\r
1043       {\r
1044         scan_eight_bit_int();\r
1045         begin_diagnostic();\r
1046         print_nl("> \\box");\r
1047         print_int(cur_val);\r
1048         print_char('=');\r
1049 \r
1050         if (box(cur_val) == 0)\r
1051           prints("void");\r
1052         else\r
1053           show_box(box(cur_val));\r
1054       }\r
1055       break;\r
1056 \r
1057     case show_code:\r
1058       {\r
1059         get_token();\r
1060 \r
1061         if (interaction == error_stop_mode)\r
1062           do_nothing();\r
1063 \r
1064         print_nl("> ");\r
1065 \r
1066         if (cur_cs != 0)\r
1067         {\r
1068           sprint_cs(cur_cs);\r
1069           print_char('=');\r
1070         }\r
1071 \r
1072         print_meaning();\r
1073         goto common_ending;\r
1074       }\r
1075       break;\r
1076 \r
1077     default:\r
1078       {\r
1079         p = the_toks();\r
1080 \r
1081         if (interaction == error_stop_mode)\r
1082           do_nothing();\r
1083 \r
1084         print_nl("> ");\r
1085         token_show(temp_head);\r
1086         flush_list(link(temp_head));\r
1087         goto common_ending;\r
1088       }\r
1089       break;\r
1090   }\r
1091 \r
1092   end_diagnostic(true);\r
1093   print_err("OK");\r
1094 \r
1095   if (selector == term_and_log)\r
1096     if (tracing_online <= 0)\r
1097     {\r
1098       selector = term_only;\r
1099       prints(" (see the transcript file)");\r
1100       selector = term_and_log;\r
1101     }\r
1102 \r
1103 common_ending:\r
1104 \r
1105   if (interaction < error_stop_mode)\r
1106   {\r
1107     help_ptr = 0;\r
1108     decr(error_count);\r
1109   }\r
1110   else if (tracing_online > 0)\r
1111   {\r
1112     help3("This isn't an error message; I'm just \\showing something.",\r
1113       "Type `I\\show...' to show more (e.g., \\show\\cs,",\r
1114       "\\showthe\\count10, \\showbox255, \\showlists).");\r
1115   }\r
1116   else\r
1117   {\r
1118     help5("This isn't an error message; I'm just \\showing something.",\r
1119       "Type `I\\show...' to show more (e.g., \\show\\cs,",\r
1120       "\\showthe\\count10, \\showbox255, \\showlists).",\r
1121       "And type `I\\tracingonline=1\\show...' to show boxes and",\r
1122       "lists on your terminal as well as in the transcript file.");\r
1123   }\r
1124 \r
1125   error();\r
1126 }\r
1127 /* sec 1349 */\r
1128 void new_whatsit_(small_number s, small_number w)\r
1129 {\r
1130   pointer p;\r
1131 \r
1132   p = get_node(w);\r
1133   type(p) = whatsit_node;\r
1134   subtype(p) = s;\r
1135   link(tail) = p;\r
1136   tail = p;\r
1137 }\r
1138 /* sec 1350 */\r
1139 void new_write_whatsit (small_number w)\r
1140 {\r
1141   new_whatsit(cur_chr, w);\r
1142 \r
1143   if (w != write_node_size)\r
1144     scan_four_bit_int();\r
1145   else\r
1146   {\r
1147     scan_int();\r
1148 \r
1149     if (cur_val < 0)\r
1150       cur_val = 17;\r
1151     else if (cur_val > 15)\r
1152       cur_val = 16;\r
1153   }\r
1154 \r
1155   write_stream(tail) = cur_val;\r
1156 }\r
1157 /* sec 1348 */\r
1158 void do_extension (void)\r
1159 {\r
1160   integer k;\r
1161   pointer p;\r
1162 \r
1163   switch (cur_chr)\r
1164   {\r
1165     case open_node:\r
1166       {\r
1167         new_write_whatsit(open_node_size);\r
1168         scan_optional_equals();\r
1169         scan_file_name();\r
1170         open_name(tail) = cur_name;\r
1171         open_area(tail) = cur_area;\r
1172         open_ext(tail) = cur_ext;\r
1173       }\r
1174       break;\r
1175 \r
1176     case write_node:\r
1177       {\r
1178         k = cur_cs;\r
1179         new_write_whatsit(write_node_size);\r
1180         cur_cs = k;\r
1181         p = scan_toks(false, false);\r
1182         write_tokens(tail) = def_ref;\r
1183       }\r
1184       break;\r
1185 \r
1186     case close_node:\r
1187       {\r
1188         new_write_whatsit(write_node_size);\r
1189         write_tokens(tail) = 0;\r
1190       }\r
1191       break;\r
1192 \r
1193     case special_node:\r
1194       {\r
1195         new_whatsit(special_node, write_node_size);\r
1196         write_stream(tail) = 0;\r
1197         p = scan_toks(false, true);\r
1198         write_tokens(tail) = def_ref;\r
1199       }\r
1200       break;\r
1201 \r
1202     case immediate_code:\r
1203       {\r
1204         get_x_token();\r
1205 \r
1206         if ((cur_cmd == extension) && (cur_chr <= close_node))\r
1207         {\r
1208           p = tail;\r
1209           do_extension();\r
1210           out_what(tail);\r
1211           flush_node_list(tail);\r
1212           tail = p;\r
1213           link(p) = 0;\r
1214         }\r
1215         else\r
1216           back_input();\r
1217       }\r
1218       break;\r
1219 \r
1220     case set_language_code:\r
1221       if (abs(mode) != hmode)\r
1222       {\r
1223         report_illegal_case();\r
1224       }\r
1225       else\r
1226       {\r
1227         new_whatsit(language_node, small_node_size);\r
1228         scan_int();\r
1229 \r
1230         if (cur_val <= 0)\r
1231           clang = 0;\r
1232         else if (cur_val > 255)\r
1233           clang = 0;\r
1234         else\r
1235           clang = cur_val;\r
1236 \r
1237         what_lang(tail) = clang;\r
1238         what_lhm(tail) = norm_min(left_hyphen_min);\r
1239         what_rhm(tail) = norm_min(right_hyphen_min);\r
1240       }\r
1241       break;\r
1242 \r
1243     default:\r
1244       {\r
1245         confusion("ext1");\r
1246         return;\r
1247       }\r
1248       break;\r
1249   }\r
1250 }\r
1251 /* sec 1376 */\r
1252 void fix_language (void)\r
1253 {\r
1254   /* ASCII_code l; */\r
1255   int l;\r
1256 \r
1257   if (language <= 0)\r
1258     l = 0; \r
1259   else if (language > 255)\r
1260     l = 0;\r
1261   else\r
1262     l = language;\r
1263 \r
1264   if (l != clang)\r
1265   {\r
1266     new_whatsit(language_node, small_node_size);\r
1267     what_lang(tail) = l;\r
1268     clang = l;\r
1269     what_lhm(tail) = norm_min(left_hyphen_min);\r
1270     what_rhm(tail) = norm_min(right_hyphen_min);\r
1271   }\r
1272 }\r
1273 /* sec 1068 */\r
1274 void handle_right_brace (void)\r
1275 {\r
1276   pointer p, q;\r
1277   scaled d;\r
1278   integer f;\r
1279 \r
1280   switch (cur_group)\r
1281   {\r
1282     case simple_group:\r
1283       unsave();\r
1284       break;\r
1285 \r
1286     case bottom_level:\r
1287       {\r
1288         print_err("Too many }'s");\r
1289         help2("You've closed more groups than you opened.",\r
1290           "Such booboos are generally harmless, so keep going.");\r
1291         error();\r
1292       }\r
1293       break;\r
1294 \r
1295     case semi_simple_group:\r
1296     case math_shift_group:\r
1297     case math_left_group:\r
1298       extra_right_brace();\r
1299       break;\r
1300 \r
1301     case hbox_group:\r
1302       package(0);\r
1303       break;\r
1304 \r
1305     case adjust_hbox_group:\r
1306       {\r
1307         adjust_tail = adjust_head;\r
1308         package(0);\r
1309       }\r
1310       break;\r
1311 \r
1312     case vbox_group:\r
1313       {\r
1314         end_graf();\r
1315         package(0);\r
1316       }\r
1317       break;\r
1318 \r
1319     case vtop_group:\r
1320       {\r
1321         end_graf();\r
1322         package(vtop_code);\r
1323       }\r
1324       break;\r
1325 \r
1326     case insert_group:\r
1327       {\r
1328         end_graf();\r
1329         q = split_top_skip;\r
1330         add_glue_ref(q);\r
1331         d = split_max_depth;\r
1332         f = floating_penalty;\r
1333         unsave();\r
1334         decr(save_ptr);\r
1335         p = vpackage(link(head), 0, 1, max_dimen);\r
1336         pop_nest();\r
1337 \r
1338         if (saved(0) < 255)\r
1339         {\r
1340           tail_append(get_node(ins_node_size));\r
1341           type(tail) = ins_node;\r
1342           subtype(tail) = saved(0);\r
1343           height(tail) = height(p) + depth(p);\r
1344           ins_ptr(tail) = list_ptr(p);\r
1345           split_top_ptr(tail) = q;\r
1346           depth(tail) = d;\r
1347           float_cost(tail) = f;\r
1348         }\r
1349         else\r
1350         {\r
1351           tail_append(get_node(small_node_size));\r
1352           type(tail) = adjust_node;\r
1353           subtype(tail) = 0;\r
1354           adjust_ptr(tail) = list_ptr(p);\r
1355           delete_glue_ref(q);\r
1356         }\r
1357         free_node(p, box_node_size);\r
1358 \r
1359         if (nest_ptr == 0)\r
1360           build_page();\r
1361       }\r
1362       break;\r
1363 \r
1364     case output_group:\r
1365       {\r
1366         if ((loc != 0) || ((token_type != output_text) && (token_type != backed_up)))\r
1367         {\r
1368           print_err("Unbalanced output routine");\r
1369           help2("Your sneaky output routine has problematic {'s and/or }'s.",\r
1370             "I can't handle that very well; good luck.");\r
1371           error();\r
1372 \r
1373           do\r
1374             {\r
1375               get_token();\r
1376             }\r
1377           while (!(loc == 0));\r
1378         }\r
1379 \r
1380         end_token_list();\r
1381         end_graf();\r
1382         unsave();\r
1383         output_active = false;\r
1384         insert_penalties = 0;\r
1385 \r
1386         if (box(255) != 0)\r
1387         {\r
1388           print_err("Output routine didn't use all of ");\r
1389           print_esc("box");\r
1390           print_int(255);\r
1391           help3("Your \\output commands should empty \\box255,",\r
1392             "e.g., by saying `\\shipout\\box255'.",\r
1393             "Proceed; I'll discard its present contents.");\r
1394           box_error(255);\r
1395         }\r
1396 \r
1397         if (tail != head)\r
1398         {\r
1399           link(page_tail) = link(head);\r
1400           page_tail = tail;\r
1401         }\r
1402 \r
1403         if (link(page_head) != 0)\r
1404         {\r
1405           if (link(contrib_head) == 0)\r
1406             nest[0].tail_field = page_tail;\r
1407 \r
1408           link(page_tail) = link(contrib_head);\r
1409           link(contrib_head) = link(page_head);\r
1410           link(page_head) = 0;\r
1411           page_tail = page_head;\r
1412         }\r
1413 \r
1414         pop_nest();\r
1415         build_page();\r
1416       }\r
1417       break;\r
1418 \r
1419     case disc_group:\r
1420       build_discretionary();\r
1421       break;\r
1422 \r
1423     case align_group:\r
1424       {\r
1425         back_input();\r
1426         cur_tok = cs_token_flag + frozen_cr;\r
1427         print_err("Missing ");\r
1428         print_esc("cr");\r
1429         prints("inserted");\r
1430         help1("I'm guessing that you meant to end an alignment here.");\r
1431         ins_error();\r
1432       }\r
1433       break;\r
1434 \r
1435     case no_align_group:\r
1436       {\r
1437         end_graf();\r
1438         unsave();\r
1439         align_peek();\r
1440       }\r
1441       break;\r
1442 \r
1443     case vcenter_group:\r
1444       {\r
1445         end_graf();\r
1446         unsave();\r
1447         save_ptr = save_ptr - 2;\r
1448         p = vpackage(link(head), saved(1), saved(0), max_dimen);\r
1449         pop_nest();\r
1450         tail_append(new_noad());\r
1451         type(tail) = vcenter_noad;\r
1452         math_type(nucleus(tail)) = sub_box;\r
1453         info(nucleus(tail)) = p;\r
1454       }\r
1455       break;\r
1456 \r
1457     case math_choice_group:\r
1458       build_choices();\r
1459       break;\r
1460 \r
1461     case math_group:\r
1462       {\r
1463         unsave();\r
1464         decr(save_ptr);\r
1465         math_type(saved(0)) = sub_mlist;\r
1466         p = fin_mlist(0);\r
1467         info(saved(0)) = p;\r
1468 \r
1469         if (p != 0)\r
1470           if (link(p) == 0)\r
1471             if (type(p) == ord_noad)\r
1472             {\r
1473               if (math_type(subscr(p)) == 0)\r
1474                 if (math_type(supscr(p)) == 0)\r
1475                 {\r
1476                   mem[saved(0)].hh = mem[nucleus(p)].hh;\r
1477                   free_node(p, noad_size);\r
1478                 }\r
1479             }\r
1480             else if (type(p) == accent_noad)\r
1481               if (saved(0) == nucleus(tail))\r
1482                 if (type(tail) == ord_noad)\r
1483                 {\r
1484                   q = head;\r
1485 \r
1486                   while (link(q) != tail)\r
1487                     q = link(q);\r
1488 \r
1489                   link(q) = p;\r
1490                   free_node(tail, noad_size);\r
1491                   tail = p;\r
1492                 }\r
1493       }\r
1494       break;\r
1495     default:\r
1496       {\r
1497         confusion("rightbrace");\r
1498         return;\r
1499       }\r
1500       break;\r
1501   }\r
1502 }\r
1503 /* sec 1030 */\r
1504 void main_control (void) \r
1505 {\r
1506   integer t;\r
1507   boolean bSuppress;\r
1508 \r
1509   if (every_job != 0)\r
1510     begin_token_list(every_job, every_job_text);\r
1511 \r
1512 big_switch:\r
1513   get_x_token();\r
1514 \r
1515 reswitch:\r
1516   if (interrupt != 0)\r
1517     if (OK_to_interrupt)\r
1518     {\r
1519       back_input();\r
1520       check_interrupt();\r
1521       goto big_switch;\r
1522     }\r
1523 \r
1524 #ifdef DEBUG\r
1525   if (panicking)\r
1526     check_mem(false);\r
1527 #endif\r
1528 \r
1529   if (tracing_commands > 0)\r
1530     show_cur_cmd_chr();\r
1531 \r
1532   switch (abs(mode) + cur_cmd)\r
1533   {\r
1534     case hmode + letter:\r
1535     case hmode + other_char:\r
1536     case hmode + char_given:\r
1537       goto main_loop;\r
1538       break;\r
1539 \r
1540     case hmode + char_num:\r
1541       {\r
1542         scan_char_num();\r
1543         cur_chr = cur_val;\r
1544         goto main_loop;\r
1545       }\r
1546       break;\r
1547 \r
1548     case hmode + no_boundary:\r
1549       {\r
1550         get_x_token();\r
1551 \r
1552         if ((cur_cmd == letter) || (cur_cmd == other_char) ||\r
1553           (cur_cmd == char_given) || (cur_cmd == char_num))\r
1554           cancel_boundary = true;\r
1555         goto reswitch;\r
1556       }\r
1557       break;\r
1558 \r
1559     case hmode + spacer:\r
1560       if (space_factor == 1000)\r
1561         goto append_normal_space;\r
1562       else\r
1563         app_space();\r
1564       break;\r
1565 \r
1566     case hmode + ex_space:\r
1567     case mmode + ex_space:\r
1568       goto append_normal_space;\r
1569       break;\r
1570 \r
1571     case any_mode(relax):\r
1572     case vmode + spacer:\r
1573     case mmode + spacer:\r
1574     case mmode + no_boundary:\r
1575       do_nothing();\r
1576       break;\r
1577 \r
1578     case any_mode(ignore_spaces):\r
1579       {\r
1580         do\r
1581           {\r
1582             get_x_token();\r
1583           }\r
1584         while (!(cur_cmd != spacer));\r
1585         goto reswitch;\r
1586       }\r
1587       break;\r
1588 \r
1589     case vmode + stop:\r
1590       if (its_all_over())\r
1591         return;\r
1592       break;\r
1593 \r
1594     case vmode + vmove:\r
1595     case hmode + hmove:\r
1596     case mmode + hmove:\r
1597     case any_mode(last_item):\r
1598     case vmode + vadjust:\r
1599     case vmode + ital_corr:\r
1600     case non_math(eq_no):\r
1601     case any_mode(mac_param):\r
1602       report_illegal_case();\r
1603       break;\r
1604 \r
1605     case non_math(sup_mark):\r
1606     case non_math(sub_mark):\r
1607     case non_math(math_char_num):\r
1608     case non_math(math_given):\r
1609     case non_math(math_comp):\r
1610     case non_math(delim_num):\r
1611     case non_math(left_right):\r
1612     case non_math(above):\r
1613     case non_math(radical):\r
1614     case non_math(math_style):\r
1615     case non_math(math_choice):\r
1616     case non_math(vcenter):\r
1617     case non_math(non_script):\r
1618     case non_math(mkern):\r
1619     case non_math(limit_switch):\r
1620     case non_math(mskip):\r
1621     case non_math(math_accent):\r
1622     case mmode + endv:\r
1623     case mmode + par_end:\r
1624     case mmode + stop:\r
1625     case mmode + vskip:\r
1626     case mmode + un_vbox:\r
1627     case mmode + valign:\r
1628     case mmode + hrule:\r
1629       insert_dollar_sign();\r
1630       break;\r
1631 \r
1632     case vmode + hrule:\r
1633     case hmode + vrule:\r
1634     case mmode + vrule:\r
1635       {\r
1636         tail_append(scan_rule_spec());\r
1637 \r
1638         if (abs(mode) == vmode)\r
1639           prev_depth = ignore_depth;\r
1640         else if (abs(mode) == hmode)\r
1641           space_factor = 1000;\r
1642       }\r
1643       break;\r
1644 \r
1645     case vmode + vskip:\r
1646     case hmode + hskip:\r
1647     case mmode + hskip:\r
1648     case mmode + mskip:\r
1649       append_glue();\r
1650       break;\r
1651 \r
1652     case any_mode(kern):\r
1653     case mmode + mkern:\r
1654       append_kern();\r
1655       break;\r
1656 \r
1657     case non_math(left_brace):\r
1658       new_save_level(simple_group);\r
1659       break;\r
1660 \r
1661     case any_mode(begin_group):\r
1662       new_save_level(semi_simple_group);\r
1663       break;\r
1664 \r
1665     case any_mode(end_group):\r
1666       if (cur_group == semi_simple_group)\r
1667         unsave();\r
1668       else\r
1669         off_save();\r
1670       break;\r
1671 \r
1672     case any_mode(right_brace):\r
1673       handle_right_brace();\r
1674       break;\r
1675 \r
1676     case vmode + hmove:\r
1677     case hmode + vmove:\r
1678     case mmode + vmove:\r
1679       {\r
1680         t = cur_chr;\r
1681         scan_dimen(false, false, false);\r
1682 \r
1683         if (t == 0)\r
1684           scan_box(cur_val);\r
1685         else\r
1686           scan_box(- (integer) cur_val);\r
1687       }\r
1688       break;\r
1689 \r
1690     case any_mode(leader_ship):\r
1691       scan_box(leader_flag - a_leaders + cur_chr);\r
1692       break;\r
1693 \r
1694     case any_mode(make_box):\r
1695       begin_box(0);\r
1696       break;\r
1697 \r
1698     case vmode + start_par:\r
1699       new_graf(cur_chr > 0);\r
1700       break;\r
1701 \r
1702     case vmode + letter:\r
1703     case vmode + other_char:\r
1704     case vmode + char_num:\r
1705     case vmode + char_given:\r
1706     case vmode + math_shift:\r
1707     case vmode + un_hbox:\r
1708     case vmode + vrule:\r
1709     case vmode + accent:\r
1710     case vmode + discretionary:\r
1711     case vmode + hskip:\r
1712     case vmode + valign:\r
1713     case vmode + ex_space:\r
1714     case vmode + no_boundary:\r
1715       {\r
1716         back_input();\r
1717         new_graf(true);\r
1718       }\r
1719       break;\r
1720 \r
1721     case hmode + start_par:\r
1722     case mmode + start_par:\r
1723       indent_in_hmode();\r
1724       break;\r
1725 \r
1726     case vmode + par_end:\r
1727       {\r
1728         normal_paragraph();\r
1729 \r
1730         if (mode > 0)\r
1731           build_page();\r
1732       }\r
1733       break;\r
1734 \r
1735     case hmode + par_end:\r
1736       {\r
1737         if (align_state < 0)\r
1738           off_save();\r
1739 \r
1740         end_graf();\r
1741 \r
1742         if (mode == 1)\r
1743           build_page();\r
1744       }\r
1745       break;\r
1746 \r
1747     case hmode + stop:\r
1748     case hmode + vskip:\r
1749     case hmode + hrule:\r
1750     case hmode + un_vbox:\r
1751     case hmode + halign:\r
1752       head_for_vmode();\r
1753       break;\r
1754 \r
1755     case any_mode(insert):\r
1756     case hmode + vadjust:\r
1757     case mmode + vadjust:\r
1758       begin_insert_or_adjust();\r
1759       break;\r
1760 \r
1761     case any_mode(mark):\r
1762       make_mark();\r
1763       break;\r
1764 \r
1765     case any_mode(break_penalty):\r
1766       append_penalty();\r
1767       break;\r
1768 \r
1769     case any_mode(remove_item):\r
1770       delete_last();\r
1771       break;\r
1772 \r
1773     case vmode + un_vbox:\r
1774     case hmode + un_hbox:\r
1775     case mmode + un_hbox:\r
1776       unpackage();\r
1777       break;\r
1778 \r
1779     case hmode + ital_corr:\r
1780       append_italic_correction();\r
1781       break;\r
1782 \r
1783     case mmode + ital_corr:\r
1784       tail_append(new_kern(0));\r
1785       break;\r
1786 \r
1787     case hmode + discretionary:\r
1788     case mmode + discretionary:\r
1789       append_discretionary();\r
1790       break;\r
1791 \r
1792     case hmode + accent:\r
1793       make_accent();\r
1794       break;\r
1795 \r
1796     case any_mode(car_ret):\r
1797     case any_mode(tab_mark):\r
1798       align_error();\r
1799       break;\r
1800 \r
1801     case any_mode(no_align):\r
1802       noalign_error();\r
1803       break;\r
1804 \r
1805     case any_mode(omit):\r
1806       omit_error();\r
1807       break;\r
1808 \r
1809     case vmode + halign:\r
1810     case hmode + valign:\r
1811       init_align();\r
1812       break;\r
1813 \r
1814     case mmode + halign:\r
1815       if (privileged ())\r
1816         if (cur_group == math_shift_group)\r
1817           init_align();\r
1818         else\r
1819           off_save();\r
1820       break;\r
1821 \r
1822     case vmode + endv:\r
1823     case hmode + endv:\r
1824       do_endv();\r
1825       break;\r
1826 \r
1827     case any_mode(end_cs_name):\r
1828       cs_error();\r
1829       break;\r
1830 \r
1831     case hmode + math_shift:\r
1832       init_math();\r
1833       break;\r
1834 \r
1835     case mmode + eq_no:\r
1836       if (privileged ())\r
1837         if (cur_group == math_shift_group)\r
1838           start_eq_no();\r
1839         else\r
1840           off_save();\r
1841       break;\r
1842 \r
1843     case mmode + left_brace:\r
1844       {\r
1845         tail_append(new_noad());\r
1846         back_input();\r
1847         scan_math(nucleus(tail));\r
1848       }\r
1849       break;\r
1850 \r
1851     case mmode + letter:\r
1852     case mmode + other_char:\r
1853     case mmode + char_given:\r
1854       set_math_char(math_code(cur_chr));\r
1855       break;\r
1856 \r
1857     case mmode + char_num:\r
1858       {\r
1859         scan_char_num();\r
1860         cur_chr = cur_val;\r
1861         set_math_char(math_code(cur_chr));\r
1862       }\r
1863       break;\r
1864 \r
1865     case mmode + math_char_num:\r
1866       {\r
1867         scan_fifteen_bit_int();\r
1868         set_math_char(cur_val);\r
1869       }\r
1870       break;\r
1871 \r
1872     case mmode + math_given:\r
1873       set_math_char(cur_chr);\r
1874       break;\r
1875 \r
1876     case mmode + delim_num:\r
1877       {\r
1878         scan_twenty_seven_bit_int();\r
1879         set_math_char(cur_val / 4096);\r
1880       }\r
1881       break;\r
1882 \r
1883     case mmode + math_comp:\r
1884       {\r
1885         tail_append(new_noad());\r
1886         type(tail) = cur_chr;\r
1887         scan_math(nucleus(tail));\r
1888       }\r
1889       break;\r
1890 \r
1891     case mmode + limit_switch:\r
1892       math_limit_switch();\r
1893       break;\r
1894 \r
1895     case mmode + radical:\r
1896       math_radical();\r
1897       break;\r
1898 \r
1899     case mmode + accent:\r
1900     case mmode + math_accent:\r
1901       math_ac();\r
1902       break;\r
1903 \r
1904     case mmode + vcenter:\r
1905       {\r
1906         scan_spec(vcenter_group, false);\r
1907         normal_paragraph();\r
1908         push_nest();\r
1909         mode = -1;\r
1910         prev_depth = ignore_depth;\r
1911 \r
1912         if (every_vbox != 0)\r
1913           begin_token_list(every_vbox, every_vbox_text);\r
1914       }\r
1915       break;\r
1916 \r
1917     case mmode + math_style:\r
1918       tail_append(new_style(cur_chr));\r
1919       break;\r
1920 \r
1921     case mmode + non_script:\r
1922       {\r
1923         tail_append(new_glue(zero_glue));\r
1924         subtype(tail) = cond_math_glue;\r
1925       }\r
1926       break;\r
1927 \r
1928     case mmode + math_choice:\r
1929       append_choices();\r
1930       break;\r
1931 \r
1932     case mmode + sub_mark:\r
1933     case mmode + sup_mark:\r
1934       sub_sup();\r
1935       break;\r
1936 \r
1937     case mmode + above:\r
1938       math_fraction();\r
1939       break;\r
1940 \r
1941     case mmode + left_right:\r
1942       math_left_right();\r
1943       break;\r
1944 \r
1945     case mmode + math_shift:\r
1946       if (cur_group == math_shift_group)\r
1947         after_math();\r
1948       else\r
1949         off_save();\r
1950       break;\r
1951 \r
1952     case any_mode(toks_register):\r
1953     case any_mode(assign_toks):\r
1954     case any_mode(assign_int):\r
1955     case any_mode(assign_dimen):\r
1956     case any_mode(assign_glue):\r
1957     case any_mode(assign_mu_glue):\r
1958     case any_mode(assign_font_dimen):\r
1959     case any_mode(assign_font_int):\r
1960     case any_mode(set_aux):\r
1961     case any_mode(set_prev_graf):\r
1962     case any_mode(set_page_dimen):\r
1963     case any_mode(set_page_int):\r
1964     case any_mode(set_box_dimen):\r
1965     case any_mode(set_shape):\r
1966     case any_mode(def_code):\r
1967     case any_mode(def_family):\r
1968     case any_mode(set_font):\r
1969     case any_mode(def_font):\r
1970     case any_mode(tex_register):\r
1971     case any_mode(advance):\r
1972     case any_mode(multiply):\r
1973     case any_mode(divide):\r
1974     case any_mode(prefix):\r
1975     case any_mode(let):\r
1976     case any_mode(shorthand_def):\r
1977     case any_mode(read_to_cs):\r
1978     case any_mode(def):\r
1979     case any_mode(set_box):\r
1980     case any_mode(hyph_data):\r
1981     case any_mode(set_interaction):\r
1982       prefixed_command();\r
1983       break;\r
1984 \r
1985     case any_mode(after_assignment):\r
1986       {\r
1987         get_token();\r
1988         after_token = cur_tok;\r
1989       }\r
1990       break;\r
1991 \r
1992     case any_mode(after_group):\r
1993       {\r
1994         get_token();\r
1995         save_for_after(cur_tok);\r
1996       }\r
1997       break;\r
1998 \r
1999     case any_mode(in_stream):\r
2000       open_or_close_in();\r
2001       break;\r
2002 \r
2003     case any_mode(message):\r
2004       issue_message();\r
2005       break;\r
2006 \r
2007     case any_mode(case_shift):\r
2008       shift_case();\r
2009       break;\r
2010 \r
2011     case any_mode(xray):\r
2012       show_whatever();\r
2013       break;\r
2014 \r
2015     case any_mode(extension):\r
2016       do_extension();\r
2017       break;\r
2018   }\r
2019 \r
2020   goto big_switch;\r
2021 \r
2022 main_loop:\r
2023   adjust_space_factor();\r
2024   main_f = cur_font;\r
2025   bchar = font_bchar[main_f];\r
2026   false_bchar = font_false_bchar[main_f];\r
2027 \r
2028   if (mode > 0)\r
2029     if (language != clang)\r
2030       fix_language();\r
2031 \r
2032   fast_get_avail(lig_stack);\r
2033   font(lig_stack) = main_f;\r
2034   cur_l = cur_chr;\r
2035   character(lig_stack) = cur_l;\r
2036   cur_q = tail;\r
2037 \r
2038   if (cancel_boundary)\r
2039   {\r
2040     cancel_boundary = false;\r
2041     main_k = non_address;\r
2042   }\r
2043   else\r
2044     main_k = bchar_label[main_f];\r
2045 \r
2046   if (main_k == non_address)\r
2047     goto main_loop_move_2;\r
2048 \r
2049   cur_r = cur_l;\r
2050   cur_l = non_char;\r
2051   goto main_lig_loop_1;\r
2052 \r
2053 main_loop_wrapup: \r
2054   wrapup(rt_hit);\r
2055 \r
2056 main_loop_move:\r
2057   if (lig_stack == 0)\r
2058     goto reswitch;\r
2059 \r
2060   cur_q = tail;\r
2061   cur_l = character(lig_stack);\r
2062 \r
2063 main_loop_move_1:\r
2064   if (!is_char_node(lig_stack))\r
2065     goto main_loop_move_lig;\r
2066 \r
2067 main_loop_move_2:\r
2068   if ((cur_chr < font_bc[main_f]) || (cur_chr > font_ec[main_f]))\r
2069   {\r
2070     char_warning(main_f, cur_chr);\r
2071     free_avail(lig_stack);\r
2072     goto big_switch;\r
2073   }\r
2074 \r
2075   main_i = char_info(main_f, cur_l);\r
2076 \r
2077   if (!char_exists(main_i))\r
2078   {\r
2079     char_warning(main_f, cur_chr);\r
2080     free_avail(lig_stack);\r
2081     goto big_switch; \r
2082   }\r
2083 \r
2084   link(tail) = lig_stack;\r
2085   tail = lig_stack;\r
2086 \r
2087 main_loop_lookahead:\r
2088   get_next();\r
2089 \r
2090   if (cur_cmd == letter)\r
2091     goto main_loop_lookahead_1;\r
2092 \r
2093   if (cur_cmd == other_char)\r
2094     goto main_loop_lookahead_1;\r
2095 \r
2096   if (cur_cmd == char_given)\r
2097     goto main_loop_lookahead_1;\r
2098 \r
2099   x_token();\r
2100 \r
2101   if (cur_cmd == letter)\r
2102     goto main_loop_lookahead_1;\r
2103 \r
2104   if (cur_cmd == other_char)\r
2105     goto main_loop_lookahead_1;\r
2106 \r
2107   if (cur_cmd == char_given)\r
2108     goto main_loop_lookahead_1;\r
2109 \r
2110   if (cur_cmd == char_num)\r
2111   {\r
2112     scan_char_num();\r
2113     cur_chr = cur_val;\r
2114     goto main_loop_lookahead_1;\r
2115   }\r
2116 \r
2117   if (cur_cmd == no_boundary)\r
2118     bchar = non_char;\r
2119 \r
2120   cur_r = bchar;\r
2121   lig_stack = 0;\r
2122   goto main_lig_loop;\r
2123 \r
2124 main_loop_lookahead_1:\r
2125   adjust_space_factor();\r
2126   fast_get_avail(lig_stack);\r
2127   font(lig_stack) = main_f;\r
2128   cur_r = cur_chr;\r
2129   character(lig_stack) = cur_r;\r
2130 \r
2131   if (cur_r == false_bchar)\r
2132     cur_r = non_char;\r
2133 \r
2134 main_lig_loop:\r
2135   if (char_tag(main_i) != lig_tag)\r
2136     goto main_loop_wrapup;\r
2137 \r
2138   if (cur_r == non_char)\r
2139     goto main_loop_wrapup;\r
2140 \r
2141   main_k = lig_kern_start(main_f, main_i);\r
2142   main_j = font_info[main_k].qqqq;\r
2143 \r
2144   if (skip_byte(main_j) <= stop_flag)\r
2145     goto main_lig_loop_2;\r
2146 \r
2147   main_k = lig_kern_restart(main_f, main_j);\r
2148 \r
2149 main_lig_loop_1:\r
2150   main_j = font_info[main_k].qqqq;\r
2151 \r
2152 main_lig_loop_2:\r
2153   bSuppress = false;\r
2154 \r
2155   if (suppress_f_ligs && next_char(main_j) == cur_r && op_byte(main_j) == no_tag)\r
2156   {\r
2157     if (cur_l == 'f')\r
2158       bSuppress = true;\r
2159   }\r
2160 \r
2161   if (next_char(main_j) == cur_r && bSuppress == false)\r
2162     if (skip_byte(main_j) <= stop_flag)\r
2163     {\r
2164       if (op_byte(main_j) >= kern_flag)\r
2165       {\r
2166         wrapup(rt_hit);\r
2167         tail_append(new_kern(char_kern(main_f, main_j)));\r
2168         goto main_loop_move;\r
2169       }\r
2170 \r
2171       if (cur_l == non_char)\r
2172         lft_hit = true;\r
2173       else if (lig_stack == 0)\r
2174         rt_hit = true;\r
2175 \r
2176       check_interrupt();\r
2177 \r
2178       switch (op_byte(main_j))\r
2179       {\r
2180         case 1:\r
2181         case 5:\r
2182           {\r
2183             cur_l = rem_byte(main_j);\r
2184             main_i = char_info(main_f, cur_l);\r
2185             ligature_present = true;\r
2186           }\r
2187           break;\r
2188         case 2:\r
2189         case 6:\r
2190           {\r
2191             cur_r = rem_byte(main_j);\r
2192 \r
2193             if (lig_stack == 0)\r
2194             {\r
2195               lig_stack = new_lig_item(cur_r);\r
2196               bchar = non_char;\r
2197             }\r
2198             else if (is_char_node(lig_stack))\r
2199             {\r
2200               main_p = lig_stack;\r
2201               lig_stack = new_lig_item(cur_r);\r
2202               lig_ptr(lig_stack) = main_p;\r
2203             }\r
2204             else\r
2205               character(lig_stack) = cur_r;\r
2206           }\r
2207           break;\r
2208         case 3:\r
2209           {\r
2210             cur_r = rem_byte(main_j);\r
2211             main_p = lig_stack;\r
2212             lig_stack = new_lig_item(cur_r);\r
2213             link(lig_stack) = main_p;\r
2214           }\r
2215           break;\r
2216         case 7:\r
2217         case 11:\r
2218           {\r
2219             wrapup(false);\r
2220             cur_q = tail;\r
2221             cur_l = rem_byte(main_j);\r
2222             main_i = char_info(main_f, cur_l);\r
2223             ligature_present = true;\r
2224           }\r
2225           break;\r
2226         default:\r
2227           {\r
2228             cur_l = rem_byte(main_j);\r
2229             ligature_present = true;\r
2230  \r
2231             if (lig_stack == 0)\r
2232               goto main_loop_wrapup;\r
2233             else\r
2234               goto main_loop_move_1;\r
2235           }\r
2236           break;\r
2237       }\r
2238 \r
2239       if (op_byte(main_j) > 4)\r
2240         if (op_byte(main_j) != 7)\r
2241           goto main_loop_wrapup;\r
2242 \r
2243       if (cur_l < non_char)\r
2244         goto main_lig_loop;\r
2245 \r
2246       main_k = bchar_label[main_f];\r
2247       goto main_lig_loop_1;\r
2248     }\r
2249 \r
2250     if (skip_byte(main_j) == 0)\r
2251       incr(main_k);\r
2252     else\r
2253     {\r
2254       if (skip_byte(main_j) >= stop_flag)\r
2255         goto main_loop_wrapup;\r
2256 \r
2257       main_k = main_k + skip_byte(main_j) + 1;\r
2258     }\r
2259 \r
2260     goto main_lig_loop_1;\r
2261 \r
2262 main_loop_move_lig:\r
2263   main_p = lig_ptr(lig_stack);\r
2264 \r
2265   if (main_p != 0)\r
2266     tail_append(main_p);\r
2267 \r
2268   temp_ptr = lig_stack;\r
2269   lig_stack = link(temp_ptr);\r
2270   free_node(temp_ptr, small_node_size);\r
2271   main_i = char_info(main_f, cur_l);\r
2272   ligature_present = true;\r
2273 \r
2274   if (lig_stack == 0)\r
2275     if (main_p != 0)\r
2276       goto main_loop_lookahead;\r
2277     else\r
2278       cur_r = bchar;\r
2279   else\r
2280     cur_r = character(lig_stack);\r
2281 \r
2282   goto main_lig_loop;\r
2283 \r
2284 append_normal_space:\r
2285   if (space_skip == 0)\r
2286   {\r
2287     {\r
2288       main_p = font_glue[cur_font];\r
2289 \r
2290       if (main_p == 0)\r
2291       {\r
2292         main_p = new_spec(zero_glue);\r
2293         main_k = param_base[cur_font] + space_code;\r
2294         width(main_p) = font_info[main_k].cint;\r
2295         stretch(main_p) = font_info[main_k + 1].cint;\r
2296         shrink(main_p) = font_info[main_k + 2].cint;\r
2297         font_glue[cur_font] = main_p;\r
2298       }\r
2299     }\r
2300 \r
2301     temp_ptr = new_glue(main_p);\r
2302   }\r
2303   else\r
2304     temp_ptr = new_param_glue(space_skip_code);\r
2305 \r
2306   link(tail) = temp_ptr;\r
2307   tail = temp_ptr;\r
2308 \r
2309   goto big_switch;\r
2310 }