home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / source / TeX / tex / tex1.c < prev    next >
C/C++ Source or Header  |  1993-10-12  |  45KB  |  2,029 lines

  1. #define EXTERN extern
  2. #include "texd.h"
  3.  
  4.  
  5. void showbox ( halfword p )
  6. { showbox_regmem
  7.  
  8.   depththreshold = showboxdepth;
  9.   breadthmax = showboxbreadth;
  10.   if ( breadthmax <= 0 )
  11.     breadthmax = 5;
  12.   if ( poolptr + depththreshold >= poolsize )
  13.     depththreshold = poolsize - poolptr - 1;
  14.   shownodelist( p );
  15.   println();
  16.  
  17.  
  18. void deletetokenref ( halfword p )
  19. { deletetokenref_regmem
  20.  
  21.   if ( tokenrefcount ( p ) == 0 )
  22.     flushlist( p );
  23.   else
  24.     decr( tokenrefcount(p) );
  25. }
  26.  
  27.  
  28. void deleteglueref ( halfword p )
  29. { deleteglueref_regmem
  30.  
  31.   fastdeleteglueref( p );
  32. }
  33.  
  34.  
  35. void flushnodelist ( halfword p )
  36. { flushnodelist_regmem
  37.   register halfword q;
  38.  
  39.   while ( p != 0 ) {
  40.     q = link ( p );
  41.     if ( ischarnode ( p ) ) {
  42.       register halfword tmp_avail = avail;
  43.  
  44.       do {
  45.     /* freeavail ( p ) ; */
  46.     link(p) = tmp_avail;  tmp_avail = p;
  47. #ifdef STAT
  48.     decr(dynused);
  49. #endif
  50.     p = q;
  51.         if( p == 0 ) {
  52.       avail = tmp_avail;
  53.       return;
  54.     }
  55.         q = link( p );
  56.       } while( ischarnode(p) );
  57.  
  58.       avail = tmp_avail;
  59.       /* continue; */ /* we know: p != null && !ischarnode(p) */
  60.     }
  61.  
  62.     switch ( ztype ( p ) ) {
  63.       case hlistnode :
  64.       case vlistnode :
  65.       case unsetnode :
  66.     flushnodelist ( listptr ( p ) );
  67.     freenode( p, boxnodesize );
  68.     goto lab30;
  69.     break;
  70.       case rulenode : 
  71.     freenode( p, rulenodesize );
  72.     goto lab30;
  73.     break;
  74.       case insnode :
  75.     {
  76.       flushnodelist ( insptr ( p ) ) ; 
  77.       deleteglueref ( splittopptr ( p ) ) ; 
  78.       freenode ( p , insnodesize ) ; 
  79.       goto lab30 ; 
  80.     } 
  81.     break ; 
  82.       case whatsitnode : 
  83.     {
  84.       switch ( subtype ( p ) ) {
  85.       case opennode : 
  86.         freenode ( p , opennodesize ) ; 
  87.         break ; 
  88.       case writenode : 
  89.       case specialnode : 
  90.         {
  91.           deletetokenref ( writetokens ( p ) ) ; 
  92.           freenode ( p , writenodesize ) ; 
  93.           goto lab30 ; 
  94.         } 
  95.         break ; 
  96.       case closenode : 
  97.       case languagenode : 
  98.         freenode ( p, smallnodesize );
  99.         break;
  100.       default: 
  101.         confusion("ext3");
  102.         break;
  103.       }
  104.       goto lab30;
  105.     }
  106.     break;
  107.       case gluenode :
  108.     {
  109.       fastdeleteglueref ( glueptr ( p ) ) ; 
  110.       if ( leaderptr ( p ) != 0 ) 
  111.         flushnodelist ( leaderptr ( p ) ) ; 
  112.     } 
  113.     break ; 
  114.       case kernnode : 
  115.       case mathnode : 
  116.       case penaltynode : 
  117.     break ; 
  118.       case ligaturenode : 
  119.     flushnodelist ( ligptr ( p ) ) ; 
  120.     break ; 
  121.       case marknode : 
  122.     deletetokenref ( markptr ( p ) ) ; 
  123.     break ; 
  124.       case discnode : 
  125.     flushnodelist ( prebreak ( p ) ) ; 
  126.     flushnodelist ( postbreak ( p ) ) ; 
  127.     break ; 
  128.       case adjustnode : 
  129.     flushnodelist ( adjustptr ( p ) ) ; 
  130.     break ; 
  131.       case stylenode : 
  132.     {
  133.       freenode ( p , stylenodesize ) ; 
  134.       goto lab30 ; 
  135.     } 
  136.     break ; 
  137.       case choicenode : 
  138.     {
  139.       flushnodelist ( displaymlist ( p ) ) ; 
  140.       flushnodelist ( textmlist ( p ) ) ; 
  141.       flushnodelist ( scriptmlist ( p ) ) ; 
  142.       flushnodelist ( scriptscriptmlist ( p ) ) ; 
  143.       freenode ( p , stylenodesize ) ; 
  144.       goto lab30 ; 
  145.     } 
  146.     break ; 
  147.       case ordnoad : 
  148.       case opnoad : 
  149.       case binnoad : 
  150.       case relnoad : 
  151.       case opennoad : 
  152.       case closenoad : 
  153.       case punctnoad : 
  154.       case innernoad : 
  155.       case radicalnoad : 
  156.       case overnoad : 
  157.       case undernoad : 
  158.       case vcenternoad : 
  159.       case accentnoad : 
  160.     if ( mathtype ( nucleus ( p ) ) >= subbox ) 
  161.       flushnodelist ( info ( nucleus ( p ) ) ) ; 
  162.     if ( mathtype ( supscr ( p ) ) >= subbox ) 
  163.       flushnodelist ( info ( supscr ( p ) ) ) ; 
  164.     if ( mathtype ( subscr ( p ) ) >= subbox ) 
  165.       flushnodelist ( info ( subscr ( p ) ) ) ; 
  166.     if ( ztype ( p ) == radicalnoad ) 
  167.       freenode ( p , radicalnoadsize ) ; 
  168.     else if ( ztype ( p ) == accentnoad ) 
  169.       freenode ( p , accentnoadsize ) ; 
  170.     else
  171.       freenode ( p , noadsize );
  172.     goto lab30;
  173.     break;
  174.       case leftnoad : 
  175.       case rightnoad : 
  176.     {
  177.       freenode ( p , noadsize ) ; 
  178.       goto lab30 ; 
  179.     } 
  180.     break ; 
  181.       case fractionnoad : 
  182.     {
  183.       flushnodelist ( info ( numerator ( p ) ) ) ; 
  184.       flushnodelist ( info ( denominator ( p ) ) ) ; 
  185.       freenode ( p , fractionnoadsize ) ; 
  186.       goto lab30 ; 
  187.     } 
  188.     break ; 
  189.       default: 
  190.     confusion("flushing"); /* 350 */
  191.     break ; 
  192.     }
  193.     freenode( p, smallnodesize );
  194. lab30:
  195.     p = q;
  196.   }
  197. }
  198.  
  199.  
  200. halfword copynodelist ( halfword p )
  201. { copynodelist_regmem 
  202.   register halfword q ; 
  203.   register long_halfword r ; 
  204.   /*register*/ long_halfword h; /* head of copied list, not used in loop! */
  205.  
  206.   h = q = getavail ();
  207.   /* q = h; */
  208.   while ( p != 0 ) {
  209.     if ( ischarnode ( p ) ) {
  210.       r = getavail () ;
  211.       /* we know:  words = 1 for this simple and often occuring case */
  212.       mem[r] = mem[p];
  213.     } else {
  214.       register schar words = 1;
  215.       /* half of remaining cases are gluenodes with length smallnodesize,
  216.          but only one word must be copied (see 202. flushnodelist) */
  217.  
  218.       switch ( ztype ( p ) ) {
  219.       case hlistnode : 
  220.       case vlistnode : 
  221.       case unsetnode : 
  222.     r = getnode ( boxnodesize ) ; 
  223.     mem [ r + 6 ] = mem [ p + 6 ] ; 
  224.     mem [ r + 5 ] = mem [ p + 5 ] ; 
  225.     listptr ( r ) = copynodelist ( listptr ( p ) ) ; 
  226.     words = 5 ; 
  227.     break ; 
  228.       case rulenode : 
  229.     r = getnode ( rulenodesize ) ; 
  230.     words = rulenodesize ; 
  231.     break ; 
  232.       case insnode : 
  233.     r = getnode ( insnodesize ) ; 
  234.     mem [ r + 4 ] = mem [ p + 4 ] ; 
  235.     addglueref ( splittopptr ( p ) ) ; 
  236.     insptr ( r ) = copynodelist ( insptr ( p ) ) ; 
  237.     words = insnodesize - 1 ; 
  238.     break ; 
  239.       case whatsitnode : 
  240.     switch ( subtype ( p ) ) {
  241.     case opennode : 
  242.         r = getnode ( opennodesize ) ; 
  243.         words = opennodesize ; 
  244.         break ; 
  245.     case writenode : 
  246.     case specialnode : 
  247.         r = getnode ( writenodesize ) ; 
  248.         addtokenref ( writetokens ( p ) ) ; 
  249.         words = writenodesize ; 
  250.         break ; 
  251.     case closenode : 
  252.     case languagenode : 
  253.         r = getnode ( smallnodesize ) ; 
  254.         words = smallnodesize ; 
  255.         break ; 
  256.     default: 
  257.         confusion("ext2");
  258.         break ; 
  259.     }
  260.     break ; 
  261.       case gluenode : 
  262.     r = getnode ( smallnodesize ) ; 
  263.     addglueref ( glueptr ( p ) ) ; 
  264.     glueptr ( r ) = glueptr ( p ) ; 
  265.     leaderptr ( r ) = copynodelist ( leaderptr ( p ) ) ; 
  266.     break ; 
  267.       case kernnode : 
  268.       case mathnode : 
  269.       case penaltynode : 
  270.     r = getnode ( smallnodesize ) ; 
  271.     words = smallnodesize ; 
  272.     break ; 
  273.       case ligaturenode : 
  274.     r = getnode ( smallnodesize ) ; 
  275.     mem [ ligchar ( r ) ] = mem [ ligchar ( p ) ] ; 
  276.     ligptr ( r ) = copynodelist ( ligptr ( p ) ) ; 
  277.     break ; 
  278.       case discnode : 
  279.     r = getnode ( smallnodesize ) ; 
  280.     prebreak ( r ) = copynodelist ( prebreak ( p ) ) ; 
  281.     postbreak ( r ) = copynodelist ( postbreak ( p ) ) ; 
  282.     break ; 
  283.       case marknode : 
  284.     r = getnode ( smallnodesize ) ; 
  285.     addtokenref ( markptr ( p ) ) ; 
  286.     words = smallnodesize ; 
  287.     break ; 
  288.       case adjustnode : 
  289.     r = getnode ( smallnodesize ) ; 
  290.     adjustptr ( r ) = copynodelist ( adjustptr ( p ) ) ; 
  291.     break ; 
  292.       default:
  293.     confusion("copying"); /* 351 */ /* --> jump_out() --> exit() */
  294.     break ; 
  295.       }
  296.       while ( words > 0 ) {
  297.     decr ( words ) ; 
  298.     mem [ r + words ] = mem [ p + words ] ; 
  299.       }
  300.     }
  301.     link ( q ) = r;
  302.     q = r;
  303.     p = link ( p );
  304.   }
  305.   link( q ) = 0;
  306.   q = link( h );
  307.   freeavail( h );
  308.  
  309.   return(q);
  310. }
  311.  
  312.  
  313. void printmode ( integer m )
  314. { printmode_regmem
  315.  
  316. #ifdef OLD_MODE
  317.   if ( m > 0 )
  318.   switch ( m / (maxcommand + 1) ) {
  319.   case 0 : 
  320.     c_print("vertical");
  321.     break ; 
  322.   case 1 : 
  323.     c_print("horizontal");
  324.     break ;
  325.   case 2 :
  326.     c_print("display math");
  327.     break ; 
  328.   } else if ( m == 0 ) 
  329.     c_print("no");
  330.   else switch ( (-(integer)m) / (maxcommand + 1) ) {
  331.   case 0 :
  332.     c_print("internal vertical");
  333.     break ;
  334.   case 1 : 
  335.     c_print("restricted horizontal");
  336.     break ; 
  337.   case 2 : 
  338.     c_print("math");
  339.     break ; 
  340.   }
  341. #else
  342.   char *s;
  343.  
  344.   if ( m > 0 ) {
  345.     switch ( m ) {
  346.     case vmode:  s = "vertical"; break;
  347.     case hmode:  s = "horizontal"; break;
  348.     case mmode:  s = "display math"; break;
  349.     }
  350.   } else if ( m == 0 ) {
  351.     s = "no";
  352.   } else {
  353.     switch ( -m ) {
  354.     case vmode:  s = "internal vertical"; break;
  355.     case hmode:  s = "restricted horizontal"; break;
  356.     case mmode:  s = "math"; break;
  357.     }
  358.   }
  359.   c_print(s);
  360. #endif
  361.   c_print(" mode");
  362. }
  363.  
  364.  
  365. void pushnest ( void )
  366. { pushnest_regmem 
  367.  
  368.   if ( nestptr > maxneststack ) {
  369.     maxneststack = nestptr;
  370.     if ( nestptr == nestsize )
  371.       overflow(4, nestsize);
  372.   } 
  373.   nest[nestptr] = curlist;
  374.   incr( nestptr );
  375.   curlist .headfield = getavail();
  376.   curlist .tailfield = curlist .headfield;
  377.   curlist .pgfield = 0;
  378.   curlist .mlfield = line;
  379. #ifdef TEXXET
  380.   LR_save = 0;
  381. #endif
  382. }
  383.  
  384.  
  385. void popnest ( void )
  386. { popnest_regmem
  387.  
  388.   freeavail( curlist .headfield );
  389.   decr ( nestptr );
  390.   curlist = nest[nestptr];
  391. }
  392.  
  393.  
  394. void showactivities ( void )
  395. { showactivities_regmem 
  396.   register integer p;
  397.   register short m;
  398.   memoryword a;
  399.   register halfword q, r;
  400.   register integer t;
  401.  
  402.   nest [ nestptr ] = curlist;
  403.   c_printnl("");
  404.   println();
  405.   for( p = nestptr ; p >= 0 ; --p ) {
  406.     m = nest [ p ] .modefield ; 
  407.     a = nest [ p ] .auxfield ; 
  408.     c_printnl("### ");
  409.     printmode ( m ) ; 
  410.     c_print(" entered at line ");
  411.     printint ( abs ( nest [ p ] .mlfield ) ) ; 
  412.     if ( m == hmode )
  413. #if 0  /* 3.1415 */
  414.       if ( ( nest [ p ] .lhmfield != 2 ) || ( nest [ p ] .rhmfield != 3 ) ) {
  415.     c_print(" (hyphenmin ");
  416.     printint ( nest [ p ] .lhmfield ) ; 
  417.     printchar ( 44 ) ; 
  418.     printint ( nest [ p ] .rhmfield ) ; 
  419.     printchar ( 41 ) ; 
  420.       } 
  421. #else
  422.       if ( nest [ p ] .pgfield != 0x830000L ) {
  423.     c_print(" (language");
  424.     printint ( ( nest [ p ] .pgfield % 0x010000L ) ) ;
  425.     c_print(":hyphenmin");
  426.     printint ( ( nest [ p ] .pgfield / 0x400000L ) ) ;
  427.     printchar ( 44 ) ; 
  428.     printint ( ( ( nest [ p ] .pgfield / 0x010000L ) % 0x40 ) ) ;
  429.     printchar ( 41 ) ; 
  430.       }
  431. #endif
  432.     if ( nest [ p ] .mlfield < 0 ) 
  433.       c_print(" (\\output routine)");
  434.     if ( p == 0 ) {
  435.     if ( pagehead != pagetail ) {
  436.       c_printnl("### current page:");
  437.       if ( outputactive ) 
  438.       c_print(" (held over for next output)");
  439.       showbox ( link ( pagehead ) ) ; 
  440.       if ( pagecontents > 0 ) {
  441.         c_printnl("total height ");
  442.         printtotals () ; 
  443.         c_printnl(" goal height ");
  444.         printscaled ( pagesofar [ 0 ] ) ; 
  445.         r = link ( pageinshead ) ; 
  446.         while ( r != pageinshead ) {
  447.           println () ; 
  448.           printesc( STR_INSERT );
  449.           t = subtype ( r ) ; 
  450.           printint ( t ) ; 
  451.           c_print(" adds ");
  452.           t = xovern ( height ( r ) , 1000 ) * count ( t ) ; 
  453.           printscaled ( t ) ; 
  454.           if ( ztype ( r ) == splitup ) {
  455.         q = pagehead ; 
  456.         t = 0 ; 
  457.         do {
  458.           q = link ( q ) ; 
  459.           if ( ( ztype ( q ) == insnode ) && ( subtype ( q ) == 
  460.           subtype ( r ) ) ) 
  461.           incr ( t ) ; 
  462.         } while ( ! ( q == brokenins ( r ) ) ) ; 
  463.         c_print(", #");
  464.         printint ( t ) ; 
  465.         c_print(" might split");
  466.           } 
  467.           r = link ( r ) ; 
  468.         } 
  469.       } 
  470.     } 
  471.     if ( link ( contribhead ) != 0 ) 
  472.       c_printnl("### recent contributions:");
  473.     }
  474.     showbox ( link ( nest [ p ] .headfield ) ) ; 
  475. #ifdef OLD_MODE
  476.     switch ( abs ( m ) / (maxcommand + 1) )
  477. #else
  478.     switch ( abs ( m ) )
  479. #endif
  480.       {
  481. #ifdef OLD_MODE
  482.       case 0 :
  483. #else
  484.       case vmode:
  485. #endif
  486.     {
  487.       c_printnl("prevdepth ");
  488.       if ( a .cint <= ignoredepth ) 
  489.         c_print("ignored");
  490.       else
  491.         printscaled ( a .cint ) ; 
  492.       if ( nest [ p ] .pgfield != 0 ) {
  493.         c_print(", prevgraf ");
  494.         printint ( nest [ p ] .pgfield ) ; 
  495.         c_print(" line");
  496.         if ( nest [ p ] .pgfield != 1 ) 
  497.           printchar ( 115 ) ; 
  498.       }
  499.     }
  500.     break ;
  501. #ifdef OLD_MODE
  502.       case 1 :
  503. #else
  504.       case hmode:
  505. #endif
  506.     {
  507.       c_printnl("spacefactor ");
  508.       printint ( a.hh.v.LH ) ; 
  509.       if ( m > 0 && a.hh.v.RH > 0 ) {
  510.         c_print(", current language ");
  511.         printint ( a.hh.v.RH );
  512.       }
  513.     }
  514.     break ; 
  515. #ifdef OLD_MODE
  516.       case 2:
  517. #else
  518.       case mmode:
  519. #endif
  520.     if ( a .cint != 0 ) {
  521.       c_print("this will be denominator of:");
  522.       showbox ( a .cint ) ; 
  523.     } 
  524.     break ; 
  525.       }
  526.   }
  527. }
  528.  
  529.  
  530. void printparam ( integer n )
  531. { printparam_regmem 
  532.  
  533.   switch ( n ) {
  534.   case pretolerancecode : 
  535.     printesc ( 416 ) ; 
  536.     break ; 
  537.   case tolerancecode : 
  538.     printesc ( 417 ) ; 
  539.     break ; 
  540.   case linepenaltycode : 
  541.     printesc ( 418 ) ; 
  542.     break ; 
  543.   case hyphenpenaltycode : 
  544.     printesc ( 419 ) ; 
  545.     break ; 
  546.   case exhyphenpenaltycode : 
  547.     printesc ( 420 ) ; 
  548.     break ; 
  549.   case clubpenaltycode : 
  550.     printesc ( 421 ) ; 
  551.     break ; 
  552.   case widowpenaltycode : 
  553.     printesc ( 422 ) ; 
  554.     break ; 
  555.   case displaywidowpenaltycode : 
  556.     printesc ( 423 ) ; 
  557.     break ; 
  558.   case brokenpenaltycode : 
  559.     printesc ( 424 ) ; 
  560.     break ; 
  561.   case binoppenaltycode : 
  562.     printesc ( 425 ) ; 
  563.     break ; 
  564.   case relpenaltycode : 
  565.     printesc ( 426 ) ; 
  566.     break ; 
  567.   case predisplaypenaltycode : 
  568.     printesc ( 427 ) ; 
  569.     break ; 
  570.   case postdisplaypenaltycode : 
  571.     printesc ( 428 ) ; 
  572.     break ; 
  573.   case interlinepenaltycode : 
  574.     printesc ( 429 ) ; 
  575.     break ; 
  576.   case doublehyphendemeritscode : 
  577.     printesc ( 430 ) ; 
  578.     break ; 
  579.   case finalhyphendemeritscode : 
  580.     printesc ( 431 ) ; 
  581.     break ; 
  582.   case adjdemeritscode : 
  583.     printesc ( 432 ) ; 
  584.     break ; 
  585.   case magcode : 
  586.     printesc ( 433 ) ; 
  587.     break ; 
  588.   case delimiterfactorcode : 
  589.     printesc ( 434 ) ; 
  590.     break ; 
  591.   case loosenesscode : 
  592.     printesc ( 435 ) ; 
  593.     break ; 
  594.   case timecode : 
  595.     printesc ( 436 ) ; 
  596.     break ; 
  597.   case daycode : 
  598.     printesc ( 437 ) ; 
  599.     break ; 
  600.   case monthcode : 
  601.     printesc ( 438 ) ; 
  602.     break ; 
  603.   case yearcode : 
  604.     printesc ( 439 ) ; 
  605.     break ; 
  606.   case showboxbreadthcode : 
  607.     printesc ( 440 ) ; 
  608.     break ; 
  609.   case showboxdepthcode : 
  610.     printesc ( 441 ) ; 
  611.     break ; 
  612.   case hbadnesscode : 
  613.     printesc ( 442 ) ; 
  614.     break ; 
  615.   case vbadnesscode : 
  616.     printesc ( 443 ) ; 
  617.     break ; 
  618.   case pausingcode : 
  619.     printesc ( 444 ) ; 
  620.     break ; 
  621.   case tracingonlinecode : 
  622.     printesc ( 445 ) ; 
  623.     break ; 
  624.   case tracingmacroscode : 
  625.     printesc ( 446 ) ; 
  626.     break ; 
  627.   case tracingstatscode : 
  628.     printesc ( 447 ) ; 
  629.     break ; 
  630.   case tracingparagraphscode : 
  631.     printesc ( 448 ) ; 
  632.     break ; 
  633.   case tracingpagescode : 
  634.     printesc ( 449 ) ; 
  635.     break ; 
  636.   case tracingoutputcode : 
  637.     printesc ( 450 ) ; 
  638.     break ; 
  639.   case tracinglostcharscode : 
  640.     printesc ( 451 ) ; 
  641.     break ; 
  642.   case tracingcommandscode : 
  643.     printesc ( 452 ) ; 
  644.     break ; 
  645.   case tracingrestorescode : 
  646.     printesc ( 453 ) ; 
  647.     break ; 
  648.   case uchyphcode : 
  649.     printesc ( 454 ) ; 
  650.     break ; 
  651.   case outputpenaltycode : 
  652.     printesc ( 455 ) ; 
  653.     break ; 
  654.   case maxdeadcyclescode : 
  655.     printesc ( 456 ) ; 
  656.     break ; 
  657.   case hangaftercode : 
  658.     printesc ( 457 ) ; 
  659.     break ; 
  660.   case floatingpenaltycode : 
  661.     printesc ( 458 ) ; 
  662.     break ; 
  663.   case globaldefscode : 
  664.     printesc ( 459 ) ; 
  665.     break ; 
  666.   case curfamcode : 
  667.     printesc ( 460 ) ; 
  668.     break ; 
  669.   case escapecharcode : 
  670.     printesc ( 461 ) ; 
  671.     break ; 
  672.   case defaulthyphencharcode : 
  673.     printesc ( 462 ) ; 
  674.     break ; 
  675.   case defaultskewcharcode : 
  676.     printesc ( 463 ) ; 
  677.     break ; 
  678.   case endlinecharcode : 
  679.     printesc ( 464 ) ; 
  680.     break ; 
  681.   case newlinecharcode : 
  682.     printesc ( 465 ) ; 
  683.     break ; 
  684.   case languagecode : 
  685.     printesc ( 466 ) ; 
  686.     break ; 
  687.   case lefthyphenmincode : 
  688.     printesc ( 467 ) ; 
  689.     break ; 
  690.   case righthyphenmincode : 
  691.     printesc ( 468 ) ; 
  692.     break ; 
  693.   case holdinginsertscode : 
  694.     printesc ( 469 ) ; 
  695.     break ; 
  696.   case errorcontextlinescode : 
  697.     printesc ( 470 ) ; 
  698.     break ;
  699. #ifdef MLTEX
  700.   case char_sub_def_max_code :
  701.     printesc( STR_CHARSUBDEFMAX );
  702.     break;
  703.   case tracing_char_sub_def_code :
  704.     printesc( STR_TRACING_CHARSUBDEF );
  705.     break;
  706. #endif
  707. #ifdef ERW_INTERACTION
  708.   case interactionmodecode :
  709.     printesc( STR_INTERACTION_MODE );
  710.     break;
  711. #endif
  712.   default: 
  713.     c_print("[unknown integer parameter!]");
  714.     break ; 
  715.   }
  716.  
  717.  
  718. void begindiagnostic ( void )
  719. { begindiagnostic_regmem
  720.  
  721.   oldsetting = selector;
  722.   if ( ( tracingonline <= 0 ) && ( selector == termandlog ) ) {
  723.     decr ( selector );
  724.     if ( history == spotless )
  725.       history = warningissued;
  726.   }
  727. }
  728.  
  729.  
  730. void enddiagnostic ( boolean blankline )
  731. { enddiagnostic_regmem
  732.  
  733.   c_printnl("");
  734.   if ( blankline )
  735.     println();
  736.   selector = oldsetting;
  737. }
  738.  
  739.  
  740. void printlengthparam ( integer n )
  741. { printlengthparam_regmem 
  742.  
  743.   switch ( n ) {
  744.   case parindentcode : 
  745.     printesc ( 474 ) ; 
  746.     break ; 
  747.   case mathsurroundcode : 
  748.     printesc ( 475 ) ; 
  749.     break ; 
  750.   case lineskiplimitcode : 
  751.     printesc ( 476 ) ; 
  752.     break ; 
  753.   case hsizecode : 
  754.     printesc ( 477 ) ; 
  755.     break ; 
  756.   case vsizecode : 
  757.     printesc ( 478 ) ; 
  758.     break ; 
  759.   case maxdepthcode : 
  760.     printesc ( 479 ) ; 
  761.     break ; 
  762.   case splitmaxdepthcode : 
  763.     printesc ( 480 ) ; 
  764.     break ; 
  765.   case boxmaxdepthcode : 
  766.     printesc ( 481 ) ; 
  767.     break ; 
  768.   case hfuzzcode : 
  769.     printesc ( 482 ) ; 
  770.     break ; 
  771.   case vfuzzcode : 
  772.     printesc ( 483 ) ; 
  773.     break ; 
  774.   case delimitershortfallcode : 
  775.     printesc ( 484 ) ; 
  776.     break ; 
  777.   case nulldelimiterspacecode : 
  778.     printesc ( 485 ) ; 
  779.     break ; 
  780.   case scriptspacecode : 
  781.     printesc ( 486 ) ; 
  782.     break ; 
  783.   case predisplaysizecode : 
  784.     printesc ( 487 ) ; 
  785.     break ; 
  786.   case displaywidthcode : 
  787.     printesc ( 488 ) ; 
  788.     break ; 
  789.   case displayindentcode : 
  790.     printesc ( 489 ) ; 
  791.     break ; 
  792.   case overfullrulecode : 
  793.     printesc ( 490 ) ; 
  794.     break ; 
  795.   case hangindentcode : 
  796.     printesc ( 491 ) ; 
  797.     break ; 
  798.   case hoffsetcode : 
  799.     printesc ( 492 ) ; 
  800.     break ; 
  801.   case voffsetcode : 
  802.     printesc ( 493 ) ; 
  803.     break ; 
  804.   case emergencystretchcode : 
  805.     printesc ( 494 ) ; 
  806.     break ; 
  807.   default: 
  808.     c_print("[unknown dimen parameter!]");
  809.     break ; 
  810.   } 
  811.  
  812.  
  813. void printcmdchr ( quarterword cmd, halfword chrcode )
  814. { printcmdchr_regmem 
  815.  
  816.   switch ( cmd ) {
  817.   case left_brace : 
  818.       c_print("begin-group character ");
  819.       print ( chrcode ) ; 
  820.     break ; 
  821.   case right_brace : 
  822.       c_print("end-group character ");
  823.       print ( chrcode ) ; 
  824.     break ; 
  825.   case math_shift : 
  826.       c_print("math shift character ");
  827.       print ( chrcode ) ; 
  828.     break ; 
  829.   case mac_param : 
  830.       c_print("macro parameter character ");
  831.       print ( chrcode ) ; 
  832.     break ; 
  833.   case sup_mark : 
  834.       c_print("superscript character ");
  835.       print ( chrcode ) ; 
  836.     break ; 
  837.   case sub_mark : 
  838.       c_print("subscript character ");
  839.       print ( chrcode ) ; 
  840.     break ; 
  841.   case endv : 
  842.     c_print("end of alignment template");
  843.     break ; 
  844.   case spacer : 
  845.       c_print("blank space ");
  846.       print ( chrcode ) ; 
  847.     break ; 
  848.   case letter : 
  849.       c_print("the letter ");
  850.       print ( chrcode ) ; 
  851.     break ; 
  852.   case otherchar : 
  853.       c_print("the character ");
  854.       print ( chrcode ) ; 
  855.     break ; 
  856.  
  857.   case assign_glue : 
  858.   case assign_mu_glue : 
  859.     if ( chrcode < skipbase ) 
  860.       printskipparam ( chrcode - gluebase ) ; 
  861.     else if ( chrcode < muskipbase ) {
  862.       printesc( STR_SKIP );
  863.       printint ( chrcode - skipbase ) ; 
  864.     } else {
  865.       printesc ( 392 ) ; 
  866.       printint ( chrcode - muskipbase ) ; 
  867.     } 
  868.     break ; 
  869.   case assign_toks : 
  870.     if ( chrcode >= toksbase ) {
  871.       printesc ( 403 ) ; 
  872.       printint ( chrcode - toksbase ) ; 
  873.     } else switch ( chrcode ) {
  874.     case outputroutineloc : 
  875.       printesc ( 394 ) ; 
  876.       break ; 
  877.     case everyparloc : 
  878.       printesc ( 395 ) ; 
  879.       break ; 
  880.     case everymathloc : 
  881.       printesc ( 396 ) ; 
  882.       break ; 
  883.     case everydisplayloc : 
  884.       printesc ( 397 ) ; 
  885.       break ; 
  886.     case everyhboxloc : 
  887.       printesc ( 398 ) ; 
  888.       break ; 
  889.     case everyvboxloc : 
  890.       printesc ( 399 ) ; 
  891.       break ; 
  892.     case everyjobloc : 
  893.       printesc ( 400 ) ; 
  894.       break ; 
  895.     case everycrloc : 
  896.       printesc ( 401 ) ; 
  897.       break ; 
  898.     default: 
  899.       printesc ( 402 ) ; 
  900.       break ; 
  901.     } 
  902.     break ; 
  903.   case assign_int : 
  904.     if ( chrcode < countbase ) 
  905.       printparam ( chrcode - intbase ) ; 
  906.     else {
  907.       printesc ( 472 ) ; 
  908.       printint ( chrcode - countbase ) ; 
  909.     } 
  910.     break ; 
  911.   case assign_dimen : 
  912.     if ( chrcode < scaledbase ) 
  913.       printlengthparam ( chrcode - dimenbase ) ; 
  914.     else {
  915.       printesc ( 496 ) ; 
  916.       printint ( chrcode - scaledbase ) ; 
  917.     } 
  918.     break ; 
  919.   case accent : 
  920.     printesc ( 504 ) ; 
  921.     break ; 
  922.   case advance : 
  923.     printesc ( 505 ) ; 
  924.     break ; 
  925.   case afterassignment : 
  926.     printesc ( 506 ) ; 
  927.     break ; 
  928.   case aftergroup : 
  929.     printesc ( 507 ) ; 
  930.     break ; 
  931.   case assign_font_dimen : 
  932.     printesc ( 515 ) ; 
  933.     break ; 
  934.   case begin_group : 
  935.     printesc ( 508 ) ; 
  936.     break ; 
  937.   case break_penalty : 
  938.     printesc ( 527 ) ; 
  939.     break ; 
  940.   case charnum : 
  941.     printesc ( 509 ) ; 
  942.     break ; 
  943.   case csname : 
  944.     printesc ( 500 ) ; 
  945.     break ; 
  946.   case def_font : 
  947.     printesc ( 514 ) ; 
  948.     break ; 
  949.   case delim_num : 
  950.     printesc ( 510 ) ; 
  951.     break ; 
  952.   case divide : 
  953.     printesc ( 511 ) ; 
  954.     break ; 
  955.   case end_cs_name : 
  956.     printesc ( STR_ENDCSNAME );
  957.     break ; 
  958.   case end_group : 
  959.     printesc( STR_ENDGROUP );
  960.     break ; 
  961.   case exspace : 
  962.     printesc ( 32 ) ; 
  963.     break ; 
  964.   case expandafter : 
  965.     printesc ( 513 ) ; 
  966.     break ; 
  967.   case halign : 
  968.     printesc ( 516 ) ; 
  969.     break ; 
  970.   case hrule : 
  971.     printesc ( 517 ) ; 
  972.     break ; 
  973.   case ignorespaces : 
  974.     printesc ( 518 ) ; 
  975.     break ; 
  976.   case insert : 
  977.     printesc( STR_INSERT );
  978.     break ; 
  979.   case ital_corr : 
  980.     printesc ( 47 ) ; 
  981.     break ; 
  982.   case mark : 
  983.     printesc ( 348 ) ; 
  984.     break ; 
  985.   case math_accent : 
  986.     printesc ( 519 ) ; 
  987.     break ; 
  988.   case math_char_num : 
  989.     printesc ( 520 ) ; 
  990.     break ; 
  991.   case math_choice : 
  992.     printesc ( 521 ) ; 
  993.     break ; 
  994.   case multiply : 
  995.     printesc ( 522 ) ; 
  996.     break ; 
  997.   case no_align : 
  998.     printesc ( 523 ) ; 
  999.     break ; 
  1000.   case noboundary : 
  1001.     printesc ( 524 ) ; 
  1002.     break ; 
  1003.   case noexpand : 
  1004.     printesc ( 525 ) ; 
  1005.     break ; 
  1006.   case non_script : 
  1007.     printesc ( 332 ) ; 
  1008.     break ; 
  1009.   case omit : 
  1010.     printesc ( 526 ) ; 
  1011.     break ; 
  1012.   case radical : 
  1013.     printesc ( 529 ) ; 
  1014.     break ; 
  1015.   case read_to_cs : 
  1016.     printesc ( STR_READ );
  1017.     break ; 
  1018.   case relax : 
  1019.     printesc ( 531 ) ; 
  1020.     break ; 
  1021.   case set_box : 
  1022.     printesc ( 532 ) ; 
  1023.     break ; 
  1024.   case set_prev_graf : 
  1025.     printesc ( 528 ) ; 
  1026.     break ; 
  1027.   case set_shape : 
  1028.     printesc ( 404 ) ; 
  1029.     break ; 
  1030.   case the : 
  1031.     printesc ( 533 ) ; 
  1032.     break ; 
  1033.   case toks_register : 
  1034.     printesc ( 403 ) ; 
  1035.     break ; 
  1036.   case vadjust : 
  1037.     printesc ( 349 ) ; 
  1038.     break ; 
  1039.   case valign : 
  1040. #ifdef TEXXET
  1041.     if( chrcode != 0 ) {
  1042.       switch( chrcode ) {
  1043.     case begin_L_code:    print_esc(STR_BEGINL); break;
  1044.     case end_L_code:    print_esc(STR_ENDL); break;
  1045.     case begin_R_code:    print_esc(STR_BEGINR); break;
  1046.     default:        print_esc(STR_ENDR); break;
  1047.       }
  1048.     } else
  1049. #endif
  1050.       printesc ( 534 ) ; 
  1051.     break ; 
  1052.   case vcenter : 
  1053.     printesc ( 535 ) ; 
  1054.     break ; 
  1055.   case vrule : 
  1056.     printesc ( 536 ) ; 
  1057.     break ; 
  1058. #ifdef MLTEX
  1059.   case char_sub_def :
  1060.     printesc(STR_CHARSUBDEF);
  1061.     break;
  1062. #endif
  1063.   case par_end : 
  1064.     printesc( STR_PAR );
  1065.     break ; 
  1066.   case input : 
  1067.     printesc( (chrcode == 0) ? 625 : 626 );
  1068.     break ; 
  1069.   case topbotmark : 
  1070.     switch ( chrcode ) {
  1071.     case firstmarkcode : 
  1072.       printesc ( 628 ) ; 
  1073.       break ; 
  1074.     case botmarkcode : 
  1075.       printesc ( 629 ) ; 
  1076.       break ; 
  1077.     case splitfirstmarkcode : 
  1078.       printesc ( 630 ) ; 
  1079.       break ; 
  1080.     case splitbotmarkcode : 
  1081.       printesc ( 631 ) ; 
  1082.       break ; 
  1083.       default: 
  1084.       printesc ( 627 ) ; 
  1085.       break ; 
  1086.     } 
  1087.     break ; 
  1088.   case register_cmd : 
  1089.     if ( chrcode == intval ) 
  1090.       printesc ( 472 ) ; 
  1091.     else if ( chrcode == dimenval ) 
  1092.       printesc ( 496 ) ; 
  1093.     else if ( chrcode == glueval ) 
  1094.       printesc( STR_SKIP );
  1095.     else
  1096.       printesc ( 392 ) ; 
  1097.     break ; 
  1098.   case set_aux:
  1099.     printesc( (chrcode == vmode) ? STR_PREVDEPTH : STR_SPACEFACTOR );
  1100.     break;
  1101.   case set_page_int : 
  1102.     printesc( (chrcode == 0) ? STR_DEADCYCLES : STR_INSERTPENALTIES );
  1103.     break;
  1104.   case set_box_dimen : 
  1105.     if ( chrcode == widthoffset ) 
  1106.       printesc ( STR_WD ) ; 
  1107.     else if ( chrcode == heightoffset ) 
  1108.       printesc ( STR_HT ) ; 
  1109.     else
  1110.       printesc ( STR_DP ) ; 
  1111.     break ; 
  1112.   case last_item : 
  1113.     switch ( chrcode ) {
  1114.     case intval : 
  1115.       printesc ( STR_LASTPENALTY ) ; 
  1116.       break ; 
  1117.     case dimenval : 
  1118.       printesc ( STR_LASTKERN ) ; 
  1119.       break ; 
  1120.     case glueval : 
  1121.       printesc ( STR_LASTSKIP ) ; 
  1122.       break ; 
  1123.     case inputlinenocode : 
  1124.       printesc ( STR_INPUTLINENO ) ; 
  1125.       break ; 
  1126.     default: 
  1127.       printesc ( STR_BADNESS ) ; 
  1128.       break ; 
  1129.     } 
  1130.     break ; 
  1131.   case convert : 
  1132.     switch ( chrcode ) {
  1133.     case numbercode : 
  1134.       printesc ( STR_NUMBER );
  1135.       break ; 
  1136.     case romannumeralcode : 
  1137.       printesc ( STR_ROMANNUMERAL );
  1138.       break ; 
  1139.     case stringcode : 
  1140.       printesc ( STR_STRING );
  1141.       break ; 
  1142.     case meaningcode : 
  1143.       printesc ( STR_MEANING );
  1144.       break ; 
  1145.     case fontnamecode : 
  1146.       printesc ( STR_FONTNAME );
  1147.       break ; 
  1148.     default: 
  1149.       printesc ( STR_JOBNAME );
  1150.       break;
  1151.     }
  1152.     break;
  1153.   case iftest : 
  1154.     switch ( chrcode ) {
  1155.     case ifcatcode : 
  1156.       printesc ( STR_IFCAT ) ; 
  1157.       break ; 
  1158.     case ifintcode : 
  1159.       printesc ( STR_IFNUM ) ; 
  1160.       break ; 
  1161.     case ifdimcode : 
  1162.       printesc ( STR_IFDIM ) ; 
  1163.       break ; 
  1164.     case ifoddcode : 
  1165.       printesc ( STR_IFODD ) ; 
  1166.       break ; 
  1167.     case ifvmodecode : 
  1168.       printesc ( STR_IFVMODE ) ; 
  1169.       break ; 
  1170.     case ifhmodecode : 
  1171.       printesc ( STR_IFHMODE ) ; 
  1172.       break ; 
  1173.     case ifmmodecode : 
  1174.       printesc ( STR_IFMMODE ) ; 
  1175.       break ; 
  1176.     case ifinnercode : 
  1177.       printesc ( STR_IFINNER ) ; 
  1178.       break ; 
  1179.     case ifvoidcode : 
  1180.       printesc ( STR_IFVOID ) ; 
  1181.       break ; 
  1182.     case ifhboxcode : 
  1183.       printesc ( STR_IFHBOX ) ; 
  1184.       break ; 
  1185.     case ifvboxcode : 
  1186.       printesc ( STR_IFVBOX ) ; 
  1187.       break ; 
  1188.     case ifxcode : 
  1189.       printesc ( STR_IFX ) ; 
  1190.       break ; 
  1191.     case ifeofcode : 
  1192.       printesc ( STR_IFEOF ) ; 
  1193.       break ; 
  1194.     case iftruecode : 
  1195.       printesc ( STR_IFTRUE ) ; 
  1196.       break ; 
  1197.     case iffalsecode : 
  1198.       printesc ( STR_IFFALSE ) ; 
  1199.       break ; 
  1200.     case ifcasecode : 
  1201.       printesc ( STR_IFCASE ) ; 
  1202.       break ; 
  1203.     default: 
  1204.       printesc( STR_IF );
  1205.       break ; 
  1206.     } 
  1207.     break ; 
  1208.   case fiorelse : 
  1209.     if ( chrcode == ficode ) 
  1210.       printesc ( STR_FI ) ; 
  1211.     else if ( chrcode == orcode ) 
  1212.       printesc ( STR_OR ) ; 
  1213.     else printesc ( STR_ELSE );
  1214.     break ; 
  1215.   case tab_mark : 
  1216.     if ( chrcode == spancode ) 
  1217.       printesc( STR_SPAN );
  1218.     else {
  1219.       c_print("alignment tab character ");
  1220.       print ( chrcode ) ; 
  1221.     } 
  1222.     break ; 
  1223.   case car_ret : 
  1224.     printesc( (chrcode == crcode) ? STR_CR : STR_CRCR );
  1225.     break;
  1226.   case set_page_dimen : 
  1227.     switch ( chrcode ) {
  1228.     case 0 : 
  1229.       printesc( STR_PAGEGOAL );
  1230.       break ; 
  1231.     case 1 : 
  1232.       printesc( STR_PAGETOTAL );
  1233.       break ; 
  1234.     case 2 : 
  1235.       printesc( STR_PAGESTRETCH );
  1236.       break ; 
  1237.     case 3 : 
  1238.       printesc( STR_PAGEFILSTRETCH );
  1239.       break ; 
  1240.     case 4 : 
  1241.       printesc( STR_PAGEFILLSTRETCH );
  1242.       break ; 
  1243.     case 5 : 
  1244.       printesc( STR_PAGEFILLLSTRETCH );
  1245.       break ; 
  1246.     case 6 : 
  1247.       printesc( STR_PAGESHRINK );
  1248.       break ; 
  1249.     default: 
  1250.       printesc( STR_PAGEDEPTH );
  1251.       break ; 
  1252.     } 
  1253.     break ; 
  1254.   case stop : 
  1255.     printesc( (chrcode == 1) ? STR_DUMP : STR_END );
  1256.     break ; 
  1257.   case hskip : 
  1258.     switch ( chrcode ) {
  1259.     case 4 : 
  1260.       printesc( STR_HSKIP );
  1261.       break ; 
  1262.     case 0 : 
  1263.       printesc( STR_HFIL );
  1264.       break ; 
  1265.     case 1 : 
  1266.       printesc( STR_HFILL );
  1267.       break ; 
  1268.     case 2 : 
  1269.       printesc( STR_HSS );
  1270.       break ; 
  1271.     default: 
  1272.       printesc( STR_HFILNEG );
  1273.       break;
  1274.     }
  1275.     break ; 
  1276.   case vskip : 
  1277.     switch ( chrcode ) {
  1278.     case 4 : 
  1279.       printesc( STR_VSKIP );
  1280.       break ; 
  1281.     case 0 : 
  1282.       printesc( STR_VFIL ) ; 
  1283.       break ; 
  1284.     case 1 : 
  1285.       printesc( STR_VFILL ) ; 
  1286.       break ; 
  1287.     case 2 : 
  1288.       printesc( STR_VSS ) ; 
  1289.       break ; 
  1290.     default: 
  1291.       printesc( STR_VFILNEG ) ; 
  1292.       break ; 
  1293.     } 
  1294.     break ; 
  1295.   case mskip : 
  1296.     printesc ( 333 ) ; 
  1297.     break ; 
  1298.   case kern : 
  1299.     printesc ( 337 ) ; 
  1300.     break ; 
  1301.   case mkern : 
  1302.     printesc ( 339 ) ; 
  1303.     break ; 
  1304.   case hmove : 
  1305.     printesc( (chrcode == 1) ? STR_MOVELEFT : STR_MOVERIGHT );
  1306.     break ; 
  1307.   case vmove : 
  1308.     printesc( (chrcode == 1) ? STR_RAISE : STR_LOWER );
  1309.     break ; 
  1310.   case make_box : 
  1311.     switch ( chrcode ) {
  1312.     case 0 : 
  1313.       printesc( STR_BOX );
  1314.       break ; 
  1315.     case 1 : 
  1316.       printesc( STR_COPY );
  1317.       break ; 
  1318.     case 2 : 
  1319.       printesc( STR_LASTBOX );
  1320.       break ; 
  1321.     case 3 : 
  1322.       printesc( STR_VSPLIT );
  1323.       break ; 
  1324. #ifdef OLD_MODE
  1325.     case 4 :
  1326.       printesc( STR_VTOP );
  1327.       break ; 
  1328.     case 5 : 
  1329.       printesc( STR_VBOX );
  1330.       break ; 
  1331.     default: 
  1332.       printesc( STR_HBOX );
  1333.       break ; 
  1334. #else
  1335.     default:
  1336.       if( chrcode == 4 )
  1337.     printesc( STR_VTOP );
  1338.       else if( chrcode == (4 + vmode) )
  1339.     printesc( STR_VBOX );
  1340.       else
  1341.     printesc( STR_HBOX ); 
  1342.       break;
  1343. #endif
  1344.     }
  1345.     break;
  1346.   case leader_ship :
  1347.     if ( chrcode == aleaders ) 
  1348.       printesc( STR_LEADERS );
  1349.     else if ( chrcode == cleaders ) 
  1350.       printesc( STR_CLEADERS );
  1351.     else if ( chrcode == xleaders ) 
  1352.       printesc( STR_XLEADERS );
  1353.     else
  1354.       printesc( STR_SHIPOUT );
  1355.     break ; 
  1356.   case start_par : 
  1357.     printesc( (chrcode == 0) ? STR_NOINDENT : STR_INDENT );
  1358.     break;
  1359.   case remove_item : 
  1360.     if ( chrcode == gluenode ) 
  1361.       printesc( STR_UNSKIP );
  1362.     else if ( chrcode == kernnode ) 
  1363.       printesc( STR_UNKERN );
  1364.     else
  1365.       printesc( STR_UNPENALTY );
  1366.     break;
  1367.   case un_hbox : 
  1368.     printesc( (chrcode == 1) ? STR_UNHCOPY : STR_UNHBOX );
  1369.     break;
  1370.   case un_vbox : 
  1371.     printesc( (chrcode == 1) ? STR_UNVCOPY : STR_UNVBOX );
  1372.     break;
  1373.   case discretionary : 
  1374.     printesc( (chrcode == 1) ? 45 : 346 );
  1375.     break ; 
  1376.   case eq_no : 
  1377.     printesc( (chrcode == 1) ? STR_LEQNO : STR_EQNO );
  1378.     break ; 
  1379.   case math_comp : 
  1380.     switch ( chrcode ) {
  1381.     case ordnoad : 
  1382.       printesc ( STR_MATHORD ) ; 
  1383.       break ; 
  1384.     case opnoad : 
  1385.       printesc ( STR_MATHOP ) ; 
  1386.       break ; 
  1387.     case binnoad : 
  1388.       printesc ( STR_MATHBIN ) ; 
  1389.       break ; 
  1390.     case relnoad : 
  1391.       printesc ( STR_MATHREL ) ; 
  1392.       break ; 
  1393.     case opennoad : 
  1394.       printesc ( STR_MATHOPEN ) ; 
  1395.       break ; 
  1396.     case closenoad : 
  1397.       printesc ( STR_MATHCLOSE ) ; 
  1398.       break ; 
  1399.     case punctnoad : 
  1400.       printesc ( STR_MATHPUNCT ) ; 
  1401.       break ; 
  1402.     case innernoad : 
  1403.       printesc ( STR_MATHINNER ) ; 
  1404.       break ; 
  1405.     case undernoad : 
  1406.       printesc ( STR_UNDERLINE ) ; 
  1407.       break ; 
  1408.     default: 
  1409.       printesc ( STR_OVERLINE );
  1410.       break ; 
  1411.     } 
  1412.     break ; 
  1413.   case limit_switch : 
  1414.     if ( chrcode == limits ) 
  1415.       printesc ( STR_LIMITS ) ; 
  1416.     else if ( chrcode == nolimits ) 
  1417.       printesc ( STR_NOLIMITS ) ; 
  1418.     else
  1419.       printesc( STR_DISPLAYLIMITS );
  1420.     break ; 
  1421.   case math_style :
  1422.     printstyle ( chrcode ) ; 
  1423.     break ; 
  1424.   case above :
  1425.     { strnumber s;
  1426.  
  1427.       switch ( chrcode ) {
  1428.     case 1:  s = STR_OVER;  break;
  1429.     case 2:  s = STR_ATOP;  break;
  1430.     case 3:  s = STR_ABOVEWITHDELIMS; break;
  1431.     case 4:  s = STR_OVERWITHDELIMS;  break;
  1432.     case 5:  s = STR_ATOPWITHDELIMS;  break;
  1433.     default: s = STR_ABOVE; break;
  1434.       }
  1435.       printesc(s);
  1436.     }
  1437.     break;
  1438.   case left_right : 
  1439.     printesc( (chrcode == leftnoad) ? STR_LEFT : STR_RIGHT );
  1440.     break ; 
  1441.   case prefix : 
  1442.     if ( chrcode == 1 ) 
  1443.       printesc ( STR_LONG );
  1444.     else if ( chrcode == 2 ) 
  1445.       printesc ( STR_OUTER );
  1446.     else
  1447.       printesc ( STR_GLOBAL );
  1448.     break ; 
  1449.   case def : 
  1450.     if ( chrcode == 0 ) 
  1451.       printesc ( STR_DEF );
  1452.     else if ( chrcode == 1 ) 
  1453.       printesc ( STR_GDEF );
  1454.     else if ( chrcode == 2 ) 
  1455.       printesc ( STR_EDEF );
  1456.     else
  1457.       printesc ( STR_XDEF );
  1458.     break ; 
  1459.   case let : 
  1460.     printesc( (chrcode != normal) ? STR_FUTURELET : STR_LET );
  1461.     break ; 
  1462.   case shorthand_def : 
  1463.     switch ( chrcode ) {
  1464.     case 0 : 
  1465.       printesc ( STR_CHARDEF );
  1466.       break ; 
  1467.     case 1 : 
  1468.       printesc ( STR_MATHCHARDEF );
  1469.       break ; 
  1470.     case 2 : 
  1471.       printesc ( STR_COUNTDEF );
  1472.       break ; 
  1473.     case 3 : 
  1474.       printesc ( STR_DIMENDEF );
  1475.       break ; 
  1476.     case 4 : 
  1477.       printesc ( STR_SKIPDEF );
  1478.       break ; 
  1479.     case 5 : 
  1480.       printesc ( STR_MUSKIPDEF );
  1481.       break ; 
  1482.     default: 
  1483.       printesc ( STR_TOKSDEF );
  1484.       break ; 
  1485.     } 
  1486.     break ; 
  1487.   case chargiven : 
  1488.     printesc ( 509 ) ; 
  1489.     printhex ( chrcode ) ; 
  1490.     break ; 
  1491.   case math_given :
  1492.     printesc ( 520 ) ; 
  1493.     printhex ( chrcode ) ; 
  1494.     break ; 
  1495.   case def_code : 
  1496.     if ( chrcode == catcodebase ) 
  1497.       printesc ( 411 ) ; 
  1498.     else if ( chrcode == mathcodebase ) 
  1499.       printesc ( 415 ) ; 
  1500.     else if ( chrcode == lccodebase ) 
  1501.       printesc ( 412 ) ; 
  1502.     else if ( chrcode == uccodebase ) 
  1503.       printesc ( 413 ) ; 
  1504.     else if ( chrcode == sfcodebase ) 
  1505.       printesc ( 414 ) ; 
  1506.     else printesc ( 473 ) ; 
  1507.     break ; 
  1508.   case def_family : 
  1509.     printsize ( chrcode - mathfontbase );
  1510.     break ; 
  1511.   case hyph_data : 
  1512.     printesc( (chrcode == 1) ? STR_PATTERNS : STR_HYPHENATION );
  1513.     break ; 
  1514.   case assign_font_int : 
  1515.     printesc( (chrcode == 0) ? STR_HYPHENCHAR : STR_SKEWCHAR );
  1516.     break ; 
  1517.   case set_font :
  1518.     {
  1519.       c_print("select font ");
  1520. #if 0  /* TeX 3.141 */
  1521.       print ( fontname(chrcode) );
  1522. #else
  1523.       slowprint ( fontname(chrcode) );
  1524. #endif
  1525.       if ( fontsize(chrcode) != fontdsize(chrcode) ) {
  1526.     print( STR_AT_ );
  1527.     printscaled ( fontsize(chrcode) );
  1528.     print( STR_PT );
  1529.       } 
  1530.     } 
  1531.     break ; 
  1532.   case set_interaction : 
  1533.     switch ( chrcode ) {
  1534.     case batchmode : 
  1535.       printesc ( 272 ) ; 
  1536.       break ; 
  1537.     case nonstopmode : 
  1538.       printesc ( 273 ) ; 
  1539.       break ; 
  1540.     case scrollmode : 
  1541.       printesc ( 274 ) ; 
  1542.       break ; 
  1543.     default: 
  1544.       printesc ( STR_ERRORSTOPMODE );
  1545.       break ; 
  1546.     } 
  1547.     break ; 
  1548.   case instream : 
  1549.     printesc( (chrcode == 0) ? STR_CLOSEIN : STR_OPENIN );
  1550.     break ; 
  1551.   case message : 
  1552.     printesc( (chrcode == 0) ? STR_MESSAGE : STR_ERRMESSAGE );
  1553.     break ; 
  1554.   case caseshift : 
  1555.     printesc( (chrcode == lccodebase) ? STR_LOWERCASE : STR_UPPERCASE );
  1556.     break ; 
  1557.   case xray : 
  1558.     switch ( chrcode ) {
  1559.     case 1 : 
  1560.       printesc ( STR_SHOWBOX );
  1561.       break;
  1562.     case 2 : 
  1563.       printesc ( STR_SHOWTHE );
  1564.       break;
  1565.     case 3 : 
  1566.       printesc ( STR_SHOWLISTS );
  1567.       break;
  1568.     default: 
  1569.       printesc ( STR_SHOW );
  1570.       break;
  1571.     }
  1572.     break ; 
  1573.   case undefinedcs : 
  1574.     c_print("undefined");
  1575.     break ; 
  1576.   case call : 
  1577.     c_print("macro");
  1578.     break ; 
  1579.   case longcall : 
  1580.     c_printesc("long macro");
  1581.     break ; 
  1582.   case longoutercall : 
  1583.     printesc ( STR_LONG );
  1584.     /* Fall through */
  1585.   case outercall : 
  1586.     c_printesc("outer macro");
  1587.     break ;
  1588.   case endtemplate : 
  1589.     c_printesc("outer endtemplate");
  1590.     break ;
  1591.   case extension: 
  1592.     switch ( chrcode ) {
  1593.     case opennode : 
  1594.       printesc ( STR_OPENOUT );
  1595.       break ; 
  1596.     case writenode : 
  1597.       printesc ( STR_WRITE );
  1598.       break ; 
  1599.     case closenode : 
  1600.       printesc ( STR_CLOSEOUT );
  1601.       break ; 
  1602.     case specialnode : 
  1603.       printesc ( STR_SPECIAL );
  1604.       break ; 
  1605.     case 4 : 
  1606.       printesc ( STR_IMMEDIATE );
  1607.       break ; 
  1608.     case 5 : 
  1609.       printesc( STR_SETLANGUAGE );
  1610.       break ; 
  1611.     default: 
  1612.       c_print("[unknown extension!]");
  1613.       break ; 
  1614.     } 
  1615.     break ; 
  1616.   default:
  1617.     c_print("[unknown command code!]");
  1618.     break;
  1619.   } 
  1620.  
  1621.  
  1622. #ifdef STAT
  1623. void showeqtb ( halfword n )
  1624. { showeqtb_regmem 
  1625.  
  1626.   if ( n < activebase ) 
  1627.     printchar ( 63 ) ; 
  1628.   else if ( n < gluebase ) {
  1629.     sprintcs ( n ) ; 
  1630.     printchar ( 61 ) ; 
  1631.     printcmdchr ( eqtype ( n ) , equiv ( n ) ) ; 
  1632.     if ( eqtype ( n ) >= call ) {
  1633.       printchar ( 58 ) ; 
  1634.       showtokenlist ( link ( equiv ( n ) ) , 0 , 32 ) ; 
  1635.     } 
  1636.   } else if ( n < localbase ) {
  1637.     if ( n < skipbase ) {
  1638.       printskipparam ( n - gluebase ) ; 
  1639.       printchar ( 61 ) ; 
  1640.       if ( n < gluebase + thinmuskipcode ) 
  1641.     printspec( equiv(n), STR_PT );
  1642.       else
  1643.     printspec( equiv(n), STR_MU );
  1644.     } else if ( n < muskipbase ) {
  1645.       printesc( STR_SKIP );
  1646.       printint ( n - skipbase ) ; 
  1647.       printchar ( 61 ) ; 
  1648.       printspec ( equiv ( n ) , STR_PT ) ; 
  1649.     } else {
  1650.       printesc ( 392 ) ; 
  1651.       printint ( n - muskipbase ) ; 
  1652.       printchar ( 61 ) ; 
  1653.       printspec ( equiv ( n ), STR_MU );
  1654.     }
  1655.   } else if ( n < intbase ) 
  1656.  
  1657.   if ( n == parshapeloc ) {
  1658.     printesc ( 404 ) ; 
  1659.     printchar ( 61 ) ; 
  1660.     if ( parshapeptr == 0 ) 
  1661.       printchar ( 48 ) ; 
  1662.     else printint ( info ( parshapeptr ) ) ; 
  1663.   } else if ( n < toksbase ) {
  1664.     printcmdchr( assign_toks, n );
  1665.     printchar ( 61 ) ; 
  1666.     if ( equiv ( n ) != 0 )
  1667.       showtokenlist ( link ( equiv ( n ) ) , 0 , 32 ) ; 
  1668.   } else if ( n < boxbase ) {
  1669.     printesc ( 403 ) ; 
  1670.     printint ( n - toksbase ) ; 
  1671.     printchar ( 61 ) ; 
  1672.     if ( equiv ( n ) != 0 )
  1673.       showtokenlist ( link ( equiv ( n ) ) , 0 , 32 ) ; 
  1674.   } else if ( n < curfontloc ) {
  1675.     printesc( STR_BOX );
  1676.     printint ( n - boxbase ) ; 
  1677.     printchar ( 61 ) ;
  1678.     if ( equiv ( n ) == 0 ) 
  1679.       c_print("void");
  1680.     else {
  1681.       depththreshold = 0 ; 
  1682.       breadthmax = 1 ; 
  1683.       shownodelist ( equiv ( n ) ) ; 
  1684.     } 
  1685.   } else if ( n < catcodebase ) {
  1686.     if ( n == curfontloc )
  1687.       c_print("current font");
  1688.     else if ( n < mathfontbase + 16 ) {
  1689.       printesc ( 408 ) ; 
  1690.       printint ( n - mathfontbase ) ; 
  1691.     } else if ( n < mathfontbase + 32 ) {
  1692.       printesc ( 409 ) ; 
  1693.       printint ( n - mathfontbase - 16 ) ; 
  1694.     } else {
  1695.       printesc ( 410 ) ; 
  1696.       printint ( n - mathfontbase - 32 ) ; 
  1697.     } 
  1698.     printchar ( 61 ) ; 
  1699.     printesc ( hash [ fontidbase + equiv ( n ) ] .v.RH ) ; 
  1700.   } else if ( n < mathcodebase ) {
  1701.     if ( n < lccodebase ) {
  1702.       printesc ( 411 ) ; 
  1703.       printint ( n - catcodebase ) ; 
  1704.     } else if ( n < uccodebase ) {
  1705.       printesc ( 412 ) ; 
  1706.       printint ( n - lccodebase ) ; 
  1707.     } else if ( n < sfcodebase ) {
  1708.       printesc ( 413 ) ; 
  1709.       printint ( n - uccodebase ) ; 
  1710.     } else {
  1711.       printesc ( 414 ) ; 
  1712.       printint ( n - sfcodebase ) ; 
  1713.     } 
  1714.     printchar ( 61 ) ; 
  1715.     printint ( equiv ( n ) ) ; 
  1716.   } else {
  1717.     printesc ( 415 ) ; 
  1718.     printint ( n - mathcodebase ) ; 
  1719.     printchar ( 61 ) ; 
  1720.     printint ( equiv ( n ) ) ; 
  1721.   }
  1722.  
  1723.   else if ( n < dimenbase ) {
  1724.     if ( n < countbase ) 
  1725.       printparam ( n - intbase ) ; 
  1726.     else if ( n < delcodebase ) {
  1727.       printesc ( 472 ) ; 
  1728.       printint ( n - countbase ) ; 
  1729.     } else {
  1730.       printesc ( 473 ) ; 
  1731.       printint ( n - delcodebase ) ; 
  1732.     } 
  1733.     printchar ( 61 ) ; 
  1734.     printint ( eqtb [ n ] .cint ) ; 
  1735.   } else if ( n <= eqtbsize ) {
  1736.     if ( n < scaledbase )
  1737.       printlengthparam ( n - dimenbase ) ; 
  1738.     else {
  1739.       printesc ( 496 ) ; 
  1740.       printint ( n - scaledbase ) ; 
  1741.     } 
  1742.     printchar ( 61 ) ; 
  1743.     printscaled ( eqtb [ n ] .cint ) ; 
  1744.     print ( STR_PT );
  1745.   } else
  1746.     printchar ( 63 );
  1747. }
  1748. #endif /* STAT */
  1749.  
  1750.  
  1751. halfword idlookup ( integer j, integer l )
  1752. { idlookup_regmem
  1753.   register unsigned short h;    /* ==> hashprime < (65536/2-256) */
  1754.   register integer d; 
  1755.   register halfword p;
  1756.   register long k;
  1757.  
  1758.   ASCIIcode *cp = &buffer[j];
  1759.  
  1760.   /* 261. */
  1761.   h = *cp++;    /* h = buffer [ j ] ; */
  1762.   for( k = 2 ; k <= l ; k++ ) {
  1763.       h = h + h + *cp++;    /* buffer[k] */
  1764.       while ( h >= hashprime )
  1765.     h -= hashprime;
  1766.   }
  1767.   /* 261. end */
  1768.  
  1769.   p = h + hashbase;
  1770.  
  1771.   while ( true ) {
  1772.     if( ( ztext(p) > 0 )
  1773.     &&  ( length( ztext(p) ) == l )
  1774.     && !strncmp( (char *) &strpool[strstart[ztext(p)]],
  1775.              (char *) &buffer[j],
  1776.              l ) )
  1777.       return(p);
  1778.  
  1779.     if ( next ( p ) == 0 ) {
  1780.       if ( nonewcontrolsequence )
  1781.     return( undefinedcontrolsequence );
  1782.       else {
  1783.     /* 260. */
  1784.     if ( ztext ( p ) > 0 ) {
  1785.       do {
  1786.         if ( hashisfull )
  1787.         overflow(5, hashsize);
  1788.         decr ( hashused );
  1789.       } while ( ztext ( hashused ) != 0 );
  1790.       next ( p ) = hashused;
  1791.       p = hashused;
  1792.     }
  1793.     strroom ( l );
  1794.     d = curlength;
  1795.     while ( poolptr > strstart [ strptr ] ) {
  1796.       decr ( poolptr );
  1797.       strpool [ poolptr + l ] = strpool [ poolptr ];
  1798.     }
  1799.     for( k = j ; k <= j + l - 1 ; k++ ) {
  1800.       appendchar ( buffer [ k ] );
  1801.     }
  1802.     ztext ( p ) = makestring();
  1803.     poolptr += d;
  1804. #ifdef STAT
  1805.     incr ( cscount );
  1806. #endif /* STAT */
  1807.       }
  1808.       return(p);
  1809.     }
  1810.     p = next ( p );
  1811.   }
  1812. }
  1813.  
  1814.  
  1815. void newsavelevel ( groupcode c )
  1816. { newsavelevel_regmem
  1817.  
  1818.   if ( saveptr > maxsavestack ) {
  1819.     maxsavestack = saveptr;
  1820.     if ( maxsavestack > savesize - 6 )
  1821.     overflow(6, savesize);
  1822.   }
  1823.   savetype ( saveptr ) = levelboundary;
  1824.   savelevel ( saveptr ) = curgroup;
  1825.   saveindex ( saveptr ) = curboundary;
  1826.   if ( curlevel == maxquarterword )
  1827.     overflow(7, maxquarterword - 0);
  1828.   curboundary = saveptr;
  1829.   incr ( curlevel );
  1830.   incr ( saveptr );
  1831.   curgroup = c;
  1832. }
  1833.  
  1834.  
  1835. static    /* (hes) */
  1836. void eqdestroy ( MEDmemoryword w )
  1837. { eqdestroy_regmem
  1838.  
  1839.   switch ( eqtypefield ( w ) ) {
  1840.   case call :
  1841.   case longcall :
  1842.   case outercall :
  1843.   case longoutercall :
  1844.     deletetokenref ( equivfield ( w ) );
  1845.     break;
  1846.   case glueref :
  1847.     deleteglueref ( equivfield ( w ) );
  1848.     break;
  1849.   case shaperef :
  1850.     { register halfword q;
  1851.  
  1852.       q = equivfield( w );
  1853.       if ( q != 0 )
  1854.     freenode( q, info(q) + info(q) + 1 ); 
  1855.     }
  1856.     break;
  1857.   case boxref :
  1858.     flushnodelist ( equivfield ( w ) );
  1859.     break;
  1860.   default:
  1861.     break;
  1862.   }
  1863. }
  1864.  
  1865.  
  1866. void eqsave ( halfword p, quarterword l )
  1867. { eqsave_regmem
  1868.  
  1869.   if ( saveptr > maxsavestack ) {
  1870.     maxsavestack = saveptr ; 
  1871.     if ( maxsavestack > savesize - 6 ) 
  1872.       overflow(6, savesize);
  1873.   } 
  1874.   if ( l == levelzero ) 
  1875.     savetype ( saveptr ) = restorezero ; 
  1876.   else {
  1877.     savestack [ saveptr ] = eqtb [ p ] ; 
  1878.     incr ( saveptr ) ; 
  1879.     savetype ( saveptr ) = restoreoldvalue ; 
  1880.   } 
  1881.   savelevel ( saveptr ) = l ; 
  1882.   saveindex ( saveptr ) = p ; 
  1883.   incr ( saveptr ) ; 
  1884. }
  1885.  
  1886.  
  1887. void eqdefine ( halfword p, quarterword t, halfword e )
  1888. { eqdefine_regmem
  1889.  
  1890.   if ( eqlevel ( p ) == curlevel ) 
  1891.     eqdestroy ( eqtb [ p ] ) ; 
  1892.   else if ( curlevel > levelone ) 
  1893.     eqsave ( p , eqlevel ( p ) ) ; 
  1894.   eqlevel ( p ) = curlevel ; 
  1895.   eqtype ( p ) = t ; 
  1896.   equiv ( p ) = e ; 
  1897. }
  1898.  
  1899.  
  1900. void eqworddefine ( halfword p, integer w )
  1901. { eqworddefine_regmem 
  1902.  
  1903.   if ( xeqlevel [ p ] != curlevel ) {
  1904.     eqsave( p, xeqlevel[p] );
  1905.     xeqlevel[p] = curlevel;
  1906.   }
  1907.   eqtb [ p ] .cint = w;
  1908. }
  1909.  
  1910.  
  1911. void geqdefine ( halfword p, quarterword t, halfword e )
  1912. { geqdefine_regmem
  1913.  
  1914.   eqdestroy ( eqtb [ p ] );
  1915.   eqlevel ( p ) = levelone;
  1916.   eqtype ( p ) = t;
  1917.   equiv ( p ) = e;
  1918. }
  1919.  
  1920.  
  1921. void geqworddefine ( halfword p, integer w )
  1922. { geqworddefine_regmem
  1923.  
  1924.   eqtb [ p ] .cint = w;
  1925.   xeqlevel [ p ] = levelone;
  1926.  
  1927.  
  1928. void saveforafter ( halfword t )
  1929. { saveforafter_regmem
  1930.  
  1931.   if ( curlevel > levelone ) {
  1932.     if ( saveptr > maxsavestack ) {
  1933.       maxsavestack = saveptr ; 
  1934.       if ( maxsavestack > savesize - 6 ) 
  1935.     overflow(6, savesize);
  1936.     }
  1937.     savetype ( saveptr ) = inserttoken;
  1938.     savelevel ( saveptr ) = levelzero;
  1939.     saveindex ( saveptr ) = t;
  1940.     incr ( saveptr );
  1941.   }
  1942. }
  1943.  
  1944.  
  1945. #ifdef STAT
  1946. void restoretrace ( halfword p, char *s )
  1947. { restoretrace_regmem
  1948.  
  1949.   begindiagnostic () ; 
  1950.   printchar ( 123 ) ; 
  1951.   c_print(s);
  1952.   printchar ( 32 ) ; 
  1953.   showeqtb ( p ) ; 
  1954.   printchar ( 125 ) ; 
  1955.   enddiagnostic ( false ) ; 
  1956. #endif /* STAT */
  1957.  
  1958.  
  1959. void unsave ( void )
  1960. {/* 30 */ unsave_regmem 
  1961.   register halfword p  ; 
  1962.   register quarterword l  ; 
  1963.  
  1964.   if ( curlevel > levelone ) {
  1965.     decr ( curlevel ) ; 
  1966.     while ( true ) {
  1967.       decr ( saveptr ) ; 
  1968.       if ( savetype ( saveptr ) == levelboundary ) 
  1969.     goto lab30 ; 
  1970.       p = saveindex ( saveptr ) ; 
  1971.       if ( savetype ( saveptr ) == inserttoken ) {
  1972.     register halfword t;
  1973.  
  1974.     t = curtok ; 
  1975.     curtok = p ; 
  1976.     backinput () ; 
  1977.     curtok = t ; 
  1978.       } else {
  1979.     if ( savetype ( saveptr ) == restoreoldvalue ) {
  1980.       l = savelevel ( saveptr ) ; 
  1981.       decr ( saveptr ) ; 
  1982.     } else
  1983.       savestack [ saveptr ] = eqtb [ undefinedcontrolsequence ] ; 
  1984.     if ( p < intbase ) 
  1985.     if ( eqlevel ( p ) == levelone ) {
  1986.       eqdestroy ( savestack [ saveptr ] ) ; 
  1987. #ifdef STAT
  1988.       if ( tracingrestores > 0 ) 
  1989.         restoretrace(p, "retaining");
  1990. #endif /* STAT */
  1991.     } else {
  1992.       eqdestroy ( eqtb [ p ] ) ; 
  1993.       eqtb [ p ] = savestack [ saveptr ] ; 
  1994. #ifdef STAT
  1995.       if ( tracingrestores > 0 ) 
  1996.         restoretrace(p, "restoring");
  1997. #endif /* STAT */
  1998.     }
  1999.     else if ( xeqlevel [ p ] != levelone ) {
  2000.       eqtb [ p ] = savestack [ saveptr ] ; 
  2001.       xeqlevel [ p ] = l ; 
  2002. #ifdef STAT
  2003.       if ( tracingrestores > 0 ) 
  2004.         restoretrace(p, "restoring");
  2005. #endif /* STAT */
  2006.     }
  2007.     else {
  2008. #ifdef STAT
  2009.       if ( tracingrestores > 0 ) 
  2010.         restoretrace(p, "retaining");
  2011. #endif /* STAT */
  2012.     }
  2013.       }
  2014.     }
  2015. lab30:
  2016.     curgroup = savelevel ( saveptr ) ; 
  2017.     curboundary = saveindex ( saveptr ) ; 
  2018.   } else
  2019.     confusion("curlevel");
  2020. }
  2021.  
  2022. /* -- end -- */
  2023.