home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / source / TeX / tex / tex6.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-10-11  |  45.0 KB  |  1,987 lines

  1. #define EXTERN extern
  2. #include "texd.h"
  3.  
  4.  
  5. void postlinebreak ( integer finalwidowpenalty )
  6. { postlinebreak_regmem 
  7.   register halfword q, r;
  8.   boolean discbreak;
  9.   boolean postdiscbreak;
  10.   register halfword curline;
  11. #ifdef TEXXET
  12.   halfword LR_ptr = LR_save;
  13. #endif
  14.  
  15.   /* 878. Reverse the link ... */
  16.   q = breaknode ( bestbet ) ; 
  17.   curp = 0 ;
  18.   do {
  19.     r = q ; 
  20.     q = prevbreak ( q ) ; 
  21.     prevbreak ( r ) = curp ; 
  22.     curp = r ; 
  23.   } while ( q != 0 );
  24.  
  25.  
  26.   curline = curlist .pgfield + 1 ; 
  27.  
  28.   do {
  29.     /* Justify the line ending... 880. */
  30.  
  31. #ifdef TEXXET
  32.     /* 1381. Insert LR nodes at the beginning... */
  33.     q = link(temphead);
  34.     if( LR_ptr != 0 ) {
  35.       tempptr = LR_ptr;  r = q;
  36.       do {
  37.         register long_halfword s;
  38.  
  39.     s = newmath(0, begin_LR_type(tempptr));
  40.     link(s) = r;  r = s;
  41.     tempptr = link(tempptr);
  42.       } while( tempptr != 0 );
  43.     }
  44.     while( q != curbreak(curp) ) {
  45.       if( ! ischarnode(q) ) {
  46.     /* 1382. Adjust the LR stack.... */
  47.     if( ztype(q) == mathnode ) {
  48.       if( end_LR(q) ) {
  49.         if( LR_ptr != 0 )
  50.           if( info(LR_ptr) == subtype(q) )
  51.         pop_LR;
  52.       } else {
  53.         push_LR(q);
  54.       }
  55.     }
  56.       }
  57.       q = link(q);
  58.     }
  59. #endif
  60.  
  61.     /* Modify the end of the line ... 881. */
  62.     q = curbreak ( curp ) ; 
  63.     discbreak = false ; 
  64.     postdiscbreak = false ; 
  65.  
  66.     if ( q != 0 ) 
  67.     if ( ztype ( q ) == gluenode ) {
  68.       deleteglueref ( glueptr ( q ) ) ; 
  69.       glueptr ( q ) = rightskip ; 
  70.       subtype ( q ) = rightskipcode + 1 ; 
  71.       addglueref ( rightskip ) ; 
  72.       goto lab30 ; 
  73.     } else {
  74.       if ( ztype ( q ) == discnode ) {
  75.     register quarterword t;
  76.  
  77.     t = replacecount( q );
  78.     if ( t == 0 )
  79.       r = link ( q ) ; 
  80.     else {
  81.       r = q ; 
  82.       while ( t > 1 ) {
  83.         r = link ( r ) ; 
  84.         decr ( t ) ; 
  85.       } 
  86.           { register halfword s;
  87.  
  88.       s = link ( r ) ; 
  89. #if 0                    /* TeX 3.1->3.14 Update */
  90.       if ( ! ischarnode ( s ) ) 
  91.       if ( prevbreak ( curp ) != 0 ) 
  92.       if ( curbreak ( prevbreak ( curp ) ) == s ) 
  93.         s = r ;
  94. #endif
  95.       r = link ( s ) ; 
  96.       link ( s ) = 0 ; 
  97.           }
  98.       flushnodelist ( link ( q ) ) ; 
  99.       replacecount ( q ) = 0 ; 
  100.     }
  101.     if ( postbreak ( q ) != 0 ) {
  102.           register halfword s;
  103.  
  104.       s = postbreak ( q ) ; 
  105.       while ( link ( s ) != 0 )
  106.         s = link ( s ) ; 
  107.       link ( s ) = r ; 
  108.       r = postbreak ( q ) ; 
  109.       postbreak ( q ) = 0 ; 
  110.       postdiscbreak = true ; 
  111.     } 
  112.     if ( prebreak ( q ) != 0 ) {
  113.           register halfword s;
  114.  
  115.       s = prebreak ( q ) ; 
  116.       link ( q ) = s ; 
  117.       while ( link ( s ) != 0 )
  118.         s = link ( s ) ; 
  119.       prebreak ( q ) = 0 ; 
  120.       q = s ; 
  121.     } 
  122.     link ( q ) = r ; 
  123.     discbreak = true ; 
  124.       } else if ( ( ztype(q) == mathnode ) || ( ztype(q) == kernnode ) ) {
  125.     width ( q ) = 0 ;
  126. #ifdef TEXXET
  127.     if( ztype(q) == mathnode ) {
  128.       if( end_LR(q) ) {
  129.         if( LR_ptr != 0 )
  130.           if( info(LR_ptr) == subtype(q) )
  131.         pop_LR;
  132.       } else {
  133.         push_LR(q);
  134.       }
  135.     }
  136. #endif
  137.       }
  138.     }
  139.     else {
  140.       q = temphead ; 
  141.       while ( link ( q ) != 0 )
  142.     q = link ( q ) ; 
  143.     } 
  144.     r = newparamglue ( rightskipcode ) ; 
  145.     link ( r ) = link ( q ) ; 
  146.     link ( q ) = r ; 
  147.     q = r ; 
  148. lab30:        /* done: */
  149.  
  150. #ifdef TEXXET
  151.     /* 1383. Insert LR nodes ... */
  152.     if( LR_ptr != 0 ) {
  153.       register halfword s;
  154.  
  155.       s = temphead;  r = link(s);
  156.       while( r != q ) {
  157.     s = r;  r = link(s);
  158.       }
  159.       r = LR_ptr;
  160.       while( r != 0 ) {
  161.     tempptr = newmath(0, info(r));
  162.     link(s) = tempptr;
  163.     s = tempptr;
  164.     r = link(r);
  165.       }
  166.       link(s) = q;
  167.     }
  168. #endif
  169.  
  170.     /* Put the \leftskip glue ... 887. */
  171.     r = link ( q ) ; 
  172.     link ( q ) = 0 ; 
  173.     q = link ( temphead ) ; 
  174.     link ( temphead ) = r ; 
  175.     if ( leftskip != zeroglue ) {
  176.       r = newparamglue ( leftskipcode ) ; 
  177.       link ( r ) = q ; 
  178.       q = r ; 
  179.     }
  180.  
  181.     /* Call the packaging subroutine... 889. */
  182.     { register scaled curindent, curwidth;
  183.  
  184.       if ( curline > lastspecialline ) {
  185.     curwidth = secondwidth ; 
  186.     curindent = secondindent ; 
  187.       } else if ( parshapeptr == 0 ) {
  188.     curwidth = firstwidth ; 
  189.     curindent = firstindent ; 
  190.       } else {
  191.     curwidth = mem [ parshapeptr + 2 * curline ] .cint ; 
  192.     curindent = mem [ parshapeptr + 2 * curline - 1 ] .cint ; 
  193.       }
  194.       adjusttail = adjusthead ; 
  195.       justbox = hpack ( q , curwidth , 0 ) ; 
  196.       shiftamount ( justbox ) = curindent ;
  197.     }
  198.  
  199.     /* Append the new box to the current vertical list ... 888. */
  200.     appendtovlist ( justbox ) ; 
  201.     if ( adjusthead != adjusttail ) {
  202.       link ( curlist .tailfield ) = link ( adjusthead ) ; 
  203.       curlist .tailfield = adjusttail ; 
  204.     } 
  205.     adjusttail = 0 ;
  206.  
  207.     /* Append a penalty node.. 890. */
  208.     if ( curline + 1 != bestline ) {
  209.       register integer pen;
  210.  
  211.       pen = interlinepenalty ; 
  212.       if ( curline == curlist .pgfield + 1 ) 
  213.     pen = pen + clubpenalty ; 
  214.       if ( curline + 2 == bestline ) 
  215.     pen = pen + finalwidowpenalty ; 
  216.       if ( discbreak ) 
  217.     pen = pen + brokenpenalty ; 
  218.       if ( pen != 0 ) {
  219.     r = newpenalty ( pen ) ; 
  220.     link ( curlist .tailfield ) = r ; 
  221.     curlist .tailfield = r ; 
  222.       } 
  223.     } 
  224.  
  225.  
  226.     incr ( curline ) ; 
  227.     curp = prevbreak ( curp ) ; 
  228.     if ( curp != 0 ) 
  229.     if ( ! postdiscbreak ) {
  230.       /* 879. Prune unwanted ... */
  231.       r = temphead ; 
  232.       while ( true ) {
  233.     q = link ( r ) ; 
  234.     if ( q == curbreak ( curp ) ) 
  235.       goto lab31 ; 
  236.     if ( ischarnode ( q ) ) 
  237.       goto lab31 ; 
  238.     if ( nondiscardable ( q ) ) 
  239.       goto lab31 ; 
  240. #if 0  /* 3.1415 */
  241.     if ( subtype ( q ) == acckern ) 
  242.     if ( ztype ( q ) == kernnode ) 
  243.       goto lab31 ; 
  244. #else
  245.     if ( ztype ( q ) == kernnode )
  246.       if ( subtype ( q ) != explicit )
  247.         goto lab31 ; 
  248. #endif
  249.     r = q;
  250. #ifdef TEXXET
  251.     if( ztype(q) == mathnode ) {
  252.       if( end_LR(q) ) {
  253.         if( LR_ptr != 0 )
  254.           if( info(LR_ptr) == subtype(q) )
  255.         pop_LR;
  256.       } else {
  257.         push_LR(q);
  258.       }
  259.     }
  260. #endif
  261.       } 
  262. lab31:
  263.       if ( r != temphead ) {
  264.     link ( r ) = 0 ; 
  265.     flushnodelist ( link ( temphead ) ) ; 
  266.     link ( temphead ) = q ; 
  267.       }
  268.     }
  269.   } while ( curp != 0 );
  270.  
  271.   if ( ( curline != bestline ) || ( link ( temphead ) != 0 ) ) 
  272.     confusion("line breaking");
  273.   curlist .pgfield = bestline - 1 ;
  274.  
  275. #ifdef TEXXET
  276.   LR_save = LR_ptr;
  277. #endif
  278. }
  279.  
  280.  
  281.   smallnumber
  282. reconstitute ( smallnumber j, smallnumber n, halfword bchar, halfword hchar )
  283. { reconstitute_regmem 
  284.   register halfword p  ; 
  285.   register halfword t  ; 
  286.   fourquarters q  ; 
  287.   register halfword currh  ; 
  288.   register halfword testchar  ; 
  289.   register scaled w  ; 
  290. #ifdef FONTPTR
  291.   SMALLmemoryword *ligp;    /* (br) ptr in lig/kern program */
  292. #else
  293.   fontindex k  ; 
  294. #endif
  295.   register halfword ligstack, curl, curr, curq;
  296.  
  297.   hyphenpassed = 0 ; 
  298.   t = holdhead ; 
  299.   w = 0 ; 
  300.   link ( holdhead ) = 0 ; 
  301.   curl = hu [ j ] ; 
  302.   curq = t ; 
  303.   if ( j == 0 ) {
  304.     ligaturepresent = initlig ; 
  305.     p = initlist ; 
  306.     if ( ligaturepresent ) 
  307.       lfthit = initlft ; 
  308.     while ( p > 0 ) {
  309.       {
  310.     link ( t ) = getavail () ; 
  311.     t = link ( t ) ; 
  312.     font ( t ) = hf ; 
  313.     character ( t ) = character ( p ) ; 
  314.       } 
  315.       p = link ( p ) ; 
  316.     } 
  317.   } else if ( curl < nonchar ) {
  318.     link ( t ) = getavail () ; 
  319.     t = link ( t ) ; 
  320.     font ( t ) = hf ; 
  321.     character ( t ) = curl ; 
  322.   } 
  323.   ligstack = 0 ; 
  324.   {
  325.     if ( j < n )
  326.       curr = hu [ j + 1 ] ; 
  327.     else curr = bchar ; 
  328.     if ( odd ( hyf [ j ] ) ) 
  329.       currh = hchar ; 
  330.     else currh = nonchar ; 
  331.   }
  332.  
  333. lab22:
  334.   if ( curl == nonchar ) {
  335. #ifdef FONTPTR
  336.     if( bcharlabel(hf) == nonaddress )
  337.     goto lab30;
  338.     ligp = &fontinfo[bcharlabel(hf)];
  339.     q = ligp->qqqq;
  340. #else
  341.     k = bcharlabel(hf); 
  342.     if ( k == nonaddress ) 
  343.       goto lab30 ; 
  344.     else
  345.       q = fontinfo [ k ] .qqqq ; 
  346. #endif
  347.   } else {
  348.     q = zcharinfo ( hf ,  curl ) ; 
  349.     if ( chartag ( q ) != ligtag ) 
  350.       goto lab30 ; 
  351. #ifdef FONTPTR
  352.     ligp = zligkernstart ( hf ,  q ) ; 
  353.     q = ligp->qqqq ; 
  354.     if ( skipbyte ( q ) > stopflag ) {
  355.       ligp = zligkernrestart ( hf ,  q ) ; 
  356.       q = ligp->qqqq ; 
  357.     }
  358. #else
  359.     k = zligkernstart ( hf ,  q ) ; 
  360.     q = fontinfo [ k ] .qqqq ; 
  361.     if ( skipbyte ( q ) > stopflag ) {
  362.       k = zligkernrestart ( hf ,  q ) ; 
  363.       q = fontinfo [ k ] .qqqq ; 
  364.     }
  365. #endif
  366.   }
  367.   if ( currh < nonchar ) 
  368.     testchar = currh ; 
  369.   else
  370.     testchar = curr ;
  371.  
  372.   while ( true ) {
  373.     if ( nextchar ( q ) == testchar ) 
  374.     if ( skipbyte ( q ) <= stopflag ) 
  375.     if ( currh < nonchar ) {
  376.       hyphenpassed = j ; 
  377.       hchar = nonchar ; 
  378.       currh = nonchar ; 
  379.       goto lab22 ; 
  380.     } else {
  381.       if ( hchar < nonchar ) 
  382.       if ( odd ( hyf [ j ] ) ) {
  383.     hyphenpassed = j ; 
  384.     hchar = nonchar ; 
  385.       } 
  386.       if ( opbyte ( q ) < kernflag ) {
  387.     if ( curl == nonchar ) 
  388.     lfthit = true ; 
  389.     if ( j == n ) 
  390.     if ( ligstack == 0 ) 
  391.     rthit = true ; 
  392.     {
  393.       if ( interrupt != 0 ) 
  394.       pauseforinstructions () ; 
  395.     } 
  396.     switch ( opbyte ( q ) ) 
  397.     {case 1 : 
  398.     case 5 : 
  399.       {
  400.         curl = rembyte ( q ) ; 
  401.         ligaturepresent = true ; 
  402.       } 
  403.       break ; 
  404.     case 2 : 
  405.     case 6 : 
  406.       {
  407.         curr = rembyte ( q ) ; 
  408.         if ( ligstack > 0 ) 
  409.           character ( ligstack ) = curr ; 
  410.         else {
  411.           ligstack = newligitem ( curr ) ; 
  412.           if ( j == n ) 
  413.         bchar = nonchar ; 
  414.           else {
  415.         p = getavail () ; 
  416.         ligptr ( ligstack ) = p ; 
  417.         character ( p ) = hu [ j + 1 ] ; 
  418.         font ( p ) = hf ; 
  419.           } 
  420.         } 
  421.       } 
  422.       break ; 
  423.     case 3 : 
  424.       {
  425.         curr = rembyte ( q ) ; 
  426.         p = ligstack ; 
  427.         ligstack = newligitem ( curr ) ; 
  428.         link ( ligstack ) = p ; 
  429.       } 
  430.       break ; 
  431.     case 7 : 
  432.     case 11 : 
  433.       {
  434.         if ( ligaturepresent ) {
  435.           p = newligature ( hf , curl , link ( curq ) ) ; 
  436.           if ( lfthit ) {
  437.         subtype ( p ) = 2 ; 
  438.         lfthit = false ; 
  439.           } 
  440.           if ( false ) 
  441.           if ( ligstack == 0 ) {
  442.         incr ( subtype ( p ) ) ; 
  443.         rthit = false ; 
  444.           } 
  445.           link ( curq ) = p ; 
  446.           t = p ; 
  447.           ligaturepresent = false ; 
  448.         } 
  449.         curq = t ; 
  450.         curl = rembyte ( q ) ; 
  451.         ligaturepresent = true ; 
  452.       } 
  453.       break ; 
  454.     default: 
  455.       {
  456.         curl = rembyte ( q ) ; 
  457.         ligaturepresent = true ; 
  458.         if ( ligstack > 0 ) {
  459.           if ( ligptr ( ligstack ) > 0 ) {
  460.         link ( t ) = ligptr ( ligstack ) ; 
  461.         t = link ( t ) ; 
  462.         incr ( j ) ; 
  463.           } 
  464.           p = ligstack ; 
  465.           ligstack = link ( p ) ; 
  466.           freenode ( p , smallnodesize ) ; 
  467.           if ( ligstack == 0 ) {
  468.         if ( j < n ) 
  469.         curr = hu [ j + 1 ] ; 
  470.         else curr = bchar ; 
  471.         if ( odd ( hyf [ j ] ) ) 
  472.         currh = hchar ; 
  473.         else currh = nonchar ; 
  474.           } 
  475.           else curr = character ( ligstack ) ; 
  476.         } 
  477.         else if ( j == n ) 
  478.           goto lab30 ; 
  479.         else {
  480.           {
  481.         link ( t ) = getavail () ; 
  482.         t = link ( t ) ; 
  483.         font ( t ) = hf ; 
  484.         character ( t ) = curr ; 
  485.           } 
  486.           incr ( j ) ; 
  487.           {
  488.         if ( j < n ) 
  489.         curr = hu [ j + 1 ] ; 
  490.         else curr = bchar ; 
  491.         if ( odd ( hyf [ j ] ) ) 
  492.         currh = hchar ; 
  493.         else currh = nonchar ; 
  494.           } 
  495.         } 
  496.       } 
  497.       break ; 
  498.     } 
  499.     if ( opbyte ( q ) > 4 ) 
  500.     if ( opbyte ( q ) != 7 ) 
  501.     goto lab30 ; 
  502.     goto lab22 ; 
  503.       } 
  504.       w = zcharkern ( hf ,  q ) ; 
  505.       goto lab30 ; 
  506.     } 
  507.     if ( skipbyte ( q ) >= stopflag ) 
  508.     if ( currh == nonchar ) 
  509.       goto lab30 ; 
  510.     else {
  511.       currh = nonchar ; 
  512.       goto lab22 ; 
  513.     }
  514. #ifdef FONTPTR
  515.     ligp = ligp + skipbyte ( q ) + 1 ; 
  516.     q = ligp->qqqq ; 
  517. #else
  518.     k = k + skipbyte ( q ) + 1 ; 
  519.     q = fontinfo [ k ] .qqqq ;
  520. #endif
  521.   }
  522.  
  523. lab30:
  524.   if ( ligaturepresent ) {
  525.     p = newligature ( hf , curl , link ( curq ) ) ; 
  526.     if ( lfthit ) {
  527.       subtype ( p ) = 2 ; 
  528.       lfthit = false ; 
  529.     } 
  530.     if ( rthit ) 
  531.     if ( ligstack == 0 ) {
  532.       incr ( subtype ( p ) ) ; 
  533.       rthit = false ; 
  534.     } 
  535.     link ( curq ) = p ; 
  536.     t = p ; 
  537.     ligaturepresent = false ; 
  538.   } 
  539.   if ( w != 0 ) {
  540.     link ( t ) = newkern ( w ) ; 
  541.     t = link ( t ) ; 
  542.     w = 0 ; 
  543.   } 
  544.   if ( ligstack > 0 ) {
  545.     curq = t ; 
  546.     curl = character ( ligstack ) ; 
  547.     ligaturepresent = true ; 
  548.     {
  549.       if ( ligptr ( ligstack ) > 0 ) {
  550.     link ( t ) = ligptr ( ligstack ) ; 
  551.     t = link ( t ) ; 
  552.     incr ( j ) ; 
  553.       } 
  554.       p = ligstack ; 
  555.       ligstack = link ( p ) ; 
  556.       freenode ( p , smallnodesize ) ; 
  557.       if ( ligstack == 0 ) {
  558.     if ( j < n ) 
  559.     curr = hu [ j + 1 ] ; 
  560.     else curr = bchar ; 
  561.     if ( odd ( hyf [ j ] ) ) 
  562.     currh = hchar ; 
  563.     else currh = nonchar ; 
  564.       } 
  565.       else curr = character ( ligstack ) ; 
  566.     } 
  567.     goto lab22 ; 
  568.   }
  569.   return(j);
  570. }
  571.  
  572.  
  573. void hyphenate ( void )
  574. {/* 50 30 40 41 42 45 10 */ hyphenate_regmem 
  575.   register schar i, j, l  ; 
  576.   register halfword q, r, s  ; 
  577.   register halfword bchar;
  578.   register halfword majortail, minortail  ; 
  579.   register ASCIIcode c  ; 
  580.   register schar cloc  ; 
  581.   register integer rcount  ; 
  582.   register halfword hyfnode  ; 
  583.   register hyphpointer h  ; 
  584.  
  585.   for( j = hn ; j >= 0 ; --j ) {
  586.     hyf [ j ] = 0 ; 
  587.   }
  588.   h = hc [ 1 ] ; 
  589.   incr ( hn ) ; 
  590.   hc [ hn ] = curlang ; 
  591.   {register integer for_end; j = 2 ; for_end = hn ; if ( j <= for_end) do 
  592.     h = ( h + h + hc [ j ] ) % hyphsize ; 
  593.   while ( j++ < for_end ) ; } 
  594.  
  595.   while ( true ) {
  596.     register strnumber k;
  597.  
  598.     k = hyphword(h) ; 
  599.     if ( k == 0 ) 
  600.       goto lab45 ; 
  601.     if ( length ( k ) < hn ) 
  602.       goto lab45 ; 
  603.     if ( length ( k ) == hn ) {
  604.       register poolpointer u;
  605.  
  606.       j = 1 ; 
  607.       u = strstart [ k ] ; 
  608.       do {
  609.     if ( strpool [ u ] < hc [ j ] )
  610.       goto lab45 ; 
  611.     if ( strpool [ u ] > hc [ j ] )
  612.       goto lab30 ; 
  613.     incr ( j ); incr ( u );
  614.       } while ( j <= hn );
  615.       s = hyphlist(h); 
  616.       while ( s != 0 ) {
  617.     hyf [ info ( s ) ] = 1 ; 
  618.     s = link ( s ) ; 
  619.       } 
  620.       decr ( hn );
  621.       goto lab40;
  622.     } 
  623. lab30:
  624.     if ( h > 0 ) 
  625.       decr ( h ) ; 
  626.     else h = hyphsize ; 
  627.   }
  628. lab45: decr ( hn ) ; 
  629.   if ( trietrc [ curlang + 1 ] != curlang ) 
  630.     return ;
  631.  
  632.   hc [ 0 ] = 0 ; 
  633.   hc [ hn + 1 ] = 0 ; 
  634.   hc [ hn + 2 ] = 256 ; 
  635.  
  636.   { register SMALLhalfword r_opstart = opstart[curlang];
  637.  
  638.   {register integer for_end; j = 0 ; for_end = hn - rhyf + 1 ; if ( j <= 
  639.   for_end) do 
  640.     {
  641.       register triepointer z;
  642.  
  643.       z = trietrl [ curlang + 1 ] + hc [ j ] ; 
  644.       l = j ; 
  645.       while ( hc [ l ] == trietrc [ z ] ) {
  646.     if ( trietro [ z ] != mintrieop ) {
  647.       register integer v;
  648.  
  649.       v = trietro [ z ] ;
  650.       do {
  651.         v = v + r_opstart;        /* opstart [ curlang ] ; */
  652.         i = l - hyfdistance(v);
  653.         if ( hyfnum(v) > hyf [ i ] ) 
  654.           hyf [ i ] = hyfnum(v);
  655.         v = hyfnext(v);
  656.       } while ( v != mintrieop );
  657.     }
  658.     incr ( l ) ; 
  659.     z = trietrl [ z ] + hc [ l ] ; 
  660.       }
  661.     } 
  662.   while ( j++ < for_end ) ; }
  663.   }
  664.  
  665. lab40: {
  666.       register integer for_end; j = 0 ; for_end = lhyf - 1 ; if ( j <= 
  667.   for_end) do 
  668.     hyf [ j ] = 0 ; 
  669.   while ( j++ < for_end ) ; } 
  670.   {register integer for_end; j = 0 ; for_end = rhyf - 1 ; if ( j <= for_end) 
  671.   do 
  672.     hyf [ hn - j ] = 0 ; 
  673.   while ( j++ < for_end ) ; } 
  674.   {register integer for_end; j = lhyf ; for_end = hn - rhyf ; if ( j <= 
  675.   for_end) do 
  676.     if ( odd ( hyf [ j ] ) ) 
  677.     goto lab41 ; 
  678.   while ( j++ < for_end ) ; } 
  679.   return ; 
  680.  
  681. lab41: ;
  682.   /* 903.  Replace nodes ha..hb by a sequence of nodes ... */
  683.   q = link ( hb );  link ( hb ) = 0;  r = link ( ha );  link ( ha ) = 0;
  684.   bchar = hyf_bchar;  /* bchar = nonchar; */  /* TeX 3.141 */
  685. #if 0  /* TeX 3.141 */
  686.   if ( ! ischarnode ( hb ) ) 
  687.     if ( ztype ( hb ) == ligaturenode ) 
  688.       if ( odd ( subtype ( hb ) ) ) 
  689.     bchar = fontbchar(hf); 
  690. #endif
  691.   if ( ischarnode ( ha ) ) 
  692.     if ( font ( ha ) != hf ) 
  693.       goto lab42 ; 
  694.     else {
  695.       initlist = ha ; 
  696.       initlig = false ; 
  697.       hu [ 0 ] = character ( ha ) ; 
  698.     } 
  699.   else if ( ztype ( ha ) == ligaturenode ) 
  700.   if ( font ( ligchar ( ha ) ) != hf ) 
  701.     goto lab42 ; 
  702.   else {
  703.     initlist = ligptr ( ha ) ; 
  704.     initlig = true ; 
  705.     initlft = ( subtype ( ha ) > 1 ) ; 
  706.     hu [ 0 ] = character ( ligchar ( ha ) ) ; 
  707.     if ( initlist == 0 ) 
  708.     if ( initlft ) {
  709.       hu [ 0 ] = 256 ; 
  710.       initlig = false ; 
  711.     }
  712.     freenode ( ha , smallnodesize ) ; 
  713.   }
  714.   else {
  715.     if ( ! ischarnode ( r ) ) 
  716.     if ( ztype ( r ) == ligaturenode ) 
  717.     if ( subtype ( r ) > 1 ) 
  718.       goto lab42 ; 
  719.     j = 1 ; 
  720.     s = ha ; 
  721.     initlist = 0 ; 
  722.     goto lab50 ; 
  723.   } 
  724.   s = curp ; 
  725.   while ( link ( s ) != ha )
  726.     s = link ( s ) ; 
  727.   j = 0 ; 
  728.   goto lab50 ; 
  729.  
  730. lab42:
  731.   s = ha ; 
  732.   j = 0 ; 
  733.   hu [ 0 ] = 256 ; 
  734.   initlig = false ; 
  735.   initlist = 0 ; 
  736.  
  737. lab50:
  738.   flushnodelist ( r ) ; 
  739.   do {
  740.     l = j ; 
  741.     j = reconstitute ( j , hn , bchar , hyfchar ) + 1 ; 
  742.     if ( hyphenpassed == 0 ) {
  743.       link ( s ) = link ( holdhead ) ; 
  744.       while ( link ( s ) > 0 )
  745.     s = link ( s ) ; 
  746.       if ( odd ( hyf [ j - 1 ] ) ) {
  747.     l = j ; 
  748.     hyphenpassed = j - 1 ; 
  749.     link ( holdhead ) = 0 ; 
  750.       } 
  751.     } 
  752.     if ( hyphenpassed > 0 ) 
  753.     do {
  754.       r = getnode ( smallnodesize ) ; 
  755.       link ( r ) = link ( holdhead ) ; 
  756.       ztype ( r ) = discnode ; 
  757.       majortail = r ; 
  758.       rcount = 0 ; 
  759.       while ( link ( majortail ) > 0 ) {
  760.     majortail = link ( majortail ) ; 
  761.     incr ( rcount ) ; 
  762.       } 
  763.       i = hyphenpassed ; 
  764.       hyf [ i ] = 0 ; 
  765.       minortail = 0 ; 
  766.       prebreak ( r ) = 0 ; 
  767.       hyfnode = newcharacter ( hf , hyfchar ) ; 
  768.       if ( hyfnode != 0 ) {
  769.     incr ( i ) ; 
  770.     c = hu [ i ] ; 
  771.     hu [ i ] = hyfchar ; 
  772.     freeavail ( hyfnode ) ; 
  773.       } 
  774.       while ( l <= i ) {
  775.     l = reconstitute ( l , i , fontbchar(hf), nonchar ) + 1 ; 
  776.     if ( link ( holdhead ) > 0 ) {
  777.       if ( minortail == 0 ) 
  778.       prebreak ( r ) = link ( holdhead ) ; 
  779.       else link ( minortail ) = link ( holdhead ) ; 
  780.       minortail = link ( holdhead ) ; 
  781.       while ( link ( minortail ) > 0 ) minortail = link ( minortail ) ; 
  782.     } 
  783.       } 
  784.       if ( hyfnode != 0 ) {
  785.     hu [ i ] = c ; 
  786.     l = i ; 
  787.     decr ( i ) ; 
  788.       } 
  789.       minortail = 0 ; 
  790.       postbreak ( r ) = 0 ; 
  791.       cloc = 0 ; 
  792.       if ( bcharlabel(hf) < nonaddress ) {
  793.     decr ( l ) ; 
  794.     c = hu [ l ] ; 
  795.     cloc = l ; 
  796.     hu [ l ] = 256 ; 
  797.       } 
  798.       while ( l < j ) {
  799.     do {
  800.       l = reconstitute ( l , hn , bchar , nonchar ) + 1 ; 
  801.       if ( cloc > 0 ) {
  802.         hu [ cloc ] = c ; 
  803.         cloc = 0 ; 
  804.       } 
  805.       if ( link ( holdhead ) > 0 ) {
  806.         if ( minortail == 0 ) 
  807.         postbreak ( r ) = link ( holdhead ) ; 
  808.         else link ( minortail ) = link ( holdhead ) ; 
  809.         minortail = link ( holdhead ) ; 
  810.         while ( link ( minortail ) > 0 ) minortail = link ( minortail ) ; 
  811.       } 
  812.     } while ( ! ( l >= j ) ) ; 
  813.     while ( l > j ) {        
  814.       j = reconstitute ( j , hn , bchar , nonchar ) + 1 ; 
  815.       link ( majortail ) = link ( holdhead ) ; 
  816.       while ( link ( majortail ) > 0 ) {
  817.         majortail = link ( majortail ) ; 
  818.         incr ( rcount ) ; 
  819.       } 
  820.     } 
  821.       }
  822.       if ( rcount > 127 ) {
  823.     link ( s ) = link ( r ) ; 
  824.     link ( r ) = 0 ; 
  825.     flushnodelist ( r ) ; 
  826.       } else {
  827.     link ( s ) = r ; 
  828.     replacecount ( r ) = rcount ; 
  829.       } 
  830.       s = majortail ; 
  831.       hyphenpassed = j - 1 ; 
  832.       link ( holdhead ) = 0 ; 
  833.     } while ( ! ( ! odd ( hyf [ j - 1 ] ) ) ) ; 
  834.   } while ( ! ( j > hn ) ) ; 
  835.   link ( s ) = q ; 
  836.   flushlist ( initlist ) ; 
  837. }
  838.  
  839.  
  840. void newhyphexceptions ( void )
  841. {/* 21 10 40 45 */ newhyphexceptions_regmem 
  842.   register short n  ; 
  843.   register short j  ; 
  844.   register hyphpointer h  ; 
  845.   register strnumber k  ; 
  846.   register halfword p  ; 
  847.   /* register halfword q; */
  848.   register strnumber s;
  849.   /* register poolpointer u, v; */
  850.  
  851.   scanleftbrace () ; 
  852.   if ( language <= 0 || language > 255 )
  853.     curlang = 0 ; 
  854.   else
  855.     curlang = language ; 
  856.   n = 0 ; 
  857.   p = 0 ; 
  858.  
  859.   while ( true ) {
  860.     getxtoken () ; 
  861. lab21:
  862.     switch ( curcmd ) {
  863.     case 16 : 
  864.     curchr = scancharnum ();    /* curchr = curval; */
  865.     curcmd = 68 ; 
  866.     /* goto lab21 ; */
  867.     /* FALL THROUGH */
  868.     case 11 : 
  869.     case 12 : 
  870.     case 68 : 
  871.       if ( curchr == 45 ) {
  872.     if ( n < 63 ) {
  873.       register long_halfword q;
  874.  
  875.       q = getavail ();
  876.       link ( q ) = p;
  877.       info ( q ) = n;
  878.       p = q;
  879.     }
  880.       } else {
  881.     if ( lccode ( curchr ) == 0 ) {
  882.       print_err("Not a letter");
  883.       zhelp1( STR_H_LETTERSINHYPH );
  884.       error () ; 
  885.     } else if ( n < 63 ) {
  886.       incr ( n ) ; 
  887.       hc [ n ] = lccode ( curchr ) ; 
  888.     } 
  889.       } 
  890.       break ; 
  891.     case 10 : 
  892.     case 2 : 
  893.       if ( n > 1 ) {
  894.     incr ( n ) ; 
  895.     hc [ n ] = curlang ; 
  896.     strroom ( n ) ; 
  897.     h = 0 ; 
  898.     for( j = 1 ; j <=n ; j++ ) {
  899.       h = ( h + h + hc [ j ] ) % hyphsize ; 
  900.       appendchar ( hc [ j ] ) ; 
  901.     }
  902.     s = makestring () ; 
  903.  
  904.     if ( hyphcount == hyphsize ) 
  905.       overflow(12, hyphsize);
  906.     incr ( hyphcount ) ; 
  907.  
  908.     while ( hyphword(h) != 0 ) {
  909.       k = hyphword(h); 
  910.       if ( length ( k ) < length ( s ) ) 
  911.         goto lab40 ; 
  912.       if ( length ( k ) > length ( s ) ) 
  913.         goto lab45 ; 
  914. #if 0
  915.       { register poolpointer u, v;
  916.         u = strstart [ k ]; v = strstart [ s ];
  917.         do {
  918.           if ( strpool [ u ] < strpool [ v ] ) 
  919.             goto lab40 ; 
  920.           if ( strpool [ u ] > strpool [ v ] ) 
  921.             goto lab45 ; 
  922.           incr ( u ); incr ( v );
  923.         } while ( u != strstart [ k + 1 ] );
  924.       }
  925. #else
  926.       { register ASCIIcode *u, *v, *ep;
  927.         u = &strpool[strstart [ k ]]; ep = &strpool[strstart[k+1]];
  928.         v = &strpool[strstart [ s ]];
  929.         do {
  930.           if ( *u < *v ) 
  931.             goto lab40 ; 
  932.           if ( *u > *v ) 
  933.             goto lab45 ; 
  934.           incr(u); incr(v);
  935.         } while ( u != ep );
  936.       }
  937. #endif
  938. lab40:
  939.       { register halfword q;
  940.  
  941.         q = hyphlist(h); hyphlist(h) = p; p = q;
  942.       }
  943.       { register strnumber t;
  944.  
  945.         t = hyphword(h); hyphword(h) = s; s = t;
  946.       }
  947. lab45:
  948.       if ( h > 0 )
  949.         decr ( h );
  950.       else
  951.         h = hyphsize ; 
  952.     }
  953.     hyphword(h) = s ; 
  954.     hyphlist(h) = p ; 
  955.       }
  956.       if ( curcmd == 2 ) 
  957.     return;
  958.       n = 0;
  959.       p = 0;
  960.       break ; 
  961.     default: 
  962.       {
  963.     p_print_err( STR_H_IMPROPER );
  964.     printesc( STR_HYPHENATION );
  965.     c_print(" will be flushed");
  966.     zhelp1( STR_H_HYPH_EXC_ONLY );
  967.     error () ; 
  968.       } 
  969.       break ; 
  970.     }
  971.   }
  972. }
  973.  
  974.  
  975. halfword prunepagetop ( halfword p )
  976. { prunepagetop_regmem 
  977.   register halfword prevp  ; 
  978.   register halfword q  ; 
  979.  
  980.   prevp = temphead ; 
  981.   link ( temphead ) = p ; 
  982.  
  983.  while ( p != 0 )
  984.   switch ( ztype ( p ) ) {
  985.   case hlistnode : 
  986.   case vlistnode : 
  987.   case rulenode : 
  988.     {
  989.       q = newskipparam ( splittopskipcode ) ; 
  990.       link ( prevp ) = q ; 
  991.       link ( q ) = p ; 
  992.       if ( width ( tempptr ) > height ( p ) ) 
  993.     width ( tempptr ) = width ( tempptr ) - height ( p ) ; 
  994.       else
  995.     width ( tempptr ) = 0 ; 
  996.       p = 0 ; 
  997.     } 
  998.     break ; 
  999.   case whatsitnode : 
  1000.   case marknode : 
  1001.   case insnode : 
  1002.     {
  1003.       prevp = p ; 
  1004.       p = link ( prevp ) ; 
  1005.     } 
  1006.     break ; 
  1007.   case gluenode : 
  1008.   case kernnode : 
  1009.   case penaltynode : 
  1010.     {
  1011.       q = p ; 
  1012.       p = link ( q ) ; 
  1013.       link ( q ) = 0 ; 
  1014.       link ( prevp ) = p ; 
  1015.       flushnodelist ( q ) ; 
  1016.     } 
  1017.     break ; 
  1018.   default: 
  1019.     confusion("pruning");
  1020.     break ; 
  1021.   }
  1022.   return( link ( temphead ) );
  1023.  
  1024.  
  1025. halfword vertbreak ( halfword p, scaled h, scaled d )
  1026. {/* 30 45 90 */ vertbreak_regmem 
  1027.   register halfword prevp  ; 
  1028.   register halfword q, r  ; 
  1029.   register integer pi  ; 
  1030.   register integer b  ; 
  1031.   register integer leastcost  ; 
  1032.   register halfword bestplace  ; 
  1033.   register scaled prevdp  ; 
  1034.   register smallnumber t  ; 
  1035.  
  1036.   prevp = p ; 
  1037.   leastcost = awfulbad ; 
  1038.   activewidth [ 0 ] = 0 ; 
  1039.   activewidth [ 1 ] = 0 ; 
  1040.   activewidth [ 2 ] = 0 ; 
  1041.   activewidth [ 3 ] = 0 ; 
  1042.   activewidth [ 4 ] = 0 ; 
  1043.   activewidth [ 5 ] = 0 ; 
  1044.   prevdp = 0 ; 
  1045.  
  1046.   while ( true ) {
  1047.     if ( p == 0 ) 
  1048.       pi = ejectpenalty ; 
  1049.     else switch ( ztype ( p ) ) 
  1050.     {case hlistnode : 
  1051.     case vlistnode : 
  1052.     case rulenode : 
  1053.       {
  1054.     activewidth [ 0 ] += prevdp + height ( p ) ; 
  1055.     prevdp = depth ( p ) ; 
  1056.     goto lab45 ; 
  1057.       } 
  1058.       break ; 
  1059.     case whatsitnode : 
  1060.       goto lab45 ; 
  1061.       break ; 
  1062.     case gluenode : 
  1063.       if ( precedesbreak ( prevp ) ) 
  1064.     pi = 0 ;
  1065.       else
  1066.     goto lab90 ; 
  1067.       break ; 
  1068.     case kernnode : 
  1069.       {
  1070.     if ( link ( p ) == 0 ) 
  1071.       t = penaltynode ; 
  1072.     else
  1073.       t = ztype ( link ( p ) ) ; 
  1074.     if ( t == gluenode ) 
  1075.       pi = 0 ; 
  1076.     else
  1077.       goto lab90 ; 
  1078.       } 
  1079.       break ; 
  1080.     case penaltynode : 
  1081.       pi = mem [ p + 1 ] .cint ; 
  1082.       break ; 
  1083.     case marknode : 
  1084.     case insnode : 
  1085.       goto lab45 ; 
  1086.       break ; 
  1087.     default: 
  1088.       confusion("vertbreak");
  1089.       break ; 
  1090.     } 
  1091.     if ( pi < infpenalty ) {
  1092.       if ( activewidth [ 0 ] < h ) 
  1093.       if ( ( activewidth [ 2 ] != 0 ) || ( activewidth [ 3 ] != 0 ) || ( 
  1094.       activewidth [ 4 ] != 0 ) ) 
  1095.       b = 0 ; 
  1096.       else b = badness ( h - activewidth [ 0 ] , activewidth [ 1 ] ) ; 
  1097.       else if ( activewidth [ 0 ] - h > activewidth [ 5 ] ) 
  1098.       b = awfulbad ; 
  1099.       else b = badness ( activewidth [ 0 ] - h , activewidth [ 5 ] ) ; 
  1100.       if ( b < awfulbad ) 
  1101.       if ( pi <= ejectpenalty ) 
  1102.       b = pi ; 
  1103.       else if ( b < infbad ) 
  1104.       b = b + pi ; 
  1105.       else b = 100000L ; 
  1106.       if ( b <= leastcost ) {
  1107.     bestplace = p ; 
  1108.     leastcost = b ; 
  1109.     bestheightplusdepth = activewidth [ 0 ] + prevdp ;
  1110.       } 
  1111.       if ( ( b == awfulbad ) || ( pi <= ejectpenalty ) ) 
  1112.       goto lab30 ; 
  1113.     } 
  1114.     if ( ( ztype ( p ) < gluenode ) || ( ztype ( p ) > kernnode ) ) 
  1115.     goto lab45 ; 
  1116.  
  1117. lab90:
  1118.     if ( ztype ( p ) == kernnode ) 
  1119.       q = p ; 
  1120.     else {
  1121.       q = glueptr ( p ) ; 
  1122.       activewidth [ 1 + stretchorder ( q ) ] += stretch ( q );
  1123.       activewidth [ 5 ] += shrink ( q ) ; 
  1124.       if ( ( shrinkorder ( q ) != normal ) && ( shrink ( q ) != 0 ) ) {
  1125.     print_err("Infinite glue shrinkage found in box being split");
  1126.     zhelp3( STR_H_THEBOX_VSPLIT, STR_H_SHRINKABLEGLUE,
  1127.         STR_H_SINCETHE_OFFENSIVE);
  1128.     error();
  1129.     r = newspec ( q ) ; 
  1130.     shrinkorder ( r ) = normal ; 
  1131.     deleteglueref ( q ) ; 
  1132.     glueptr ( p ) = r ; 
  1133.     q = r ; 
  1134.       } 
  1135.     }
  1136.     activewidth [ 0 ] += prevdp + width ( q ) ; 
  1137.     prevdp = 0 ;
  1138.  
  1139. lab45:
  1140.     if ( prevdp > d ) {
  1141.       activewidth [ 0 ] += prevdp - d ; 
  1142.       prevdp = d;
  1143.     }
  1144.     prevp = p ; 
  1145.     p = link ( prevp ) ; 
  1146.   }
  1147.  
  1148. lab30:
  1149.   return( bestplace );
  1150. }
  1151.  
  1152.  
  1153. long_halfword vsplit ( eightbits n, scaled h )
  1154. { vsplit_regmem 
  1155.   register halfword v  ; 
  1156.   register halfword p  ; 
  1157.   register halfword q  ; 
  1158.  
  1159.   v = box ( n ) ; 
  1160.   if ( splitfirstmark != 0 ) {
  1161.     deletetokenref ( splitfirstmark ) ; 
  1162.     splitfirstmark = 0 ; 
  1163.     deletetokenref ( splitbotmark ) ; 
  1164.     splitbotmark = 0 ; 
  1165.   } 
  1166.   if ( v == 0 ) {
  1167.     return( 0L ) ; 
  1168.   } 
  1169.   if ( ztype ( v ) != vlistnode ) {
  1170.     print_err("");
  1171.     printesc( STR_VSPLIT );
  1172.     c_print(" needs a ");
  1173.     printesc( STR_VBOX );
  1174.     zhelp1( STR_H_THEBOX_SPLITHBOX );
  1175.     error();
  1176.     return( 0L );
  1177.   }
  1178.  
  1179.   q = vertbreak ( listptr(v), h, splitmaxdepth );
  1180.   p = listptr ( v ) ; 
  1181.   if ( p == q ) 
  1182.     listptr ( v ) = 0 ; 
  1183.   else while ( true ) {
  1184.     if ( ztype ( p ) == marknode ) 
  1185.     if ( splitfirstmark == 0 ) {
  1186.       splitfirstmark = markptr ( p ) ; 
  1187.       splitbotmark = splitfirstmark ; 
  1188.       tokenrefcount ( splitfirstmark ) = tokenrefcount ( splitfirstmark ) + 2;
  1189.     } else {
  1190.       deletetokenref ( splitbotmark ) ; 
  1191.       splitbotmark = markptr ( p ) ; 
  1192.       addtokenref ( splitbotmark ) ; 
  1193.     } 
  1194.     if ( link ( p ) == q ) {
  1195.       link ( p ) = 0 ; 
  1196.       goto lab30 ; 
  1197.     } 
  1198.     p = link ( p ) ; 
  1199.   }
  1200.  
  1201. lab30:
  1202.   q = prunepagetop ( q ) ; 
  1203.   p = listptr ( v ) ; 
  1204.   freenode ( v , boxnodesize ) ; 
  1205.   if ( q == 0 ) 
  1206.     box ( n ) = 0 ; 
  1207.   else
  1208.     box ( n ) = vpackage ( q , 0 , 1 , maxdimen ) ; 
  1209.  
  1210.   return( vpackage ( p , h , 0 , splitmaxdepth ) );
  1211. }
  1212.  
  1213.  
  1214. void printtotals ( void )
  1215. { printtotals_regmem
  1216.  
  1217.   printscaled ( pagesofar [ 1 ] ) ; 
  1218.   if ( pagesofar [ 2 ] != 0 ) {
  1219.     print( STR_PLUS_ );
  1220.     printscaled ( pagesofar [ 2 ] ) ; 
  1221.     c_print("");
  1222.   } 
  1223.   if ( pagesofar [ 3 ] != 0 ) {
  1224.     print( STR_PLUS_ );
  1225.     printscaled ( pagesofar [ 3 ] ) ; 
  1226.     print( STR_FIL );
  1227.   } 
  1228.   if ( pagesofar [ 4 ] != 0 ) {
  1229.     print( STR_PLUS_ );
  1230.     printscaled ( pagesofar [ 4 ] ) ; 
  1231.     c_print("fill");
  1232.   } 
  1233.   if ( pagesofar [ 5 ] != 0 ) {
  1234.     print( STR_PLUS_ );
  1235.     printscaled ( pagesofar [ 5 ] ) ; 
  1236.     c_print("filll");
  1237.   }
  1238.   if ( pagesofar [ 6 ] != 0 ) {
  1239.     print( STR_MINUS_ );
  1240.     printscaled ( pagesofar [ 6 ] ) ; 
  1241.   } 
  1242. }
  1243.  
  1244.  
  1245. void freezepagespecs ( smallnumber s )
  1246. { freezepagespecs_regmem
  1247.  
  1248.   pagecontents = s ; 
  1249.   pagemaxdepth = maxdepth ; 
  1250.   pagesofar [ 0 ] = vsize ; 
  1251.   pagesofar [ 1 ] = 0 ; 
  1252.   pagesofar [ 2 ] = 0 ; 
  1253.   pagesofar [ 3 ] = 0 ; 
  1254.   pagesofar [ 4 ] = 0 ; 
  1255.   pagesofar [ 5 ] = 0 ; 
  1256.   pagesofar [ 6 ] = 0 ; 
  1257.   pagesofar [ 7 ] = 0 ; 
  1258.   leastpagecost = awfulbad ; 
  1259. #ifdef STAT
  1260.   if ( tracingpages > 0 ) {
  1261.     begindiagnostic();
  1262.     c_printnl("%% goal height=");
  1263.     printscaled( pagesofar[0] );
  1264.     c_print(", max depth=");
  1265.     printscaled( pagemaxdepth );
  1266.     enddiagnostic( false );
  1267.   }
  1268. #endif /* STAT */
  1269. }
  1270.  
  1271.  
  1272. void boxerror ( eightbits n )
  1273. { boxerror_regmem
  1274.  
  1275.   error(); 
  1276.   begindiagnostic();
  1277.   c_printnl("The following box has been deleted:");
  1278.   showbox ( box ( n ) );
  1279.   enddiagnostic ( true );
  1280.   flushnodelist ( box ( n ) );
  1281.   box ( n ) = 0;
  1282. }
  1283.  
  1284.  
  1285. void ensurevbox ( eightbits n )
  1286. { ensurevbox_regmem
  1287.   register halfword p  ; 
  1288.  
  1289.   p = box ( n ) ; 
  1290.   if ( p != 0 ) 
  1291.   if ( ztype ( p ) == hlistnode ) {
  1292.     print_err("Insertions can only be added to a vbox");
  1293.     zhelp2( STR_H_TUTTUT_INSERT, STR_H_PROCEED_DISCRADCONT);
  1294.     boxerror ( n ) ; 
  1295.   }
  1296. }
  1297.  
  1298.  
  1299. void fireup ( halfword c )
  1300. {/* 10 */ fireup_regmem
  1301.   register halfword p, q, r, s  ; 
  1302.   register halfword prevp  ; 
  1303.   unsigned char n  ; 
  1304.   boolean wait  ; 
  1305.   /*register*/ integer savevbadness  ; 
  1306.   /*register*/ scaled savevfuzz  ; 
  1307.   /*register*/ halfword savesplittopskip  ; 
  1308.  
  1309.   if ( ztype ( bestpagebreak ) == penaltynode ) {
  1310.     geqworddefine ( intbase + outputpenaltycode, mem[bestpagebreak+1].cint );
  1311.     mem [ bestpagebreak + 1 ] .cint = infpenalty ; 
  1312.   } else
  1313.     geqworddefine ( intbase + outputpenaltycode , infpenalty ) ; 
  1314.  
  1315.   if ( botmark != 0 ) {
  1316.     if ( topmark != 0 ) 
  1317.       deletetokenref ( topmark ) ; 
  1318.     topmark = botmark ; 
  1319.     addtokenref ( topmark ) ; 
  1320.     deletetokenref ( firstmark ) ; 
  1321.     firstmark = 0 ; 
  1322.   } 
  1323.  
  1324.   if ( c == bestpagebreak ) 
  1325.     bestpagebreak = 0 ; 
  1326.  
  1327.   if ( box ( 255 ) != 0 ) {
  1328.     print_err("");
  1329.     printesc( STR_BOX );
  1330.     c_print("255 is not void");
  1331.     zhelp2( STR_H_YOUSHOULDNTUSEBOX, STR_H_PROCEED_DISCRADCONT );
  1332.     boxerror( 255 );
  1333.   } 
  1334.   insertpenalties = 0 ; 
  1335.   savesplittopskip = splittopskip ; 
  1336.   if ( holdinginserts <= 0 ) {
  1337.     r = link ( pageinshead ) ; 
  1338.     while ( r != pageinshead ) {
  1339.       if ( bestinsptr ( r ) != 0 ) {
  1340.     n = subtype ( r ) ; 
  1341.     ensurevbox ( n ) ; 
  1342.     if ( box ( n ) == 0 )
  1343.       box ( n ) = newnullbox () ; 
  1344.     p = box ( n ) + listoffset ; 
  1345.     while ( link ( p ) != 0 )
  1346.       p = link ( p ) ; 
  1347.     lastinsptr ( r ) = p ; 
  1348.       } 
  1349.       r = link ( r ) ; 
  1350.     } 
  1351.   } 
  1352.   q = holdhead ; 
  1353.   link ( q ) = 0 ; 
  1354.   prevp = pagehead ; 
  1355.   p = link ( prevp ) ; 
  1356.   while ( p != bestpagebreak ) {
  1357.     if ( ztype ( p ) == insnode ) {
  1358.       if ( holdinginserts <= 0 ) {
  1359.     r = link ( pageinshead ) ; 
  1360.     while ( subtype ( r ) != subtype ( p ) )
  1361.       r = link ( r ) ; 
  1362.     if ( bestinsptr ( r ) == 0 ) 
  1363.       wait = true ; 
  1364.     else {
  1365.       wait = false ; 
  1366.       s = lastinsptr ( r ) ; 
  1367.       link ( s ) = insptr ( p ) ; 
  1368.       if ( bestinsptr ( r ) == p ) {
  1369.         if ( ztype ( r ) == splitup ) 
  1370.         if ( ( brokenins ( r ) == p ) && ( brokenptr ( r ) != 0 ) ) {
  1371.           while ( link ( s ) != brokenptr ( r ) )
  1372.         s = link ( s ) ; 
  1373.           link ( s ) = 0 ; 
  1374.           splittopskip = splittopptr ( p ) ; 
  1375.           insptr ( p ) = prunepagetop ( brokenptr ( r ) ) ; 
  1376.           if ( insptr ( p ) != 0 ) {
  1377.         tempptr = vpackage ( insptr ( p ) , 0 , 1 , maxdimen ) ; 
  1378.         height ( p ) = height ( tempptr ) + depth ( tempptr ) ; 
  1379.         freenode ( tempptr , boxnodesize ) ; 
  1380.         wait = true ; 
  1381.           }
  1382.         }
  1383.         bestinsptr ( r ) = 0 ; 
  1384.         n = subtype ( r ) ; 
  1385.         tempptr = listptr ( box ( n ) ) ; 
  1386.         freenode ( box ( n ) , boxnodesize ) ; 
  1387.         box ( n ) = vpackage ( tempptr , 0 , 1 , maxdimen ) ; 
  1388.       } else {
  1389.         while ( link ( s ) != 0 )
  1390.           s = link ( s ) ; 
  1391.         lastinsptr ( r ) = s ; 
  1392.       } 
  1393.     } 
  1394.     link ( prevp ) = link ( p ) ; 
  1395.     link ( p ) = 0 ; 
  1396.     if ( wait ) {
  1397.       link ( q ) = p ; 
  1398.       q = p ; 
  1399.       incr ( insertpenalties ) ; 
  1400.     } else {
  1401.       deleteglueref ( splittopptr ( p ) ) ; 
  1402.       freenode ( p , insnodesize ) ; 
  1403.     } 
  1404.     p = prevp ; 
  1405.       } 
  1406.     } else if ( ztype ( p ) == marknode ) {
  1407.       if ( firstmark == 0 ) {
  1408.     firstmark = markptr ( p ) ; 
  1409.     addtokenref ( firstmark ) ; 
  1410.       }
  1411.       if ( botmark != 0 ) 
  1412.     deletetokenref ( botmark ) ; 
  1413.       botmark = markptr ( p ) ; 
  1414.       addtokenref ( botmark ) ; 
  1415.     }
  1416.     prevp = p ; 
  1417.     p = link ( prevp ) ; 
  1418.   }
  1419.   splittopskip = savesplittopskip ; 
  1420.   if ( p != 0 ) {
  1421.     if ( link ( contribhead ) == 0 ) 
  1422.     if ( nestptr == 0 ) 
  1423.       curlist .tailfield = pagetail ; 
  1424.     else nest [ 0 ] .tailfield = pagetail ; 
  1425.     link ( pagetail ) = link ( contribhead ) ; 
  1426.     link ( contribhead ) = p ; 
  1427.     link ( prevp ) = 0 ; 
  1428.   } 
  1429.   savevbadness = vbadness ; 
  1430.   vbadness = infbad ; 
  1431.   savevfuzz = vfuzz ; 
  1432.   vfuzz = maxdimen ; 
  1433.   box ( 255 ) = vpackage ( link ( pagehead ) , bestsize , 0 , pagemaxdepth ) ; 
  1434.   vbadness = savevbadness ; 
  1435.   vfuzz = savevfuzz ; 
  1436.   if ( lastglue != maxhalfword ) 
  1437.     deleteglueref ( lastglue ) ; 
  1438.   pagecontents = 0 ; 
  1439.   pagetail = pagehead ; 
  1440.   link ( pagehead ) = 0 ; 
  1441.   lastglue = maxhalfword ; 
  1442.   lastpenalty = 0 ; 
  1443.   lastkern = 0 ; 
  1444.   pagesofar [ 7 ] = 0 ; 
  1445.   pagemaxdepth = 0 ; 
  1446.   if ( q != holdhead ) {
  1447.     link ( pagehead ) = link ( holdhead ) ; 
  1448.     pagetail = q ; 
  1449.   }
  1450.   r = link ( pageinshead ) ; 
  1451.   while ( r != pageinshead ) {
  1452.     q = link ( r ) ; 
  1453.     freenode ( r , pageinsnodesize ) ; 
  1454.     r = q ; 
  1455.   } 
  1456.   link ( pageinshead ) = pageinshead ; 
  1457.   if ( ( topmark != 0 ) && ( firstmark == 0 ) ) {
  1458.     firstmark = topmark ; 
  1459.     addtokenref ( topmark ) ; 
  1460.   } 
  1461.   if ( outputroutine != 0 ) 
  1462.   if ( deadcycles >= maxdeadcycles ) {
  1463.     print_err("Output loop---");
  1464.     printint ( deadcycles ) ; 
  1465.     c_print(" consecutive dead cycles");
  1466.     zhelp1( STR_H_IVE_OUTPUT_AWRY );
  1467.     error();
  1468.   } else {
  1469.     outputactive = true ; 
  1470.     incr ( deadcycles ) ; 
  1471.     pushnest () ; 
  1472.     curlist .modefield = -vmode ;
  1473.     curlist .auxfield .cint = ignoredepth ; 
  1474.     curlist .mlfield = - (integer) line ; 
  1475.     begintokenlist ( outputroutine , outputtext ) ; 
  1476.     newsavelevel ( outputgroup ) ; 
  1477.     normalparagraph () ; 
  1478.     scanleftbrace () ; 
  1479.     return ; 
  1480.   } 
  1481.  
  1482.   if ( link ( pagehead ) != 0 ) {
  1483.     if ( link ( contribhead ) == 0 ) 
  1484.       if ( nestptr == 0 ) 
  1485.     curlist .tailfield = pagetail ; 
  1486.       else
  1487.     nest [ 0 ] .tailfield = pagetail ; 
  1488.     else
  1489.       link ( pagetail ) = link ( contribhead ) ; 
  1490.     link ( contribhead ) = link ( pagehead ) ; 
  1491.     link ( pagehead ) = 0 ; 
  1492.     pagetail = pagehead ; 
  1493.   }
  1494.   shipout ( box ( 255 ) ) ; 
  1495.   box ( 255 ) = 0 ; 
  1496. }
  1497.  
  1498.  
  1499. void buildpage ( void )
  1500. {/* 10 30 31 22 80 90 */ buildpage_regmem 
  1501.   register halfword p  ; 
  1502.   register halfword q, r  ; 
  1503.   register integer b, c  ; 
  1504.   register integer pi  ; 
  1505.   unsigned char n  ; 
  1506.   register scaled delta, h, w  ; 
  1507.  
  1508.   if ( ( link ( contribhead ) == 0 ) || outputactive ) 
  1509.     return ; 
  1510.  
  1511.   do {
  1512. lab22:
  1513.     p = link ( contribhead ) ; 
  1514.     if ( lastglue != maxhalfword ) 
  1515.       deleteglueref ( lastglue ) ; 
  1516.     lastpenalty = 0 ; 
  1517.     lastkern = 0 ; 
  1518.     if ( ztype ( p ) == gluenode ) {
  1519.       lastglue = glueptr ( p ) ; 
  1520.       addglueref ( lastglue ) ; 
  1521.     } else {
  1522.       lastglue = maxhalfword ; 
  1523.       if ( ztype ( p ) == penaltynode ) 
  1524.     lastpenalty = mem [ p + 1 ] .cint ; 
  1525.       else if ( ztype ( p ) == kernnode ) 
  1526.     lastkern = width ( p ) ; 
  1527.     }
  1528.     switch ( ztype ( p ) ) 
  1529.     {case hlistnode : 
  1530.     case vlistnode : 
  1531.     case rulenode : 
  1532.       if ( pagecontents < boxthere ) {
  1533.     if ( pagecontents == 0 ) 
  1534.       freezepagespecs ( boxthere ) ; 
  1535.     else
  1536.       pagecontents = boxthere ; 
  1537.     q = newskipparam ( topskipcode ) ; 
  1538.     if ( width ( tempptr ) > height ( p ) ) 
  1539.       width ( tempptr ) = width ( tempptr ) - height ( p ) ; 
  1540.     else
  1541.       width ( tempptr ) = 0 ; 
  1542.     link ( q ) = p ; 
  1543.     link ( contribhead ) = q ; 
  1544.     goto lab22 ; 
  1545.       } else {
  1546.     pagesofar [ 1 ] = pagesofar [ 1 ] + pagesofar [ 7 ] + height ( p ) ; 
  1547.     pagesofar [ 7 ] = depth ( p ) ; 
  1548.     goto lab80 ; 
  1549.       }
  1550.       break ; 
  1551.     case whatsitnode : 
  1552.       goto lab80 ; 
  1553.       break ; 
  1554.     case gluenode : 
  1555.       if ( pagecontents < boxthere ) 
  1556.     goto lab31 ; 
  1557.       else if ( precedesbreak ( pagetail ) ) 
  1558.     pi = 0 ; 
  1559.       else
  1560.     goto lab90 ; 
  1561.       break ; 
  1562.     case kernnode : 
  1563.       if ( pagecontents < boxthere ) 
  1564.     goto lab31 ; 
  1565.       else if ( link ( p ) == 0 ) 
  1566.     return ; 
  1567.       else if ( ztype ( link ( p ) ) == gluenode ) 
  1568.     pi = 0 ; 
  1569.       else
  1570.     goto lab90 ; 
  1571.       break ; 
  1572.     case penaltynode : 
  1573.       if ( pagecontents < boxthere ) 
  1574.     goto lab31 ; 
  1575.       else
  1576.     pi = mem [ p + 1 ] .cint ; 
  1577.       break ; 
  1578.     case marknode : 
  1579.       goto lab80 ; 
  1580.       break ; 
  1581.     case insnode : 
  1582.       {
  1583.     if ( pagecontents == 0 ) 
  1584.       freezepagespecs ( insertsonly ) ; 
  1585.     n = subtype ( p ) ; 
  1586.     r = pageinshead ; 
  1587.     while ( n >= subtype ( link ( r ) ) )
  1588.       r = link ( r ) ; 
  1589.     n = n ; 
  1590.     if ( subtype ( r ) != n ) {
  1591.       q = getnode ( pageinsnodesize ) ; 
  1592.       link ( q ) = link ( r ) ; 
  1593.       link ( r ) = q ; 
  1594.       r = q ; 
  1595.       subtype ( r ) = n ; 
  1596.       ztype ( r ) = inserting ; 
  1597.       ensurevbox ( n ) ; 
  1598.       if ( box ( n ) == 0 ) 
  1599.         height ( r ) = 0 ; 
  1600.       else
  1601.         height ( r ) = height ( box ( n ) ) + depth ( box ( n ) ) ; 
  1602.       bestinsptr ( r ) = 0 ; 
  1603.       q = skip ( n ) ; 
  1604.       if ( count ( n ) == 1000 ) 
  1605.         h = height ( r ) ; 
  1606.       else
  1607.         h = xovern ( height ( r ) , 1000 ) * count ( n ) ; 
  1608.       pagesofar [ 0 ] = pagesofar [ 0 ] - h - width ( q ) ; 
  1609.       pagesofar [ 2 + stretchorder ( q ) ] += stretch ( q ) ; 
  1610.       pagesofar [ 6 ] += shrink ( q ) ; 
  1611.       if ( ( shrinkorder ( q ) != normal ) && ( shrink ( q ) != 0 ) ) {
  1612.         print_err("Infinite glue shrinkage inserted from ");
  1613.         printesc( STR_SKIP );
  1614.         printint ( n ) ; 
  1615.         zhelp2( STR_H_THECORRECTIONGLUE, STR_H_SINCETHE_OFFENSIVE );
  1616.         error();
  1617.       } 
  1618.     } 
  1619.     if ( ztype ( r ) == splitup ) 
  1620.       insertpenalties = insertpenalties + floatcost ( p ) ; 
  1621.     else {
  1622.       lastinsptr ( r ) = p ; 
  1623.       delta = pagesofar [ 0 ] - pagesofar [ 1 ] - pagesofar [ 7 ] + 
  1624.       pagesofar [ 6 ] ; 
  1625.       if ( count ( n ) == 1000 ) 
  1626.         h = height ( p ) ; 
  1627.       else
  1628.         h = xovern ( height ( p ) , 1000 ) * count ( n ) ; 
  1629.       if ( ( ( h <= 0 ) || ( h <= delta ) ) && ( height ( p ) + height ( r 
  1630.       ) <= dimen ( n ) ) ) 
  1631.       {
  1632.         pagesofar [ 0 ] -= h ; 
  1633.         height ( r ) += height ( p ) ; 
  1634.       } else {
  1635.         if ( count ( n ) <= 0 ) 
  1636.           w = maxdimen ; 
  1637.         else {
  1638.           w = pagesofar [ 0 ] - pagesofar [ 1 ] - pagesofar [ 7 ] ; 
  1639.           if ( count ( n ) != 1000 ) 
  1640.         w = xovern ( w , count ( n ) ) * 1000 ; 
  1641.         } 
  1642.         if ( w > dimen ( n ) - height ( r ) ) 
  1643.           w = dimen ( n ) - height ( r ) ; 
  1644.         q = vertbreak ( insptr ( p ) , w , depth ( p ) ) ; 
  1645.         height ( r ) += bestheightplusdepth ; 
  1646. #ifdef STAT
  1647.         if ( tracingpages > 0 ) {
  1648.           begindiagnostic () ; 
  1649.           c_printnl("% split");
  1650.           printint ( n ) ; 
  1651.           c_print(" to ");
  1652.           printscaled ( w ) ; 
  1653.           printchar ( 44 ) ; 
  1654.           printscaled ( bestheightplusdepth ) ; 
  1655.           c_print(" p=");
  1656.           if ( q == 0 ) 
  1657.         printint ( ejectpenalty ) ; 
  1658.           else if ( ztype ( q ) == penaltynode ) 
  1659.         printint ( mem [ q + 1 ] .cint ) ; 
  1660.           else
  1661.         printchar ( 48 ) ; 
  1662.           enddiagnostic ( false ) ; 
  1663.         } 
  1664. #endif /* STAT */
  1665.         if ( count ( n ) != 1000 ) 
  1666.           bestheightplusdepth = xovern(bestheightplusdepth, 1000)*count(n);
  1667.         pagesofar [ 0 ] -= bestheightplusdepth;
  1668.         ztype ( r ) = splitup ; 
  1669.         brokenptr ( r ) = q ; 
  1670.         brokenins ( r ) = p ; 
  1671.         if ( q == 0 )
  1672.           insertpenalties += ejectpenalty ; 
  1673.         else if ( ztype ( q ) == penaltynode ) 
  1674.           insertpenalties += mem [ q + 1 ] .cint ; 
  1675.       }
  1676.     }
  1677.     goto lab80 ; 
  1678.       } 
  1679.       break ; 
  1680.     default: 
  1681.       confusion("page");
  1682.       break ; 
  1683.     } 
  1684.     if ( pi < infpenalty ) {
  1685.       if ( pagesofar [ 1 ] < pagesofar [ 0 ] ) 
  1686.       if ( ( pagesofar [ 3 ] != 0 ) || ( pagesofar [ 4 ] != 0 ) || ( pagesofar 
  1687.       [ 5 ] != 0 ) ) 
  1688.       b = 0 ; 
  1689.       else b = badness ( pagesofar [ 0 ] - pagesofar [ 1 ] , pagesofar [ 2 ] );
  1690.       else if ( pagesofar [ 1 ] - pagesofar [ 0 ] > pagesofar [ 6 ] ) 
  1691.       b = awfulbad ; 
  1692.       else b = badness ( pagesofar [ 1 ] - pagesofar [ 0 ] , pagesofar [ 6 ] );
  1693.       if ( b < awfulbad ) 
  1694.       if ( pi <= ejectpenalty ) 
  1695.       c = pi ; 
  1696.       else if ( b < infbad ) 
  1697.       c = b + pi + insertpenalties ; 
  1698.       else c = 100000L ; 
  1699.       else c = b ; 
  1700.       if ( insertpenalties >= 10000 ) 
  1701.       c = awfulbad ; 
  1702. #ifdef STAT
  1703.       if ( tracingpages > 0 ) {
  1704.     begindiagnostic () ; 
  1705.     printnl ( 37 ) ; 
  1706.     c_print(" t=");
  1707.     printtotals () ; 
  1708.     c_print(" g=");
  1709.     printscaled ( pagesofar [ 0 ] ) ; 
  1710.     c_print(" b=");
  1711.     if ( b == awfulbad ) printchar ( 42 ) ; else printint ( b ) ; 
  1712.     c_print(" p=");
  1713.     printint ( pi ) ; 
  1714.     c_print(" c=");
  1715.     if ( c == awfulbad ) 
  1716.       printchar ( 42 ) ; 
  1717.     else
  1718.       printint ( c ) ; 
  1719.     if ( c <= leastpagecost ) 
  1720.       printchar ( 35 ) ; 
  1721.     enddiagnostic ( false ) ; 
  1722.       } 
  1723. #endif /* STAT */
  1724.       if ( c <= leastpagecost ) {
  1725.     bestpagebreak = p ; 
  1726.     bestsize = pagesofar [ 0 ] ; 
  1727.     leastpagecost = c ; 
  1728.     r = link ( pageinshead ) ; 
  1729.     while ( r != pageinshead ) {
  1730.       bestinsptr ( r ) = lastinsptr ( r ) ; 
  1731.       r = link ( r ) ; 
  1732.     } 
  1733.       } 
  1734.       if ( ( c == awfulbad ) || ( pi <= ejectpenalty ) ) {
  1735.     fireup ( p ) ; 
  1736.     if ( outputactive ) 
  1737.       return ; 
  1738.     goto lab30 ; 
  1739.       }
  1740.     } 
  1741.     if ( ( ztype ( p ) < gluenode ) || ( ztype ( p ) > kernnode ) ) 
  1742.       goto lab80 ; 
  1743. lab90:
  1744.     if ( ztype ( p ) == kernnode ) 
  1745.       q = p ; 
  1746.     else {
  1747.       q = glueptr ( p ) ; 
  1748.       pagesofar [ 2 + stretchorder ( q ) ] += stretch ( q ) ; 
  1749.       pagesofar [ 6 ] += shrink ( q ) ; 
  1750.       if ( ( shrinkorder ( q ) != normal ) && ( shrink ( q ) != 0 ) ) {
  1751.     print_err("Infinite glue shrinkage found on current page");
  1752.     zhelp3( STR_H_THEPAGE_INFINITELY, STR_H_SHRINKABLEGLUE,
  1753.         STR_H_SINCETHE_OFFENSIVE );
  1754.     error();
  1755.     r = newspec ( q ) ; 
  1756.     shrinkorder ( r ) = normal ; 
  1757.     deleteglueref ( q ) ; 
  1758.     glueptr ( p ) = r ; 
  1759.     q = r ; 
  1760.       } 
  1761.     } 
  1762.     pagesofar [ 1 ] = pagesofar [ 1 ] + pagesofar [ 7 ] + width ( q ) ; 
  1763.     pagesofar [ 7 ] = 0 ; 
  1764. lab80:
  1765.     if ( pagesofar [ 7 ] > pagemaxdepth ) {
  1766.       pagesofar [ 1 ] = pagesofar [ 1 ] + pagesofar [ 7 ] - pagemaxdepth ; 
  1767.       pagesofar [ 7 ] = pagemaxdepth ; 
  1768.     }
  1769.     link ( pagetail ) = p ; 
  1770.     pagetail = p ; 
  1771.     link ( contribhead ) = link ( p ) ; 
  1772.     link ( p ) = 0 ; 
  1773.     goto lab30 ; 
  1774.  
  1775. lab31:
  1776.     link ( contribhead ) = link ( p ) ; 
  1777.     link ( p ) = 0 ; 
  1778.     flushnodelist ( p ) ; 
  1779. lab30: ;
  1780.   } while ( ! ( link ( contribhead ) == 0 ) ) ;
  1781.  
  1782.   if ( nestptr == 0 ) 
  1783.     curlist .tailfield = contribhead ; 
  1784.   else nest [ 0 ] .tailfield = contribhead ; 
  1785. }
  1786.  
  1787.  
  1788. void insertdollarsign ( void )
  1789. { insertdollarsign_regmem
  1790.  
  1791.   backinput () ; 
  1792.   curtok = mathshifttoken + 36 ; 
  1793.   print_err("Missing $ inserted");
  1794.   zhelp1( STR_H_IVE_BEGINMATH );
  1795.   inserror () ; 
  1796.  
  1797.  
  1798. void youcant ( void)
  1799. { youcant_regmem
  1800.  
  1801.   p_print_err( STR_H_YOUCANTUSE );
  1802.   printcmdchr( curcmd , curchr );
  1803.   c_print("' in ");
  1804.   printmode( curlist .modefield );
  1805.  
  1806.  
  1807. void reportillegalcase ( void )
  1808. { reportillegalcase_regmem
  1809.  
  1810.   youcant();
  1811.   zhelp1( STR_H_SORRY_NOTPROGRAMMED );
  1812.   error();
  1813. }
  1814.  
  1815.  
  1816. boolean privileged ( void )
  1817. { privileged_regmem
  1818.  
  1819.   if ( curlist .modefield > 0 ) 
  1820.     return(true);
  1821.   else {
  1822.     reportillegalcase () ; 
  1823.     return(false);
  1824.   }
  1825. }
  1826.  
  1827.  
  1828. boolean itsallover ( void )
  1829. {/* 10 */ itsallover_regmem
  1830.  
  1831.   if ( privileged () ) {
  1832.     if ( ( pagehead == pagetail ) && ( curlist .headfield == curlist 
  1833.     .tailfield ) && ( deadcycles == 0 ) ) 
  1834.     {
  1835.       return(true);
  1836.     } 
  1837.     backinput () ; 
  1838.     tailappend ( newnullbox () ) ; 
  1839.     width ( curlist .tailfield ) = hsize ; 
  1840.     tailappend ( newglue ( fillglue ) ) ; 
  1841.     tailappend ( newpenalty ( -1073741824L ) ) ; 
  1842.     buildpage () ; 
  1843.   }
  1844.   return(false) ; 
  1845. }
  1846.  
  1847.  
  1848. void appendglue ( void )
  1849. { appendglue_regmem
  1850.   register smallnumber s;
  1851.   register long_halfword r_curval;
  1852.  
  1853.   s = curchr ; 
  1854.   switch ( s ) {
  1855.   case 0 : 
  1856.     r_curval = filglue ; 
  1857.     break ; 
  1858.   case 1 : 
  1859.     r_curval = fillglue ; 
  1860.     break ; 
  1861.   case 2 : 
  1862.     r_curval = ssglue ; 
  1863.     break ; 
  1864.   case 3 : 
  1865.     r_curval = filnegglue ; 
  1866.     break ; 
  1867.   case 4 : 
  1868.     r_curval = scanglue ( glueval );
  1869.     break ; 
  1870.   case 5 : 
  1871.     r_curval = scanglue ( muval );
  1872.     break ; 
  1873.   }
  1874.   tailappend ( newglue ( r_curval ) );
  1875.   if ( s >= 4 ) {
  1876.     decr ( gluerefcount ( r_curval ) );
  1877.     if ( s > 4 )
  1878.       subtype ( curlist .tailfield ) = muglue;
  1879.   }
  1880. }
  1881.  
  1882.  
  1883. void appendkern ( void )
  1884. { register quarterword s;
  1885.   register integer r_curval;
  1886.  
  1887.   s = curchr ; 
  1888.   r_curval = scandimen ( s == muglue, false, false );
  1889.   { appendkern_regmem
  1890.     tailappend ( newkern ( r_curval ) );
  1891.     subtype ( curlist .tailfield ) = s;
  1892.   }
  1893. }
  1894.  
  1895.  
  1896. void offsave ( void )
  1897. { offsave_regmem
  1898.   register halfword p ;
  1899.  
  1900.   if ( curgroup == bottomlevel ) {
  1901.     print_err("Extra ");
  1902.     printcmdchr ( curcmd , curchr ) ; 
  1903.     zhelp1( STR_H_THINGS_MIXEDUP );
  1904.     error () ; 
  1905.   } else {
  1906.     backinput () ; 
  1907.     p = getavail () ; 
  1908.     link ( temphead ) = p ; 
  1909.     print_err("Missing ");
  1910.  
  1911.     switch ( curgroup ) {
  1912.     case semisimplegroup : 
  1913.       {
  1914.     info ( p ) = cstokenflag + frozenendgroup ; 
  1915.     printesc( STR_ENDGROUP );
  1916.       } 
  1917.       break ; 
  1918.     case mathshiftgroup : 
  1919.       {
  1920.     info ( p ) = mathshifttoken + 36 ; 
  1921.     printchar ( 36 ) ; 
  1922.       } 
  1923.       break ; 
  1924.     case mathleftgroup : 
  1925.       {
  1926.     info ( p ) = cstokenflag + frozenright ; 
  1927.     link ( p ) = getavail () ; 
  1928.     p = link ( p ) ; 
  1929.     info ( p ) = othertoken + 46 ; 
  1930.     c_printesc("right.");
  1931.       } 
  1932.       break ; 
  1933.     default: 
  1934.       {
  1935.     info ( p ) = rightbracetoken + 125 ; 
  1936.     printchar ( 125 ) ; 
  1937.       } 
  1938.       break ; 
  1939.     } 
  1940.     c_print(" inserted");
  1941.     begintokenlist ( link ( temphead ) , inserted ) ; 
  1942.     zhelp1( STR_H_IVE_INSERTED_SOMETHING );
  1943.     error () ; 
  1944.   }
  1945. }
  1946.  
  1947.  
  1948. void extrarightbrace ( void )
  1949. { extrarightbrace_regmem
  1950.  
  1951.   print_err("Extra }, or forgotten ");
  1952.  
  1953.   switch ( curgroup ) {
  1954.   case semisimplegroup : 
  1955.     printesc( STR_ENDGROUP );
  1956.     break ; 
  1957.   case mathshiftgroup : 
  1958.     printchar ( 36 ) ; 
  1959.     break ; 
  1960.   case mathleftgroup : 
  1961.     printesc( STR_RIGHT );
  1962.     break ; 
  1963.   }
  1964.   zhelp1( STR_H_IVE_GROUPCLOSING );
  1965.   error();
  1966.   incr ( alignstate );
  1967. }
  1968.  
  1969.  
  1970. void normalparagraph ( void )
  1971. { normalparagraph_regmem
  1972.  
  1973.   if ( looseness != 0 ) 
  1974.     eqworddefine ( intbase + loosenesscode , 0 ) ; 
  1975.   if ( hangindent != 0 ) 
  1976.     eqworddefine ( dimenbase + hangindentcode , 0 ) ; 
  1977.   if ( hangafter != 1 ) 
  1978.     eqworddefine ( intbase + hangaftercode , 1 ) ; 
  1979.   if ( parshapeptr != 0 ) 
  1980.     eqdefine ( parshapeloc , shaperef , 0 ) ; 
  1981. }
  1982.  
  1983. /* -- end -- */
  1984.