OSDN Git Service

updated headers.
[putex/putex.git] / src / texsourc / tex1.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 0198 */\r
25 void show_box_(pointer p)\r
26 {\r
27   depth_threshold = show_box_depth;\r
28   breadth_max = show_box_breadth;\r
29 \r
30   if (breadth_max <= 0)\r
31     breadth_max = 5;\r
32 \r
33 #ifdef ALLOCATESTRING\r
34   if (pool_ptr + depth_threshold >= current_pool_size)\r
35     str_pool = realloc_str_pool(increment_pool_size);\r
36 \r
37   if (pool_ptr + depth_threshold >= current_pool_size)\r
38     depth_threshold = current_pool_size - pool_ptr - 1;\r
39 #else\r
40   if (pool_ptr + depth_threshold >= pool_size)\r
41     depth_threshold = pool_size - pool_ptr - 1;\r
42 #endif\r
43 \r
44   show_node_list(p);\r
45   print_ln();\r
46 }\r
47 /* sec 0200 */\r
48 void delete_token_ref_(pointer p)\r
49 {\r
50   if (token_ref_count(p) == 0)\r
51     flush_list(p);\r
52   else\r
53     decr(token_ref_count(p));\r
54 }\r
55 /* sec 0201 */\r
56 void delete_glue_ref_(pointer p)\r
57 {\r
58   if (glue_ref_count(p) == 0)\r
59     free_node(p, glue_spec_size);\r
60   else\r
61     decr(glue_ref_count(p));\r
62 }\r
63 /* sec 0202 */\r
64 void flush_node_list_(pointer p)\r
65 {\r
66   pointer q;\r
67 \r
68   while (is_char_node(p))\r
69   {\r
70     q = link(p);\r
71 \r
72     if (is_char_node(p))\r
73       free_avail(p);\r
74     else\r
75     {\r
76       switch (type(p))\r
77       {\r
78         case hlist_node:\r
79         case vlist_node:\r
80         case unset_node:\r
81           {\r
82             flush_node_list(list_ptr(p));\r
83             free_node(p, box_node_size);\r
84             goto done;\r
85           }\r
86           break;\r
87         case rule_node:\r
88           {\r
89             free_node(p, rule_node_size);\r
90             goto done;\r
91           }\r
92           break;\r
93         case ins_node:\r
94           {\r
95             flush_node_list(ins_ptr(p));\r
96             delete_glue_ref(split_top_ptr(p));\r
97             free_node(p, ins_node_size);\r
98             goto done;\r
99           }\r
100           break;\r
101         case whatsit_node:\r
102           {\r
103             switch (subtype(p))\r
104             {\r
105               case open_node:\r
106                 free_node(p, open_node_size);\r
107                 break;\r
108               case write_node:\r
109               case special_node:\r
110                 {\r
111                   delete_token_ref(write_tokens(p));\r
112                   free_node(p, write_node_size);\r
113                   goto done;\r
114                 }\r
115                 break;\r
116               case close_node:\r
117               case set_language_code:\r
118                 free_node(p, small_node_size);\r
119                 break;\r
120               default:\r
121                 {\r
122                   confusion("ext3");\r
123                   return;\r
124                 }\r
125                 break;\r
126             }\r
127             goto done;\r
128           }\r
129           break;\r
130         case glue_node:\r
131           delete_glue_ref(p);\r
132 \r
133           if (leader_ptr(p) != 0)\r
134             flush_node_list(leader_ptr(p));\r
135           break;\r
136         case kern_node:\r
137         case math_node:\r
138         case penalty_node:\r
139           break;\r
140         case ligature_node:\r
141           flush_node_list(lig_ptr(p));\r
142           break;\r
143         case mark_node:\r
144           delete_token_ref(mark_ptr(p));\r
145           break;\r
146         case disc_node:\r
147           flush_node_list(pre_break(p));\r
148           flush_node_list(post_break(p));\r
149           break;\r
150         case adjust_node:\r
151           flush_node_list(adjust_ptr(p));\r
152           break;\r
153         case style_node:\r
154           {\r
155             free_node(p, style_node_size);\r
156             goto done;\r
157           }\r
158           break;\r
159         case choice_node:\r
160           {\r
161             flush_node_list(display_mlist(p));\r
162             flush_node_list(text_mlist(p));\r
163             flush_node_list(script_mlist(p));\r
164             flush_node_list(script_script_mlist(p));\r
165             free_node(p, style_node_size);\r
166             goto done;\r
167           }\r
168           break;\r
169         case ord_noad:\r
170         case op_noad:\r
171         case bin_noad:\r
172         case rel_noad:\r
173         case open_noad:\r
174         case close_noad:\r
175         case punct_noad:\r
176         case inner_noad:\r
177         case radical_noad:\r
178         case over_noad:\r
179         case under_noad:\r
180         case vcenter_noad:\r
181         case accent_noad:\r
182           {\r
183             if (math_type(nucleus(p)) >= sub_box)\r
184               flush_node_list(info(nucleus(p)));\r
185 \r
186             if (math_type(supscr(p)) >= sub_box)\r
187               flush_node_list(info(supscr(p)));\r
188 \r
189             if (math_type(subscr(p)) >= sub_box)\r
190               flush_node_list(info(subscr(p)));\r
191 \r
192             if (type(p) == radical_noad)\r
193               free_node(p, radical_noad_size);\r
194             else\r
195             {\r
196               if (type(p) == accent_noad)\r
197                 free_node(p, accent_noad_size);\r
198               else\r
199                 free_node(p, noad_size);\r
200             }\r
201 \r
202             goto done;\r
203           }\r
204           break;\r
205         case left_noad:\r
206         case right_noad:\r
207           {\r
208             free_node(p, noad_size);\r
209             goto done;\r
210           }\r
211           break;\r
212         case fraction_noad:\r
213           {\r
214             flush_node_list(info(numerator(p)));\r
215             flush_node_list(info(denominator(p)));\r
216             free_node(p, fraction_noad_size);\r
217             goto done;\r
218           }\r
219           break;\r
220         default:\r
221           {\r
222             confusion("flushing");\r
223             return;\r
224           }\r
225           break;\r
226       }\r
227 \r
228       free_node(p, small_node_size);\r
229 done:;\r
230     }\r
231 \r
232     p = q;\r
233   }\r
234 }\r
235 /* sec 0204 */\r
236 pointer copy_node_list_(pointer p)\r
237 {\r
238   pointer h;\r
239   pointer q;\r
240   pointer r;\r
241   char words;\r
242 \r
243   h = get_avail();\r
244   q = h;\r
245 \r
246   while (p != 0)\r
247   {\r
248     words = 1;\r
249 \r
250     if (is_char_node(p)) \r
251       r = get_avail();\r
252     else switch (type(p))\r
253     {\r
254       case hlist_node:\r
255       case vlist_node:\r
256       case unset_node:\r
257         {\r
258           r = get_node(box_node_size);\r
259           mem[r + 6] = mem[p + 6];\r
260           mem[r + 5] = mem[p + 5];\r
261           list_ptr(r) = copy_node_list(list_ptr(p));\r
262           words = 5;\r
263         }\r
264         break;\r
265       case rule_node:\r
266         {\r
267           r = get_node(rule_node_size);\r
268           words = rule_node_size;\r
269         }\r
270         break;\r
271       case ins_node:\r
272         {\r
273           r = get_node(ins_node_size);\r
274           mem[r + 4] = mem[p + 4];\r
275           add_glue_ref(split_top_ptr(p));\r
276           ins_ptr(r) = copy_node_list(ins_ptr(p));\r
277           words = ins_node_size - 1;\r
278         }\r
279         break;\r
280       case whatsit_node:\r
281         switch (subtype(p))\r
282         {\r
283           case open_node:\r
284             {\r
285               r = get_node(open_node_size);\r
286               words = open_node_size;\r
287             }\r
288             break;\r
289 \r
290           case write_node:\r
291           case special_node:\r
292             {\r
293               r = get_node(write_node_size);\r
294               add_token_ref(write_tokens(p));\r
295               words = write_node_size;\r
296             }\r
297             break;\r
298 \r
299           case close_node:\r
300           case language_node:\r
301             {\r
302               r = get_node(small_node_size);\r
303               words = small_node_size;\r
304             }\r
305             break;\r
306 \r
307           default:\r
308             {\r
309               confusion("ext2");\r
310               return 0;\r
311             }\r
312             break;\r
313         }\r
314         break;\r
315 \r
316       case glue_node:\r
317         {\r
318           r = get_node(small_node_size);\r
319           add_glue_ref(glue_ptr(p));\r
320           glue_ptr(r) = glue_ptr(p);\r
321           leader_ptr(r) = copy_node_list(leader_ptr(p));\r
322         }\r
323         break;\r
324 \r
325       case kern_node:\r
326       case math_node:\r
327       case penalty_node:\r
328         {\r
329           r = get_node(small_node_size);\r
330           words = small_node_size;\r
331         }\r
332         break;\r
333 \r
334       case ligature_node:\r
335         {\r
336           r = get_node(small_node_size);\r
337           mem[lig_char(r)] = mem[lig_char(p)];\r
338           lig_ptr(r) = copy_node_list(lig_ptr(p));\r
339         }\r
340         break;\r
341 \r
342       case disc_node:\r
343         {\r
344           r = get_node(small_node_size);\r
345           pre_break(r) = copy_node_list(pre_break(p));\r
346           post_break(r) = copy_node_list(pre_break(p));\r
347         }\r
348         break;\r
349 \r
350       case mark_node:\r
351         {\r
352           r = get_node(small_node_size);\r
353           add_token_ref(mark_ptr(p));\r
354           words = small_node_size;\r
355         }\r
356         break;\r
357 \r
358       case adjust_node:\r
359         {\r
360           r = get_node(small_node_size);\r
361           adjust_ptr(r) = copy_node_list(adjust_ptr(p));\r
362         }\r
363         break;\r
364 \r
365       default:\r
366         {\r
367           confusion("copying");\r
368           return 0;\r
369         }\r
370         break;\r
371     }\r
372 \r
373     while (words > 0)\r
374     {\r
375       decr(words);\r
376       mem[r + words] = mem[p + words];\r
377     }\r
378 \r
379     link(q) = r;\r
380     q = r;\r
381     p = link(p);\r
382   }\r
383 \r
384   link(q) = 0;\r
385   q = link(h);\r
386   free_avail(h);\r
387 \r
388   return q;\r
389 }\r
390 /* sec 0211 */\r
391 void print_mode_(integer m)\r
392\r
393   if (m > 0)\r
394   {\r
395     switch (m / (max_command + 1))\r
396     {\r
397       case 0:\r
398         prints("vertical");\r
399         break;\r
400       case 1:\r
401         prints("horizontal");\r
402         break;\r
403       case 2:\r
404         prints("display math");\r
405         break;\r
406     }\r
407   }\r
408   else\r
409   {\r
410     if (m == 0)\r
411       prints("no");\r
412     else\r
413     {\r
414       switch ((- (integer) m) / (max_command + 1))\r
415       {\r
416         case 0:\r
417           prints("internal vertical");\r
418           break;\r
419         case 1:\r
420           prints("restricted horizontal");\r
421           break;\r
422         case 2:\r
423           prints("math");\r
424           break;\r
425       }\r
426     }\r
427   }\r
428 \r
429   prints(" mode");\r
430 }\r
431 /* sec 0216 */\r
432 void push_nest (void) \r
433 {\r
434   if (nest_ptr > max_nest_stack)\r
435   {\r
436     max_nest_stack = nest_ptr;\r
437 \r
438 #ifdef ALLOCATEINPUTSTACK\r
439     if (nest_ptr == current_nest_size)\r
440       nest = realloc_nest_stack(increment_nest_size);\r
441 \r
442     if (nest_ptr == current_nest_size)\r
443     {\r
444       overflow("semantic nest size", current_nest_size);\r
445       return;\r
446     }\r
447 #else\r
448     if (nest_ptr == nest_size)\r
449     {\r
450       overflow("semantic nest size", nest_size);\r
451       return;\r
452     }\r
453 #endif\r
454   }\r
455 \r
456   nest[nest_ptr]= cur_list;\r
457   incr(nest_ptr);\r
458   head = get_avail();\r
459   tail = head;\r
460   prev_graf = 0;\r
461   mode_line = line;\r
462 }\r
463 /* sec 0217 */\r
464 void pop_nest (void) \r
465 {\r
466   free_avail(head);\r
467   decr(nest_ptr);\r
468   cur_list = nest[nest_ptr];\r
469 }\r
470 /* sec 0218 */\r
471 void show_activities (void)\r
472 {\r
473   integer p;\r
474   short m;\r
475   memory_word a;\r
476   halfword q, r;\r
477   integer t;\r
478 \r
479   nest[nest_ptr] = cur_list;\r
480   print_nl("");\r
481   print_ln();\r
482 \r
483   for (p = nest_ptr; p >= 0; p--)\r
484   {\r
485     m = nest[p].mode_field;\r
486     a = nest[p].aux_field;\r
487     print_nl("### ");\r
488     print_mode(m);\r
489     prints(" entered at line ");\r
490     print_int(abs(nest[p].ml_field));\r
491 \r
492     if (m == hmode)\r
493     {\r
494       if (nest[p].pg_field != 040600000)\r
495       {\r
496         prints(" (language");\r
497         print_int(nest[p].pg_field % 65536L);\r
498         prints(":hyphenmin");\r
499         print_int(nest[p].pg_field / 4194304L);\r
500         print_char(',');\r
501         print_int((nest[p].pg_field / 65536L) % 64);\r
502         print_char(')');\r
503       }\r
504     }\r
505 \r
506     if (nest[p].ml_field < 0)\r
507       prints(" (\\output routine)");\r
508 \r
509     if (p == 0)\r
510     {\r
511       if (page_head != page_tail)\r
512       {\r
513         print_nl("### current page:");\r
514         \r
515         if (output_active)\r
516           prints(" (held over for next output)");\r
517 \r
518         show_box(link(page_head));\r
519 \r
520         if (page_contents > 0)\r
521         {\r
522           print_nl("total height ");\r
523           print_totals();\r
524           print_nl(" goal height ");\r
525           print_scaled(page_so_far[0]);\r
526           r = link(page_ins_head);\r
527           \r
528           while (r != mem_top)\r
529           {\r
530             print_ln();\r
531             print_esc("insert");\r
532             t = subtype(r);\r
533             print_int(t);\r
534             prints(" adds ");\r
535 \r
536             if (count(t) == 1000)\r
537               t = height(r);\r
538             else\r
539               t = x_over_n(height(r), 1000) * count(t);\r
540 \r
541             print_scaled(t);\r
542 \r
543             if (type(r) == split_up)\r
544             {\r
545               q = page_head;\r
546               t = 0;\r
547 \r
548               do\r
549                 {\r
550                   q = link(q);\r
551 \r
552                   if ((type(q) == ins_node) && (subtype(q) == subtype(r)))\r
553                     incr(t);\r
554                 }\r
555               while (!(q == broken_ins(r)));\r
556 \r
557               prints(", #");\r
558               print_int(t);\r
559               prints(" might split");\r
560             }\r
561             r = link(r);\r
562           }\r
563         }\r
564       }\r
565 \r
566       if (link(contrib_head) != 0)\r
567         print_nl("### recent contributions:");\r
568     }\r
569 \r
570     show_box(link(nest[p].head_field));\r
571 \r
572     switch (abs(m) / (max_command + 1))\r
573     {\r
574       case 0:\r
575         {\r
576           print_nl("prevdepth ");\r
577 \r
578           if  (a.cint <= ignore_depth)\r
579             prints("ignored");\r
580           else\r
581             print_scaled(a.cint);\r
582 \r
583           if (nest[p].pg_field != 0)\r
584           {\r
585             prints(", prevgraf ");\r
586             print_int(nest[p].pg_field);\r
587             prints(" line");\r
588 \r
589             if (nest[p].pg_field != 1)\r
590               print_char('s');\r
591           }\r
592         }\r
593         break;\r
594 \r
595       case 1:\r
596         {\r
597           print_nl("spacefactor ");\r
598           print_int(a.hh.lh);\r
599 \r
600           if (m > 0)\r
601           {\r
602             if (a.hh.rh > 0)\r
603             {\r
604               prints(", current language ");\r
605               print_int(a.hh.rh);\r
606             }\r
607           }\r
608         }\r
609         break;\r
610 \r
611       case 2:\r
612         if (a.cint != 0)\r
613         {\r
614           prints("this will be denominator of:");\r
615           show_box(a.cint);\r
616         }\r
617         break;\r
618     }\r
619   }\r
620 }\r
621 /* sec 0237 */\r
622 void print_param_(integer n)\r
623 {\r
624   switch (n)\r
625   {\r
626     case pretolerance_code:\r
627       print_esc("pretolerance");\r
628       break;\r
629 \r
630     case tolerance_code:\r
631       print_esc("tolerance");\r
632       break;\r
633 \r
634     case line_penalty_code:\r
635       print_esc("linepenalty");\r
636       break;\r
637 \r
638     case hyphen_penalty_code:\r
639       print_esc("hyphenpenalty");\r
640       break;\r
641 \r
642     case ex_hyphen_penalty_code:\r
643       print_esc("exhyphenpenalty");\r
644       break;\r
645 \r
646     case club_penalty_code:\r
647       print_esc("clubpenalty");\r
648       break;\r
649 \r
650     case widow_penalty_code:\r
651       print_esc("widowpenalty");\r
652       break;\r
653 \r
654     case display_widow_penalty_code:\r
655       print_esc("displaywidowpenalty");\r
656       break;\r
657 \r
658     case broken_penalty_code:\r
659       print_esc("brokenpenalty");\r
660       break;\r
661 \r
662     case bin_op_penalty_code:\r
663       print_esc("binoppenalty");\r
664       break;\r
665 \r
666     case rel_penalty_code:\r
667       print_esc("relpenalty");\r
668       break;\r
669 \r
670     case pre_display_penalty_code:\r
671       print_esc("predisplaypenalty");\r
672       break;\r
673 \r
674     case post_display_penalty_code:\r
675       print_esc("postdisplaypenalty");\r
676       break;\r
677 \r
678     case inter_line_penalty_code:\r
679       print_esc("interlinepenalty");\r
680       break;\r
681 \r
682     case double_hyphen_demerits_code:\r
683       print_esc("doublehyphendemerits");\r
684       break;\r
685 \r
686     case final_hyphen_demerits_code:\r
687       print_esc("finalhyphendemerits");\r
688       break;\r
689 \r
690     case adj_demerits_code:\r
691       print_esc("adjdemerits");\r
692       break;\r
693 \r
694     case mag_code:\r
695       print_esc("mag");\r
696       break;\r
697 \r
698     case delimiter_factor_code:\r
699       print_esc("delimiterfactor");\r
700       break;\r
701 \r
702     case looseness_code:\r
703       print_esc("looseness");\r
704       break;\r
705 \r
706     case time_code:\r
707       print_esc("time");\r
708       break;\r
709 \r
710     case day_code:\r
711       print_esc("day");\r
712       break;\r
713 \r
714     case month_code:\r
715       print_esc("month");\r
716       break;\r
717 \r
718     case year_code:\r
719       print_esc("year");\r
720       break;\r
721 \r
722     case show_box_breadth_code:\r
723       print_esc("showboxbreadth");\r
724       break;\r
725 \r
726     case show_box_depth_code:\r
727       print_esc("showboxdepth");\r
728       break;\r
729 \r
730     case hbadness_code:\r
731       print_esc("hbadness");\r
732       break;\r
733 \r
734     case vbadness_code:\r
735       print_esc("vbadness");\r
736       break;\r
737 \r
738     case pausing_code:\r
739       print_esc("pausing");\r
740       break;\r
741 \r
742     case tracing_online_code:\r
743       print_esc("tracingonline");\r
744       break;\r
745 \r
746     case tracing_macros_code:\r
747       print_esc("tracingmacros");\r
748       break;\r
749 \r
750     case tracing_stats_code:\r
751       print_esc("tracingstats");\r
752       break;\r
753 \r
754     case tracing_paragraphs_code:\r
755       print_esc("tracingparagraphs");\r
756       break;\r
757 \r
758     case tracing_pages_code:\r
759       print_esc("tracingpages");\r
760       break;\r
761 \r
762     case tracing_output_code:\r
763       print_esc("tracingoutput");\r
764       break;\r
765 \r
766     case tracing_lost_chars_code:\r
767       print_esc("tracinglostchars");\r
768       break;\r
769 \r
770     case tracing_commands_code:\r
771       print_esc("tracingcommands");\r
772       break;\r
773 \r
774     case tracing_restores_code:\r
775       print_esc("tracingrestores");\r
776       break;\r
777 \r
778     case uc_hyph_code:\r
779       print_esc("uchyph");\r
780       break;\r
781 \r
782     case output_penalty_code:\r
783       print_esc("outputpenalty");\r
784       break;\r
785 \r
786     case max_dead_cycles_code:\r
787       print_esc("maxdeadcycles");\r
788       break;\r
789 \r
790     case hang_after_code:\r
791       print_esc("hangafter");\r
792       break;\r
793 \r
794     case floating_penalty_code:\r
795       print_esc("floatingpenalty");\r
796       break;\r
797 \r
798     case global_defs_code:\r
799       print_esc("globaldefs");\r
800       break;\r
801 \r
802     case cur_fam_code:\r
803       print_esc("fam");\r
804       break;\r
805 \r
806     case escape_char_code:\r
807       print_esc("escapechar");\r
808       break;\r
809 \r
810     case default_hyphen_char_code:\r
811       print_esc("defaulthyphenchar");\r
812       break;\r
813 \r
814     case default_skew_char_code:\r
815       print_esc("defaultskewchar");\r
816       break;\r
817 \r
818     case end_line_char_code:\r
819       print_esc("endlinechar");\r
820       break;\r
821 \r
822     case new_line_char_code:\r
823       print_esc("newlinechar");\r
824       break;\r
825 \r
826     case language_code:\r
827       print_esc("language");\r
828       break;\r
829 \r
830     case left_hyphen_min_code:\r
831       print_esc("lefthyphenmin");\r
832       break;\r
833 \r
834     case right_hyphen_min_code:\r
835       print_esc("righthyphenmin");\r
836       break;\r
837 \r
838     case holding_inserts_code:\r
839       print_esc("holdinginserts");\r
840       break;\r
841 \r
842     case error_context_lines_code:\r
843       print_esc("errorcontextlines");\r
844       break;\r
845 \r
846     default:\r
847       prints("[unknown integer parameter!]");\r
848       break;\r
849   }\r
850 }\r
851 /* sec 0245 */\r
852 void begin_diagnostic (void)\r
853 {\r
854   old_setting = selector;\r
855 \r
856   if ((tracing_online <= 0) && (selector == term_and_log))\r
857   {\r
858     decr(selector);\r
859 \r
860     if (history == spotless)\r
861       history = warning_issued;\r
862   }\r
863 }\r
864 /* sec 0245 */\r
865 void end_diagnostic(boolean blank_line)\r
866 {\r
867   print_nl("");\r
868 \r
869   if (blank_line)\r
870     print_ln();\r
871 \r
872   selector = old_setting;\r
873 }\r
874 /* sec 0247 */\r
875 void print_length_param_ (integer n)\r
876 {\r
877   switch (n)\r
878   {\r
879     case par_indent_code:\r
880       print_esc("parindent");\r
881       break;\r
882 \r
883     case math_surround_code:\r
884       print_esc("mathsurround");\r
885       break;\r
886 \r
887     case line_skip_limit_code:\r
888       print_esc("lineskiplimit");\r
889       break;\r
890 \r
891     case hsize_code:\r
892       print_esc("hsize");\r
893       break;\r
894 \r
895     case vsize_code:\r
896       print_esc("vsize");\r
897       break;\r
898 \r
899     case max_depth_code:\r
900       print_esc("maxdepth");\r
901       break;\r
902 \r
903     case split_max_depth_code:\r
904       print_esc("splitmaxdepth");\r
905       break;\r
906 \r
907     case box_max_depth_code:\r
908       print_esc("boxmaxdepth");\r
909       break;\r
910 \r
911     case hfuzz_code:\r
912       print_esc("hfuzz");\r
913       break;\r
914 \r
915     case vfuzz_code:\r
916       print_esc("vfuzz");\r
917       break;\r
918 \r
919     case delimiter_shortfall_code:\r
920       print_esc("delimitershortfall");\r
921       break;\r
922 \r
923     case null_delimiter_space_code:\r
924       print_esc("nulldelimiterspace");\r
925       break;\r
926 \r
927     case script_space_code:\r
928       print_esc("scriptspace");\r
929       break;\r
930 \r
931     case pre_display_size_code:\r
932       print_esc("predisplaysize");\r
933       break;\r
934 \r
935     case display_width_code:\r
936       print_esc("displaywidth");\r
937       break;\r
938 \r
939     case display_indent_code:\r
940       print_esc("displayindent");\r
941       break;\r
942 \r
943     case overfull_rule_code:\r
944       print_esc("overfullrule");\r
945       break;\r
946 \r
947     case hang_indent_code:\r
948       print_esc("hangindent");\r
949       break;\r
950 \r
951     case h_offset_code:\r
952       print_esc("hoffset");\r
953       break;\r
954 \r
955     case v_offset_code:\r
956       print_esc("voffset");\r
957       break;\r
958 \r
959     case emergency_stretch_code:\r
960       print_esc("emergencystretch");\r
961       break;\r
962 \r
963     default:\r
964       prints("[unknown dimen parameter!]");\r
965       break;\r
966   }\r
967 }\r
968 /* sec 0298 */\r
969 void print_cmd_chr_ (quarterword cmd, halfword chr_code)\r
970 {\r
971   switch (cmd)\r
972   {\r
973     case left_brace:\r
974       chr_cmd("begin-group character ");\r
975       break;\r
976 \r
977     case right_brace:\r
978       chr_cmd("end-group character ");\r
979       break;\r
980 \r
981     case math_shift:\r
982       chr_cmd("math shift character ");\r
983       break;\r
984 \r
985     case mac_param:\r
986       chr_cmd("macro parameter character ");\r
987       break;\r
988 \r
989     case sup_mark:\r
990       chr_cmd("superscript character ");\r
991       break;\r
992 \r
993     case sub_mark:\r
994       chr_cmd("subscript character ");\r
995       break;\r
996 \r
997     case endv:\r
998       chr_cmd("end of alignment template");\r
999       break;\r
1000 \r
1001     case spacer:\r
1002       chr_cmd("blank space ");\r
1003       break;\r
1004 \r
1005     case letter:\r
1006       chr_cmd("the letter ");\r
1007       break;\r
1008 \r
1009     case other_char:\r
1010       chr_cmd("the character ");\r
1011       break;\r
1012 \r
1013     case assign_glue:\r
1014     case assign_mu_glue:\r
1015       if (chr_code < skip_base)\r
1016         print_skip_param(chr_code - glue_base);\r
1017       else if (chr_code < mu_skip_base)\r
1018       {\r
1019         print_esc("skip");\r
1020         print_int(chr_code - skip_base);\r
1021       }\r
1022       else\r
1023       {\r
1024         print_esc("muskip");\r
1025         print_int(chr_code - mu_skip_base);\r
1026       }\r
1027       break;\r
1028 \r
1029     case assign_toks:\r
1030       if (chr_code >= toks_base)\r
1031       {\r
1032         print_esc("toks");\r
1033         print_int(chr_code - toks_base);\r
1034       }\r
1035       else\r
1036       {\r
1037         switch (chr_code)\r
1038         {\r
1039           case output_routine_loc:\r
1040             print_esc("output");\r
1041             break;\r
1042 \r
1043           case every_par_loc:\r
1044             print_esc("everypar");\r
1045             break;\r
1046 \r
1047           case every_math_loc:\r
1048             print_esc("everymath");\r
1049             break;\r
1050 \r
1051           case every_display_loc:\r
1052             print_esc("everydisplay");\r
1053             break;\r
1054 \r
1055           case every_hbox_loc:\r
1056             print_esc("everyhbox");\r
1057             break;\r
1058 \r
1059           case every_vbox_loc:\r
1060             print_esc("everyvbox");\r
1061             break;\r
1062 \r
1063           case every_job_loc:\r
1064             print_esc("everyjob");\r
1065             break;\r
1066 \r
1067           case every_cr_loc:\r
1068             print_esc("everycr");\r
1069             break;\r
1070 \r
1071           default:\r
1072             print_esc("errhelp");\r
1073             break;\r
1074         }\r
1075       }\r
1076       break;\r
1077 \r
1078     case assign_int:\r
1079       if (chr_code < count_base)\r
1080         print_param(chr_code - int_base);\r
1081       else\r
1082       {\r
1083         print_esc("count");\r
1084         print_int(chr_code - count_base);\r
1085       }\r
1086       break;\r
1087 \r
1088     case assign_dimen:\r
1089       if (chr_code < scaled_base)\r
1090         print_length_param(chr_code - dimen_base);\r
1091       else\r
1092       {\r
1093         print_esc("dimen");\r
1094         print_int(chr_code - scaled_base);\r
1095       }\r
1096       break;\r
1097 \r
1098     case accent:\r
1099       print_esc("accent");\r
1100       break;\r
1101 \r
1102     case advance:\r
1103       print_esc("advance");\r
1104       break;\r
1105 \r
1106     case after_assignment:\r
1107       print_esc("afterassignment");\r
1108       break;\r
1109 \r
1110     case after_group:\r
1111       print_esc("aftergroup");\r
1112       break;\r
1113 \r
1114     case assign_font_dimen:\r
1115       print_esc("fontdimen");\r
1116       break;\r
1117 \r
1118     case begin_group:\r
1119       print_esc("begingroup");\r
1120       break;\r
1121 \r
1122     case break_penalty:\r
1123       print_esc("penalty");\r
1124       break;\r
1125 \r
1126     case char_num:\r
1127       print_esc("char");\r
1128       break;\r
1129 \r
1130     case cs_name:\r
1131       print_esc("csname");\r
1132       break;\r
1133 \r
1134     case def_font:\r
1135       print_esc("font");\r
1136       break;\r
1137 \r
1138     case delim_num:\r
1139       print_esc("delimiter");\r
1140       break;\r
1141 \r
1142     case divide:\r
1143       print_esc("divide");\r
1144       break;\r
1145 \r
1146     case end_cs_name:\r
1147       print_esc("endcsname");\r
1148       break;\r
1149 \r
1150     case end_group:\r
1151       print_esc("endgroup");\r
1152       break;\r
1153 \r
1154     case ex_space:\r
1155       print_esc(" ");\r
1156       break;\r
1157 \r
1158     case expand_after:\r
1159       print_esc("expandafter");\r
1160       break;\r
1161 \r
1162     case halign:\r
1163       print_esc("halign");\r
1164       break;\r
1165 \r
1166     case hrule:\r
1167       print_esc("hrule");\r
1168       break;\r
1169 \r
1170     case ignore_spaces:\r
1171       print_esc("ignorespaces");\r
1172       break;\r
1173 \r
1174     case insert:\r
1175       print_esc("insert");\r
1176       break;\r
1177 \r
1178     case ital_corr:\r
1179       print_esc("/");\r
1180       break;\r
1181 \r
1182     case mark:\r
1183       print_esc("mark");\r
1184       break;\r
1185 \r
1186     case math_accent:\r
1187       print_esc("mathaccent");\r
1188       break;\r
1189 \r
1190     case math_char_num:\r
1191       print_esc("mathchar");\r
1192       break;\r
1193 \r
1194     case math_choice:\r
1195       print_esc("mathchoice");\r
1196       break;\r
1197 \r
1198     case multiply:\r
1199       print_esc("multiply");\r
1200       break;\r
1201 \r
1202     case no_align:\r
1203       print_esc("noalign");\r
1204       break;\r
1205 \r
1206     case no_boundary:\r
1207       print_esc("noboundary");\r
1208       break;\r
1209 \r
1210     case no_expand:\r
1211       print_esc("noexpand");\r
1212       break;\r
1213 \r
1214     case non_script:\r
1215       print_esc("nonscript");\r
1216       break;\r
1217 \r
1218     case omit:\r
1219       print_esc("omit");\r
1220       break;\r
1221 \r
1222     case radical:\r
1223       print_esc("radical");\r
1224       break;\r
1225 \r
1226     case read_to_cs:\r
1227       print_esc("read");\r
1228       break;\r
1229 \r
1230     case relax:\r
1231       print_esc("relax");\r
1232       break;\r
1233 \r
1234     case set_box:\r
1235       print_esc("setbox");\r
1236       break;\r
1237 \r
1238     case set_prev_graf:\r
1239       print_esc("prevgraf");\r
1240       break;\r
1241 \r
1242     case set_shape:\r
1243       print_esc("parshape");\r
1244       break;\r
1245 \r
1246     case the:\r
1247       print_esc("the");\r
1248       break;\r
1249 \r
1250     case toks_register:\r
1251       print_esc("toks");\r
1252       break;\r
1253 \r
1254     case vadjust:\r
1255       print_esc("vadjust");\r
1256       break;\r
1257 \r
1258     case valign:\r
1259       print_esc("valign");\r
1260       break;\r
1261 \r
1262     case vcenter:\r
1263       print_esc("vcenter");\r
1264       break;\r
1265 \r
1266     case vrule:\r
1267       print_esc("vrule");\r
1268       break;\r
1269 \r
1270     case par_end:\r
1271       print_esc("par");\r
1272       break;\r
1273 \r
1274     case input:\r
1275       if (chr_code == 0)\r
1276         print_esc("input");\r
1277       else\r
1278         print_esc("endinput");\r
1279       break;\r
1280 \r
1281     case top_bot_mark:\r
1282       switch (chr_code)\r
1283       {\r
1284         case first_mark_code:\r
1285           print_esc("firstmark");\r
1286           break;\r
1287 \r
1288         case bot_mark_code:\r
1289           print_esc("botmark");\r
1290           break;\r
1291 \r
1292         case split_first_mark_code:\r
1293           print_esc("splitfirstmark");\r
1294           break;\r
1295 \r
1296         case split_bot_mark_code:\r
1297           print_esc("splitbotmark");\r
1298           break;\r
1299 \r
1300         default:\r
1301           print_esc("topmark");\r
1302           break;\r
1303       }\r
1304       break;\r
1305 \r
1306     case tex_register:\r
1307       if (chr_code == int_val)\r
1308         print_esc("count");\r
1309       else if (chr_code == dimen_val)\r
1310         print_esc("dimen");\r
1311       else if (chr_code == glue_val)\r
1312         print_esc("skip");\r
1313       else\r
1314         print_esc("muskip");\r
1315       break;\r
1316 \r
1317     case set_aux:\r
1318       if (chr_code == vmode)\r
1319         print_esc("prevdepth");\r
1320       else\r
1321         print_esc("spacefactor");\r
1322       break;\r
1323 \r
1324     case set_page_int:\r
1325       if (chr_code == 0)\r
1326         print_esc("deadcycles");\r
1327       else\r
1328         print_esc("insertpenalties");\r
1329       break;\r
1330 \r
1331     case set_box_dimen:\r
1332       if (chr_code == width_offset)\r
1333         print_esc("wd");\r
1334       else if (chr_code == height_offset)\r
1335         print_esc("ht");\r
1336       else\r
1337         print_esc("dp");\r
1338       break;\r
1339 \r
1340     case last_item:\r
1341       switch (chr_code)\r
1342       {\r
1343         case int_val:\r
1344           print_esc("lastpenalty");\r
1345           break;\r
1346 \r
1347         case dimen_val:\r
1348           print_esc("lastkern");\r
1349           break;\r
1350 \r
1351         case glue_val:\r
1352           print_esc("lastskip");\r
1353           break;\r
1354 \r
1355         case input_line_no_code:\r
1356           print_esc("inputlineno");\r
1357           break;\r
1358 \r
1359         default:\r
1360           print_esc("badness");\r
1361           break;\r
1362       }\r
1363       break;\r
1364 \r
1365     case convert:\r
1366       switch (chr_code)\r
1367       {\r
1368         case number_code:\r
1369           print_esc("number");\r
1370           break;\r
1371 \r
1372         case roman_numeral_code:\r
1373           print_esc("romannumeral");\r
1374           break;\r
1375 \r
1376         case string_code:\r
1377           print_esc("string");\r
1378           break;\r
1379 \r
1380         case meaning_code:\r
1381           print_esc("meaning");\r
1382           break;\r
1383 \r
1384         case font_name_code:\r
1385           print_esc("fontname");\r
1386           break;\r
1387 \r
1388         default:\r
1389           print_esc("jobname");\r
1390           break;\r
1391       }\r
1392       break;\r
1393 \r
1394     case if_test:\r
1395       switch (chr_code)\r
1396       {\r
1397         case if_cat_code:\r
1398           print_esc("ifcat");\r
1399           break;\r
1400 \r
1401         case if_int_code:\r
1402           print_esc("ifnum");\r
1403           break;\r
1404 \r
1405         case if_dim_code:\r
1406           print_esc("ifdim");\r
1407           break;\r
1408 \r
1409         case if_odd_code:\r
1410           print_esc("ifodd");\r
1411           break;\r
1412 \r
1413         case if_vmode_code:\r
1414           print_esc("ifvmode");\r
1415           break;\r
1416 \r
1417         case if_hmode_code:\r
1418           print_esc("ifhmode");\r
1419           break;\r
1420 \r
1421         case if_mmode_code:\r
1422           print_esc("ifmmode");\r
1423           break;\r
1424 \r
1425         case if_inner_code:\r
1426           print_esc("ifinner");\r
1427           break;\r
1428 \r
1429         case if_void_code:\r
1430           print_esc("ifvoid");\r
1431           break;\r
1432 \r
1433         case if_hbox_code:\r
1434           print_esc("ifhbox");\r
1435           break;\r
1436 \r
1437         case if_vbox_code:\r
1438           print_esc("ifvbox");\r
1439           break;\r
1440 \r
1441         case ifx_code:\r
1442           print_esc("ifx");\r
1443           break;\r
1444 \r
1445         case if_eof_code:\r
1446           print_esc("ifeof");\r
1447           break;\r
1448 \r
1449         case if_true_code:\r
1450           print_esc("iftrue");\r
1451           break;\r
1452 \r
1453         case if_false_code:\r
1454           print_esc("iffalse");\r
1455           break;\r
1456 \r
1457         case if_case_code:\r
1458           print_esc("ifcase");\r
1459           break;\r
1460 \r
1461         default:\r
1462           print_esc("if");\r
1463           break;\r
1464       }\r
1465       break;\r
1466 \r
1467     case fi_or_else:\r
1468       if (chr_code == fi_code)\r
1469         print_esc("fi");\r
1470       else if (chr_code == or_code)\r
1471         print_esc("or");\r
1472       else\r
1473         print_esc("else");\r
1474       break;\r
1475 \r
1476     case tab_mark:\r
1477       if (chr_code == span_code)\r
1478         print_esc("span");\r
1479       else\r
1480       {\r
1481         prints("alignment tab character ");\r
1482         print(chr_code);\r
1483       }\r
1484       break;\r
1485 \r
1486     case car_ret:\r
1487       if (chr_code == cr_code)\r
1488         print_esc("cr");\r
1489       else\r
1490         print_esc("crcr");\r
1491       break;\r
1492 \r
1493     case set_page_dimen:\r
1494       switch (chr_code)\r
1495       {\r
1496         case 0:\r
1497           print_esc("pagegoal");\r
1498           break;\r
1499 \r
1500         case 1:\r
1501           print_esc("pagetotal");\r
1502           break;\r
1503 \r
1504         case 2:\r
1505           print_esc("pagestretch");\r
1506           break;\r
1507 \r
1508         case 3:\r
1509           print_esc("pagefilstretch");\r
1510           break;\r
1511 \r
1512         case 4:\r
1513           print_esc("pagefillstretch");\r
1514           break;\r
1515 \r
1516         case 5:\r
1517           print_esc("pagefilllstretch");\r
1518           break;\r
1519 \r
1520         case 6:\r
1521           print_esc("pageshrink");\r
1522           break;\r
1523 \r
1524         default:\r
1525           print_esc("pagedepth");\r
1526           break;\r
1527       }\r
1528       break;\r
1529 \r
1530     case stop:\r
1531       if (chr_code == 1)\r
1532         print_esc("dump");\r
1533       else\r
1534         print_esc("end");\r
1535       break;\r
1536 \r
1537     case hskip:\r
1538       switch (chr_code)\r
1539       {\r
1540         case skip_code:\r
1541           print_esc("hskip");\r
1542           break;\r
1543 \r
1544         case fil_code:\r
1545           print_esc("hfil");\r
1546           break;\r
1547 \r
1548         case fill_code:\r
1549           print_esc("hfill");\r
1550           break;\r
1551 \r
1552         case ss_code:\r
1553           print_esc("hss");\r
1554           break;\r
1555 \r
1556         default:\r
1557           print_esc("hfilneg");\r
1558           break;\r
1559       }\r
1560       break;\r
1561 \r
1562     case vskip:\r
1563       switch (chr_code)\r
1564       {\r
1565         case skip_code:\r
1566           print_esc("vskip");\r
1567           break;\r
1568 \r
1569         case fil_code:\r
1570           print_esc("vfil");\r
1571           break;\r
1572 \r
1573         case fill_code:\r
1574           print_esc("vfill");\r
1575           break;\r
1576 \r
1577         case ss_code:\r
1578           print_esc("vss");\r
1579           break;\r
1580 \r
1581         default:\r
1582           print_esc("vfilneg");\r
1583           break;\r
1584       }\r
1585       break;\r
1586 \r
1587     case mskip:\r
1588       print_esc("mskip");\r
1589       break;\r
1590 \r
1591     case kern:\r
1592       print_esc("kern");\r
1593       break;\r
1594 \r
1595     case mkern:\r
1596       print_esc("mkern");\r
1597       break;\r
1598 \r
1599     case hmove:\r
1600       if (chr_code == 1)\r
1601         print_esc("moveleft");\r
1602       else\r
1603         print_esc("moveright");\r
1604       break;\r
1605 \r
1606     case vmove:\r
1607       if (chr_code == 1)\r
1608         print_esc("raise");\r
1609       else\r
1610         print_esc("lower");\r
1611       break;\r
1612 \r
1613     case make_box:\r
1614       switch (chr_code)\r
1615       {\r
1616         case box_code:\r
1617           print_esc("box");\r
1618           break;\r
1619 \r
1620         case copy_code:\r
1621           print_esc("copy");\r
1622           break;\r
1623 \r
1624         case last_box_code:\r
1625           print_esc("lastbox");\r
1626           break;\r
1627 \r
1628         case vsplit_code:\r
1629           print_esc("vsplit");\r
1630           break;\r
1631 \r
1632         case vtop_code:\r
1633           print_esc("vtop");\r
1634           break;\r
1635 \r
1636         case vtop_code + vmode:\r
1637           print_esc("vbox");\r
1638           break;\r
1639 \r
1640         default:\r
1641           print_esc("hbox");\r
1642           break;\r
1643       }\r
1644       break;\r
1645 \r
1646     case leader_ship:\r
1647       if (chr_code == a_leaders)\r
1648         print_esc("leaders");\r
1649       else if (chr_code == c_leaders)\r
1650         print_esc("cleaders");\r
1651       else if (chr_code == x_leaders)\r
1652         print_esc("xleaders");\r
1653       else\r
1654         print_esc("shipout");\r
1655       break;\r
1656 \r
1657     case start_par:\r
1658       if (chr_code == 0)\r
1659         print_esc("noindent");\r
1660       else\r
1661         print_esc("indent");\r
1662       break;\r
1663 \r
1664     case remove_item:\r
1665       if (chr_code == glue_node)\r
1666         print_esc("unskip");\r
1667       else if (chr_code == kern_node)\r
1668         print_esc("unkern");\r
1669       else\r
1670         print_esc("unpenalty");\r
1671       break;\r
1672 \r
1673     case un_hbox:\r
1674       if (chr_code == copy_code)\r
1675         print_esc("unhcopy");\r
1676       else\r
1677         print_esc("unhbox");\r
1678       break;\r
1679 \r
1680     case un_vbox:\r
1681       if (chr_code == copy_code)\r
1682         print_esc("unvcopy");\r
1683       else\r
1684         print_esc("unvbox");\r
1685       break;\r
1686 \r
1687     case discretionary:\r
1688       if (chr_code == 1)\r
1689         print_esc("-");\r
1690       else\r
1691         print_esc("discretionary");\r
1692       break;\r
1693 \r
1694     case eq_no:\r
1695       if (chr_code == 1)\r
1696         print_esc("leqno");\r
1697       else\r
1698         print_esc("eqno");\r
1699       break;\r
1700 \r
1701     case math_comp:\r
1702       switch (chr_code)\r
1703       {\r
1704         case ord_noad:\r
1705           print_esc("mathord");\r
1706           break;\r
1707 \r
1708         case op_noad:\r
1709           print_esc("mathop");\r
1710           break;\r
1711 \r
1712         case bin_noad:\r
1713           print_esc("mathbin");\r
1714           break;\r
1715 \r
1716         case rel_noad:\r
1717           print_esc("mathrel");\r
1718           break;\r
1719 \r
1720         case open_noad:\r
1721           print_esc("mathopen");\r
1722           break;\r
1723 \r
1724         case close_noad:\r
1725           print_esc("mathclose");\r
1726           break;\r
1727 \r
1728         case punct_noad:\r
1729           print_esc("mathpunct");\r
1730           break;\r
1731 \r
1732         case inner_noad:\r
1733           print_esc("mathinner");\r
1734           break;\r
1735 \r
1736         case under_noad:\r
1737           print_esc("underline");\r
1738           break;\r
1739 \r
1740         default:\r
1741           print_esc("overline");\r
1742           break;\r
1743       }\r
1744       break;\r
1745 \r
1746     case limit_switch:\r
1747       if (chr_code == limits)\r
1748         print_esc("limits");\r
1749       else if (chr_code == no_limits)\r
1750         print_esc("nolimits");\r
1751       else\r
1752         print_esc("displaylimits");\r
1753       break;\r
1754 \r
1755     case math_style:\r
1756       print_style(chr_code);\r
1757       break;\r
1758 \r
1759     case above:\r
1760       switch (chr_code)\r
1761       {\r
1762         case over_code:\r
1763           print_esc("over");\r
1764           break;\r
1765 \r
1766         case atop_code:\r
1767           print_esc("atop");\r
1768           break;\r
1769 \r
1770         case delimited_code + above_code:\r
1771           print_esc("abovewithdelims");\r
1772           break;\r
1773 \r
1774         case delimited_code + over_code:\r
1775           print_esc("overwithdelims");\r
1776           break;\r
1777 \r
1778         case delimited_code + atop_code:\r
1779           print_esc("atopwithdelims");\r
1780           break;\r
1781 \r
1782         default:\r
1783           print_esc("above");\r
1784           break;\r
1785       }\r
1786       break;\r
1787 \r
1788     case left_right:\r
1789       if (chr_code == left_noad)\r
1790         print_esc("left");\r
1791       else\r
1792         print_esc("right");\r
1793       break;\r
1794 \r
1795     case prefix:\r
1796       if (chr_code == 1)\r
1797         print_esc("long");\r
1798       else if (chr_code == 2)\r
1799         print_esc("outer");\r
1800       else\r
1801         print_esc("global");\r
1802       break;\r
1803 \r
1804     case def:\r
1805       if (chr_code == 0)\r
1806         print_esc("def");\r
1807       else if (chr_code == 1)\r
1808         print_esc("gdef");\r
1809       else if (chr_code == 2)\r
1810         print_esc("edef");\r
1811       else\r
1812         print_esc("xdef");\r
1813       break;\r
1814 \r
1815     case let:\r
1816       if (chr_code != normal)\r
1817         print_esc("futurelet");\r
1818       else\r
1819         print_esc("let");\r
1820       break;\r
1821 \r
1822     case shorthand_def:\r
1823       switch (chr_code)\r
1824       {\r
1825         case char_def_code:\r
1826           print_esc("chardef");\r
1827           break;\r
1828 \r
1829         case math_char_def_code:\r
1830           print_esc("mathchardef");\r
1831           break;\r
1832 \r
1833         case count_def_code:\r
1834           print_esc("countdef");\r
1835           break;\r
1836 \r
1837         case dimen_def_code:\r
1838           print_esc("dimendef");\r
1839           break;\r
1840 \r
1841         case skip_def_code:\r
1842           print_esc("skipdef");\r
1843           break;\r
1844 \r
1845         case mu_skip_def_code:\r
1846           print_esc("muskipdef");\r
1847           break;\r
1848 \r
1849         default:\r
1850           print_esc("toksdef");\r
1851           break;\r
1852       }\r
1853       break;\r
1854 \r
1855     case char_given:\r
1856       print_esc("char");\r
1857       print_hex(chr_code);\r
1858       break;\r
1859 \r
1860     case math_given:\r
1861       print_esc("mathchar");\r
1862       print_hex(chr_code);\r
1863       break;\r
1864 \r
1865     case def_code:\r
1866       if (chr_code == cat_code_base)\r
1867         print_esc("catcode");\r
1868       else if (chr_code == math_code_base)\r
1869         print_esc("mathcode");\r
1870       else if (chr_code == lc_code_base)\r
1871         print_esc("lccode");\r
1872       else if (chr_code == uc_code_base)\r
1873         print_esc("uccode");\r
1874       else if (chr_code == sf_code_base)\r
1875         print_esc("sfcode");\r
1876       else\r
1877         print_esc("delcode");\r
1878       break;\r
1879 \r
1880     case def_family:\r
1881       print_size(chr_code - math_font_base);\r
1882       break; \r
1883 \r
1884     case hyph_data:\r
1885       if (chr_code == 1)\r
1886         print_esc("patterns");\r
1887       else\r
1888         print_esc("hyphenation");\r
1889       break;\r
1890 \r
1891     case assign_font_int:\r
1892       if (chr_code == 0)\r
1893         print_esc("hyphenchar");\r
1894       else\r
1895         print_esc("skewchar");\r
1896       break;\r
1897 \r
1898     case set_font:\r
1899       prints("select font ");\r
1900       slow_print(font_name[chr_code]);\r
1901 \r
1902       if (font_size[chr_code] != font_dsize[chr_code])\r
1903       {\r
1904         prints(" at ");\r
1905         print_scaled(font_size[chr_code]);\r
1906         prints("pt");\r
1907       }\r
1908       break;\r
1909 \r
1910     case set_interaction:\r
1911       switch (chr_code)\r
1912       {\r
1913         case batch_mode:\r
1914           print_esc("batchmode");\r
1915           break;\r
1916 \r
1917         case nonstop_mode:\r
1918           print_esc("nonstopmode");\r
1919           break;\r
1920 \r
1921         case scroll_mode:\r
1922           print_esc("scrollmode");\r
1923           break;\r
1924 \r
1925         default:\r
1926           print_esc("errorstopmode");\r
1927           break;\r
1928       }\r
1929       break;\r
1930 \r
1931     case in_stream:\r
1932       if (chr_code == 0)\r
1933         print_esc("closein");\r
1934       else\r
1935         print_esc("openin");\r
1936       break;\r
1937 \r
1938     case message:\r
1939       if (chr_code == 0)\r
1940         print_esc("message");\r
1941       else\r
1942         print_esc("errmessage");\r
1943       break;\r
1944 \r
1945     case case_shift:\r
1946       if (chr_code == lc_code_base)\r
1947         print_esc("lowercase");\r
1948       else\r
1949         print_esc("uppercase");\r
1950       break;\r
1951 \r
1952     case xray:\r
1953       switch (chr_code)\r
1954       {\r
1955         case show_box_code:\r
1956           print_esc("showbox");\r
1957           break;\r
1958 \r
1959         case show_the_code:\r
1960           print_esc("showthe");\r
1961           break;\r
1962 \r
1963         case show_lists:\r
1964           print_esc("showlists");\r
1965           break;\r
1966 \r
1967         default:\r
1968           print_esc("show");\r
1969           break;\r
1970       }\r
1971       break;\r
1972 \r
1973     case undefined_cs:\r
1974       prints("undefined");\r
1975       break;\r
1976 \r
1977     case call:\r
1978       prints("macro");\r
1979       break;\r
1980 \r
1981     case long_call:\r
1982       print_esc("long macro");\r
1983       break;\r
1984 \r
1985     case outer_call:\r
1986       print_esc("outer macro");\r
1987       break;\r
1988 \r
1989     case long_outer_call:\r
1990       print_esc("long");\r
1991       print_esc("outer macro");\r
1992       break;\r
1993 \r
1994     case end_template:\r
1995       print_esc("outer endtemplate");\r
1996       break;\r
1997 \r
1998     case extension:\r
1999       switch (chr_code)\r
2000       {\r
2001         case open_node:\r
2002           print_esc("openout");\r
2003           break;\r
2004 \r
2005         case write_node:\r
2006           print_esc("write");\r
2007           break;\r
2008 \r
2009         case close_node:\r
2010           print_esc("closeout");\r
2011           break;\r
2012 \r
2013         case special_node:\r
2014           print_esc("special");\r
2015           break;\r
2016 \r
2017         case immediate_code:\r
2018           print_esc("immediate");\r
2019           break;\r
2020 \r
2021         case set_language_code:\r
2022           print_esc("setlanguage");\r
2023           break;\r
2024 \r
2025         default:\r
2026           prints("[unknown extension!]");\r
2027           break;\r
2028       }\r
2029       break;\r
2030 \r
2031     default:\r
2032       prints("[unknown command code!]");\r
2033       break;\r
2034   }\r
2035 }\r
2036 #ifdef STAT\r
2037 /* sec 0252 */\r
2038 void show_eqtb (pointer n)\r
2039\r
2040   if (n < active_base)\r
2041     print_char('?');\r
2042   else if (n < glue_base)\r
2043   {\r
2044     sprint_cs(n);\r
2045     print_char('=');\r
2046     print_cmd_chr(eq_type(n), equiv(n));\r
2047     \r
2048     if (eq_type(n) >= call)\r
2049     {\r
2050       print_char(':');\r
2051       show_token_list(link(equiv(n)), 0, 32);\r
2052     }\r
2053   }\r
2054   else if (n < local_base)\r
2055     if (n < skip_base)\r
2056     {\r
2057       print_skip_param(n - glue_base);\r
2058       print_char('=');\r
2059       \r
2060       if (n < glue_base + thin_mu_skip_code)\r
2061         print_spec(equiv(n), "pt");\r
2062       else\r
2063         print_spec(equiv(n), "mu");\r
2064     }\r
2065     else if (n < mu_skip_base)\r
2066     {\r
2067       print_esc("skip");\r
2068       print_int(n - skip_base);\r
2069       print_char('=');\r
2070       print_spec(equiv(n), "pt");\r
2071     }\r
2072     else\r
2073     {\r
2074       print_esc("muskip");\r
2075       print_int(n - mu_skip_base);\r
2076       print_char('=');\r
2077       print_spec(equiv(n), "mu");\r
2078     }\r
2079   else if (n < int_base)\r
2080     if (n == par_shape_loc)\r
2081     {\r
2082       print_esc("parshape");\r
2083       print_char('=');\r
2084       \r
2085       if (par_shape_ptr == 0)\r
2086         print_char('0');\r
2087       else\r
2088         print_int(info(par_shape_ptr));\r
2089     }\r
2090     else if (n < toks_base)\r
2091     {\r
2092       print_cmd_chr(assign_toks, n);\r
2093       print_char('=');\r
2094       \r
2095       if (equiv(n) != 0)\r
2096         show_token_list(link(equiv(n)), 0, 32);\r
2097     }\r
2098     else if (n < box_base)\r
2099     {\r
2100       print_esc("toks");\r
2101       print_int(n - toks_base);\r
2102       print_char('=');\r
2103       \r
2104       if (equiv(n) != 0)\r
2105         show_token_list(link(equiv(n)), 0, 32);\r
2106     }\r
2107     else if (n < cur_font_loc)\r
2108     {\r
2109       print_esc("box");\r
2110       print_int(n - box_base);\r
2111       print_char('=');\r
2112       \r
2113       if (equiv(n) == 0)\r
2114         prints("void");\r
2115       else\r
2116       {\r
2117         depth_threshold = 0;\r
2118         breadth_max = 1;\r
2119         show_node_list(equiv(n));\r
2120       }\r
2121     }\r
2122     else if (n < cat_code_base)\r
2123     {\r
2124       if (n == cur_font_loc)\r
2125         prints("current font");\r
2126       else if (n < math_font_base + 16)\r
2127       {\r
2128         print_esc("textfont");\r
2129         print_int(n - math_font_base);\r
2130       }\r
2131       else if (n < math_font_base + 32)\r
2132       {\r
2133         print_esc("scriptfont");\r
2134         print_int(n - math_font_base - 16);\r
2135       }\r
2136       else\r
2137       {\r
2138         print_esc("scriptscriptfont");\r
2139         print_int(n - math_font_base - 32);\r
2140       }\r
2141       \r
2142       print_char('=');\r
2143       print_esc("");\r
2144       print(hash[font_id_base + equiv(n)].rh);\r
2145     }\r
2146     else if (n < math_code_base)\r
2147     {\r
2148       if (n < lc_code_base)\r
2149       {\r
2150         print_esc("catcode");\r
2151         print_int(n - cat_code_base);\r
2152       }\r
2153       else if (n < uc_code_base)\r
2154       {\r
2155         print_esc("lccode");\r
2156         print_int(n - lc_code_base);\r
2157       }\r
2158       else if (n < sf_code_base)\r
2159       {\r
2160         print_esc("uccode");\r
2161         print_int(n - uc_code_base);\r
2162       }\r
2163       else\r
2164       {\r
2165         print_esc("sfcode");\r
2166         print_int(n - sf_code_base);\r
2167       }\r
2168       \r
2169       print_char('=');\r
2170       print_int(equiv(n));\r
2171     }\r
2172     else\r
2173     {\r
2174       print_esc("mathcode");\r
2175       print_int(n - math_code_base);\r
2176       print_char('=');\r
2177       print_int(equiv(n));\r
2178     }\r
2179   else if (n < dimen_base)\r
2180   {\r
2181     if (n < count_base)\r
2182       print_param(n - int_base);\r
2183     else if (n < del_code_base)\r
2184     {\r
2185       print_esc("count");\r
2186       print_int(n - count_base);\r
2187     }\r
2188     else\r
2189     {\r
2190       print_esc("delcode");\r
2191       print_int(n - del_code_base);\r
2192     }\r
2193     \r
2194     print_char('=');\r
2195     print_int(eqtb[n].cint);\r
2196   }\r
2197   else if (n <= eqtb_size)\r
2198   {\r
2199     if (n < scaled_base)\r
2200       print_length_param(n - dimen_base);\r
2201     else\r
2202     {\r
2203       print_esc("dimen");\r
2204       print_int(n - scaled_base);\r
2205     }\r
2206     \r
2207     print_char('=');\r
2208     print_scaled(eqtb[n].cint);\r
2209     prints("pt");\r
2210   }\r
2211   else\r
2212     print_char('?');\r
2213 }\r
2214 #endif\r
2215 /* sec 0259 */\r
2216 pointer id_lookup_(integer j, integer l)\r
2217 {\r
2218   integer h;\r
2219   integer d;\r
2220   pointer p;\r
2221   pointer k;\r
2222 \r
2223   h = buffer[j];\r
2224 \r
2225   for (k = j + 1; k <= j + l - 1; k++)\r
2226   {\r
2227     h = h + h + buffer[k];\r
2228 \r
2229     while (h >= hash_prime)\r
2230       h = h - hash_prime;\r
2231   }\r
2232 \r
2233   p = h + hash_base;\r
2234 \r
2235   while (true)\r
2236   {\r
2237     if (text(p) > 0)\r
2238       if (length(text(p)) == l)\r
2239         if (str_eq_buf(text(p), j))\r
2240           goto found;\r
2241 \r
2242     if (next(p) == 0)\r
2243     {\r
2244       if (no_new_control_sequence)\r
2245         p = undefined_control_sequence;\r
2246       else\r
2247       {\r
2248         if (text(p) > 0)\r
2249         {\r
2250           do\r
2251             {\r
2252               if (hash_is_full)\r
2253               {\r
2254                 overflow("hash size", hash_size + hash_extra);\r
2255                 /* not dynamic        ^~~~~~~~~~~~~~~~~~~~~~*/\r
2256                 return 0;\r
2257               }\r
2258 \r
2259               decr(hash_used);\r
2260             }\r
2261           while (!(text(hash_used) == 0));\r
2262 \r
2263           next(p) = hash_used;\r
2264           p = hash_used;\r
2265         }\r
2266 \r
2267         str_room(l);\r
2268         d = cur_length;\r
2269 \r
2270         while (pool_ptr > str_start[str_ptr])\r
2271         {\r
2272           decr(pool_ptr);\r
2273           str_pool[pool_ptr + l] = str_pool[pool_ptr];\r
2274         }\r
2275 \r
2276         for (k = j; k <= j + l - 1; k++)\r
2277           append_char(buffer[k]);\r
2278 \r
2279         text(p) = make_string();\r
2280         pool_ptr = pool_ptr + d;\r
2281 \r
2282 #ifdef STAT\r
2283         incr(cs_count);\r
2284 \r
2285         if (trace_flag)\r
2286         {\r
2287           str_pool[pool_ptr] = '\0';\r
2288           printf(" tex1.c incr(cs_count): '%s' ", &str_pool[pool_ptr - l - d]);\r
2289         }\r
2290 #endif\r
2291       }\r
2292 \r
2293       goto found;\r
2294     }\r
2295 \r
2296     p = next(p);\r
2297   } \r
2298 \r
2299 found:\r
2300   return p;\r
2301 }\r
2302 /* sec 0274 */\r
2303 void new_save_level (group_code c)\r
2304 {\r
2305   check_full_save_stack();\r
2306   save_type(save_ptr) = level_boundary;\r
2307   save_level(save_ptr) = (quarterword) cur_group; \r
2308   save_index(save_ptr) = cur_boundary;\r
2309 \r
2310   if (cur_level == max_quarterword)\r
2311   {\r
2312     overflow("grouping levels", max_quarterword - min_quarterword);\r
2313     return;\r
2314   }\r
2315 \r
2316   cur_boundary = save_ptr;\r
2317   incr(cur_level);\r
2318   incr(save_ptr);\r
2319   cur_group = c;\r
2320 }\r
2321 /* sec 0275 */\r
2322 void eq_destroy (memory_word w)\r
2323 {\r
2324   pointer q;\r
2325 \r
2326   switch (eq_type_field(w))\r
2327   {\r
2328     case call:\r
2329     case long_call:\r
2330     case outer_call:\r
2331     case long_outer_call:\r
2332       delete_token_ref(equiv_field(w));\r
2333       break;\r
2334 \r
2335     case glue_ref:\r
2336       delete_glue_ref(equiv_field(w));\r
2337       break;\r
2338 \r
2339     case shape_ref:\r
2340       q = equiv_field(w);\r
2341 \r
2342       if (q != 0)\r
2343         free_node(q, info(q) + info(q) + 1);\r
2344       break;\r
2345 \r
2346     case box_ref:\r
2347       flush_node_list(equiv_field(w));\r
2348       break;\r
2349 \r
2350     default:\r
2351       break;\r
2352   }\r
2353 }\r
2354 /* sec 0276 */\r
2355 void eq_save (pointer p, quarterword l)\r
2356 {\r
2357   check_full_save_stack();\r
2358 \r
2359   if (l == level_zero)\r
2360     save_type(save_ptr) = restore_zero;\r
2361   else\r
2362   {\r
2363     save_stack[save_ptr] = eqtb[p];\r
2364     incr(save_ptr);\r
2365     save_type(save_ptr) = restore_old_value;\r
2366   }\r
2367 \r
2368   save_level(save_ptr) = l;\r
2369   save_index(save_ptr) = p;\r
2370   incr(save_ptr);\r
2371 }\r
2372 /* sec 0277 */\r
2373 void eq_define_(pointer p, quarterword t, halfword e)\r
2374 {\r
2375   if (eq_level(p) == cur_level)\r
2376     eq_destroy(eqtb[p]);\r
2377   else if (cur_level > level_one)\r
2378     eq_save(p, eq_level(p));\r
2379 \r
2380   eq_level(p) = (quarterword) cur_level;\r
2381   eq_type(p) = t;\r
2382   equiv(p) = e;\r
2383 }\r
2384 /* sec 0278 */\r
2385 void eq_word_define_(pointer p, integer w)\r
2386 {\r
2387   if (xeq_level[p] != cur_level)\r
2388   {\r
2389     eq_save(p, xeq_level[p]);\r
2390     xeq_level[p] = (quarterword) cur_level;\r
2391   }\r
2392 \r
2393   eqtb[p].cint = w;\r
2394 }\r
2395 /* sec 0279 */\r
2396 void geq_define_(pointer p, quarterword t, halfword e)\r
2397 {\r
2398   eq_destroy(eqtb[p]);\r
2399   eq_level(p) = level_one;\r
2400   eq_type(p) = t;\r
2401   equiv(p) = e;\r
2402 }\r
2403 /* sec 0279 */\r
2404 void geq_word_define_(pointer p, integer w)\r
2405 {\r
2406   eqtb[p].cint = w;\r
2407   xeq_level[p]= level_one;\r
2408 }\r
2409 /* sec 0280 */\r
2410 void save_for_after (halfword t)\r
2411\r
2412   if (cur_level > level_one)\r
2413   {\r
2414     check_full_save_stack();\r
2415     save_type(save_ptr) = insert_token;\r
2416     save_level(save_ptr) = level_zero;\r
2417     save_index(save_ptr) = t;\r
2418     incr(save_ptr);\r
2419   }\r
2420 }