1 /* Copyright 2014 Clerk Ma
\r
3 This program is free software; you can redistribute it and/or modify
\r
4 it under the terms of the GNU General Public License as published by
\r
5 the Free Software Foundation; either version 2 of the License, or
\r
6 (at your option) any later version.
\r
8 This program is distributed in the hope that it will be useful, but
\r
9 WITHOUT ANY WARRANTY; without even the implied warranty of
\r
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
\r
11 General Public License for more details.
\r
13 You should have received a copy of the GNU General Public License
\r
14 along with this program; if not, write to the Free Software
\r
15 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
\r
18 #define EXTERN extern
\r
20 #include "yandytex.h"
\r
23 void show_box_(pointer p)
\r
25 depth_threshold = show_box_depth;
\r
26 breadth_max = show_box_breadth;
\r
28 if (breadth_max <= 0)
\r
31 #ifdef ALLOCATESTRING
\r
32 if (pool_ptr + depth_threshold >= current_pool_size)
\r
33 str_pool = realloc_str_pool(increment_pool_size);
\r
35 if (pool_ptr + depth_threshold >= current_pool_size)
\r
36 depth_threshold = current_pool_size - pool_ptr - 1;
\r
38 if (pool_ptr + depth_threshold >= pool_size)
\r
39 depth_threshold = pool_size - pool_ptr - 1;
\r
46 void delete_token_ref_(pointer p)
\r
48 if (token_ref_count(p) == 0)
\r
51 decr(token_ref_count(p));
\r
54 void delete_glue_ref_(pointer p)
\r
56 if (glue_ref_count(p) == 0)
\r
57 free_node(p, glue_spec_size);
\r
59 decr(glue_ref_count(p));
\r
62 void flush_node_list_(pointer p)
\r
66 while (is_char_node(p))
\r
70 if (is_char_node(p))
\r
80 flush_node_list(list_ptr(p));
\r
81 free_node(p, box_node_size);
\r
87 free_node(p, rule_node_size);
\r
93 flush_node_list(ins_ptr(p));
\r
94 delete_glue_ref(split_top_ptr(p));
\r
95 free_node(p, ins_node_size);
\r
101 switch (subtype(p))
\r
104 free_node(p, open_node_size);
\r
109 delete_token_ref(write_tokens(p));
\r
110 free_node(p, write_node_size);
\r
115 case set_language_code:
\r
116 free_node(p, small_node_size);
\r
129 delete_glue_ref(p);
\r
131 if (leader_ptr(p) != 0)
\r
132 flush_node_list(leader_ptr(p));
\r
138 case ligature_node:
\r
139 flush_node_list(lig_ptr(p));
\r
142 delete_token_ref(mark_ptr(p));
\r
145 flush_node_list(pre_break(p));
\r
146 flush_node_list(post_break(p));
\r
149 flush_node_list(adjust_ptr(p));
\r
153 free_node(p, style_node_size);
\r
159 flush_node_list(display_mlist(p));
\r
160 flush_node_list(text_mlist(p));
\r
161 flush_node_list(script_mlist(p));
\r
162 flush_node_list(script_script_mlist(p));
\r
163 free_node(p, style_node_size);
\r
181 if (math_type(nucleus(p)) >= sub_box)
\r
182 flush_node_list(info(nucleus(p)));
\r
184 if (math_type(supscr(p)) >= sub_box)
\r
185 flush_node_list(info(supscr(p)));
\r
187 if (math_type(subscr(p)) >= sub_box)
\r
188 flush_node_list(info(subscr(p)));
\r
190 if (type(p) == radical_noad)
\r
191 free_node(p, radical_noad_size);
\r
194 if (type(p) == accent_noad)
\r
195 free_node(p, accent_noad_size);
\r
197 free_node(p, noad_size);
\r
206 free_node(p, noad_size);
\r
210 case fraction_noad:
\r
212 flush_node_list(info(numerator(p)));
\r
213 flush_node_list(info(denominator(p)));
\r
214 free_node(p, fraction_noad_size);
\r
220 confusion("flushing");
\r
226 free_node(p, small_node_size);
\r
234 pointer copy_node_list_(pointer p)
\r
248 if (is_char_node(p))
\r
250 else switch (type(p))
\r
256 r = get_node(box_node_size);
\r
257 mem[r + 6] = mem[p + 6];
\r
258 mem[r + 5] = mem[p + 5];
\r
259 list_ptr(r) = copy_node_list(list_ptr(p));
\r
265 r = get_node(rule_node_size);
\r
266 words = rule_node_size;
\r
271 r = get_node(ins_node_size);
\r
272 mem[r + 4] = mem[p + 4];
\r
273 add_glue_ref(split_top_ptr(p));
\r
274 ins_ptr(r) = copy_node_list(ins_ptr(p));
\r
275 words = ins_node_size - 1;
\r
279 switch (subtype(p))
\r
283 r = get_node(open_node_size);
\r
284 words = open_node_size;
\r
291 r = get_node(write_node_size);
\r
292 add_token_ref(write_tokens(p));
\r
293 words = write_node_size;
\r
298 case language_node:
\r
300 r = get_node(small_node_size);
\r
301 words = small_node_size;
\r
316 r = get_node(small_node_size);
\r
317 add_glue_ref(glue_ptr(p));
\r
318 glue_ptr(r) = glue_ptr(p);
\r
319 leader_ptr(r) = copy_node_list(leader_ptr(p));
\r
327 r = get_node(small_node_size);
\r
328 words = small_node_size;
\r
332 case ligature_node:
\r
334 r = get_node(small_node_size);
\r
335 mem[lig_char(r)] = mem[lig_char(p)];
\r
336 lig_ptr(r) = copy_node_list(lig_ptr(p));
\r
342 r = get_node(small_node_size);
\r
343 pre_break(r) = copy_node_list(pre_break(p));
\r
344 post_break(r) = copy_node_list(pre_break(p));
\r
350 r = get_node(small_node_size);
\r
351 add_token_ref(mark_ptr(p));
\r
352 words = small_node_size;
\r
358 r = get_node(small_node_size);
\r
359 adjust_ptr(r) = copy_node_list(adjust_ptr(p));
\r
365 confusion("copying");
\r
374 mem[r + words] = mem[p + words];
\r
389 void print_mode_(integer m)
\r
393 switch (m / (max_command + 1))
\r
396 prints("vertical");
\r
399 prints("horizontal");
\r
402 prints("display math");
\r
412 switch ((- (integer) m) / (max_command + 1))
\r
415 prints("internal vertical");
\r
418 prints("restricted horizontal");
\r
430 void push_nest (void)
\r
432 if (nest_ptr > max_nest_stack)
\r
434 max_nest_stack = nest_ptr;
\r
436 #ifdef ALLOCATEINPUTSTACK
\r
437 if (nest_ptr == current_nest_size)
\r
438 nest = realloc_nest_stack(increment_nest_size);
\r
440 if (nest_ptr == current_nest_size)
\r
442 overflow("semantic nest size", current_nest_size);
\r
446 if (nest_ptr == nest_size)
\r
448 overflow("semantic nest size", nest_size);
\r
454 nest[nest_ptr]= cur_list;
\r
456 head = get_avail();
\r
462 void pop_nest (void)
\r
466 cur_list = nest[nest_ptr];
\r
469 void show_activities (void)
\r
477 nest[nest_ptr] = cur_list;
\r
481 for (p = nest_ptr; p >= 0; p--)
\r
483 m = nest[p].mode_field;
\r
484 a = nest[p].aux_field;
\r
487 prints(" entered at line ");
\r
488 print_int(abs(nest[p].ml_field));
\r
492 if (nest[p].pg_field != 040600000)
\r
494 prints(" (language");
\r
495 print_int(nest[p].pg_field % 65536L);
\r
496 prints(":hyphenmin");
\r
497 print_int(nest[p].pg_field / 4194304L);
\r
499 print_int((nest[p].pg_field / 65536L) % 64);
\r
504 if (nest[p].ml_field < 0)
\r
505 prints(" (\\output routine)");
\r
509 if (page_head != page_tail)
\r
511 print_nl("### current page:");
\r
514 prints(" (held over for next output)");
\r
516 show_box(link(page_head));
\r
518 if (page_contents > 0)
\r
520 print_nl("total height ");
\r
522 print_nl(" goal height ");
\r
523 print_scaled(page_so_far[0]);
\r
524 r = link(page_ins_head);
\r
526 while (r != mem_top)
\r
529 print_esc("insert");
\r
534 if (count(t) == 1000)
\r
537 t = x_over_n(height(r), 1000) * count(t);
\r
541 if (type(r) == split_up)
\r
550 if ((type(q) == ins_node) && (subtype(q) == subtype(r)))
\r
553 while (!(q == broken_ins(r)));
\r
557 prints(" might split");
\r
564 if (link(contrib_head) != 0)
\r
565 print_nl("### recent contributions:");
\r
568 show_box(link(nest[p].head_field));
\r
570 switch (abs(m) / (max_command + 1))
\r
574 print_nl("prevdepth ");
\r
576 if (a.cint <= ignore_depth)
\r
579 print_scaled(a.cint);
\r
581 if (nest[p].pg_field != 0)
\r
583 prints(", prevgraf ");
\r
584 print_int(nest[p].pg_field);
\r
587 if (nest[p].pg_field != 1)
\r
595 print_nl("spacefactor ");
\r
596 print_int(a.hh.lh);
\r
602 prints(", current language ");
\r
603 print_int(a.hh.rh);
\r
612 prints("this will be denominator of:");
\r
620 void print_param_(integer n)
\r
624 case pretolerance_code:
\r
625 print_esc("pretolerance");
\r
628 case tolerance_code:
\r
629 print_esc("tolerance");
\r
632 case line_penalty_code:
\r
633 print_esc("linepenalty");
\r
636 case hyphen_penalty_code:
\r
637 print_esc("hyphenpenalty");
\r
640 case ex_hyphen_penalty_code:
\r
641 print_esc("exhyphenpenalty");
\r
644 case club_penalty_code:
\r
645 print_esc("clubpenalty");
\r
648 case widow_penalty_code:
\r
649 print_esc("widowpenalty");
\r
652 case display_widow_penalty_code:
\r
653 print_esc("displaywidowpenalty");
\r
656 case broken_penalty_code:
\r
657 print_esc("brokenpenalty");
\r
660 case bin_op_penalty_code:
\r
661 print_esc("binoppenalty");
\r
664 case rel_penalty_code:
\r
665 print_esc("relpenalty");
\r
668 case pre_display_penalty_code:
\r
669 print_esc("predisplaypenalty");
\r
672 case post_display_penalty_code:
\r
673 print_esc("postdisplaypenalty");
\r
676 case inter_line_penalty_code:
\r
677 print_esc("interlinepenalty");
\r
680 case double_hyphen_demerits_code:
\r
681 print_esc("doublehyphendemerits");
\r
684 case final_hyphen_demerits_code:
\r
685 print_esc("finalhyphendemerits");
\r
688 case adj_demerits_code:
\r
689 print_esc("adjdemerits");
\r
696 case delimiter_factor_code:
\r
697 print_esc("delimiterfactor");
\r
700 case looseness_code:
\r
701 print_esc("looseness");
\r
713 print_esc("month");
\r
720 case show_box_breadth_code:
\r
721 print_esc("showboxbreadth");
\r
724 case show_box_depth_code:
\r
725 print_esc("showboxdepth");
\r
728 case hbadness_code:
\r
729 print_esc("hbadness");
\r
732 case vbadness_code:
\r
733 print_esc("vbadness");
\r
737 print_esc("pausing");
\r
740 case tracing_online_code:
\r
741 print_esc("tracingonline");
\r
744 case tracing_macros_code:
\r
745 print_esc("tracingmacros");
\r
748 case tracing_stats_code:
\r
749 print_esc("tracingstats");
\r
752 case tracing_paragraphs_code:
\r
753 print_esc("tracingparagraphs");
\r
756 case tracing_pages_code:
\r
757 print_esc("tracingpages");
\r
760 case tracing_output_code:
\r
761 print_esc("tracingoutput");
\r
764 case tracing_lost_chars_code:
\r
765 print_esc("tracinglostchars");
\r
768 case tracing_commands_code:
\r
769 print_esc("tracingcommands");
\r
772 case tracing_restores_code:
\r
773 print_esc("tracingrestores");
\r
777 print_esc("uchyph");
\r
780 case output_penalty_code:
\r
781 print_esc("outputpenalty");
\r
784 case max_dead_cycles_code:
\r
785 print_esc("maxdeadcycles");
\r
788 case hang_after_code:
\r
789 print_esc("hangafter");
\r
792 case floating_penalty_code:
\r
793 print_esc("floatingpenalty");
\r
796 case global_defs_code:
\r
797 print_esc("globaldefs");
\r
804 case escape_char_code:
\r
805 print_esc("escapechar");
\r
808 case default_hyphen_char_code:
\r
809 print_esc("defaulthyphenchar");
\r
812 case default_skew_char_code:
\r
813 print_esc("defaultskewchar");
\r
816 case end_line_char_code:
\r
817 print_esc("endlinechar");
\r
820 case new_line_char_code:
\r
821 print_esc("newlinechar");
\r
824 case language_code:
\r
825 print_esc("language");
\r
828 case left_hyphen_min_code:
\r
829 print_esc("lefthyphenmin");
\r
832 case right_hyphen_min_code:
\r
833 print_esc("righthyphenmin");
\r
836 case holding_inserts_code:
\r
837 print_esc("holdinginserts");
\r
840 case error_context_lines_code:
\r
841 print_esc("errorcontextlines");
\r
845 prints("[unknown integer parameter!]");
\r
850 void begin_diagnostic (void)
\r
852 old_setting = selector;
\r
854 if ((tracing_online <= 0) && (selector == term_and_log))
\r
858 if (history == spotless)
\r
859 history = warning_issued;
\r
863 void end_diagnostic(boolean blank_line)
\r
870 selector = old_setting;
\r
873 void print_length_param_ (integer n)
\r
877 case par_indent_code:
\r
878 print_esc("parindent");
\r
881 case math_surround_code:
\r
882 print_esc("mathsurround");
\r
885 case line_skip_limit_code:
\r
886 print_esc("lineskiplimit");
\r
890 print_esc("hsize");
\r
894 print_esc("vsize");
\r
897 case max_depth_code:
\r
898 print_esc("maxdepth");
\r
901 case split_max_depth_code:
\r
902 print_esc("splitmaxdepth");
\r
905 case box_max_depth_code:
\r
906 print_esc("boxmaxdepth");
\r
910 print_esc("hfuzz");
\r
914 print_esc("vfuzz");
\r
917 case delimiter_shortfall_code:
\r
918 print_esc("delimitershortfall");
\r
921 case null_delimiter_space_code:
\r
922 print_esc("nulldelimiterspace");
\r
925 case script_space_code:
\r
926 print_esc("scriptspace");
\r
929 case pre_display_size_code:
\r
930 print_esc("predisplaysize");
\r
933 case display_width_code:
\r
934 print_esc("displaywidth");
\r
937 case display_indent_code:
\r
938 print_esc("displayindent");
\r
941 case overfull_rule_code:
\r
942 print_esc("overfullrule");
\r
945 case hang_indent_code:
\r
946 print_esc("hangindent");
\r
949 case h_offset_code:
\r
950 print_esc("hoffset");
\r
953 case v_offset_code:
\r
954 print_esc("voffset");
\r
957 case emergency_stretch_code:
\r
958 print_esc("emergencystretch");
\r
962 prints("[unknown dimen parameter!]");
\r
967 void print_cmd_chr_ (quarterword cmd, halfword chr_code)
\r
972 chr_cmd("begin-group character ");
\r
976 chr_cmd("end-group character ");
\r
980 chr_cmd("math shift character ");
\r
984 chr_cmd("macro parameter character ");
\r
988 chr_cmd("superscript character ");
\r
992 chr_cmd("subscript character ");
\r
996 chr_cmd("end of alignment template");
\r
1000 chr_cmd("blank space ");
\r
1004 chr_cmd("the letter ");
\r
1008 chr_cmd("the character ");
\r
1012 case assign_mu_glue:
\r
1013 if (chr_code < skip_base)
\r
1014 print_skip_param(chr_code - glue_base);
\r
1015 else if (chr_code < mu_skip_base)
\r
1017 print_esc("skip");
\r
1018 print_int(chr_code - skip_base);
\r
1022 print_esc("muskip");
\r
1023 print_int(chr_code - mu_skip_base);
\r
1028 if (chr_code >= toks_base)
\r
1030 print_esc("toks");
\r
1031 print_int(chr_code - toks_base);
\r
1037 case output_routine_loc:
\r
1038 print_esc("output");
\r
1041 case every_par_loc:
\r
1042 print_esc("everypar");
\r
1045 case every_math_loc:
\r
1046 print_esc("everymath");
\r
1049 case every_display_loc:
\r
1050 print_esc("everydisplay");
\r
1053 case every_hbox_loc:
\r
1054 print_esc("everyhbox");
\r
1057 case every_vbox_loc:
\r
1058 print_esc("everyvbox");
\r
1061 case every_job_loc:
\r
1062 print_esc("everyjob");
\r
1065 case every_cr_loc:
\r
1066 print_esc("everycr");
\r
1070 print_esc("errhelp");
\r
1077 if (chr_code < count_base)
\r
1078 print_param(chr_code - int_base);
\r
1081 print_esc("count");
\r
1082 print_int(chr_code - count_base);
\r
1086 case assign_dimen:
\r
1087 if (chr_code < scaled_base)
\r
1088 print_length_param(chr_code - dimen_base);
\r
1091 print_esc("dimen");
\r
1092 print_int(chr_code - scaled_base);
\r
1097 print_esc("accent");
\r
1101 print_esc("advance");
\r
1104 case after_assignment:
\r
1105 print_esc("afterassignment");
\r
1109 print_esc("aftergroup");
\r
1112 case assign_font_dimen:
\r
1113 print_esc("fontdimen");
\r
1117 print_esc("begingroup");
\r
1120 case break_penalty:
\r
1121 print_esc("penalty");
\r
1125 print_esc("char");
\r
1129 print_esc("csname");
\r
1133 print_esc("font");
\r
1137 print_esc("delimiter");
\r
1141 print_esc("divide");
\r
1145 print_esc("endcsname");
\r
1149 print_esc("endgroup");
\r
1156 case expand_after:
\r
1157 print_esc("expandafter");
\r
1161 print_esc("halign");
\r
1165 print_esc("hrule");
\r
1168 case ignore_spaces:
\r
1169 print_esc("ignorespaces");
\r
1173 print_esc("insert");
\r
1181 print_esc("mark");
\r
1185 print_esc("mathaccent");
\r
1188 case math_char_num:
\r
1189 print_esc("mathchar");
\r
1193 print_esc("mathchoice");
\r
1197 print_esc("multiply");
\r
1201 print_esc("noalign");
\r
1205 print_esc("noboundary");
\r
1209 print_esc("noexpand");
\r
1213 print_esc("nonscript");
\r
1217 print_esc("omit");
\r
1221 print_esc("radical");
\r
1225 print_esc("read");
\r
1229 print_esc("relax");
\r
1233 print_esc("setbox");
\r
1236 case set_prev_graf:
\r
1237 print_esc("prevgraf");
\r
1241 print_esc("parshape");
\r
1248 case toks_register:
\r
1249 print_esc("toks");
\r
1253 print_esc("vadjust");
\r
1257 print_esc("valign");
\r
1261 print_esc("vcenter");
\r
1265 print_esc("vrule");
\r
1273 if (chr_code == 0)
\r
1274 print_esc("input");
\r
1276 print_esc("endinput");
\r
1279 case top_bot_mark:
\r
1282 case first_mark_code:
\r
1283 print_esc("firstmark");
\r
1286 case bot_mark_code:
\r
1287 print_esc("botmark");
\r
1290 case split_first_mark_code:
\r
1291 print_esc("splitfirstmark");
\r
1294 case split_bot_mark_code:
\r
1295 print_esc("splitbotmark");
\r
1299 print_esc("topmark");
\r
1304 case tex_register:
\r
1305 if (chr_code == int_val)
\r
1306 print_esc("count");
\r
1307 else if (chr_code == dimen_val)
\r
1308 print_esc("dimen");
\r
1309 else if (chr_code == glue_val)
\r
1310 print_esc("skip");
\r
1312 print_esc("muskip");
\r
1316 if (chr_code == vmode)
\r
1317 print_esc("prevdepth");
\r
1319 print_esc("spacefactor");
\r
1322 case set_page_int:
\r
1323 if (chr_code == 0)
\r
1324 print_esc("deadcycles");
\r
1326 print_esc("insertpenalties");
\r
1329 case set_box_dimen:
\r
1330 if (chr_code == width_offset)
\r
1332 else if (chr_code == height_offset)
\r
1342 print_esc("lastpenalty");
\r
1346 print_esc("lastkern");
\r
1350 print_esc("lastskip");
\r
1353 case input_line_no_code:
\r
1354 print_esc("inputlineno");
\r
1358 print_esc("badness");
\r
1367 print_esc("number");
\r
1370 case roman_numeral_code:
\r
1371 print_esc("romannumeral");
\r
1375 print_esc("string");
\r
1378 case meaning_code:
\r
1379 print_esc("meaning");
\r
1382 case font_name_code:
\r
1383 print_esc("fontname");
\r
1387 print_esc("jobname");
\r
1396 print_esc("ifcat");
\r
1400 print_esc("ifnum");
\r
1404 print_esc("ifdim");
\r
1408 print_esc("ifodd");
\r
1411 case if_vmode_code:
\r
1412 print_esc("ifvmode");
\r
1415 case if_hmode_code:
\r
1416 print_esc("ifhmode");
\r
1419 case if_mmode_code:
\r
1420 print_esc("ifmmode");
\r
1423 case if_inner_code:
\r
1424 print_esc("ifinner");
\r
1427 case if_void_code:
\r
1428 print_esc("ifvoid");
\r
1431 case if_hbox_code:
\r
1432 print_esc("ifhbox");
\r
1435 case if_vbox_code:
\r
1436 print_esc("ifvbox");
\r
1444 print_esc("ifeof");
\r
1447 case if_true_code:
\r
1448 print_esc("iftrue");
\r
1451 case if_false_code:
\r
1452 print_esc("iffalse");
\r
1455 case if_case_code:
\r
1456 print_esc("ifcase");
\r
1466 if (chr_code == fi_code)
\r
1468 else if (chr_code == or_code)
\r
1471 print_esc("else");
\r
1475 if (chr_code == span_code)
\r
1476 print_esc("span");
\r
1479 prints("alignment tab character ");
\r
1485 if (chr_code == cr_code)
\r
1488 print_esc("crcr");
\r
1491 case set_page_dimen:
\r
1495 print_esc("pagegoal");
\r
1499 print_esc("pagetotal");
\r
1503 print_esc("pagestretch");
\r
1507 print_esc("pagefilstretch");
\r
1511 print_esc("pagefillstretch");
\r
1515 print_esc("pagefilllstretch");
\r
1519 print_esc("pageshrink");
\r
1523 print_esc("pagedepth");
\r
1529 if (chr_code == 1)
\r
1530 print_esc("dump");
\r
1539 print_esc("hskip");
\r
1543 print_esc("hfil");
\r
1547 print_esc("hfill");
\r
1555 print_esc("hfilneg");
\r
1564 print_esc("vskip");
\r
1568 print_esc("vfil");
\r
1572 print_esc("vfill");
\r
1580 print_esc("vfilneg");
\r
1586 print_esc("mskip");
\r
1590 print_esc("kern");
\r
1594 print_esc("mkern");
\r
1598 if (chr_code == 1)
\r
1599 print_esc("moveleft");
\r
1601 print_esc("moveright");
\r
1605 if (chr_code == 1)
\r
1606 print_esc("raise");
\r
1608 print_esc("lower");
\r
1619 print_esc("copy");
\r
1622 case last_box_code:
\r
1623 print_esc("lastbox");
\r
1627 print_esc("vsplit");
\r
1631 print_esc("vtop");
\r
1634 case vtop_code + vmode:
\r
1635 print_esc("vbox");
\r
1639 print_esc("hbox");
\r
1645 if (chr_code == a_leaders)
\r
1646 print_esc("leaders");
\r
1647 else if (chr_code == c_leaders)
\r
1648 print_esc("cleaders");
\r
1649 else if (chr_code == x_leaders)
\r
1650 print_esc("xleaders");
\r
1652 print_esc("shipout");
\r
1656 if (chr_code == 0)
\r
1657 print_esc("noindent");
\r
1659 print_esc("indent");
\r
1663 if (chr_code == glue_node)
\r
1664 print_esc("unskip");
\r
1665 else if (chr_code == kern_node)
\r
1666 print_esc("unkern");
\r
1668 print_esc("unpenalty");
\r
1672 if (chr_code == copy_code)
\r
1673 print_esc("unhcopy");
\r
1675 print_esc("unhbox");
\r
1679 if (chr_code == copy_code)
\r
1680 print_esc("unvcopy");
\r
1682 print_esc("unvbox");
\r
1685 case discretionary:
\r
1686 if (chr_code == 1)
\r
1689 print_esc("discretionary");
\r
1693 if (chr_code == 1)
\r
1694 print_esc("leqno");
\r
1696 print_esc("eqno");
\r
1703 print_esc("mathord");
\r
1707 print_esc("mathop");
\r
1711 print_esc("mathbin");
\r
1715 print_esc("mathrel");
\r
1719 print_esc("mathopen");
\r
1723 print_esc("mathclose");
\r
1727 print_esc("mathpunct");
\r
1731 print_esc("mathinner");
\r
1735 print_esc("underline");
\r
1739 print_esc("overline");
\r
1744 case limit_switch:
\r
1745 if (chr_code == limits)
\r
1746 print_esc("limits");
\r
1747 else if (chr_code == no_limits)
\r
1748 print_esc("nolimits");
\r
1750 print_esc("displaylimits");
\r
1754 print_style(chr_code);
\r
1761 print_esc("over");
\r
1765 print_esc("atop");
\r
1768 case delimited_code + above_code:
\r
1769 print_esc("abovewithdelims");
\r
1772 case delimited_code + over_code:
\r
1773 print_esc("overwithdelims");
\r
1776 case delimited_code + atop_code:
\r
1777 print_esc("atopwithdelims");
\r
1781 print_esc("above");
\r
1787 if (chr_code == left_noad)
\r
1788 print_esc("left");
\r
1790 print_esc("right");
\r
1794 if (chr_code == 1)
\r
1795 print_esc("long");
\r
1796 else if (chr_code == 2)
\r
1797 print_esc("outer");
\r
1799 print_esc("global");
\r
1803 if (chr_code == 0)
\r
1805 else if (chr_code == 1)
\r
1806 print_esc("gdef");
\r
1807 else if (chr_code == 2)
\r
1808 print_esc("edef");
\r
1810 print_esc("xdef");
\r
1814 if (chr_code != normal)
\r
1815 print_esc("futurelet");
\r
1820 case shorthand_def:
\r
1823 case char_def_code:
\r
1824 print_esc("chardef");
\r
1827 case math_char_def_code:
\r
1828 print_esc("mathchardef");
\r
1831 case count_def_code:
\r
1832 print_esc("countdef");
\r
1835 case dimen_def_code:
\r
1836 print_esc("dimendef");
\r
1839 case skip_def_code:
\r
1840 print_esc("skipdef");
\r
1843 case mu_skip_def_code:
\r
1844 print_esc("muskipdef");
\r
1848 print_esc("toksdef");
\r
1854 print_esc("char");
\r
1855 print_hex(chr_code);
\r
1859 print_esc("mathchar");
\r
1860 print_hex(chr_code);
\r
1864 if (chr_code == cat_code_base)
\r
1865 print_esc("catcode");
\r
1866 else if (chr_code == math_code_base)
\r
1867 print_esc("mathcode");
\r
1868 else if (chr_code == lc_code_base)
\r
1869 print_esc("lccode");
\r
1870 else if (chr_code == uc_code_base)
\r
1871 print_esc("uccode");
\r
1872 else if (chr_code == sf_code_base)
\r
1873 print_esc("sfcode");
\r
1875 print_esc("delcode");
\r
1879 print_size(chr_code - math_font_base);
\r
1883 if (chr_code == 1)
\r
1884 print_esc("patterns");
\r
1886 print_esc("hyphenation");
\r
1889 case assign_font_int:
\r
1890 if (chr_code == 0)
\r
1891 print_esc("hyphenchar");
\r
1893 print_esc("skewchar");
\r
1897 prints("select font ");
\r
1898 slow_print(font_name[chr_code]);
\r
1900 if (font_size[chr_code] != font_dsize[chr_code])
\r
1903 print_scaled(font_size[chr_code]);
\r
1908 case set_interaction:
\r
1912 print_esc("batchmode");
\r
1915 case nonstop_mode:
\r
1916 print_esc("nonstopmode");
\r
1920 print_esc("scrollmode");
\r
1924 print_esc("errorstopmode");
\r
1930 if (chr_code == 0)
\r
1931 print_esc("closein");
\r
1933 print_esc("openin");
\r
1937 if (chr_code == 0)
\r
1938 print_esc("message");
\r
1940 print_esc("errmessage");
\r
1944 if (chr_code == lc_code_base)
\r
1945 print_esc("lowercase");
\r
1947 print_esc("uppercase");
\r
1953 case show_box_code:
\r
1954 print_esc("showbox");
\r
1957 case show_the_code:
\r
1958 print_esc("showthe");
\r
1962 print_esc("showlists");
\r
1966 print_esc("show");
\r
1971 case undefined_cs:
\r
1972 prints("undefined");
\r
1980 print_esc("long macro");
\r
1984 print_esc("outer macro");
\r
1987 case long_outer_call:
\r
1988 print_esc("long");
\r
1989 print_esc("outer macro");
\r
1992 case end_template:
\r
1993 print_esc("outer endtemplate");
\r
2000 print_esc("openout");
\r
2004 print_esc("write");
\r
2008 print_esc("closeout");
\r
2011 case special_node:
\r
2012 print_esc("special");
\r
2015 case immediate_code:
\r
2016 print_esc("immediate");
\r
2019 case set_language_code:
\r
2020 print_esc("setlanguage");
\r
2024 prints("[unknown extension!]");
\r
2030 prints("[unknown command code!]");
\r
2036 void show_eqtb (pointer n)
\r
2038 if (n < active_base)
\r
2040 else if (n < glue_base)
\r
2044 print_cmd_chr(eq_type(n), equiv(n));
\r
2046 if (eq_type(n) >= call)
\r
2049 show_token_list(link(equiv(n)), 0, 32);
\r
2052 else if (n < local_base)
\r
2053 if (n < skip_base)
\r
2055 print_skip_param(n - glue_base);
\r
2058 if (n < glue_base + thin_mu_skip_code)
\r
2059 print_spec(equiv(n), "pt");
\r
2061 print_spec(equiv(n), "mu");
\r
2063 else if (n < mu_skip_base)
\r
2065 print_esc("skip");
\r
2066 print_int(n - skip_base);
\r
2068 print_spec(equiv(n), "pt");
\r
2072 print_esc("muskip");
\r
2073 print_int(n - mu_skip_base);
\r
2075 print_spec(equiv(n), "mu");
\r
2077 else if (n < int_base)
\r
2078 if (n == par_shape_loc)
\r
2080 print_esc("parshape");
\r
2083 if (par_shape_ptr == 0)
\r
2086 print_int(info(par_shape_ptr));
\r
2088 else if (n < toks_base)
\r
2090 print_cmd_chr(assign_toks, n);
\r
2093 if (equiv(n) != 0)
\r
2094 show_token_list(link(equiv(n)), 0, 32);
\r
2096 else if (n < box_base)
\r
2098 print_esc("toks");
\r
2099 print_int(n - toks_base);
\r
2102 if (equiv(n) != 0)
\r
2103 show_token_list(link(equiv(n)), 0, 32);
\r
2105 else if (n < cur_font_loc)
\r
2108 print_int(n - box_base);
\r
2111 if (equiv(n) == 0)
\r
2115 depth_threshold = 0;
\r
2117 show_node_list(equiv(n));
\r
2120 else if (n < cat_code_base)
\r
2122 if (n == cur_font_loc)
\r
2123 prints("current font");
\r
2124 else if (n < math_font_base + 16)
\r
2126 print_esc("textfont");
\r
2127 print_int(n - math_font_base);
\r
2129 else if (n < math_font_base + 32)
\r
2131 print_esc("scriptfont");
\r
2132 print_int(n - math_font_base - 16);
\r
2136 print_esc("scriptscriptfont");
\r
2137 print_int(n - math_font_base - 32);
\r
2142 print(hash[font_id_base + equiv(n)].rh);
\r
2144 else if (n < math_code_base)
\r
2146 if (n < lc_code_base)
\r
2148 print_esc("catcode");
\r
2149 print_int(n - cat_code_base);
\r
2151 else if (n < uc_code_base)
\r
2153 print_esc("lccode");
\r
2154 print_int(n - lc_code_base);
\r
2156 else if (n < sf_code_base)
\r
2158 print_esc("uccode");
\r
2159 print_int(n - uc_code_base);
\r
2163 print_esc("sfcode");
\r
2164 print_int(n - sf_code_base);
\r
2168 print_int(equiv(n));
\r
2172 print_esc("mathcode");
\r
2173 print_int(n - math_code_base);
\r
2175 print_int(equiv(n));
\r
2177 else if (n < dimen_base)
\r
2179 if (n < count_base)
\r
2180 print_param(n - int_base);
\r
2181 else if (n < del_code_base)
\r
2183 print_esc("count");
\r
2184 print_int(n - count_base);
\r
2188 print_esc("delcode");
\r
2189 print_int(n - del_code_base);
\r
2193 print_int(eqtb[n].cint);
\r
2195 else if (n <= eqtb_size)
\r
2197 if (n < scaled_base)
\r
2198 print_length_param(n - dimen_base);
\r
2201 print_esc("dimen");
\r
2202 print_int(n - scaled_base);
\r
2206 print_scaled(eqtb[n].cint);
\r
2214 pointer id_lookup_(integer j, integer l)
\r
2223 for (k = j + 1; k <= j + l - 1; k++)
\r
2225 h = h + h + buffer[k];
\r
2227 while (h >= hash_prime)
\r
2228 h = h - hash_prime;
\r
2231 p = h + hash_base;
\r
2236 if (length(text(p)) == l)
\r
2237 if (str_eq_buf(text(p), j))
\r
2242 if (no_new_control_sequence)
\r
2243 p = undefined_control_sequence;
\r
2252 overflow("hash size", hash_size + hash_extra);
\r
2253 /* not dynamic ^~~~~~~~~~~~~~~~~~~~~~*/
\r
2259 while (!(text(hash_used) == 0));
\r
2261 next(p) = hash_used;
\r
2268 while (pool_ptr > str_start[str_ptr])
\r
2271 str_pool[pool_ptr + l] = str_pool[pool_ptr];
\r
2274 for (k = j; k <= j + l - 1; k++)
\r
2275 append_char(buffer[k]);
\r
2277 text(p) = make_string();
\r
2278 pool_ptr = pool_ptr + d;
\r
2285 str_pool[pool_ptr] = '\0';
\r
2286 printf(" tex1.c incr(cs_count): '%s' ", &str_pool[pool_ptr - l - d]);
\r
2301 void new_save_level (group_code c)
\r
2303 check_full_save_stack();
\r
2304 save_type(save_ptr) = level_boundary;
\r
2305 save_level(save_ptr) = (quarterword) cur_group;
\r
2306 save_index(save_ptr) = cur_boundary;
\r
2308 if (cur_level == max_quarterword)
\r
2310 overflow("grouping levels", max_quarterword - min_quarterword);
\r
2314 cur_boundary = save_ptr;
\r
2320 void eq_destroy (memory_word w)
\r
2324 switch (eq_type_field(w))
\r
2329 case long_outer_call:
\r
2330 delete_token_ref(equiv_field(w));
\r
2334 delete_glue_ref(equiv_field(w));
\r
2338 q = equiv_field(w);
\r
2341 free_node(q, info(q) + info(q) + 1);
\r
2345 flush_node_list(equiv_field(w));
\r
2353 void eq_save (pointer p, quarterword l)
\r
2355 check_full_save_stack();
\r
2357 if (l == level_zero)
\r
2358 save_type(save_ptr) = restore_zero;
\r
2361 save_stack[save_ptr] = eqtb[p];
\r
2363 save_type(save_ptr) = restore_old_value;
\r
2366 save_level(save_ptr) = l;
\r
2367 save_index(save_ptr) = p;
\r
2371 void eq_define_(pointer p, quarterword t, halfword e)
\r
2373 if (eq_level(p) == cur_level)
\r
2374 eq_destroy(eqtb[p]);
\r
2375 else if (cur_level > level_one)
\r
2376 eq_save(p, eq_level(p));
\r
2378 eq_level(p) = (quarterword) cur_level;
\r
2383 void eq_word_define_(pointer p, integer w)
\r
2385 if (xeq_level[p] != cur_level)
\r
2387 eq_save(p, xeq_level[p]);
\r
2388 xeq_level[p] = (quarterword) cur_level;
\r
2394 void geq_define_(pointer p, quarterword t, halfword e)
\r
2396 eq_destroy(eqtb[p]);
\r
2397 eq_level(p) = level_one;
\r
2402 void geq_word_define_(pointer p, integer w)
\r
2405 xeq_level[p]= level_one;
\r
2408 void save_for_after (halfword t)
\r
2410 if (cur_level > level_one)
\r
2412 check_full_save_stack();
\r
2413 save_type(save_ptr) = insert_token;
\r
2414 save_level(save_ptr) = level_zero;
\r
2415 save_index(save_ptr) = t;
\r