2 Copyright 2014 Clerk Ma
\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
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
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
20 #define EXTERN extern
\r
22 #include "yandytex.h"
\r
25 void show_box_(pointer p)
\r
27 depth_threshold = show_box_depth;
\r
28 breadth_max = show_box_breadth;
\r
30 if (breadth_max <= 0)
\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
37 if (pool_ptr + depth_threshold >= current_pool_size)
\r
38 depth_threshold = current_pool_size - pool_ptr - 1;
\r
40 if (pool_ptr + depth_threshold >= pool_size)
\r
41 depth_threshold = pool_size - pool_ptr - 1;
\r
48 void delete_token_ref_(pointer p)
\r
50 if (token_ref_count(p) == 0)
\r
53 decr(token_ref_count(p));
\r
56 void delete_glue_ref_(pointer p)
\r
58 if (glue_ref_count(p) == 0)
\r
59 free_node(p, glue_spec_size);
\r
61 decr(glue_ref_count(p));
\r
64 void flush_node_list_(pointer p)
\r
68 while (is_char_node(p))
\r
72 if (is_char_node(p))
\r
82 flush_node_list(list_ptr(p));
\r
83 free_node(p, box_node_size);
\r
89 free_node(p, rule_node_size);
\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
103 switch (subtype(p))
\r
106 free_node(p, open_node_size);
\r
111 delete_token_ref(write_tokens(p));
\r
112 free_node(p, write_node_size);
\r
117 case set_language_code:
\r
118 free_node(p, small_node_size);
\r
131 delete_glue_ref(p);
\r
133 if (leader_ptr(p) != 0)
\r
134 flush_node_list(leader_ptr(p));
\r
140 case ligature_node:
\r
141 flush_node_list(lig_ptr(p));
\r
144 delete_token_ref(mark_ptr(p));
\r
147 flush_node_list(pre_break(p));
\r
148 flush_node_list(post_break(p));
\r
151 flush_node_list(adjust_ptr(p));
\r
155 free_node(p, style_node_size);
\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
183 if (math_type(nucleus(p)) >= sub_box)
\r
184 flush_node_list(info(nucleus(p)));
\r
186 if (math_type(supscr(p)) >= sub_box)
\r
187 flush_node_list(info(supscr(p)));
\r
189 if (math_type(subscr(p)) >= sub_box)
\r
190 flush_node_list(info(subscr(p)));
\r
192 if (type(p) == radical_noad)
\r
193 free_node(p, radical_noad_size);
\r
196 if (type(p) == accent_noad)
\r
197 free_node(p, accent_noad_size);
\r
199 free_node(p, noad_size);
\r
208 free_node(p, noad_size);
\r
212 case fraction_noad:
\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
222 confusion("flushing");
\r
228 free_node(p, small_node_size);
\r
236 pointer copy_node_list_(pointer p)
\r
250 if (is_char_node(p))
\r
252 else switch (type(p))
\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
267 r = get_node(rule_node_size);
\r
268 words = rule_node_size;
\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
281 switch (subtype(p))
\r
285 r = get_node(open_node_size);
\r
286 words = open_node_size;
\r
293 r = get_node(write_node_size);
\r
294 add_token_ref(write_tokens(p));
\r
295 words = write_node_size;
\r
300 case language_node:
\r
302 r = get_node(small_node_size);
\r
303 words = small_node_size;
\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
329 r = get_node(small_node_size);
\r
330 words = small_node_size;
\r
334 case ligature_node:
\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
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
352 r = get_node(small_node_size);
\r
353 add_token_ref(mark_ptr(p));
\r
354 words = small_node_size;
\r
360 r = get_node(small_node_size);
\r
361 adjust_ptr(r) = copy_node_list(adjust_ptr(p));
\r
367 confusion("copying");
\r
376 mem[r + words] = mem[p + words];
\r
391 void print_mode_(integer m)
\r
395 switch (m / (max_command + 1))
\r
398 prints("vertical");
\r
401 prints("horizontal");
\r
404 prints("display math");
\r
414 switch ((- (integer) m) / (max_command + 1))
\r
417 prints("internal vertical");
\r
420 prints("restricted horizontal");
\r
432 void push_nest (void)
\r
434 if (nest_ptr > max_nest_stack)
\r
436 max_nest_stack = nest_ptr;
\r
438 #ifdef ALLOCATEINPUTSTACK
\r
439 if (nest_ptr == current_nest_size)
\r
440 nest = realloc_nest_stack(increment_nest_size);
\r
442 if (nest_ptr == current_nest_size)
\r
444 overflow("semantic nest size", current_nest_size);
\r
448 if (nest_ptr == nest_size)
\r
450 overflow("semantic nest size", nest_size);
\r
456 nest[nest_ptr]= cur_list;
\r
458 head = get_avail();
\r
464 void pop_nest (void)
\r
468 cur_list = nest[nest_ptr];
\r
471 void show_activities (void)
\r
479 nest[nest_ptr] = cur_list;
\r
483 for (p = nest_ptr; p >= 0; p--)
\r
485 m = nest[p].mode_field;
\r
486 a = nest[p].aux_field;
\r
489 prints(" entered at line ");
\r
490 print_int(abs(nest[p].ml_field));
\r
494 if (nest[p].pg_field != 040600000)
\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
501 print_int((nest[p].pg_field / 65536L) % 64);
\r
506 if (nest[p].ml_field < 0)
\r
507 prints(" (\\output routine)");
\r
511 if (page_head != page_tail)
\r
513 print_nl("### current page:");
\r
516 prints(" (held over for next output)");
\r
518 show_box(link(page_head));
\r
520 if (page_contents > 0)
\r
522 print_nl("total height ");
\r
524 print_nl(" goal height ");
\r
525 print_scaled(page_so_far[0]);
\r
526 r = link(page_ins_head);
\r
528 while (r != mem_top)
\r
531 print_esc("insert");
\r
536 if (count(t) == 1000)
\r
539 t = x_over_n(height(r), 1000) * count(t);
\r
543 if (type(r) == split_up)
\r
552 if ((type(q) == ins_node) && (subtype(q) == subtype(r)))
\r
555 while (!(q == broken_ins(r)));
\r
559 prints(" might split");
\r
566 if (link(contrib_head) != 0)
\r
567 print_nl("### recent contributions:");
\r
570 show_box(link(nest[p].head_field));
\r
572 switch (abs(m) / (max_command + 1))
\r
576 print_nl("prevdepth ");
\r
578 if (a.cint <= ignore_depth)
\r
581 print_scaled(a.cint);
\r
583 if (nest[p].pg_field != 0)
\r
585 prints(", prevgraf ");
\r
586 print_int(nest[p].pg_field);
\r
589 if (nest[p].pg_field != 1)
\r
597 print_nl("spacefactor ");
\r
598 print_int(a.hh.lh);
\r
604 prints(", current language ");
\r
605 print_int(a.hh.rh);
\r
614 prints("this will be denominator of:");
\r
622 void print_param_(integer n)
\r
626 case pretolerance_code:
\r
627 print_esc("pretolerance");
\r
630 case tolerance_code:
\r
631 print_esc("tolerance");
\r
634 case line_penalty_code:
\r
635 print_esc("linepenalty");
\r
638 case hyphen_penalty_code:
\r
639 print_esc("hyphenpenalty");
\r
642 case ex_hyphen_penalty_code:
\r
643 print_esc("exhyphenpenalty");
\r
646 case club_penalty_code:
\r
647 print_esc("clubpenalty");
\r
650 case widow_penalty_code:
\r
651 print_esc("widowpenalty");
\r
654 case display_widow_penalty_code:
\r
655 print_esc("displaywidowpenalty");
\r
658 case broken_penalty_code:
\r
659 print_esc("brokenpenalty");
\r
662 case bin_op_penalty_code:
\r
663 print_esc("binoppenalty");
\r
666 case rel_penalty_code:
\r
667 print_esc("relpenalty");
\r
670 case pre_display_penalty_code:
\r
671 print_esc("predisplaypenalty");
\r
674 case post_display_penalty_code:
\r
675 print_esc("postdisplaypenalty");
\r
678 case inter_line_penalty_code:
\r
679 print_esc("interlinepenalty");
\r
682 case double_hyphen_demerits_code:
\r
683 print_esc("doublehyphendemerits");
\r
686 case final_hyphen_demerits_code:
\r
687 print_esc("finalhyphendemerits");
\r
690 case adj_demerits_code:
\r
691 print_esc("adjdemerits");
\r
698 case delimiter_factor_code:
\r
699 print_esc("delimiterfactor");
\r
702 case looseness_code:
\r
703 print_esc("looseness");
\r
715 print_esc("month");
\r
722 case show_box_breadth_code:
\r
723 print_esc("showboxbreadth");
\r
726 case show_box_depth_code:
\r
727 print_esc("showboxdepth");
\r
730 case hbadness_code:
\r
731 print_esc("hbadness");
\r
734 case vbadness_code:
\r
735 print_esc("vbadness");
\r
739 print_esc("pausing");
\r
742 case tracing_online_code:
\r
743 print_esc("tracingonline");
\r
746 case tracing_macros_code:
\r
747 print_esc("tracingmacros");
\r
750 case tracing_stats_code:
\r
751 print_esc("tracingstats");
\r
754 case tracing_paragraphs_code:
\r
755 print_esc("tracingparagraphs");
\r
758 case tracing_pages_code:
\r
759 print_esc("tracingpages");
\r
762 case tracing_output_code:
\r
763 print_esc("tracingoutput");
\r
766 case tracing_lost_chars_code:
\r
767 print_esc("tracinglostchars");
\r
770 case tracing_commands_code:
\r
771 print_esc("tracingcommands");
\r
774 case tracing_restores_code:
\r
775 print_esc("tracingrestores");
\r
779 print_esc("uchyph");
\r
782 case output_penalty_code:
\r
783 print_esc("outputpenalty");
\r
786 case max_dead_cycles_code:
\r
787 print_esc("maxdeadcycles");
\r
790 case hang_after_code:
\r
791 print_esc("hangafter");
\r
794 case floating_penalty_code:
\r
795 print_esc("floatingpenalty");
\r
798 case global_defs_code:
\r
799 print_esc("globaldefs");
\r
806 case escape_char_code:
\r
807 print_esc("escapechar");
\r
810 case default_hyphen_char_code:
\r
811 print_esc("defaulthyphenchar");
\r
814 case default_skew_char_code:
\r
815 print_esc("defaultskewchar");
\r
818 case end_line_char_code:
\r
819 print_esc("endlinechar");
\r
822 case new_line_char_code:
\r
823 print_esc("newlinechar");
\r
826 case language_code:
\r
827 print_esc("language");
\r
830 case left_hyphen_min_code:
\r
831 print_esc("lefthyphenmin");
\r
834 case right_hyphen_min_code:
\r
835 print_esc("righthyphenmin");
\r
838 case holding_inserts_code:
\r
839 print_esc("holdinginserts");
\r
842 case error_context_lines_code:
\r
843 print_esc("errorcontextlines");
\r
847 prints("[unknown integer parameter!]");
\r
852 void begin_diagnostic (void)
\r
854 old_setting = selector;
\r
856 if ((tracing_online <= 0) && (selector == term_and_log))
\r
860 if (history == spotless)
\r
861 history = warning_issued;
\r
865 void end_diagnostic(boolean blank_line)
\r
872 selector = old_setting;
\r
875 void print_length_param_ (integer n)
\r
879 case par_indent_code:
\r
880 print_esc("parindent");
\r
883 case math_surround_code:
\r
884 print_esc("mathsurround");
\r
887 case line_skip_limit_code:
\r
888 print_esc("lineskiplimit");
\r
892 print_esc("hsize");
\r
896 print_esc("vsize");
\r
899 case max_depth_code:
\r
900 print_esc("maxdepth");
\r
903 case split_max_depth_code:
\r
904 print_esc("splitmaxdepth");
\r
907 case box_max_depth_code:
\r
908 print_esc("boxmaxdepth");
\r
912 print_esc("hfuzz");
\r
916 print_esc("vfuzz");
\r
919 case delimiter_shortfall_code:
\r
920 print_esc("delimitershortfall");
\r
923 case null_delimiter_space_code:
\r
924 print_esc("nulldelimiterspace");
\r
927 case script_space_code:
\r
928 print_esc("scriptspace");
\r
931 case pre_display_size_code:
\r
932 print_esc("predisplaysize");
\r
935 case display_width_code:
\r
936 print_esc("displaywidth");
\r
939 case display_indent_code:
\r
940 print_esc("displayindent");
\r
943 case overfull_rule_code:
\r
944 print_esc("overfullrule");
\r
947 case hang_indent_code:
\r
948 print_esc("hangindent");
\r
951 case h_offset_code:
\r
952 print_esc("hoffset");
\r
955 case v_offset_code:
\r
956 print_esc("voffset");
\r
959 case emergency_stretch_code:
\r
960 print_esc("emergencystretch");
\r
964 prints("[unknown dimen parameter!]");
\r
969 void print_cmd_chr_ (quarterword cmd, halfword chr_code)
\r
974 chr_cmd("begin-group character ");
\r
978 chr_cmd("end-group character ");
\r
982 chr_cmd("math shift character ");
\r
986 chr_cmd("macro parameter character ");
\r
990 chr_cmd("superscript character ");
\r
994 chr_cmd("subscript character ");
\r
998 chr_cmd("end of alignment template");
\r
1002 chr_cmd("blank space ");
\r
1006 chr_cmd("the letter ");
\r
1010 chr_cmd("the character ");
\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
1019 print_esc("skip");
\r
1020 print_int(chr_code - skip_base);
\r
1024 print_esc("muskip");
\r
1025 print_int(chr_code - mu_skip_base);
\r
1030 if (chr_code >= toks_base)
\r
1032 print_esc("toks");
\r
1033 print_int(chr_code - toks_base);
\r
1039 case output_routine_loc:
\r
1040 print_esc("output");
\r
1043 case every_par_loc:
\r
1044 print_esc("everypar");
\r
1047 case every_math_loc:
\r
1048 print_esc("everymath");
\r
1051 case every_display_loc:
\r
1052 print_esc("everydisplay");
\r
1055 case every_hbox_loc:
\r
1056 print_esc("everyhbox");
\r
1059 case every_vbox_loc:
\r
1060 print_esc("everyvbox");
\r
1063 case every_job_loc:
\r
1064 print_esc("everyjob");
\r
1067 case every_cr_loc:
\r
1068 print_esc("everycr");
\r
1072 print_esc("errhelp");
\r
1079 if (chr_code < count_base)
\r
1080 print_param(chr_code - int_base);
\r
1083 print_esc("count");
\r
1084 print_int(chr_code - count_base);
\r
1088 case assign_dimen:
\r
1089 if (chr_code < scaled_base)
\r
1090 print_length_param(chr_code - dimen_base);
\r
1093 print_esc("dimen");
\r
1094 print_int(chr_code - scaled_base);
\r
1099 print_esc("accent");
\r
1103 print_esc("advance");
\r
1106 case after_assignment:
\r
1107 print_esc("afterassignment");
\r
1111 print_esc("aftergroup");
\r
1114 case assign_font_dimen:
\r
1115 print_esc("fontdimen");
\r
1119 print_esc("begingroup");
\r
1122 case break_penalty:
\r
1123 print_esc("penalty");
\r
1127 print_esc("char");
\r
1131 print_esc("csname");
\r
1135 print_esc("font");
\r
1139 print_esc("delimiter");
\r
1143 print_esc("divide");
\r
1147 print_esc("endcsname");
\r
1151 print_esc("endgroup");
\r
1158 case expand_after:
\r
1159 print_esc("expandafter");
\r
1163 print_esc("halign");
\r
1167 print_esc("hrule");
\r
1170 case ignore_spaces:
\r
1171 print_esc("ignorespaces");
\r
1175 print_esc("insert");
\r
1183 print_esc("mark");
\r
1187 print_esc("mathaccent");
\r
1190 case math_char_num:
\r
1191 print_esc("mathchar");
\r
1195 print_esc("mathchoice");
\r
1199 print_esc("multiply");
\r
1203 print_esc("noalign");
\r
1207 print_esc("noboundary");
\r
1211 print_esc("noexpand");
\r
1215 print_esc("nonscript");
\r
1219 print_esc("omit");
\r
1223 print_esc("radical");
\r
1227 print_esc("read");
\r
1231 print_esc("relax");
\r
1235 print_esc("setbox");
\r
1238 case set_prev_graf:
\r
1239 print_esc("prevgraf");
\r
1243 print_esc("parshape");
\r
1250 case toks_register:
\r
1251 print_esc("toks");
\r
1255 print_esc("vadjust");
\r
1259 print_esc("valign");
\r
1263 print_esc("vcenter");
\r
1267 print_esc("vrule");
\r
1275 if (chr_code == 0)
\r
1276 print_esc("input");
\r
1278 print_esc("endinput");
\r
1281 case top_bot_mark:
\r
1284 case first_mark_code:
\r
1285 print_esc("firstmark");
\r
1288 case bot_mark_code:
\r
1289 print_esc("botmark");
\r
1292 case split_first_mark_code:
\r
1293 print_esc("splitfirstmark");
\r
1296 case split_bot_mark_code:
\r
1297 print_esc("splitbotmark");
\r
1301 print_esc("topmark");
\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
1314 print_esc("muskip");
\r
1318 if (chr_code == vmode)
\r
1319 print_esc("prevdepth");
\r
1321 print_esc("spacefactor");
\r
1324 case set_page_int:
\r
1325 if (chr_code == 0)
\r
1326 print_esc("deadcycles");
\r
1328 print_esc("insertpenalties");
\r
1331 case set_box_dimen:
\r
1332 if (chr_code == width_offset)
\r
1334 else if (chr_code == height_offset)
\r
1344 print_esc("lastpenalty");
\r
1348 print_esc("lastkern");
\r
1352 print_esc("lastskip");
\r
1355 case input_line_no_code:
\r
1356 print_esc("inputlineno");
\r
1360 print_esc("badness");
\r
1369 print_esc("number");
\r
1372 case roman_numeral_code:
\r
1373 print_esc("romannumeral");
\r
1377 print_esc("string");
\r
1380 case meaning_code:
\r
1381 print_esc("meaning");
\r
1384 case font_name_code:
\r
1385 print_esc("fontname");
\r
1389 print_esc("jobname");
\r
1398 print_esc("ifcat");
\r
1402 print_esc("ifnum");
\r
1406 print_esc("ifdim");
\r
1410 print_esc("ifodd");
\r
1413 case if_vmode_code:
\r
1414 print_esc("ifvmode");
\r
1417 case if_hmode_code:
\r
1418 print_esc("ifhmode");
\r
1421 case if_mmode_code:
\r
1422 print_esc("ifmmode");
\r
1425 case if_inner_code:
\r
1426 print_esc("ifinner");
\r
1429 case if_void_code:
\r
1430 print_esc("ifvoid");
\r
1433 case if_hbox_code:
\r
1434 print_esc("ifhbox");
\r
1437 case if_vbox_code:
\r
1438 print_esc("ifvbox");
\r
1446 print_esc("ifeof");
\r
1449 case if_true_code:
\r
1450 print_esc("iftrue");
\r
1453 case if_false_code:
\r
1454 print_esc("iffalse");
\r
1457 case if_case_code:
\r
1458 print_esc("ifcase");
\r
1468 if (chr_code == fi_code)
\r
1470 else if (chr_code == or_code)
\r
1473 print_esc("else");
\r
1477 if (chr_code == span_code)
\r
1478 print_esc("span");
\r
1481 prints("alignment tab character ");
\r
1487 if (chr_code == cr_code)
\r
1490 print_esc("crcr");
\r
1493 case set_page_dimen:
\r
1497 print_esc("pagegoal");
\r
1501 print_esc("pagetotal");
\r
1505 print_esc("pagestretch");
\r
1509 print_esc("pagefilstretch");
\r
1513 print_esc("pagefillstretch");
\r
1517 print_esc("pagefilllstretch");
\r
1521 print_esc("pageshrink");
\r
1525 print_esc("pagedepth");
\r
1531 if (chr_code == 1)
\r
1532 print_esc("dump");
\r
1541 print_esc("hskip");
\r
1545 print_esc("hfil");
\r
1549 print_esc("hfill");
\r
1557 print_esc("hfilneg");
\r
1566 print_esc("vskip");
\r
1570 print_esc("vfil");
\r
1574 print_esc("vfill");
\r
1582 print_esc("vfilneg");
\r
1588 print_esc("mskip");
\r
1592 print_esc("kern");
\r
1596 print_esc("mkern");
\r
1600 if (chr_code == 1)
\r
1601 print_esc("moveleft");
\r
1603 print_esc("moveright");
\r
1607 if (chr_code == 1)
\r
1608 print_esc("raise");
\r
1610 print_esc("lower");
\r
1621 print_esc("copy");
\r
1624 case last_box_code:
\r
1625 print_esc("lastbox");
\r
1629 print_esc("vsplit");
\r
1633 print_esc("vtop");
\r
1636 case vtop_code + vmode:
\r
1637 print_esc("vbox");
\r
1641 print_esc("hbox");
\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
1654 print_esc("shipout");
\r
1658 if (chr_code == 0)
\r
1659 print_esc("noindent");
\r
1661 print_esc("indent");
\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
1670 print_esc("unpenalty");
\r
1674 if (chr_code == copy_code)
\r
1675 print_esc("unhcopy");
\r
1677 print_esc("unhbox");
\r
1681 if (chr_code == copy_code)
\r
1682 print_esc("unvcopy");
\r
1684 print_esc("unvbox");
\r
1687 case discretionary:
\r
1688 if (chr_code == 1)
\r
1691 print_esc("discretionary");
\r
1695 if (chr_code == 1)
\r
1696 print_esc("leqno");
\r
1698 print_esc("eqno");
\r
1705 print_esc("mathord");
\r
1709 print_esc("mathop");
\r
1713 print_esc("mathbin");
\r
1717 print_esc("mathrel");
\r
1721 print_esc("mathopen");
\r
1725 print_esc("mathclose");
\r
1729 print_esc("mathpunct");
\r
1733 print_esc("mathinner");
\r
1737 print_esc("underline");
\r
1741 print_esc("overline");
\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
1752 print_esc("displaylimits");
\r
1756 print_style(chr_code);
\r
1763 print_esc("over");
\r
1767 print_esc("atop");
\r
1770 case delimited_code + above_code:
\r
1771 print_esc("abovewithdelims");
\r
1774 case delimited_code + over_code:
\r
1775 print_esc("overwithdelims");
\r
1778 case delimited_code + atop_code:
\r
1779 print_esc("atopwithdelims");
\r
1783 print_esc("above");
\r
1789 if (chr_code == left_noad)
\r
1790 print_esc("left");
\r
1792 print_esc("right");
\r
1796 if (chr_code == 1)
\r
1797 print_esc("long");
\r
1798 else if (chr_code == 2)
\r
1799 print_esc("outer");
\r
1801 print_esc("global");
\r
1805 if (chr_code == 0)
\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
1812 print_esc("xdef");
\r
1816 if (chr_code != normal)
\r
1817 print_esc("futurelet");
\r
1822 case shorthand_def:
\r
1825 case char_def_code:
\r
1826 print_esc("chardef");
\r
1829 case math_char_def_code:
\r
1830 print_esc("mathchardef");
\r
1833 case count_def_code:
\r
1834 print_esc("countdef");
\r
1837 case dimen_def_code:
\r
1838 print_esc("dimendef");
\r
1841 case skip_def_code:
\r
1842 print_esc("skipdef");
\r
1845 case mu_skip_def_code:
\r
1846 print_esc("muskipdef");
\r
1850 print_esc("toksdef");
\r
1856 print_esc("char");
\r
1857 print_hex(chr_code);
\r
1861 print_esc("mathchar");
\r
1862 print_hex(chr_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
1877 print_esc("delcode");
\r
1881 print_size(chr_code - math_font_base);
\r
1885 if (chr_code == 1)
\r
1886 print_esc("patterns");
\r
1888 print_esc("hyphenation");
\r
1891 case assign_font_int:
\r
1892 if (chr_code == 0)
\r
1893 print_esc("hyphenchar");
\r
1895 print_esc("skewchar");
\r
1899 prints("select font ");
\r
1900 slow_print(font_name[chr_code]);
\r
1902 if (font_size[chr_code] != font_dsize[chr_code])
\r
1905 print_scaled(font_size[chr_code]);
\r
1910 case set_interaction:
\r
1914 print_esc("batchmode");
\r
1917 case nonstop_mode:
\r
1918 print_esc("nonstopmode");
\r
1922 print_esc("scrollmode");
\r
1926 print_esc("errorstopmode");
\r
1932 if (chr_code == 0)
\r
1933 print_esc("closein");
\r
1935 print_esc("openin");
\r
1939 if (chr_code == 0)
\r
1940 print_esc("message");
\r
1942 print_esc("errmessage");
\r
1946 if (chr_code == lc_code_base)
\r
1947 print_esc("lowercase");
\r
1949 print_esc("uppercase");
\r
1955 case show_box_code:
\r
1956 print_esc("showbox");
\r
1959 case show_the_code:
\r
1960 print_esc("showthe");
\r
1964 print_esc("showlists");
\r
1968 print_esc("show");
\r
1973 case undefined_cs:
\r
1974 prints("undefined");
\r
1982 print_esc("long macro");
\r
1986 print_esc("outer macro");
\r
1989 case long_outer_call:
\r
1990 print_esc("long");
\r
1991 print_esc("outer macro");
\r
1994 case end_template:
\r
1995 print_esc("outer endtemplate");
\r
2002 print_esc("openout");
\r
2006 print_esc("write");
\r
2010 print_esc("closeout");
\r
2013 case special_node:
\r
2014 print_esc("special");
\r
2017 case immediate_code:
\r
2018 print_esc("immediate");
\r
2021 case set_language_code:
\r
2022 print_esc("setlanguage");
\r
2026 prints("[unknown extension!]");
\r
2032 prints("[unknown command code!]");
\r
2038 void show_eqtb (pointer n)
\r
2040 if (n < active_base)
\r
2042 else if (n < glue_base)
\r
2046 print_cmd_chr(eq_type(n), equiv(n));
\r
2048 if (eq_type(n) >= call)
\r
2051 show_token_list(link(equiv(n)), 0, 32);
\r
2054 else if (n < local_base)
\r
2055 if (n < skip_base)
\r
2057 print_skip_param(n - glue_base);
\r
2060 if (n < glue_base + thin_mu_skip_code)
\r
2061 print_spec(equiv(n), "pt");
\r
2063 print_spec(equiv(n), "mu");
\r
2065 else if (n < mu_skip_base)
\r
2067 print_esc("skip");
\r
2068 print_int(n - skip_base);
\r
2070 print_spec(equiv(n), "pt");
\r
2074 print_esc("muskip");
\r
2075 print_int(n - mu_skip_base);
\r
2077 print_spec(equiv(n), "mu");
\r
2079 else if (n < int_base)
\r
2080 if (n == par_shape_loc)
\r
2082 print_esc("parshape");
\r
2085 if (par_shape_ptr == 0)
\r
2088 print_int(info(par_shape_ptr));
\r
2090 else if (n < toks_base)
\r
2092 print_cmd_chr(assign_toks, n);
\r
2095 if (equiv(n) != 0)
\r
2096 show_token_list(link(equiv(n)), 0, 32);
\r
2098 else if (n < box_base)
\r
2100 print_esc("toks");
\r
2101 print_int(n - toks_base);
\r
2104 if (equiv(n) != 0)
\r
2105 show_token_list(link(equiv(n)), 0, 32);
\r
2107 else if (n < cur_font_loc)
\r
2110 print_int(n - box_base);
\r
2113 if (equiv(n) == 0)
\r
2117 depth_threshold = 0;
\r
2119 show_node_list(equiv(n));
\r
2122 else if (n < cat_code_base)
\r
2124 if (n == cur_font_loc)
\r
2125 prints("current font");
\r
2126 else if (n < math_font_base + 16)
\r
2128 print_esc("textfont");
\r
2129 print_int(n - math_font_base);
\r
2131 else if (n < math_font_base + 32)
\r
2133 print_esc("scriptfont");
\r
2134 print_int(n - math_font_base - 16);
\r
2138 print_esc("scriptscriptfont");
\r
2139 print_int(n - math_font_base - 32);
\r
2144 print(hash[font_id_base + equiv(n)].rh);
\r
2146 else if (n < math_code_base)
\r
2148 if (n < lc_code_base)
\r
2150 print_esc("catcode");
\r
2151 print_int(n - cat_code_base);
\r
2153 else if (n < uc_code_base)
\r
2155 print_esc("lccode");
\r
2156 print_int(n - lc_code_base);
\r
2158 else if (n < sf_code_base)
\r
2160 print_esc("uccode");
\r
2161 print_int(n - uc_code_base);
\r
2165 print_esc("sfcode");
\r
2166 print_int(n - sf_code_base);
\r
2170 print_int(equiv(n));
\r
2174 print_esc("mathcode");
\r
2175 print_int(n - math_code_base);
\r
2177 print_int(equiv(n));
\r
2179 else if (n < dimen_base)
\r
2181 if (n < count_base)
\r
2182 print_param(n - int_base);
\r
2183 else if (n < del_code_base)
\r
2185 print_esc("count");
\r
2186 print_int(n - count_base);
\r
2190 print_esc("delcode");
\r
2191 print_int(n - del_code_base);
\r
2195 print_int(eqtb[n].cint);
\r
2197 else if (n <= eqtb_size)
\r
2199 if (n < scaled_base)
\r
2200 print_length_param(n - dimen_base);
\r
2203 print_esc("dimen");
\r
2204 print_int(n - scaled_base);
\r
2208 print_scaled(eqtb[n].cint);
\r
2216 pointer id_lookup_(integer j, integer l)
\r
2225 for (k = j + 1; k <= j + l - 1; k++)
\r
2227 h = h + h + buffer[k];
\r
2229 while (h >= hash_prime)
\r
2230 h = h - hash_prime;
\r
2233 p = h + hash_base;
\r
2238 if (length(text(p)) == l)
\r
2239 if (str_eq_buf(text(p), j))
\r
2244 if (no_new_control_sequence)
\r
2245 p = undefined_control_sequence;
\r
2254 overflow("hash size", hash_size + hash_extra);
\r
2255 /* not dynamic ^~~~~~~~~~~~~~~~~~~~~~*/
\r
2261 while (!(text(hash_used) == 0));
\r
2263 next(p) = hash_used;
\r
2270 while (pool_ptr > str_start[str_ptr])
\r
2273 str_pool[pool_ptr + l] = str_pool[pool_ptr];
\r
2276 for (k = j; k <= j + l - 1; k++)
\r
2277 append_char(buffer[k]);
\r
2279 text(p) = make_string();
\r
2280 pool_ptr = pool_ptr + d;
\r
2287 str_pool[pool_ptr] = '\0';
\r
2288 printf(" tex1.c incr(cs_count): '%s' ", &str_pool[pool_ptr - l - d]);
\r
2303 void new_save_level (group_code c)
\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
2310 if (cur_level == max_quarterword)
\r
2312 overflow("grouping levels", max_quarterword - min_quarterword);
\r
2316 cur_boundary = save_ptr;
\r
2322 void eq_destroy (memory_word w)
\r
2326 switch (eq_type_field(w))
\r
2331 case long_outer_call:
\r
2332 delete_token_ref(equiv_field(w));
\r
2336 delete_glue_ref(equiv_field(w));
\r
2340 q = equiv_field(w);
\r
2343 free_node(q, info(q) + info(q) + 1);
\r
2347 flush_node_list(equiv_field(w));
\r
2355 void eq_save (pointer p, quarterword l)
\r
2357 check_full_save_stack();
\r
2359 if (l == level_zero)
\r
2360 save_type(save_ptr) = restore_zero;
\r
2363 save_stack[save_ptr] = eqtb[p];
\r
2365 save_type(save_ptr) = restore_old_value;
\r
2368 save_level(save_ptr) = l;
\r
2369 save_index(save_ptr) = p;
\r
2373 void eq_define_(pointer p, quarterword t, halfword e)
\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
2380 eq_level(p) = (quarterword) cur_level;
\r
2385 void eq_word_define_(pointer p, integer w)
\r
2387 if (xeq_level[p] != cur_level)
\r
2389 eq_save(p, xeq_level[p]);
\r
2390 xeq_level[p] = (quarterword) cur_level;
\r
2396 void geq_define_(pointer p, quarterword t, halfword e)
\r
2398 eq_destroy(eqtb[p]);
\r
2399 eq_level(p) = level_one;
\r
2404 void geq_word_define_(pointer p, integer w)
\r
2407 xeq_level[p]= level_one;
\r
2410 void save_for_after (halfword t)
\r
2412 if (cur_level > level_one)
\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