home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / source / TeX / tex / tex5.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-08-18  |  17.6 KB  |  692 lines

  1. #define EXTERN extern
  2. #include "texd.h"
  3.  
  4. #if 0            /* nach math.c */
  5.  
  6. void zmakefraction ( q ) 
  7. scaled zmakeop ( q ) 
  8. void zmakeord ( q ) 
  9. void zmakescripts ( q , delta ) 
  10. smallnumber zmakeleftright ( q , style , maxd , maxh ) 
  11. void mlisttohlist ( ) 
  12.  
  13. #endif
  14.  
  15. void pushalignment ( void )
  16. { register halfword p  ; 
  17.  
  18.   p = getnode ( alignstacknodesize ) ; 
  19.  
  20.   { pushalignment_regmem
  21.  
  22.   link ( p ) = alignptr ; 
  23.   info ( p ) = curalign ; 
  24.   llink ( p ) = preamble ; 
  25.   rlink ( p ) = curspan ; 
  26.   mem [ p + 2 ] .cint = curloop ; 
  27.   mem [ p + 3 ] .cint = alignstate ; 
  28.   info ( p + 4 ) = curhead ; 
  29.   link ( p + 4 ) = curtail ;
  30.   }
  31.   alignptr = p ; 
  32.   curhead = getavail () ;
  33. }
  34.  
  35. void popalignment ( void )
  36. { popalignment_regmem 
  37.   register halfword p  ; 
  38.  
  39.   freeavail ( curhead ) ; 
  40.   p = alignptr ; 
  41.   curtail = link ( p + 4 ) ; 
  42.   curhead = info ( p + 4 ) ; 
  43.   alignstate = mem [ p + 3 ] .cint ; 
  44.   curloop = mem [ p + 2 ] .cint ; 
  45.   curspan = rlink ( p ) ; 
  46.   preamble = llink ( p ) ; 
  47.   curalign = info ( p ) ; 
  48.   alignptr = link ( p ) ; 
  49.   freenode ( p , alignstacknodesize ) ; 
  50. }
  51.  
  52. void getpreambletoken ( void )
  53. { getpreambletoken_regmem 
  54.   register eightbits r_curcmd;
  55.  
  56. lab20:
  57.   r_curcmd = gettoken () ; 
  58.   while ( (r_curcmd == 4) && (curchr == spancode) ) {
  59.     r_curcmd = gettoken ();
  60.     if ( r_curcmd > maxcommand ) {
  61.       expand ();
  62.       r_curcmd = gettoken ();
  63.     }
  64.   }
  65.  
  66.   if ( r_curcmd == 9 )
  67.     fatalerror( STR_H_FE_INTERWOVEN );
  68.  
  69.   if ( (r_curcmd == assign_glue) && (curchr == gluebase + tabskipcode) ) {
  70.     scanoptionalequals ();
  71.     { register long_halfword r_curval;
  72.  
  73.       r_curval = scanglue( glueval );
  74.       if ( globaldefs > 0 )
  75.     geqdefine( gluebase + tabskipcode, glueref, r_curval );
  76.       else
  77.     eqdefine( gluebase + tabskipcode, glueref, r_curval );
  78.     }
  79.     goto lab20;
  80.   }
  81. }
  82.  
  83. void initalign ( void )
  84. {/* 30 31 32 22 */ initalign_regmem 
  85.   register halfword savecsptr  ; 
  86.   register halfword p  ; 
  87.  
  88.   savecsptr = curcs ; 
  89.   pushalignment () ; 
  90.   alignstate = -1000000L ; 
  91.   if ( ( curlist .modefield == mmode )
  92.   && ( ( curlist .tailfield != curlist .headfield )
  93.     || ( curlist .auxfield .cint != 0 ) ) )
  94.   {
  95.     p_print_err( STR_H_IMPROPER );
  96.     printesc ( 516 ) ; 
  97.     c_print(" inside $$'s");
  98.     zhelp2( STR_H_DISPLAYSCANUSE, STR_H_SOIVE_FORMULAS );
  99.     error () ; 
  100.     flushmath () ; 
  101.   } 
  102.   pushnest () ; 
  103.   if ( curlist .modefield == mmode ) {
  104.     curlist .modefield = -vmode;
  105.     curlist .auxfield .cint = nest [ nestptr - 2 ] .auxfield .cint ; 
  106.   } else if ( curlist .modefield > 0 ) 
  107.     curlist .modefield = - curlist .modefield ; 
  108.   scanspec ( aligngroup , false ) ; 
  109.   preamble = 0 ; 
  110.   curalign = alignhead ; 
  111.   curloop = 0 ; 
  112.   scannerstatus = aligning ; 
  113.   warningindex = savecsptr ; 
  114.   alignstate = -1000000L ; 
  115.   while ( true ) {
  116.     link ( curalign ) = newparamglue ( tabskipcode ) ; 
  117.     curalign = link ( curalign ) ; 
  118.     if ( curcmd == 5 ) 
  119.       goto lab30 ; 
  120.     p = holdhead ; 
  121.     link ( p ) = 0 ; 
  122.     while ( true ) {
  123.       getpreambletoken () ; 
  124.       if ( curcmd == 6 ) 
  125.     goto lab31 ; 
  126.       if ( ( curcmd <= 5 ) && ( curcmd >= 4 ) && ( alignstate == -1000000L ) ) 
  127.       if ( ( p == holdhead ) && ( curloop == 0 ) && ( curcmd == 4 ) ) 
  128.     curloop = curalign ; 
  129.       else {
  130.     print_err("Missing # inserted in alignment preamble");
  131.     zhelp2( STR_H_THERESHOULD_TAB, STR_H_NONESOIVEPUT );
  132.     backerror () ; 
  133.     goto lab31 ; 
  134.       } else if ( ( curcmd != 10 ) || ( p != holdhead ) ) {
  135.     link ( p ) = getavail () ; 
  136.     p = link ( p ) ; 
  137.     info ( p ) = curtok ; 
  138.       }
  139.     }
  140. lab31: ; 
  141.     link ( curalign ) = newnullbox () ; 
  142.     curalign = link ( curalign ) ; 
  143.     info ( curalign ) = endspan ; 
  144.     width ( curalign ) = nullflag ; 
  145.     upart ( curalign ) = link ( holdhead ) ; 
  146.     p = holdhead ; 
  147.     link ( p ) = 0 ; 
  148.     while ( true ) {
  149. lab22:
  150.       getpreambletoken () ; 
  151.       if ( ( curcmd <= 5 ) && ( curcmd >= 4 ) && ( alignstate == -1000000L ) ) 
  152.         goto lab32 ; 
  153.       if ( curcmd == 6 ) {
  154.     print_err("Only one # is allowed per tab");
  155.     zhelp2( STR_H_THERESHOULD_TAB, STR_H_MORETHANONE_SOIM );
  156.     error () ; 
  157.     goto lab22 ; 
  158.       }
  159.       link ( p ) = getavail () ; 
  160.       p = link ( p ) ; 
  161.       info ( p ) = curtok ; 
  162.     }
  163. lab32:
  164.     link ( p ) = getavail () ; 
  165.     p = link ( p ) ; 
  166.     info ( p ) = endtemplatetoken ; 
  167.     vpart ( curalign ) = link ( holdhead ) ; 
  168.   }
  169. lab30:
  170.   scannerstatus = normal ; 
  171.   newsavelevel ( aligngroup ) ; 
  172.   if ( everycr != 0 ) 
  173.     begintokenlist ( everycr , everycrtext ) ; 
  174.   alignpeek () ; 
  175. }
  176.  
  177. void initspan ( halfword p )
  178. { initspan_regmem 
  179.  
  180.   pushnest () ; 
  181.   if ( curlist .modefield == -hmode )
  182.     curlist .auxfield .hh .v.LH = 1000 ; 
  183.   else {
  184.     curlist .auxfield .cint = ignoredepth ; 
  185.     normalparagraph () ; 
  186.   } 
  187.   curspan = p ; 
  188.  
  189. void initrow ( void )
  190. { initrow_regmem 
  191.  
  192.   pushnest () ; 
  193.   curlist.modefield = - ((hmode + vmode) + curlist.modefield);
  194.   if ( curlist .modefield == -hmode )
  195.     curlist .auxfield .hh .v.LH = 0 ; 
  196.   else
  197.     curlist .auxfield .cint = 0 ; 
  198.   tailappend ( newglue ( glueptr ( preamble ) ) ) ; 
  199.   subtype ( curlist .tailfield ) = tabskipcode + 1 ; 
  200.   curalign = link ( preamble ) ; 
  201.   curtail = curhead ; 
  202.   initspan ( curalign ) ; 
  203. }
  204.  
  205. void initcol ( void )
  206. { initcol_regmem 
  207.  
  208.   extrainfo ( curalign ) = curcmd ; 
  209.   if ( curcmd == 63 ) 
  210.     alignstate = 0 ; 
  211.   else {
  212.     backinput () ; 
  213.     begintokenlist ( upart ( curalign ) , utemplate ) ; 
  214.   } 
  215. }
  216.  
  217. boolean fincol ( void )
  218. {/* 10 */ fincol_regmem 
  219.   register halfword p  ; 
  220.   register halfword q, r  ; 
  221.   register halfword s  ; 
  222.   register halfword u  ; 
  223.   register scaled w  ; 
  224.   register glueord o  ; 
  225.   register halfword n  ; 
  226.  
  227.   if ( curalign == 0 ) 
  228.     confusion("endv"); /* 902 */
  229.   q = link ( curalign ) ; 
  230.   if ( q == 0 )
  231.     confusion("endv"); /* 902 */
  232.   if ( alignstate < 500000L ) 
  233.     fatalerror( STR_H_FE_INTERWOVEN );
  234.   p = link ( q ) ; 
  235.   if ( ( p == 0 ) && ( extrainfo ( curalign ) < crcode ) ) 
  236.   if ( curloop != 0 ) {
  237.     link ( q ) = newnullbox () ; 
  238.     p = link ( q ) ; 
  239.     info ( p ) = endspan ; 
  240.     width ( p ) = nullflag ; 
  241.     curloop = link ( curloop ) ; 
  242.     q = holdhead ; 
  243.     r = upart ( curloop ) ; 
  244.     while ( r != 0 ) {
  245.       link ( q ) = getavail () ; 
  246.       q = link ( q ) ; 
  247.       info ( q ) = info ( r ) ; 
  248.       r = link ( r ) ; 
  249.     } 
  250.     link ( q ) = 0 ; 
  251.     upart ( p ) = link ( holdhead ) ; 
  252.     q = holdhead ; 
  253.     r = vpart ( curloop ) ; 
  254.     while ( r != 0 ) {
  255.       link ( q ) = getavail () ; 
  256.       q = link ( q ) ; 
  257.       info ( q ) = info ( r ) ; 
  258.       r = link ( r ) ; 
  259.     } 
  260.     link ( q ) = 0 ; 
  261.     vpart ( p ) = link ( holdhead ) ; 
  262.     curloop = link ( curloop ) ; 
  263.     link ( p ) = newglue ( glueptr ( curloop ) ) ; 
  264.   } else {
  265.     print_err("Extra alignment tab has been changed to ");
  266.     printesc( STR_CR );
  267.     zhelp1( STR_H_YOUHAVE_SPANORTAB );
  268.     extrainfo ( curalign ) = crcode ; 
  269.     error () ; 
  270.   }
  271.   if ( extrainfo ( curalign ) != spancode ) {
  272.     unsave () ; 
  273.     newsavelevel ( aligngroup ) ; 
  274.     {
  275.       if ( curlist .modefield == -hmode ) {
  276.     adjusttail = curtail ; 
  277.     u = hpack ( link ( curlist .headfield ) , 0 , 1 ) ; 
  278.     w = width ( u ) ; 
  279.     curtail = adjusttail ; 
  280.     adjusttail = 0 ; 
  281.       } else {
  282.     u = vpackage ( link ( curlist .headfield ) , 0 , 1 , 0 ) ; 
  283.     w = height ( u ) ; 
  284.       } 
  285.       n = 0 ; 
  286.       if ( curspan != curalign ) {
  287.     q = curspan ; 
  288.     do {
  289.       incr ( n ) ; 
  290.       q = link ( link ( q ) ) ; 
  291.     } while ( ! ( q == curalign ) ) ; 
  292.     if ( n > maxquarterword ) 
  293.       confusion("256 spans"); /* 907 */
  294.     q = curspan ; 
  295.     while ( link ( info ( q ) ) < n ) q = info ( q ) ; 
  296.     if ( link ( info ( q ) ) > n ) {
  297.       s = getnode ( spannodesize ) ; 
  298.       info ( s ) = info ( q ) ; 
  299.       link ( s ) = n ; 
  300.       info ( q ) = s ; 
  301.       width ( s ) = w ; 
  302.     }
  303.     else if ( width ( info ( q ) ) < w ) 
  304.     width ( info ( q ) ) = w ; 
  305.       }
  306.       else if ( w > width ( curalign ) ) 
  307.       width ( curalign ) = w ; 
  308.       ztype ( u ) = unsetnode ; 
  309.       spancount ( u ) = n ; 
  310.       if ( totalstretch [ filll ] != 0 ) 
  311.     o = filll ; 
  312.       else if ( totalstretch [ fill ] != 0 ) 
  313.     o = fill ; 
  314.       else if ( totalstretch [ fil ] != 0 ) 
  315.     o = fil ; 
  316.       else
  317.     o = normal ; 
  318.       glueorder ( u ) = o ; 
  319.       gluestretch ( u ) = totalstretch [ o ] ; 
  320.       if ( totalshrink [ filll ] != 0 ) 
  321.     o = filll ; 
  322.       else if ( totalshrink [ fill ] != 0 ) 
  323.     o = fill ; 
  324.       else if ( totalshrink [ fil ] != 0 ) 
  325.     o = fil ; 
  326.       else
  327.     o = normal ; 
  328.       gluesign ( u ) = o ; 
  329.       glueshrink ( u ) = totalshrink [ o ] ; 
  330.       popnest () ; 
  331.       link ( curlist .tailfield ) = u ; 
  332.       curlist .tailfield = u ; 
  333.     }
  334.     tailappend ( newglue ( glueptr ( link ( curalign ) ) ) ) ; 
  335.     subtype ( curlist .tailfield ) = tabskipcode + 1 ; 
  336.     if ( extrainfo ( curalign ) >= crcode ) {
  337.       return(true) ; 
  338.     }
  339.     initspan ( p ) ; 
  340.   }
  341.   alignstate = 1000000L ;
  342. #if 0
  343.   do {
  344.     getxtoken () ; 
  345.   } while ( ! ( curcmd != 10 ) ) ; 
  346. #else
  347.   getxnbtoken(0);
  348. #endif
  349.   curalign = p ; 
  350.   initcol () ; 
  351.  
  352.   return(false);
  353. }
  354.  
  355. void finrow ( void )
  356. { finrow_regmem 
  357.   register halfword p  ; 
  358.  
  359.   if ( curlist .modefield == -hmode ) {
  360.     p = hpack ( link ( curlist .headfield ) , 0 , 1 ) ; 
  361.     popnest () ; 
  362.     appendtovlist ( p ) ; 
  363.     if ( curhead != curtail ) {
  364.       link ( curlist .tailfield ) = link ( curhead ) ; 
  365.       curlist .tailfield = curtail ; 
  366.     } 
  367.   } else {
  368.     p = vpackage ( link ( curlist .headfield ) , 0 , 1 , maxdimen ) ; 
  369.     popnest () ; 
  370.     link ( curlist .tailfield ) = p ; 
  371.     curlist .tailfield = p ; 
  372.     curlist .auxfield .hh .v.LH = 1000 ; 
  373.   } 
  374.   ztype ( p ) = unsetnode ; 
  375.   gluestretch ( p ) = 0 ; 
  376.   if ( everycr != 0 )
  377.     begintokenlist ( everycr , everycrtext ) ; 
  378.   alignpeek () ; 
  379. }
  380.  
  381. void finalign ( void )
  382. { finalign_regmem 
  383.   register halfword p, q, r, s, u, v  ; 
  384.   register scaled t, w  ; 
  385.   register scaled o  ; 
  386.   register halfword n  ; 
  387.   register scaled rulesave  ; 
  388.   memoryword auxsave  ; 
  389.  
  390.   if ( curgroup != aligngroup ) 
  391.     confusion("align1"); /* 908 */
  392.   unsave () ; 
  393.   if ( curgroup != aligngroup ) 
  394.     confusion("align2"); /* 909 */
  395.   unsave () ; 
  396.   if ( nest [ nestptr - 1 ] .modefield == mmode ) 
  397.     o = displayindent ; 
  398.   else o = 0 ; 
  399.   q = link ( preamble ) ; 
  400.   do {
  401.     flushlist ( upart ( q ) ) ; 
  402.     flushlist ( vpart ( q ) ) ; 
  403.     p = link ( link ( q ) ) ; 
  404.     if ( width ( q ) == nullflag ) {
  405.       width ( q ) = 0 ; 
  406.       r = link ( q ) ; 
  407.       s = glueptr ( r ) ; 
  408.       if ( s != zeroglue ) {
  409.     addglueref ( zeroglue ) ; 
  410.     deleteglueref ( s ) ; 
  411.     glueptr ( r ) = zeroglue ; 
  412.       } 
  413.     }
  414.     if ( info ( q ) != endspan ) {
  415.       t = width ( q ) + width ( glueptr ( link ( q ) ) ) ; 
  416.       r = info ( q ) ; 
  417.       s = endspan ; 
  418.       info ( s ) = p ; 
  419.       n = 1 ; 
  420.       do {
  421.     width ( r ) = width ( r ) - t ; 
  422.     u = info ( r ) ; 
  423.     while ( link ( r ) > n ) {
  424.       s = info ( s ) ; 
  425.       n = link ( info ( s ) ) + 1 ; 
  426.     } 
  427.     if ( link ( r ) < n ) {
  428.       info ( r ) = info ( s ) ; 
  429.       info ( s ) = r ; 
  430.       decr ( link ( r ) ) ; 
  431.       s = r ; 
  432.     } else {
  433.       if ( width ( r ) > width ( info ( s ) ) ) 
  434.         width ( info ( s ) ) = width ( r ) ; 
  435.       freenode ( r , spannodesize ) ; 
  436.     }
  437.     r = u ; 
  438.       } while ( ! ( r == endspan ) ) ; 
  439.     }
  440.     ztype ( q ) = unsetnode ; 
  441.     spancount ( q ) = 0 ; 
  442.     height ( q ) = 0 ; 
  443.     depth ( q ) = 0 ; 
  444.     glueorder ( q ) = normal ; 
  445.     gluesign ( q ) = normal ; 
  446.     gluestretch ( q ) = 0 ; 
  447.     glueshrink ( q ) = 0 ; 
  448.     q = p ; 
  449.   } while ( ! ( q == 0 ) ) ; 
  450.   saveptr = saveptr - 2 ; 
  451.   packbeginline = - (integer) curlist .mlfield ; 
  452.   if ( curlist .modefield == -vmode ) {
  453.     rulesave = overfullrule ; 
  454.     overfullrule = 0 ; 
  455.     p = hpack ( preamble , saved ( 1 ) , saved ( 0 ) ) ; 
  456.     overfullrule = rulesave ; 
  457.   } else {
  458.     q = link ( preamble ) ; 
  459.     do {
  460.       height ( q ) = width ( q ) ; 
  461.       width ( q ) = 0 ; 
  462.       q = link ( link ( q ) ) ; 
  463.     } while ( ! ( q == 0 ) ) ; 
  464.     p = vpackage ( preamble , saved ( 1 ) , saved ( 0 ) , maxdimen ) ; 
  465.     q = link ( preamble ) ; 
  466.     do {
  467.       width ( q ) = height ( q ) ; 
  468.       height ( q ) = 0 ; 
  469.       q = link ( link ( q ) ) ; 
  470.     } while ( ! ( q == 0 ) ) ; 
  471.   }
  472.   packbeginline = 0 ; 
  473.   q = link ( curlist .headfield ) ; 
  474.   s = curlist .headfield ; 
  475.   while ( q != 0 ) {
  476.     if ( ! ischarnode ( q ) ) 
  477.     if ( ztype ( q ) == unsetnode ) {
  478.       if ( curlist .modefield == -vmode ) {
  479.     ztype ( q ) = hlistnode ; 
  480.     width ( q ) = width ( p ) ; 
  481.       } else {
  482.     ztype ( q ) = vlistnode ; 
  483.     height ( q ) = height ( p ) ; 
  484.       } 
  485.       glueorder ( q ) = glueorder ( p ) ; 
  486.       gluesign ( q ) = gluesign ( p ) ; 
  487.       glueset ( q ) = glueset ( p ) ; 
  488.       shiftamount ( q ) = o ; 
  489.       r = link ( listptr ( q ) ) ; 
  490.       s = link ( listptr ( p ) ) ; 
  491.       do {
  492.     n = spancount ( r ) ; 
  493.     t = width ( s ) ; 
  494.     w = t ; 
  495.     u = holdhead ; 
  496.     while ( n > 0 ) {
  497.       decr ( n ) ; 
  498.       s = link ( s ) ; 
  499.       v = glueptr ( s ) ; 
  500.       link ( u ) = newglue ( v ) ; 
  501.       u = link ( u ) ; 
  502.       subtype ( u ) = tabskipcode + 1 ; 
  503.       t = t + width ( v ) ; 
  504.       if ( gluesign ( p ) == stretching ) {
  505.         if ( stretchorder ( v ) == glueorder ( p ) ) 
  506.         t = t + round ( glueset ( p ) * stretch ( v ) ) ; 
  507.       } else if ( gluesign ( p ) == shrinking ) {
  508.         if ( shrinkorder ( v ) == glueorder ( p ) ) 
  509.         t = t - round ( glueset ( p ) * shrink ( v ) ) ; 
  510.       }
  511.       s = link ( s ) ; 
  512.       link ( u ) = newnullbox () ; 
  513.       u = link ( u ) ; 
  514.       t = t + width ( s ) ; 
  515.       if ( curlist .modefield == -vmode ) 
  516.         width ( u ) = width ( s ) ; 
  517.       else {
  518.         ztype ( u ) = vlistnode ; 
  519.         height ( u ) = width ( s ) ; 
  520.       } 
  521.     }
  522.     if ( curlist .modefield == -vmode ) {
  523.       height ( r ) = height ( q ) ; 
  524.       depth ( r ) = depth ( q ) ; 
  525.       if ( t == width ( r ) ) {
  526.         gluesign ( r ) = normal ; 
  527.         glueorder ( r ) = normal ; 
  528.         glueset ( r ) = 0.0 ; 
  529.       } else if ( t > width ( r ) ) {
  530.         gluesign ( r ) = stretching ; 
  531.         if ( gluestretch ( r ) == 0 ) 
  532.         glueset ( r ) = 0.0 ; 
  533.         else glueset ( r ) = ( t - width ( r ) ) / ((double) gluestretch ( 
  534.         r ) ) ; 
  535.       } else {
  536.         glueorder ( r ) = gluesign ( r ) ; 
  537.         gluesign ( r ) = shrinking ; 
  538.         if ( glueshrink ( r ) == 0 ) 
  539.         glueset ( r ) = 0.0 ; 
  540.         else if ( ( glueorder ( r ) == normal ) && ( width ( r ) - t > 
  541.         glueshrink ( r ) ) ) 
  542.         glueset ( r ) = 1.0 ; 
  543.         else glueset ( r ) = ( width ( r ) - t ) / ((double) glueshrink ( 
  544.         r ) ) ; 
  545.       } 
  546.       width ( r ) = w ; 
  547.       ztype ( r ) = hlistnode ; 
  548.     } else {
  549.       width ( r ) = width ( q ) ; 
  550.       if ( t == height ( r ) ) {
  551.         gluesign ( r ) = normal ; 
  552.         glueorder ( r ) = normal ; 
  553.         glueset ( r ) = 0.0 ; 
  554.       } else if ( t > height ( r ) ) {
  555.         gluesign ( r ) = stretching ; 
  556.         if ( gluestretch ( r ) == 0 ) 
  557.         glueset ( r ) = 0.0 ; 
  558.         else glueset ( r ) = ( t - height ( r ) ) / ((double) gluestretch 
  559.         ( r ) ) ; 
  560.       } else {
  561.         glueorder ( r ) = gluesign ( r ) ; 
  562.         gluesign ( r ) = shrinking ; 
  563.         if ( glueshrink ( r ) == 0 ) 
  564.         glueset ( r ) = 0.0 ; 
  565.         else if ( ( glueorder ( r ) == normal ) && ( height ( r ) - t > 
  566.         glueshrink ( r ) ) ) 
  567.         glueset ( r ) = 1.0 ; 
  568.         else glueset ( r ) = ( height ( r ) - t ) / ((double) glueshrink ( 
  569.         r ) ) ; 
  570.       } 
  571.       height ( r ) = w ; 
  572.       ztype ( r ) = vlistnode ; 
  573.     }
  574.     shiftamount ( r ) = 0 ; 
  575.     if ( u != holdhead ) {
  576.       link ( u ) = link ( r ) ; 
  577.       link ( r ) = link ( holdhead ) ; 
  578.       r = u ; 
  579.     } 
  580.     r = link ( link ( r ) ) ; 
  581.     s = link ( link ( s ) ) ; 
  582.       } while ( ! ( r == 0 ) ) ; 
  583.     } else if ( ztype ( q ) == rulenode ) {
  584.       if ( isrunning ( width ( q ) ) ) 
  585.       width ( q ) = width ( p ) ; 
  586.       if ( isrunning ( height ( q ) ) ) 
  587.       height ( q ) = height ( p ) ; 
  588.       if ( isrunning ( depth ( q ) ) ) 
  589.       depth ( q ) = depth ( p ) ; 
  590.       if ( o != 0 ) {
  591.     r = link ( q ) ; 
  592.     link ( q ) = 0 ; 
  593.     q = hpack ( q , 0 , 1 ) ; 
  594.     shiftamount ( q ) = o ; 
  595.     link ( q ) = r ; 
  596.     link ( s ) = q ; 
  597.       } 
  598.     }
  599.     s = q ; 
  600.     q = link ( q ) ; 
  601.   }
  602.   flushnodelist ( p ) ; 
  603.   popalignment () ; 
  604.   auxsave = curlist .auxfield ; 
  605.   p = link ( curlist .headfield ) ; 
  606.   q = curlist .tailfield ; 
  607.   popnest () ; 
  608.   if ( curlist .modefield == mmode ) {
  609.     doassignments () ; 
  610.     if ( curcmd != 3 ) {
  611.       print_err("Missing $$ inserted");
  612.       zhelp1( STR_H_DISPLAYSCANUSE );
  613.       backerror () ; 
  614.     } else {
  615.       check_that_dollar_follows();
  616.     }
  617.     popnest () ; 
  618.     tailappend ( newpenalty ( predisplaypenalty ) ) ; 
  619.     tailappend ( newparamglue ( abovedisplayskipcode ) ) ; 
  620.     link ( curlist .tailfield ) = p ; 
  621.     if ( p != 0 ) 
  622.       curlist .tailfield = q ; 
  623.     tailappend ( newpenalty ( postdisplaypenalty ) ) ; 
  624.     tailappend ( newparamglue ( belowdisplayskipcode ) ) ; 
  625.     curlist .auxfield .cint = auxsave .cint ; 
  626.     resumeafterdisplay () ; 
  627.  
  628.   } else {
  629.  
  630.     curlist .auxfield = auxsave ; 
  631.     link ( curlist .tailfield ) = p ; 
  632.     if ( p != 0 ) 
  633.       curlist .tailfield = q;
  634.     if ( curlist .modefield == vmode ) 
  635.       buildpage ();
  636.   }
  637. }
  638.  
  639. void alignpeek ( void )
  640. { alignpeek_regmem 
  641.   register eightbits r_curcmd;
  642.  
  643. lab20:
  644.   alignstate = 1000000L ;
  645. #if 0
  646.   do {
  647.     r_curcmd = getxtoken () ; 
  648.   } while ( r_curcmd == 10 );
  649. #else
  650.   r_curcmd = getxnbtoken(0);
  651. #endif
  652.   if ( r_curcmd == 34 ) {
  653.     scanleftbrace () ; 
  654.     newsavelevel ( noaligngroup ) ; 
  655.     if ( curlist .modefield == -vmode ) 
  656.       normalparagraph () ; 
  657.   } else if ( r_curcmd == 2 ) 
  658.     finalign () ; 
  659.   else if ( ( r_curcmd == 5 ) && ( curchr == crcrcode ) ) 
  660.     goto lab20 ; 
  661.   else {
  662.     initrow () ; 
  663.     initcol () ; 
  664.   } 
  665. }
  666.  
  667. long_halfword finiteshrink ( halfword p )
  668. { finiteshrink_regmem 
  669.  
  670.   if ( noshrinkerroryet ) {
  671.     noshrinkerroryet = false ; 
  672.     print_err("Infinite glue shrinkage found in a paragraph");
  673.     zhelp2( STR_H_THEPARAGRAPHJUST, STR_H_SINCETHE_OFFENSIVE );
  674.     error();
  675.   }
  676.   { register long_halfword q;
  677.  
  678.   q = newspec ( p ) ; 
  679.   shrinkorder ( q ) = normal ; 
  680.   deleteglueref ( p ) ; 
  681.  
  682.   return(q) ;
  683.   }
  684. }
  685.  
  686. #if 0        /* in linebrk.c */
  687.  
  688. void ztrybreak ( pi , breaktype ) 
  689.  
  690. #endif
  691.