home *** CD-ROM | disk | FTP | other *** search
/ Atari FTP / ATARI_FTP_0693.zip / ATARI_FTP_0693 / Tex / texsrc.arc / TEX6.C < prev    next >
C/C++ Source or Header  |  1988-09-14  |  60KB  |  2,134 lines

  1. overlay "tex6"
  2. #define EXTERN extern
  3. #include "texd.h"
  4.  
  5. alignpeek () { /* 20 */ r_alignpeek 
  6.   lab20: alignstate = 1000000 ; 
  7.   do { getxtoken () ; 
  8.   } while ( ! ( curcmd != 10 ) ) ; 
  9.   if ( curcmd == 34 ) 
  10.   {
  11.     scanleftbrac () ; 
  12.     newsavelevel ( 7 ) ; 
  13.     if ( curlist .modefield == - 1 ) 
  14.     normalparagr () ; 
  15.   } 
  16.   else if ( curcmd == 2 ) 
  17.   finalign () ; 
  18.   else if ( ( curcmd == 5 ) && ( curchr == 130 ) ) 
  19.   goto lab20 ; 
  20.   else { 
  21.     initrow () ; 
  22.     initcol () ; 
  23.   } 
  24. halfword zfiniteshrink ( p ) 
  25. halfword p ; 
  26. {register halfword Result; r_finiteshrink 
  27.   halfword q ; 
  28.   if ( noshrinkerro ) 
  29.   {
  30.     noshrinkerro = false ; 
  31.     {
  32.       if ( interaction == 3 ) 
  33.       wakeuptermin () ; 
  34.       printnl ( 133 ) ; 
  35.       print ( 771 ) ; 
  36.     } 
  37.     {
  38.       helpptr = 5 ; 
  39.       helpline [ 4 ] = 772 ; 
  40.       helpline [ 3 ] = 773 ; 
  41.       helpline [ 2 ] = 774 ; 
  42.       helpline [ 1 ] = 775 ; 
  43.       helpline [ 0 ] = 776 ; 
  44.     } 
  45.     error () ; 
  46.   } 
  47.   q = newspec ( p ) ; 
  48.   mem [(long) q ] .hh.b1 = 0 ; 
  49.   deletegluere ( p ) ; 
  50.   Result = q ; 
  51.   return(Result) ; 
  52. ztrybreak ( pi , breaktype ) 
  53. integer pi ; 
  54. smallnumber breaktype ; 
  55. {/* 10 30 31 22 60 */ r_trybreak 
  56.   halfword r ; 
  57.   halfword prevr ; 
  58.   halfword oldl ; 
  59.   boolean nobreakyet ; 
  60.   halfword prevprevr ; 
  61.   halfword s ; 
  62.   halfword q ; 
  63.   halfword v ; 
  64.   integer t ; 
  65.   internalfont f ; 
  66.   halfword l ; 
  67.   boolean noderstaysac ; 
  68.   scaled linewidth ; 
  69.   quarterword fitclass ; 
  70.   halfword b ; 
  71.   integer d ; 
  72.   boolean artificialba ; 
  73.   halfword savelink ; 
  74.   scaled shortfall ; 
  75.   fourquarters qi;
  76.   if ( abs ( pi ) >= 10000 ) 
  77.   if ( pi > 0 ) 
  78.   goto lab10 ; 
  79.   else pi = - 10000 ; 
  80.   nobreakyet = true ; 
  81.   prevr = memtop - 7 ; 
  82.   oldl = 0 ; 
  83.   curactivewid [ 1 ] = activewidth [ 1 ] ; 
  84.   curactivewid [ 2 ] = activewidth [ 2 ] ; 
  85.   curactivewid [ 3 ] = activewidth [ 3 ] ; 
  86.   curactivewid [ 4 ] = activewidth [ 4 ] ; 
  87.   curactivewid [ 5 ] = activewidth [ 5 ] ; 
  88.   curactivewid [ 6 ] = activewidth [ 6 ] ; 
  89.   while ( true ) { 
  90.     lab22: r = mem [(long) prevr ] .hh .v.RH ; 
  91.     if ( mem [(long) r ] .hh.b0 == 2 ) 
  92.     {
  93.       curactivewid [ 1 ] = curactivewid [ 1 ] + mem [(long) r + 1 ] .cint ; 
  94.       curactivewid [ 2 ] = curactivewid [ 2 ] + mem [(long) r + 2 ] .cint ; 
  95.       curactivewid [ 3 ] = curactivewid [ 3 ] + mem [(long) r + 3 ] .cint ; 
  96.       curactivewid [ 4 ] = curactivewid [ 4 ] + mem [(long) r + 4 ] .cint ; 
  97.       curactivewid [ 5 ] = curactivewid [ 5 ] + mem [(long) r + 5 ] .cint ; 
  98.       curactivewid [ 6 ] = curactivewid [ 6 ] + mem [(long) r + 6 ] .cint ; 
  99.       prevprevr = prevr ; 
  100.       prevr = r ; 
  101.       goto lab22 ; 
  102.     } 
  103.     {
  104.       l = mem [(long) r + 1 ] .hh .v.LH ; 
  105.       if ( l > oldl ) 
  106.       {
  107.     if ( ( minimumdemer < 1073741823 ) && ( ( oldl != easyline ) || ( r == 
  108.     memtop - 7 ) ) ) 
  109.     {
  110.       if ( nobreakyet ) 
  111.       {
  112.         nobreakyet = false ; 
  113.         breakwidth [ 1 ] = background [ 1 ] ; 
  114.         breakwidth [ 2 ] = background [ 2 ] ; 
  115.         breakwidth [ 3 ] = background [ 3 ] ; 
  116.         breakwidth [ 4 ] = background [ 4 ] ; 
  117.         breakwidth [ 5 ] = background [ 5 ] ; 
  118.         breakwidth [ 6 ] = background [ 6 ] ; 
  119.         s = curp ; 
  120.         if ( breaktype > 0 ) 
  121.         if ( curp != 0 ) 
  122.         {
  123.           t = mem [(long) curp ] .hh.b1 ; 
  124.           v = curp ; 
  125.           s = mem [(long) curp + 1 ] .hh .v.RH ; 
  126.           while ( t > 0 ) { 
  127.         decr ( t ) ; 
  128.         v = mem [(long) v ] .hh .v.RH ; 
  129.         if ( ( v >= himemmin ) ) 
  130.         {
  131.           f = mem [(long) v ] .hh.b0 ; 
  132. /*          breakwidth [ 1 ] = breakwidth [ 1 ] - fontinfo [ widthbase [ 
  133.           f ] + fontinfo [ charbase [ f ] + mem [(long) v ] .hh.b1 ] .qqqq 
  134.           .b0 ] .cint ; 
  135. */
  136.     qi = fontinfo [ charbase [ f ] + mem [(long) v ] .hh.b1 ] .qqqq;
  137.     breakwidth [ 1 ] = breakwidth [ 1 ] - fontinfo [ widthbase [  f ]
  138.                +  qi .b0 ] .cint ; 
  139.         } 
  140.         else switch ( mem [(long) v ] .hh.b0 ) 
  141.         {case 6 : 
  142.           {
  143.             f = mem [(long) v + 1 ] .hh.b0 ; 
  144. /*            breakwidth [ 1 ] = breakwidth [ 1 ] - fontinfo [ widthbase 
  145.             [ f ] + fontinfo [ charbase [ f ] + mem [(long) v + 1 ] .hh.b1 ] 
  146.             .qqqq .b0 ] .cint ; 
  147. */
  148.    qi = fontinfo [ charbase [ f ] + mem [(long) v + 1 ] .hh.b1 ].qqqq;
  149.             breakwidth [ 1 ] = breakwidth [ 1 ] - fontinfo [ widthbase 
  150.             [ f ] +qi.b0 ] .cint ; 
  151.           } 
  152.           break ; 
  153.         case 0 : 
  154.         case 1 : 
  155.         case 2 : 
  156.         case 11 : 
  157.           breakwidth [ 1 ] = breakwidth [ 1 ] - mem [(long) v + 1 ] .cint ; 
  158.           break ; 
  159.         default : 
  160.           confusion ( 777 ) ; 
  161.           break ; 
  162.         } 
  163.           } 
  164.           while ( s != 0 ) { 
  165.         if ( ( s >= himemmin ) ) 
  166.         {
  167.           f = mem [(long) s ] .hh.b0 ; 
  168. /*          breakwidth [ 1 ] = breakwidth [ 1 ] + fontinfo [ widthbase [ 
  169.           f ] + fontinfo [ charbase [ f ] + mem [(long) s ] .hh.b1 ] .qqqq 
  170.           .b0 ] .cint ; 
  171. */
  172.     qi = fontinfo [ charbase [ f ] + mem [(long) s ] .hh.b1 ] .qqqq;
  173.     breakwidth [ 1 ] = breakwidth [ 1 ] + fontinfo [ widthbase [  f ]
  174.                +  qi .b0 ] .cint ; 
  175.         } 
  176.         else switch ( mem [(long) s ] .hh.b0 ) 
  177.         {case 6 : 
  178.           {
  179.             f = mem [(long) s + 1 ] .hh.b0 ; 
  180. /*            breakwidth [ 1 ] = breakwidth [ 1 ] + fontinfo [ widthbase 
  181.             [ f ] + fontinfo [ charbase [ f ] + mem [(long) s + 1 ] .hh.b1 ] 
  182.             .qqqq .b0 ] .cint ; 
  183. */
  184.    qi = fontinfo [ charbase [ f ] + mem [(long) s + 1 ] .hh.b1 ].qqqq;
  185.             breakwidth [ 1 ] = breakwidth [ 1 ] + fontinfo [ widthbase 
  186.             [ f ] +qi.b0 ] .cint ; 
  187.           } 
  188.           break ; 
  189.         case 0 : 
  190.         case 1 : 
  191.         case 2 : 
  192.           breakwidth [ 1 ] = breakwidth [ 1 ] + mem [(long) s + 1 ] .cint ; 
  193.           break ; 
  194.         case 11 : 
  195.           if ( ( t == 0 ) && ( mem [(long) s ] .hh.b1 != 2 ) ) 
  196.           t = - 1 ; 
  197.           else breakwidth [ 1 ] = breakwidth [ 1 ] + mem [(long) s + 1 ] 
  198.           .cint ; 
  199.           break ; 
  200.         default : 
  201.           confusion ( 778 ) ; 
  202.           break ; 
  203.         } 
  204.         incr ( t ) ; 
  205.         s = mem [(long) s ] .hh .v.RH ; 
  206.           } 
  207.           breakwidth [ 1 ] = breakwidth [ 1 ] + discwidth ; 
  208.           if ( t == 0 ) 
  209.           s = mem [(long) v ] .hh .v.RH ; 
  210.         } 
  211.         while ( s != 0 ) { 
  212.           if ( ( s >= himemmin ) ) 
  213.           goto lab30 ; 
  214.           switch ( mem [(long) s ] .hh.b0 ) 
  215.           {case 10 : 
  216.         {
  217.           v = mem [(long) s + 1 ] .hh .v.LH ; 
  218.           breakwidth [ 1 ] = breakwidth [ 1 ] - mem [(long) v + 1 ] .cint ; 
  219.           breakwidth [ 2 + mem [(long) v ] .hh.b0 ] = breakwidth [ 2 + mem [(long) 
  220.           v ] .hh.b0 ] - mem [(long) v + 2 ] .cint ; 
  221.           breakwidth [ 6 ] = breakwidth [ 6 ] - mem [(long) v + 3 ] .cint ; 
  222.         } 
  223.         break ; 
  224.           case 12 : 
  225.         ; 
  226.         break ; 
  227.           case 9 : 
  228.           case 11 : 
  229.         if ( mem [(long) s ] .hh.b1 == 2 ) 
  230.         goto lab30 ; 
  231.         else breakwidth [ 1 ] = breakwidth [ 1 ] - mem [(long) s + 1 ] .cint 
  232.         ; 
  233.         break ; 
  234.           default : 
  235.         goto lab30 ; 
  236.         break ; 
  237.           } 
  238.           s = mem [(long) s ] .hh .v.RH ; 
  239.         } 
  240.         lab30: ; 
  241.       } 
  242.       if ( mem [(long) prevr ] .hh.b0 == 2 ) 
  243.       {
  244.         mem [(long) prevr + 1 ] .cint = mem [(long) prevr + 1 ] .cint - curactivewid [ 
  245.         1 ] + breakwidth [ 1 ] ; 
  246.         mem [(long) prevr + 2 ] .cint = mem [(long) prevr + 2 ] .cint - curactivewid [ 
  247.         2 ] + breakwidth [ 2 ] ; 
  248.         mem [(long) prevr + 3 ] .cint = mem [(long) prevr + 3 ] .cint - curactivewid [ 
  249.         3 ] + breakwidth [ 3 ] ; 
  250.         mem [(long) prevr + 4 ] .cint = mem [(long) prevr + 4 ] .cint - curactivewid [ 
  251.         4 ] + breakwidth [ 4 ] ; 
  252.         mem [(long) prevr + 5 ] .cint = mem [(long) prevr + 5 ] .cint - curactivewid [ 
  253.         5 ] + breakwidth [ 5 ] ; 
  254.         mem [(long) prevr + 6 ] .cint = mem [(long) prevr + 6 ] .cint - curactivewid [ 
  255.         6 ] + breakwidth [ 6 ] ; 
  256.       } 
  257.       else if ( prevr == memtop - 7 ) 
  258.       {
  259.         activewidth [ 1 ] = breakwidth [ 1 ] ; 
  260.         activewidth [ 2 ] = breakwidth [ 2 ] ; 
  261.         activewidth [ 3 ] = breakwidth [ 3 ] ; 
  262.         activewidth [ 4 ] = breakwidth [ 4 ] ; 
  263.         activewidth [ 5 ] = breakwidth [ 5 ] ; 
  264.         activewidth [ 6 ] = breakwidth [ 6 ] ; 
  265.       } 
  266.       else { 
  267.         q = getnode ( 7 ) ; 
  268.         mem [(long) q ] .hh .v.RH = r ; 
  269.         mem [(long) q ] .hh.b0 = 2 ; 
  270.         mem [(long) q ] .hh.b1 = 0 ; 
  271.         mem [(long) q + 1 ] .cint = breakwidth [ 1 ] - curactivewid [ 1 ] ; 
  272.         mem [(long) q + 2 ] .cint = breakwidth [ 2 ] - curactivewid [ 2 ] ; 
  273.         mem [(long) q + 3 ] .cint = breakwidth [ 3 ] - curactivewid [ 3 ] ; 
  274.         mem [(long) q + 4 ] .cint = breakwidth [ 4 ] - curactivewid [ 4 ] ; 
  275.         mem [(long) q + 5 ] .cint = breakwidth [ 5 ] - curactivewid [ 5 ] ; 
  276.         mem [(long) q + 6 ] .cint = breakwidth [ 6 ] - curactivewid [ 6 ] ; 
  277.         mem [(long) prevr ] .hh .v.RH = q ; 
  278.         prevprevr = prevr ; 
  279.         prevr = q ; 
  280.       } 
  281.       minimumdemer = minimumdemer + abs ( eqtb [ 5283 ] .cint ) ; 
  282.       for ( fitclass = 0 ; fitclass <= 3 ; fitclass ++ ) 
  283.       {
  284.         if ( minimaldemer [ fitclass ] <= minimumdemer ) 
  285.         {
  286.           q = getnode ( 2 ) ; 
  287.           mem [(long) q ] .hh .v.RH = passive ; 
  288.           passive = q ; 
  289.           mem [(long) q + 1 ] .hh .v.RH = curp ; 
  290.  
  291. #ifdef STAT
  292.           incr ( passnumber ) ; 
  293.           mem [(long) q ] .hh .v.LH = passnumber ; 
  294. #endif /* STAT */
  295.           mem [(long) q + 1 ] .hh .v.LH = bestplace [ fitclass ] ; 
  296.           q = getnode ( 3 ) ; 
  297.           mem [(long) q + 1 ] .hh .v.RH = passive ; 
  298.           mem [(long) q + 1 ] .hh .v.LH = bestplline [ fitclass ] + 1 ; 
  299.           mem [(long) q ] .hh.b1 = fitclass ; 
  300.           mem [(long) q ] .hh.b0 = breaktype ; 
  301.           mem [(long) q + 2 ] .cint = minimaldemer [ fitclass ] ; 
  302.           mem [(long) q ] .hh .v.RH = r ; 
  303.           mem [(long) prevr ] .hh .v.RH = q ; 
  304.           prevr = q ; 
  305.  
  306. #ifdef STAT
  307.           if ( eqtb [ 5299 ] .cint > 0 ) 
  308.           {
  309.         printnl ( 779 ) ; 
  310.         printint ( mem [(long) passive ] .hh .v.LH ) ; 
  311.         print ( 780 ) ; 
  312.         printint ( mem [(long) q + 1 ] .hh .v.LH - 1 ) ; 
  313.         printchar ( 46 ) ; 
  314.         printint ( fitclass ) ; 
  315.         if ( breaktype == 1 ) 
  316.         printchar ( 45 ) ; 
  317.         print ( 781 ) ; 
  318.         printint ( mem [(long) q + 2 ] .cint ) ; 
  319.         print ( 782 ) ; 
  320.         if ( mem [(long) passive + 1 ] .hh .v.LH == 0 ) 
  321.         printchar ( 48 ) ; 
  322.         else printint ( mem [(long) mem [(long) passive + 1 ] .hh .v.LH ] .hh 
  323.         .v.LH ) ; 
  324.           } 
  325. #endif /* STAT */
  326.         } 
  327.         minimaldemer [ fitclass ] = 1073741823 ; 
  328.       } 
  329.       minimumdemer = 1073741823 ; 
  330.       if ( r != memtop - 7 ) 
  331.       {
  332.         q = getnode ( 7 ) ; 
  333.         mem [(long) q ] .hh .v.RH = r ; 
  334.         mem [(long) q ] .hh.b0 = 2 ; 
  335.         mem [(long) q ] .hh.b1 = 0 ; 
  336.         mem [(long) q + 1 ] .cint = curactivewid [ 1 ] - breakwidth [ 1 ] ; 
  337.         mem [(long) q + 2 ] .cint = curactivewid [ 2 ] - breakwidth [ 2 ] ; 
  338.         mem [(long) q + 3 ] .cint = curactivewid [ 3 ] - breakwidth [ 3 ] ; 
  339.         mem [(long) q + 4 ] .cint = curactivewid [ 4 ] - breakwidth [ 4 ] ; 
  340.         mem [(long) q + 5 ] .cint = curactivewid [ 5 ] - breakwidth [ 5 ] ; 
  341.         mem [(long) q + 6 ] .cint = curactivewid [ 6 ] - breakwidth [ 6 ] ; 
  342.         mem [(long) prevr ] .hh .v.RH = q ; 
  343.         prevprevr = prevr ; 
  344.         prevr = q ; 
  345.       } 
  346.     } 
  347.     if ( r == memtop - 7 ) 
  348.     goto lab10 ; 
  349.     if ( l > easyline ) 
  350.     {
  351.       linewidth = secondwidth ; 
  352.       oldl = 65534 ; 
  353.     } 
  354.     else { 
  355.       oldl = l ; 
  356.       if ( l > lastspeciall ) 
  357.       linewidth = secondwidth ; 
  358.       else if ( eqtb [ 4056 ] .hh .v.RH == 0 ) 
  359.       linewidth = firstwidth ; 
  360.       else linewidth = mem [(long) eqtb [ 4056 ] .hh .v.RH + 2 * l ] .cint ; 
  361.     } 
  362.       } 
  363.     } 
  364.     {
  365.  
  366. #ifdef STAT
  367.       artificialba = false ; 
  368. #endif /* STAT */
  369.       shortfall = linewidth - curactivewid [ 1 ] ; 
  370.       if ( shortfall > 0 ) 
  371.       if ( ( curactivewid [ 3 ] != 0 ) || ( curactivewid [ 4 ] != 0 ) || ( 
  372.       curactivewid [ 5 ] != 0 ) ) 
  373.       {
  374.     b = 0 ; 
  375.     fitclass = 2 ; 
  376.       } 
  377.       else { 
  378.     if ( shortfall > 7230584 ) 
  379.     if ( curactivewid [ 2 ] < 1663497 ) 
  380.     {
  381.       b = 10000 ; 
  382.       fitclass = 0 ; 
  383.       goto lab31 ; 
  384.     } 
  385.     b = badness ( shortfall , curactivewid [ 2 ] ) ; 
  386.     if ( b > 12 ) 
  387.     if ( b > 99 ) 
  388.     fitclass = 0 ; 
  389.     else fitclass = 1 ; 
  390.     else fitclass = 2 ; 
  391.     lab31: ; 
  392.       } 
  393.       else { 
  394.     if ( - shortfall > curactivewid [ 6 ] ) 
  395.     b = 10001 ; 
  396.     else b = badness ( - shortfall , curactivewid [ 6 ] ) ; 
  397.     if ( b > 12 ) 
  398.     fitclass = 3 ; 
  399.     else fitclass = 2 ; 
  400.       } 
  401.       if ( ( b > 10000 ) || ( pi == - 10000 ) ) 
  402.       {
  403.     if ( secondpass && ( minimumdemer == 1073741823 ) && ( mem [(long) r ] .hh 
  404.     .v.RH == memtop - 7 ) && ( prevr == memtop - 7 ) ) 
  405.     {
  406.       b = 0 ; 
  407.  
  408. #ifdef STAT
  409.       artificialba = true ; 
  410. #endif /* STAT */
  411.     } 
  412.     else if ( b > threshold ) 
  413.     goto lab60 ; 
  414.     noderstaysac = false ; 
  415.       } 
  416.       else { 
  417.     prevr = r ; 
  418.     if ( b > threshold ) 
  419.     goto lab22 ; 
  420.     noderstaysac = true ; 
  421.       } 
  422.       d = eqtb [ 5269 ] .cint + b ; 
  423.       d = d * d ; 
  424.       if ( pi != 0 ) 
  425.       if ( pi > 0 ) 
  426.       d = d + pi * pi ; 
  427.       else if ( pi > - 10000 ) 
  428.       d = d - pi * pi ; 
  429.       if ( ( breaktype == 1 ) && ( mem [(long) r ] .hh.b0 == 1 ) ) 
  430.       if ( curp != 0 ) 
  431.       d = d + eqtb [ 5281 ] .cint ; 
  432.       else d = d + eqtb [ 5282 ] .cint ; 
  433.       if ( abs ( toint ( fitclass ) - toint ( mem [(long) r ] .hh.b1 ) ) > 1 ) 
  434.       d = d + eqtb [ 5283 ] .cint ; 
  435.  
  436. #ifdef STAT
  437.       if ( eqtb [ 5299 ] .cint > 0 ) 
  438.       {
  439.     if ( printednode != curp ) 
  440.     {
  441.       printnl ( 206 ) ; 
  442.       if ( curp == 0 ) 
  443.       shortdisplay ( mem [(long) printednode ] .hh .v.RH ) ; 
  444.       else { 
  445.         savelink = mem [(long) curp ] .hh .v.RH ; 
  446.         mem [(long) curp ] .hh .v.RH = 0 ; 
  447.         printnl ( 206 ) ; 
  448.         shortdisplay ( mem [(long) printednode ] .hh .v.RH ) ; 
  449.         mem [(long) curp ] .hh .v.RH = savelink ; 
  450.       } 
  451.       printednode = curp ; 
  452.     } 
  453.     printnl ( 64 ) ; 
  454.     if ( curp == 0 ) 
  455.     printesc ( 455 ) ; 
  456.     else if ( mem [(long) curp ] .hh.b0 != 10 ) 
  457.     {
  458.       if ( mem [(long) curp ] .hh.b0 == 12 ) 
  459.       printesc ( 389 ) ; 
  460.       else if ( mem [(long) curp ] .hh.b0 == 7 ) 
  461.       printesc ( 217 ) ; 
  462.       else if ( mem [(long) curp ] .hh.b0 == 11 ) 
  463.       printesc ( 208 ) ; 
  464.       else printesc ( 211 ) ; 
  465.     } 
  466.     print ( 783 ) ; 
  467.     if ( mem [(long) r + 1 ] .hh .v.RH == 0 ) 
  468.     printchar ( 48 ) ; 
  469.     else printint ( mem [(long) mem [(long) r + 1 ] .hh .v.RH ] .hh .v.LH ) ; 
  470.     print ( 784 ) ; 
  471.     if ( artificialba ) 
  472.     printchar ( 42 ) ; 
  473.     else printint ( b ) ; 
  474.     print ( 785 ) ; 
  475.     printint ( pi ) ; 
  476.     print ( 786 ) ; 
  477.     printint ( d ) ; 
  478.       } 
  479. #endif /* STAT */
  480.       d = d + mem [(long) r + 2 ] .cint ; 
  481.       if ( d <= minimaldemer [ fitclass ] ) 
  482.       {
  483.     minimaldemer [ fitclass ] = d ; 
  484.     bestplace [ fitclass ] = mem [(long) r + 1 ] .hh .v.RH ; 
  485.     bestplline [ fitclass ] = l ; 
  486.     if ( d < minimumdemer ) 
  487.     minimumdemer = d ; 
  488.       } 
  489.       if ( noderstaysac ) 
  490.       goto lab22 ; 
  491.       lab60: mem [(long) prevr ] .hh .v.RH = mem [(long) r ] .hh .v.RH ; 
  492.       freenode ( r , 3 ) ; 
  493.       if ( prevr == memtop - 7 ) 
  494.       {
  495.     r = mem [(long) memtop - 7 ] .hh .v.RH ; 
  496.     if ( mem [(long) r ] .hh.b0 == 2 ) 
  497.     {
  498.       activewidth [ 1 ] = activewidth [ 1 ] + mem [(long) r + 1 ] .cint ; 
  499.       activewidth [ 2 ] = activewidth [ 2 ] + mem [(long) r + 2 ] .cint ; 
  500.       activewidth [ 3 ] = activewidth [ 3 ] + mem [(long) r + 3 ] .cint ; 
  501.       activewidth [ 4 ] = activewidth [ 4 ] + mem [(long) r + 4 ] .cint ; 
  502.       activewidth [ 5 ] = activewidth [ 5 ] + mem [(long) r + 5 ] .cint ; 
  503.       activewidth [ 6 ] = activewidth [ 6 ] + mem [(long) r + 6 ] .cint ; 
  504.       curactivewid [ 1 ] = activewidth [ 1 ] ; 
  505.       curactivewid [ 2 ] = activewidth [ 2 ] ; 
  506.       curactivewid [ 3 ] = activewidth [ 3 ] ; 
  507.       curactivewid [ 4 ] = activewidth [ 4 ] ; 
  508.       curactivewid [ 5 ] = activewidth [ 5 ] ; 
  509.       curactivewid [ 6 ] = activewidth [ 6 ] ; 
  510.       mem [(long) memtop - 7 ] .hh .v.RH = mem [(long) r ] .hh .v.RH ; 
  511.       freenode ( r , 7 ) ; 
  512.     } 
  513.       } 
  514.       else if ( mem [(long) prevr ] .hh.b0 == 2 ) 
  515.       {
  516.     r = mem [(long) prevr ] .hh .v.RH ; 
  517.     if ( r == memtop - 7 ) 
  518.     {
  519.       curactivewid [ 1 ] = curactivewid [ 1 ] - mem [(long) prevr + 1 ] .cint ; 
  520.       curactivewid [ 2 ] = curactivewid [ 2 ] - mem [(long) prevr + 2 ] .cint ; 
  521.       curactivewid [ 3 ] = curactivewid [ 3 ] - mem [(long) prevr + 3 ] .cint ; 
  522.       curactivewid [ 4 ] = curactivewid [ 4 ] - mem [(long) prevr + 4 ] .cint ; 
  523.       curactivewid [ 5 ] = curactivewid [ 5 ] - mem [(long) prevr + 5 ] .cint ; 
  524.       curactivewid [ 6 ] = curactivewid [ 6 ] - mem [(long) prevr + 6 ] .cint ; 
  525.       mem [(long) prevprevr ] .hh .v.RH = memtop - 7 ; 
  526.       freenode ( prevr , 7 ) ; 
  527.       prevr = prevprevr ; 
  528.     } 
  529.     else if ( mem [(long) r ] .hh.b0 == 2 ) 
  530.     {
  531.       curactivewid [ 1 ] = curactivewid [ 1 ] + mem [(long) r + 1 ] .cint ; 
  532.       curactivewid [ 2 ] = curactivewid [ 2 ] + mem [(long) r + 2 ] .cint ; 
  533.       curactivewid [ 3 ] = curactivewid [ 3 ] + mem [(long) r + 3 ] .cint ; 
  534.       curactivewid [ 4 ] = curactivewid [ 4 ] + mem [(long) r + 4 ] .cint ; 
  535.       curactivewid [ 5 ] = curactivewid [ 5 ] + mem [(long) r + 5 ] .cint ; 
  536.       curactivewid [ 6 ] = curactivewid [ 6 ] + mem [(long) r + 6 ] .cint ; 
  537.       mem [(long) prevr + 1 ] .cint = mem [(long) prevr + 1 ] .cint + mem [(long) r + 1 ] 
  538.       .cint ; 
  539.       mem [(long) prevr + 2 ] .cint = mem [(long) prevr + 2 ] .cint + mem [(long) r + 2 ] 
  540.       .cint ; 
  541.       mem [(long) prevr + 3 ] .cint = mem [(long) prevr + 3 ] .cint + mem [(long) r + 3 ] 
  542.       .cint ; 
  543.       mem [(long) prevr + 4 ] .cint = mem [(long) prevr + 4 ] .cint + mem [(long) r + 4 ] 
  544.       .cint ; 
  545.       mem [(long) prevr + 5 ] .cint = mem [(long) prevr + 5 ] .cint + mem [(long) r + 5 ] 
  546.       .cint ; 
  547.       mem [(long) prevr + 6 ] .cint = mem [(long) prevr + 6 ] .cint + mem [(long) r + 6 ] 
  548.       .cint ; 
  549.       mem [(long) prevr ] .hh .v.RH = mem [(long) r ] .hh .v.RH ; 
  550.       freenode ( r , 7 ) ; 
  551.     } 
  552.       } 
  553.     } 
  554.   } 
  555.   lab10: 
  556.  
  557. #ifdef STAT
  558.   if ( curp == printednode ) 
  559.   if ( curp != 0 ) 
  560.   if ( mem [(long) curp ] .hh.b0 == 7 ) 
  561.   {
  562.     t = mem [(long) curp ] .hh.b1 ; 
  563.     while ( t > 0 ) { 
  564.       decr ( t ) ; 
  565.       printednode = mem [(long) printednode ] .hh .v.RH ; 
  566.     } 
  567.   } 
  568. #endif /* STAT */
  569. ;
  570. zpostlinebrea ( finalwidowpe ) 
  571. integer finalwidowpe ; 
  572. {/* 30 31 */ r_postlinebrea 
  573.   halfword q, r, s ; 
  574.   boolean discbreak ; 
  575.   scaled curwidth ; 
  576.   scaled curindent ; 
  577.   quarterword t ; 
  578.   integer pen ; 
  579.   halfword curline ; 
  580.   q = mem [(long) bestbet + 1 ] .hh .v.RH ; 
  581.   curp = 0 ; 
  582.   do { r = q ; 
  583.     q = mem [(long) q + 1 ] .hh .v.LH ; 
  584.     mem [(long) r + 1 ] .hh .v.LH = curp ; 
  585.     curp = r ; 
  586.   } while ( ! ( q == 0 ) ) ; 
  587.   curline = curlist .pgfield + 1 ; 
  588.   do { q = mem [(long) curp + 1 ] .hh .v.RH ; 
  589.     discbreak = false ; 
  590.     if ( q != 0 ) 
  591.     if ( mem [(long) q ] .hh.b0 == 10 ) 
  592.     {
  593.       deletegluere ( mem [(long) q + 1 ] .hh .v.LH ) ; 
  594.       mem [(long) q + 1 ] .hh .v.LH = eqtb [ 3534 ] .hh .v.RH ; 
  595.       mem [(long) q ] .hh.b1 = 9 ; 
  596.       incr ( mem [(long) eqtb [ 3534 ] .hh .v.RH ] .hh .v.RH ) ; 
  597.       goto lab30 ; 
  598.     } 
  599.     else { 
  600.       if ( mem [(long) q ] .hh.b0 == 7 ) 
  601.       {
  602.     t = mem [(long) q ] .hh.b1 ; 
  603.     if ( t == 0 ) 
  604.     r = mem [(long) q ] .hh .v.RH ; 
  605.     else { 
  606.       r = q ; 
  607.       while ( t > 1 ) { 
  608.         r = mem [(long) r ] .hh .v.RH ; 
  609.         decr ( t ) ; 
  610.       } 
  611.       s = mem [(long) r ] .hh .v.RH ; 
  612.       if ( ! ( s >= himemmin ) ) 
  613.       if ( mem [(long) curp + 1 ] .hh .v.LH != 0 ) 
  614.       if ( mem [(long) mem [(long) curp + 1 ] .hh .v.LH + 1 ] .hh .v.RH == s ) 
  615.       s = r ; 
  616.       r = mem [(long) s ] .hh .v.RH ; 
  617.       mem [(long) s ] .hh .v.RH = 0 ; 
  618.       flushnodelis ( mem [(long) q ] .hh .v.RH ) ; 
  619.       mem [(long) q ] .hh.b1 = 0 ; 
  620.     } 
  621.     if ( mem [(long) q + 1 ] .hh .v.RH != 0 ) 
  622.     {
  623.       s = mem [(long) q + 1 ] .hh .v.RH ; 
  624.       while ( mem [(long) s ] .hh .v.RH != 0 ) s = mem [(long) s ] .hh .v.RH ; 
  625.       mem [(long) s ] .hh .v.RH = r ; 
  626.       r = mem [(long) q + 1 ] .hh .v.RH ; 
  627.       mem [(long) q + 1 ] .hh .v.RH = 0 ; 
  628.     } 
  629.     if ( mem [(long) q + 1 ] .hh .v.LH != 0 ) 
  630.     {
  631.       s = mem [(long) q + 1 ] .hh .v.LH ; 
  632.       mem [(long) q ] .hh .v.RH = s ; 
  633.       while ( mem [(long) s ] .hh .v.RH != 0 ) s = mem [(long) s ] .hh .v.RH ; 
  634.       mem [(long) q + 1 ] .hh .v.LH = 0 ; 
  635.       q = s ; 
  636.     } 
  637.     mem [(long) q ] .hh .v.RH = r ; 
  638.     discbreak = true ; 
  639.       } 
  640.       else if ( ( mem [(long) q ] .hh.b0 == 9 ) || ( mem [(long) q ] .hh.b0 == 11 ) ) 
  641.       mem [(long) q + 1 ] .cint = 0 ; 
  642.     } 
  643.     else { 
  644.       q = memtop - 3 ; 
  645.       while ( mem [(long) q ] .hh .v.RH != 0 ) q = mem [(long) q ] .hh .v.RH ; 
  646.     } 
  647.     r = newparamglue ( 8 ) ; 
  648.     mem [(long) r ] .hh .v.RH = mem [(long) q ] .hh .v.RH ; 
  649.     mem [(long) q ] .hh .v.RH = r ; 
  650.     q = r ; 
  651.     lab30: ; 
  652.     r = mem [(long) q ] .hh .v.RH ; 
  653.     mem [(long) q ] .hh .v.RH = 0 ; 
  654.     q = mem [(long) memtop - 3 ] .hh .v.RH ; 
  655.     mem [(long) memtop - 3 ] .hh .v.RH = r ; 
  656.     if ( eqtb [ 3533 ] .hh .v.RH != 0 ) 
  657.     {
  658.       r = newparamglue ( 7 ) ; 
  659.       mem [(long) r ] .hh .v.RH = q ; 
  660.       q = r ; 
  661.     } 
  662.     if ( curline > lastspeciall ) 
  663.     {
  664.       curwidth = secondwidth ; 
  665.       curindent = secondindent ; 
  666.     } 
  667.     else if ( eqtb [ 4056 ] .hh .v.RH == 0 ) 
  668.     {
  669.       curwidth = firstwidth ; 
  670.       curindent = firstindent ; 
  671.     } 
  672.     else { 
  673.       curwidth = mem [(long) eqtb [ 4056 ] .hh .v.RH + 2 * curline ] .cint ; 
  674.       curindent = mem [(long) eqtb [ 4056 ] .hh .v.RH + 2 * curline - 1 ] .cint ; 
  675.     } 
  676.     adjusttail = memtop - 5 ; 
  677.     justbox = hpack ( q , curwidth , 0 ) ; 
  678.     mem [(long) justbox + 4 ] .cint = curindent ; 
  679.     appendtovlis ( justbox ) ; 
  680.     if ( memtop - 5 != adjusttail ) 
  681.     {
  682.       mem [(long) curlist .tailfield ] .hh .v.RH = mem [(long) memtop - 5 ] .hh .v.RH ; 
  683.       curlist .tailfield = adjusttail ; 
  684.     } 
  685.     adjusttail = 0 ; 
  686.     if ( curline + 1 != bestline ) 
  687.     {
  688.       pen = eqtb [ 5280 ] .cint ; 
  689.       if ( curline == curlist .pgfield + 1 ) 
  690.       pen = pen + eqtb [ 5272 ] .cint ; 
  691.       if ( curline + 2 == bestline ) 
  692.       pen = pen + finalwidowpe ; 
  693.       if ( discbreak ) 
  694.       pen = pen + eqtb [ 5275 ] .cint ; 
  695.       if ( pen != 0 ) 
  696.       {
  697.     r = newpenalty ( pen ) ; 
  698.     mem [(long) curlist .tailfield ] .hh .v.RH = r ; 
  699.     curlist .tailfield = r ; 
  700.       } 
  701.     } 
  702.     incr ( curline ) ; 
  703.     curp = mem [(long) curp + 1 ] .hh .v.LH ; 
  704.     if ( curp != 0 ) 
  705.     {
  706.       r = memtop - 3 ; 
  707.       while ( true ) { 
  708.     q = mem [(long) r ] .hh .v.RH ; 
  709.     if ( q == mem [(long) curp + 1 ] .hh .v.RH ) 
  710.     goto lab31 ; 
  711.     if ( ( q >= himemmin ) ) 
  712.     goto lab31 ; 
  713.     if ( ( mem [(long) q ] .hh.b0 < 9 ) ) 
  714.     goto lab31 ; 
  715.     if ( mem [(long) q ] .hh.b1 == 2 ) 
  716.     if ( mem [(long) q ] .hh.b0 == 11 ) 
  717.     goto lab31 ; 
  718.     r = q ; 
  719.       } 
  720.       lab31: if ( r != memtop - 3 ) 
  721.       {
  722.     mem [(long) r ] .hh .v.RH = 0 ; 
  723.     flushnodelis ( mem [(long) memtop - 3 ] .hh .v.RH ) ; 
  724.     mem [(long) memtop - 3 ] .hh .v.RH = q ; 
  725.       } 
  726.     } 
  727.   } while ( ! ( curp == 0 ) ) ; 
  728.   if ( ( curline != bestline ) || ( mem [(long) memtop - 3 ] .hh .v.RH != 0 ) ) 
  729.   confusion ( 791 ) ; 
  730.   curlist .pgfield = bestline - 1 ; 
  731. smallnumber zreconstitute ( j , n ) 
  732. smallnumber j , n ; 
  733. {/* 22 30 */ register smallnumber Result; r_reconstitute 
  734.   halfword p ; 
  735.   halfword s ; 
  736.   fourquarters q ; 
  737.   quarterword c ; 
  738.   quarterword d ; 
  739.   scaled w ; 
  740.   integer r ; 
  741.   hyphenpassed = 0 ; 
  742.   s = memtop - 4 ; 
  743.   w = 0 ; 
  744.   d = hu [ j ] ; 
  745.   c = d ; 
  746.   while ( true ) { 
  747.     lab22: p = getavail () ; 
  748.     mem [(long) p ] .hh.b0 = hf ; 
  749.     mem [(long) p ] .hh.b1 = c ; 
  750.     mem [(long) s ] .hh .v.RH = p ; 
  751.     if ( j == n ) 
  752.     goto lab30 ; 
  753.     q = fontinfo [ charbase [ hf ] + d ] .qqqq ; 
  754.     if ( ( ( q .b2 ) % 4 ) != 1 ) 
  755.     goto lab30 ; 
  756.     r = ligkernbase [ hf ] + q .b3 ; 
  757.     c = hu [ j + 1 ] ; 
  758.     while ( true ) { 
  759.       q = fontinfo [ r ] .qqqq ; 
  760.       if ( q .b1 == c ) 
  761.       {
  762.     if ( odd ( hyf [ j ] ) && ( hyphenpassed == 0 ) ) 
  763.     hyphenpassed = j ; 
  764.     if ( q .b2 < 128 ) 
  765.     {
  766.       d = q .b3 ; 
  767.       incr ( j ) ; 
  768.       s = p ; 
  769.       goto lab22 ; 
  770.     } 
  771.     else { 
  772.       w = fontinfo [ kernbase [ hf ] + q .b3 ] .cint ; 
  773.       goto lab30 ; 
  774.     } 
  775.       } 
  776.       else if ( q .b0 < 128 ) 
  777.       incr ( r ) ; 
  778.       else goto lab30 ; 
  779.     } 
  780.   } 
  781.   lab30: ; 
  782.   if ( s != memtop - 4 ) 
  783.   {
  784.     p = newligature ( hf , d , mem [(long) memtop - 4 ] .hh .v.RH ) ; 
  785.     mem [(long) memtop - 4 ] .hh .v.RH = p ; 
  786.   } 
  787.   if ( w != 0 ) 
  788.   mem [(long) mem [(long) memtop - 4 ] .hh .v.RH ] .hh .v.RH = newkern ( w ) ; 
  789.   Result = j ; 
  790.   return(Result) ; 
  791. hyphenate () { /* 30 40 45 41 10 */ r_hyphenate 
  792.   quarterword i, j, l ; 
  793.   halfword q, r, s ; 
  794.   halfword majortail, minortail ; 
  795.   ASCIIcode c ; 
  796.   halfword hyfnode ; 
  797.   triepointer z ; 
  798.   quarterword v ; 
  799.   hyphpointer h ; 
  800.   strnumber k ; 
  801.   poolpointer u ; 
  802.   for ( j = 0 ; j <= hn ; j ++ ) 
  803.   hyf [ j ] = 0 ; 
  804.   h = hc [ 1 ] ; 
  805.   for ( j = 2 ; j <= hn ; j ++ ) 
  806.   h = ( h + h + hc [ j ] ) % 307 ; 
  807.   while ( true ) { 
  808.     k = hyphword [ h ] ; 
  809.     if ( k == 0 ) 
  810.     goto lab45 ; 
  811.     if ( ( strstart [ k + 1 ] - strstart [ k ] ) < hn ) 
  812.     goto lab45 ; 
  813.     if ( ( strstart [ k + 1 ] - strstart [ k ] ) == hn ) 
  814.     {
  815.       j = 1 ; 
  816.       u = strstart [ k ] ; 
  817.       do { if ( strpool [ u ] < hc [ j ] ) 
  818.     goto lab45 ; 
  819.     if ( strpool [ u ] > hc [ j ] ) 
  820.     goto lab30 ; 
  821.     incr ( j ) ; 
  822.     incr ( u ) ; 
  823.       } while ( ! ( j > hn ) ) ; 
  824.       s = hyphlist [ h ] ; 
  825.       while ( s != 0 ) { 
  826.     hyf [ mem [(long) s ] .hh .v.LH ] = 1 ; 
  827.     s = mem [(long) s ] .hh .v.RH ; 
  828.       } 
  829.       goto lab40 ; 
  830.     } 
  831.     lab30: ; 
  832.     if ( h > 0 ) 
  833.     decr ( h ) ; 
  834.     else h = 307 ; 
  835.   } 
  836.   lab45: ; 
  837.   hc [ 0 ] = 127 ; 
  838.   hc [ hn + 1 ] = 127 ; 
  839.   hc [ hn + 2 ] = 256 ; 
  840.   for ( j = 0 ; j <= hn - 2 ; j ++ ) 
  841.   {
  842.     z = hc [ j ] ; 
  843.     l = j ; 
  844.     while ( hc [ l ] == trie [ z ] .b1 ) { 
  845.       if ( trie [ z ] .b0 != 0 ) 
  846.       {
  847.     v = trie [ z ] .b0 ; 
  848.     do { i = l - hyfdistance [ v ] ; 
  849.       if ( hyfnum [ v ] > hyf [ i ] ) 
  850.       hyf [ i ] = hyfnum [ v ] ; 
  851.       v = hyfnext [ v ] ; 
  852.     } while ( ! ( v == 0 ) ) ; 
  853.       } 
  854.       incr ( l ) ; 
  855.       z = trie [ z ] .v.RH + hc [ l ] ; 
  856.     } 
  857.   } 
  858.   lab40: hyf [ 1 ] = 0 ; 
  859.   hyf [ hn - 2 ] = 0 ; 
  860.   hyf [ hn - 1 ] = 0 ; 
  861.   hyf [ hn ] = 0 ; 
  862.   for ( j = 2 ; j <= hn - 3 ; j ++ ) 
  863.   if ( odd ( hyf [ j ] ) ) 
  864.   goto lab41 ; 
  865.   return ; 
  866.   lab41: ; 
  867.   q = mem [(long) hb ] .hh .v.RH ; 
  868.   mem [(long) hb ] .hh .v.RH = 0 ; 
  869.   s = curp ; 
  870.   while ( mem [(long) s ] .hh .v.RH != ha ) s = mem [(long) s ] .hh .v.RH ; 
  871.   mem [(long) s ] .hh .v.RH = 0 ; 
  872.   flushnodelis ( ha ) ; 
  873.   j = 0 ; 
  874.   do { l = j ; 
  875.     j = reconstitute ( j + 1 , hn ) ; 
  876.     if ( hyphenpassed != 0 ) 
  877.     {
  878.       r = getnode ( 2 ) ; 
  879.       mem [(long) s ] .hh .v.RH = r ; 
  880.       mem [(long) r ] .hh .v.RH = mem [(long) memtop - 4 ] .hh .v.RH ; 
  881.       mem [(long) r ] .hh.b0 = 7 ; 
  882.       majortail = mem [(long) memtop - 4 ] .hh .v.RH ; 
  883.       if ( mem [(long) majortail ] .hh .v.RH != 0 ) 
  884.       majortail = mem [(long) majortail ] .hh .v.RH ; 
  885.       i = hyphenpassed ; 
  886.       minortail = 0 ; 
  887.       hyfnode = newcharacter ( hf , hyfchar ) ; 
  888.       if ( hyfnode != 0 ) 
  889.       {
  890.     incr ( i ) ; 
  891.     c = hu [ i ] ; 
  892.     hu [ i ] = hyfchar ; 
  893.       } 
  894.       do { l = reconstitute ( l + 1 , i ) ; 
  895.     if ( minortail == 0 ) 
  896.     mem [(long) r + 1 ] .hh .v.LH = mem [(long) memtop - 4 ] .hh .v.RH ; 
  897.     else mem [(long) minortail ] .hh .v.RH = mem [(long) memtop - 4 ] .hh .v.RH ; 
  898.     minortail = mem [(long) memtop - 4 ] .hh .v.RH ; 
  899.     if ( mem [(long) minortail ] .hh .v.RH != 0 ) 
  900.     minortail = mem [(long) minortail ] .hh .v.RH ; 
  901.       } while ( ! ( l == i ) ) ; 
  902.       if ( hyfnode != 0 ) 
  903.       {
  904.     hu [ i ] = c ; 
  905.     {
  906.       mem [(long) hyfnode ] .hh .v.RH = avail ; 
  907.       avail = hyfnode ; 
  908.  
  909. #ifdef STAT
  910.       decr ( dynused ) ; 
  911. #endif /* STAT */
  912.     } 
  913.     decr ( i ) ; 
  914.     l = i ; 
  915.       } 
  916.       hyf [ i ] = 0 ; 
  917.       minortail = 0 ; 
  918.       mem [(long) r + 1 ] .hh .v.RH = 0 ; 
  919.       while ( l < j ) { 
  920.     do { l = reconstitute ( l + 1 , hn ) ; 
  921.       if ( minortail == 0 ) 
  922.       mem [(long) r + 1 ] .hh .v.RH = mem [(long) memtop - 4 ] .hh .v.RH ; 
  923.       else mem [(long) minortail ] .hh .v.RH = mem [(long) memtop - 4 ] .hh .v.RH ; 
  924.       minortail = mem [(long) memtop - 4 ] .hh .v.RH ; 
  925.       if ( mem [(long) minortail ] .hh .v.RH != 0 ) 
  926.       {
  927.         hyf [ l ] = 0 ; 
  928.         minortail = mem [(long) minortail ] .hh .v.RH ; 
  929.       } 
  930.     } while ( ! ( l >= j ) ) ; 
  931.     while ( l > j ) { 
  932.       j = reconstitute ( j + 1 , hn ) ; 
  933.       mem [(long) majortail ] .hh .v.RH = mem [(long) memtop - 4 ] .hh .v.RH ; 
  934.       majortail = mem [(long) memtop - 4 ] .hh .v.RH ; 
  935.       if ( mem [(long) majortail ] .hh .v.RH != 0 ) 
  936.       {
  937.         hyf [ j ] = 0 ; 
  938.         majortail = mem [(long) majortail ] .hh .v.RH ; 
  939.       } 
  940.     } 
  941.       } 
  942.       i = 0 ; 
  943.       s = r ; 
  944.       while ( mem [(long) s ] .hh .v.RH != 0 ) { 
  945.     incr ( i ) ; 
  946.     s = mem [(long) s ] .hh .v.RH ; 
  947.       } 
  948.       mem [(long) r ] .hh.b1 = i ; 
  949.     } 
  950.     else { 
  951.       mem [(long) s ] .hh .v.RH = mem [(long) memtop - 4 ] .hh .v.RH ; 
  952.       s = mem [(long) s ] .hh .v.RH ; 
  953.       if ( mem [(long) s ] .hh .v.RH != 0 ) 
  954.       s = mem [(long) s ] .hh .v.RH ; 
  955.     } 
  956.     if ( odd ( hyf [ j ] ) ) 
  957.     {
  958.       r = newdisc () ; 
  959.       mem [(long) r + 1 ] .hh .v.LH = newcharacter ( hf , hyfchar ) ; 
  960.       mem [(long) s ] .hh .v.RH = r ; 
  961.       s = r ; 
  962.     } 
  963.   } while ( ! ( j == hn ) ) ; 
  964.   mem [(long) s ] .hh .v.RH = q ; 
  965. zlinebreak ( finalwidowpe ) 
  966. integer finalwidowpe ; 
  967. {/* 30 31 32 33 34 */ r_linebreak 
  968.   boolean autobreaking ; 
  969.   halfword prevp ; 
  970.   halfword q, r, s ; 
  971.   internalfont f ; 
  972.   smallnumber j ; 
  973.   quarterword c ; 
  974.   fourquarters qi;
  975.   packbeginlin = curlist .mlfield ; 
  976.   mem [(long) memtop - 3 ] .hh .v.RH = mem [(long) curlist .headfield ] .hh .v.RH ; 
  977.   if ( ( curlist .tailfield >= himemmin ) ) 
  978.   {
  979.     mem [(long) curlist .tailfield ] .hh .v.RH = newpenalty ( 10000 ) ; 
  980.     curlist .tailfield = mem [(long) curlist .tailfield ] .hh .v.RH ; 
  981.   } 
  982.   else if ( mem [(long) curlist .tailfield ] .hh.b0 != 10 ) 
  983.   {
  984.     mem [(long) curlist .tailfield ] .hh .v.RH = newpenalty ( 10000 ) ; 
  985.     curlist .tailfield = mem [(long) curlist .tailfield ] .hh .v.RH ; 
  986.   } 
  987.   else { 
  988.     mem [(long) curlist .tailfield ] .hh.b0 = 12 ; 
  989.     deletegluere ( mem [(long) curlist .tailfield + 1 ] .hh .v.LH ) ; 
  990.     flushnodelis ( mem [(long) curlist .tailfield + 1 ] .hh .v.RH ) ; 
  991.     mem [(long) curlist .tailfield + 1 ] .cint = 10000 ; 
  992.   } 
  993.   mem [(long) curlist .tailfield ] .hh .v.RH = newparamglue ( 14 ) ; 
  994.   popnest () ; 
  995.   noshrinkerro = true ; 
  996.   if ( ( mem [(long) eqtb [ 3533 ] .hh .v.RH ] .hh.b1 != 0 ) && ( mem [(long) eqtb [ 3533 
  997.   ] .hh .v.RH + 3 ] .cint != 0 ) ) 
  998.   {
  999.     eqtb [ 3533 ] .hh .v.RH = finiteshrink ( eqtb [ 3533 ] .hh .v.RH ) ; 
  1000.   } 
  1001.   if ( ( mem [(long) eqtb [ 3534 ] .hh .v.RH ] .hh.b1 != 0 ) && ( mem [(long) eqtb [ 3534 
  1002.   ] .hh .v.RH + 3 ] .cint != 0 ) ) 
  1003.   {
  1004.     eqtb [ 3534 ] .hh .v.RH = finiteshrink ( eqtb [ 3534 ] .hh .v.RH ) ; 
  1005.   } 
  1006.   q = eqtb [ 3533 ] .hh .v.RH ; 
  1007.   r = eqtb [ 3534 ] .hh .v.RH ; 
  1008.   background [ 1 ] = mem [(long) q + 1 ] .cint + mem [(long) r + 1 ] .cint ; 
  1009.   background [ 2 ] = 0 ; 
  1010.   background [ 3 ] = 0 ; 
  1011.   background [ 4 ] = 0 ; 
  1012.   background [ 5 ] = 0 ; 
  1013.   background [ 2 + mem [(long) q ] .hh.b0 ] = mem [(long) q + 2 ] .cint ; 
  1014.   background [ 2 + mem [(long) r ] .hh.b0 ] = background [ 2 + mem [(long) r ] .hh.b0 ] + 
  1015.   mem [(long) r + 2 ] .cint ; 
  1016.   background [ 6 ] = mem [(long) q + 3 ] .cint + mem [(long) r + 3 ] .cint ; 
  1017.   minimumdemer = 1073741823 ; 
  1018.   minimaldemer [ 3 ] = 1073741823 ; 
  1019.   minimaldemer [ 2 ] = 1073741823 ; 
  1020.   minimaldemer [ 1 ] = 1073741823 ; 
  1021.   minimaldemer [ 0 ] = 1073741823 ; 
  1022.   if ( eqtb [ 4056 ] .hh .v.RH == 0 ) 
  1023.   if ( eqtb [ 5718 ] .cint == 0 ) 
  1024.   {
  1025.     lastspeciall = 0 ; 
  1026.     secondwidth = eqtb [ 5704 ] .cint ; 
  1027.     secondindent = 0 ; 
  1028.   } 
  1029.   else { 
  1030.     lastspeciall = abs ( eqtb [ 5308 ] .cint ) ; 
  1031.     if ( eqtb [ 5308 ] .cint < 0 ) 
  1032.     {
  1033.       firstwidth = eqtb [ 5704 ] .cint - abs ( eqtb [ 5718 ] .cint ) ; 
  1034.       if ( eqtb [ 5718 ] .cint >= 0 ) 
  1035.       firstindent = eqtb [ 5718 ] .cint ; 
  1036.       else firstindent = 0 ; 
  1037.       secondwidth = eqtb [ 5704 ] .cint ; 
  1038.       secondindent = 0 ; 
  1039.     } 
  1040.     else { 
  1041.       firstwidth = eqtb [ 5704 ] .cint ; 
  1042.       firstindent = 0 ; 
  1043.       secondwidth = eqtb [ 5704 ] .cint - abs ( eqtb [ 5718 ] .cint ) ; 
  1044.       if ( eqtb [ 5718 ] .cint >= 0 ) 
  1045.       secondindent = eqtb [ 5718 ] .cint ; 
  1046.       else secondindent = 0 ; 
  1047.     } 
  1048.   } 
  1049.   else { 
  1050.     lastspeciall = mem [(long) eqtb [ 4056 ] .hh .v.RH ] .hh .v.LH - 1 ; 
  1051.     secondwidth = mem [(long) eqtb [ 4056 ] .hh .v.RH + 2 * ( lastspeciall + 1 ) ] 
  1052.     .cint ; 
  1053.     secondindent = mem [(long) eqtb [ 4056 ] .hh .v.RH + 2 * lastspeciall + 1 ] 
  1054.     .cint ; 
  1055.   } 
  1056.   if ( eqtb [ 5286 ] .cint == 0 ) 
  1057.   easyline = lastspeciall ; 
  1058.   else easyline = 65535L ; 
  1059.   threshold = eqtb [ 5267 ] .cint ; 
  1060.   if ( threshold >= 0 ) 
  1061.   {
  1062.  
  1063. #ifdef STAT
  1064.     if ( eqtb [ 5299 ] .cint > 0 ) 
  1065.     {
  1066.       begindiagnos () ; 
  1067.       printnl ( 787 ) ; 
  1068.     } 
  1069. #endif /* STAT */
  1070.     secondpass = false ; 
  1071.   } 
  1072.   else { 
  1073.     threshold = eqtb [ 5268 ] .cint ; 
  1074.     secondpass = true ; 
  1075.  
  1076. #ifdef STAT
  1077.     if ( eqtb [ 5299 ] .cint > 0 ) 
  1078.     begindiagnos () ; 
  1079. #endif /* STAT */
  1080.   } 
  1081.   while ( true ) { 
  1082.     q = getnode ( 3 ) ; 
  1083.     mem [(long) q ] .hh.b0 = 0 ; 
  1084.     mem [(long) q ] .hh.b1 = 2 ; 
  1085.     mem [(long) q ] .hh .v.RH = memtop - 7 ; 
  1086.     mem [(long) q + 1 ] .hh .v.RH = 0 ; 
  1087.     mem [(long) q + 1 ] .hh .v.LH = curlist .pgfield + 1 ; 
  1088.     mem [(long) q + 2 ] .cint = 0 ; 
  1089.     mem [(long) memtop - 7 ] .hh .v.RH = q ; 
  1090.     activewidth [ 1 ] = background [ 1 ] ; 
  1091.     activewidth [ 2 ] = background [ 2 ] ; 
  1092.     activewidth [ 3 ] = background [ 3 ] ; 
  1093.     activewidth [ 4 ] = background [ 4 ] ; 
  1094.     activewidth [ 5 ] = background [ 5 ] ; 
  1095.     activewidth [ 6 ] = background [ 6 ] ; 
  1096.     passive = 0 ; 
  1097.     printednode = memtop - 3 ; 
  1098.     passnumber = 0 ; 
  1099.     fontinshortd = 0 ; 
  1100.     curp = mem [(long) memtop - 3 ] .hh .v.RH ; 
  1101.     autobreaking = true ; 
  1102.     prevp = curp ; 
  1103.     while ( ( curp != 0 ) && ( mem [(long) memtop - 7 ] .hh .v.RH != memtop - 7 ) ) 
  1104.     {
  1105.       if ( ( curp >= himemmin ) ) 
  1106.       {
  1107.     prevp = curp ; 
  1108.     do { f = mem [(long) curp ] .hh.b0 ; 
  1109. /*      activewidth [ 1 ] = activewidth [ 1 ] + fontinfo [ widthbase [ f ] + 
  1110.       fontinfo [ charbase [ f ] + mem [(long) curp ] .hh.b1 ] .qqqq .b0 ] .cint 
  1111. */
  1112.    qi = fontinfo [ charbase [ f ] + mem [(long) curp ] .hh.b1 ] .qqqq ;
  1113.       activewidth [ 1 ] = activewidth [ 1 ] + fontinfo [ widthbase [ f ] + 
  1114.      qi .b0 ] .cint 
  1115.       ; 
  1116.       curp = mem [(long) curp ] .hh .v.RH ; 
  1117.     } while ( ! ( ! ( curp >= himemmin ) ) ) ; 
  1118.       } 
  1119.       switch ( mem [(long) curp ] .hh.b0 ) 
  1120.       {case 0 : 
  1121.       case 1 : 
  1122.       case 2 : 
  1123.     activewidth [ 1 ] = activewidth [ 1 ] + mem [(long) curp + 1 ] .cint ; 
  1124.     break ; 
  1125.       case 8 : 
  1126.  
  1127.     break ; 
  1128.       case 10 : 
  1129.     {
  1130.       if ( autobreaking ) 
  1131.       {
  1132.         if ( ( prevp >= himemmin ) ) 
  1133.         trybreak ( 0 , 0 ) ; 
  1134.         else if ( ( mem [(long) prevp ] .hh.b0 < 9 ) ) 
  1135.         trybreak ( 0 , 0 ) ; 
  1136.       } 
  1137.       {
  1138.         if ( ( mem [(long) mem [(long) curp + 1 ] .hh .v.LH ] .hh.b1 != 0 ) && ( mem [(long) 
  1139.         mem [(long) curp + 1 ] .hh .v.LH + 3 ] .cint != 0 ) ) 
  1140.         {
  1141.           mem [(long) curp + 1 ] .hh .v.LH = finiteshrink ( mem [(long) curp + 1 ] .hh 
  1142.           .v.LH ) ; 
  1143.         } 
  1144.         q = mem [(long) curp + 1 ] .hh .v.LH ; 
  1145.         activewidth [ 1 ] = activewidth [ 1 ] + mem [(long) q + 1 ] .cint ; 
  1146.         activewidth [ 2 + mem [(long) q ] .hh.b0 ] = activewidth [ 2 + mem [(long) q ] 
  1147.         .hh.b0 ] + mem [(long) q + 2 ] .cint ; 
  1148.         activewidth [ 6 ] = activewidth [ 6 ] + mem [(long) q + 3 ] .cint ; 
  1149.       } 
  1150.       if ( secondpass && autobreaking ) 
  1151.       {
  1152.         s = mem [(long) curp ] .hh .v.RH ; 
  1153.         if ( s != 0 ) 
  1154.         {
  1155.           while ( true ) { 
  1156.         if ( ( s >= himemmin ) ) 
  1157.         {
  1158.           c = mem [(long) s ] .hh.b1 ; 
  1159.           hf = mem [(long) s ] .hh.b0 ; 
  1160.         } 
  1161.         else if ( mem [(long) s ] .hh.b0 == 6 ) 
  1162.         {
  1163.           q = mem [(long) s + 1 ] .hh .v.RH ; 
  1164.           c = mem [(long) q ] .hh.b1 ; 
  1165.           hf = mem [(long) q ] .hh.b0 ; 
  1166.         } 
  1167.         else if ( ( mem [(long) s ] .hh.b0 == 11 ) && ( mem [(long) s ] .hh.b1 == 
  1168.         0 ) ) 
  1169.         c = 128 ; 
  1170.         else if ( mem [(long) s ] .hh.b0 == 8 ) 
  1171.         c = 128 ; 
  1172.         else goto lab31 ; 
  1173.         if ( c < 128 ) 
  1174.         if ( eqtb [ 4755 + c ] .hh .v.RH != 0 ) 
  1175.         if ( ( eqtb [ 4755 + c ] .hh .v.RH == c ) || ( eqtb [ 5305 ] 
  1176.         .cint > 0 ) ) 
  1177.         goto lab32 ; 
  1178.         else goto lab31 ; 
  1179.         s = mem [(long) s ] .hh .v.RH ; 
  1180.           } 
  1181.           lab32: hyfchar = hyphenchar [ hf ] ; 
  1182.           if ( hyfchar < 0 ) 
  1183.           goto lab31 ; 
  1184.           if ( hyfchar > 255 ) 
  1185.           goto lab31 ; 
  1186.           ha = s ; 
  1187.           hn = 0 ; 
  1188.           while ( true ) { 
  1189.         if ( ( s >= himemmin ) ) 
  1190.         {
  1191.           if ( mem [(long) s ] .hh.b0 != hf ) 
  1192.           goto lab33 ; 
  1193.           c = mem [(long) s ] .hh.b1 ; 
  1194.           if ( c >= 128 ) 
  1195.           goto lab33 ; 
  1196.           if ( ( eqtb [ 4755 + c ] .hh .v.RH == 0 ) || ( hn == 63 ) ) 
  1197.           goto lab33 ; 
  1198.           hb = s ; 
  1199.           incr ( hn ) ; 
  1200.           hu [ hn ] = c ; 
  1201.           hc [ hn ] = eqtb [ 4755 + c ] .hh .v.RH - 1 ; 
  1202.         } 
  1203.         else if ( mem [(long) s ] .hh.b0 == 6 ) 
  1204.         {
  1205.           j = hn ; 
  1206.           q = mem [(long) s + 1 ] .hh .v.RH ; 
  1207.           if ( mem [(long) q ] .hh.b0 != hf ) 
  1208.           goto lab33 ; 
  1209.           do { c = mem [(long) q ] .hh.b1 ; 
  1210.             if ( c >= 128 ) 
  1211.             goto lab33 ; 
  1212.             if ( ( eqtb [ 4755 + c ] .hh .v.RH == 0 ) || ( j == 63 ) ) 
  1213.             goto lab33 ; 
  1214.             incr ( j ) ; 
  1215.             hu [ j ] = c ; 
  1216.             hc [ j ] = eqtb [ 4755 + c ] .hh .v.RH - 1 ; 
  1217.             q = mem [(long) q ] .hh .v.RH ; 
  1218.           } while ( ! ( q == 0 ) ) ; 
  1219.           hb = s ; 
  1220.           hn = j ; 
  1221.         } 
  1222.         else if ( ( mem [(long) s ] .hh.b0 != 11 ) || ( mem [(long) s ] .hh.b1 != 
  1223.         0 ) ) 
  1224.         goto lab33 ; 
  1225.         s = mem [(long) s ] .hh .v.RH ; 
  1226.           } 
  1227.           lab33: ; 
  1228.           if ( hn < 5 ) 
  1229.           goto lab31 ; 
  1230.           while ( true ) { 
  1231.         if ( ! ( ( s >= himemmin ) ) ) 
  1232.         switch ( mem [(long) s ] .hh.b0 ) 
  1233.         {case 6 : 
  1234.           ; 
  1235.           break ; 
  1236.         case 11 : 
  1237.           if ( mem [(long) s ] .hh.b1 != 0 ) 
  1238.           goto lab34 ; 
  1239.           break ; 
  1240.         case 8 : 
  1241.         case 10 : 
  1242.         case 12 : 
  1243.         case 3 : 
  1244.         case 5 : 
  1245.         case 4 : 
  1246.           goto lab34 ; 
  1247.           break ; 
  1248.         default : 
  1249.           goto lab31 ; 
  1250.           break ; 
  1251.         } 
  1252.         s = mem [(long) s ] .hh .v.RH ; 
  1253.           } 
  1254.           lab34: ; 
  1255.           hyphenate () ; 
  1256.         } 
  1257.         lab31: ; 
  1258.       } 
  1259.     } 
  1260.     break ; 
  1261.       case 11 : 
  1262.     {
  1263.       if ( ! ( mem [(long) curp ] .hh .v.RH >= himemmin ) && autobreaking ) 
  1264.       if ( mem [(long) mem [(long) curp ] .hh .v.RH ] .hh.b0 == 10 ) 
  1265.       trybreak ( 0 , 0 ) ; 
  1266.       activewidth [ 1 ] = activewidth [ 1 ] + mem [(long) curp + 1 ] .cint ; 
  1267.     } 
  1268.     break ; 
  1269.       case 6 : 
  1270.     {
  1271.       f = mem [(long) curp + 1 ] .hh.b0 ; 
  1272. /*      activewidth [ 1 ] = activewidth [ 1 ] + fontinfo [ widthbase [ f ] + 
  1273.       fontinfo [ charbase [ f ] + mem [(long) curp + 1 ] .hh.b1 ] .qqqq .b0 ] 
  1274.       .cint ; 
  1275. */
  1276.     qi = fontinfo [ charbase [ f ] + mem [(long) curp + 1 ] .hh.b1 ] .qqqq;
  1277.       activewidth [ 1 ] = activewidth [ 1 ] + fontinfo [ widthbase [ f ] + 
  1278.        qi.b0 ]  .cint ; 
  1279.     } 
  1280.     break ; 
  1281.       case 7 : 
  1282.     {
  1283.       s = mem [(long) curp + 1 ] .hh .v.LH ; 
  1284.       discwidth = 0 ; 
  1285.       if ( s == 0 ) 
  1286.       trybreak ( eqtb [ 5271 ] .cint , 1 ) ; 
  1287.       else { 
  1288.         do { if ( ( s >= himemmin ) ) 
  1289.           {
  1290.         f = mem [(long) s ] .hh.b0 ; 
  1291. /*        discwidth = discwidth + fontinfo [ widthbase [ f ] + fontinfo 
  1292.         [ charbase [ f ] + mem [(long) s ] .hh.b1 ] .qqqq .b0 ] .cint ; 
  1293. */
  1294. qi = fontinfo [ charbase [ f ] + mem [(long) s ] .hh.b1 ] .qqqq;
  1295.     discwidth = discwidth + fontinfo [ widthbase [ f ] + qi .b0 ] .cint ; 
  1296.  
  1297.           } 
  1298.           else switch ( mem [(long) s ] .hh.b0 ) 
  1299.           {case 6 : 
  1300.         {
  1301.           f = mem [(long) s + 1 ] .hh.b0 ; 
  1302. /*          discwidth = discwidth + fontinfo [ widthbase [ f ] + 
  1303.           fontinfo [ charbase [ f ] + mem [(long) s + 1 ] .hh.b1 ] .qqqq .b0 
  1304.           ] .cint ; 
  1305. */
  1306.    qi = fontinfo [ charbase [ f ] + mem [(long) s + 1 ] .hh.b1 ] .qqqq;
  1307.           discwidth = discwidth + fontinfo [ widthbase [ f ] + 
  1308.           qi .b0   ] .cint ; 
  1309.  
  1310.         } 
  1311.         break ; 
  1312.           case 0 : 
  1313.           case 1 : 
  1314.           case 2 : 
  1315.           case 11 : 
  1316.         discwidth = discwidth + mem [(long) s + 1 ] .cint ; 
  1317.         break ; 
  1318.           default : 
  1319.         confusion ( 790 ) ; 
  1320.         break ; 
  1321.           } 
  1322.           s = mem [(long) s ] .hh .v.RH ; 
  1323.         } while ( ! ( s == 0 ) ) ; 
  1324.         activewidth [ 1 ] = activewidth [ 1 ] + discwidth ; 
  1325.         trybreak ( eqtb [ 5270 ] .cint , 1 ) ; 
  1326.         activewidth [ 1 ] = activewidth [ 1 ] - discwidth ; 
  1327.       } 
  1328.     } 
  1329.     break ; 
  1330.       case 9 : 
  1331.     {
  1332.       autobreaking = ( mem [(long) curp ] .hh.b1 == 1 ) ; 
  1333.       {
  1334.         if ( ! ( mem [(long) curp ] .hh .v.RH >= himemmin ) && autobreaking ) 
  1335.         if ( mem [(long) mem [(long) curp ] .hh .v.RH ] .hh.b0 == 10 ) 
  1336.         trybreak ( 0 , 0 ) ; 
  1337.         activewidth [ 1 ] = activewidth [ 1 ] + mem [(long) curp + 1 ] .cint ; 
  1338.       } 
  1339.     } 
  1340.     break ; 
  1341.       case 12 : 
  1342.     trybreak ( mem [(long) curp + 1 ] .cint , 0 ) ; 
  1343.     break ; 
  1344.       case 4 : 
  1345.       case 3 : 
  1346.       case 5 : 
  1347.  
  1348.     break ; 
  1349.       default : 
  1350.     confusion ( 789 ) ; 
  1351.     break ; 
  1352.       } 
  1353.       prevp = curp ; 
  1354.       curp = mem [(long) curp ] .hh .v.RH ; 
  1355.     } 
  1356.     if ( curp == 0 ) 
  1357.     {
  1358.       trybreak ( - 10000 , 1 ) ; 
  1359.       if ( mem [(long) memtop - 7 ] .hh .v.RH != memtop - 7 ) 
  1360.       {
  1361.     r = mem [(long) memtop - 7 ] .hh .v.RH ; 
  1362.     fewestdemeri = 1073741823 ; 
  1363.     do { if ( mem [(long) r ] .hh.b0 != 2 ) 
  1364.       if ( mem [(long) r + 2 ] .cint < fewestdemeri ) 
  1365.       {
  1366.         fewestdemeri = mem [(long) r + 2 ] .cint ; 
  1367.         bestbet = r ; 
  1368.       } 
  1369.       r = mem [(long) r ] .hh .v.RH ; 
  1370.     } while ( ! ( r == memtop - 7 ) ) ; 
  1371.     bestline = mem [(long) bestbet + 1 ] .hh .v.LH ; 
  1372.     if ( eqtb [ 5286 ] .cint == 0 ) 
  1373.     goto lab30 ; 
  1374.     {
  1375.       r = mem [(long) memtop - 7 ] .hh .v.RH ; 
  1376.       actualloosen = 0 ; 
  1377.       do { if ( mem [(long) r ] .hh.b0 != 2 ) 
  1378.         {
  1379.           linediff = (long)mem [(long) r + 1 ] .hh .v.LH -(long)bestline ; 
  1380.           if ( ( ( linediff < actualloosen ) && ( eqtb [ 5286 ] .cint <= 
  1381.           linediff ) ) || ( ( linediff > actualloosen ) && ( eqtb [ 5286 ] 
  1382.           .cint >= linediff ) ) ) 
  1383.           {
  1384.         bestbet = r ; 
  1385.         actualloosen = linediff ; 
  1386.         fewestdemeri = mem [(long) r + 2 ] .cint ; 
  1387.           } 
  1388.           else if ( ( linediff == actualloosen ) && ( mem [(long) r + 2 ] .cint 
  1389.           < fewestdemeri ) ) 
  1390.           {
  1391.         bestbet = r ; 
  1392.         fewestdemeri = mem [(long) r + 2 ] .cint ; 
  1393.           } 
  1394.         } 
  1395.         r = mem [(long) r ] .hh .v.RH ; 
  1396.       } while ( ! ( r == memtop - 7 ) ) ; 
  1397.       bestline = mem [(long) bestbet + 1 ] .hh .v.LH ; 
  1398.     } 
  1399.     if ( ( actualloosen == eqtb [ 5286 ] .cint ) || secondpass ) 
  1400.     goto lab30 ; 
  1401.       } 
  1402.     } 
  1403.     q = mem [(long) memtop - 7 ] .hh .v.RH ; 
  1404.     while ( q != memtop - 7 ) { 
  1405.       curp = mem [(long) q ] .hh .v.RH ; 
  1406.       if ( mem [(long) q ] .hh.b0 == 2 ) 
  1407.       freenode ( q , 7 ) ; 
  1408.       else freenode ( q , 3 ) ; 
  1409.       q = curp ; 
  1410.     } 
  1411.     q = passive ; 
  1412.     while ( q != 0 ) { 
  1413.       curp = mem [(long) q ] .hh .v.RH ; 
  1414.       freenode ( q , 2 ) ; 
  1415.       q = curp ; 
  1416.     } 
  1417.  
  1418. #ifdef STAT
  1419.     if ( eqtb [ 5299 ] .cint > 0 ) 
  1420.     printnl ( 788 ) ; 
  1421. #endif /* STAT */
  1422.     threshold = eqtb [ 5268 ] .cint ; 
  1423.     secondpass = true ; 
  1424.   } 
  1425.   lab30: 
  1426.  
  1427. #ifdef STAT
  1428.   if ( eqtb [ 5299 ] .cint > 0 ) 
  1429.   enddiagnosti ( true ) ; 
  1430. #endif /* STAT */
  1431.   postlinebrea ( finalwidowpe ) ; 
  1432.   q = mem [(long) memtop - 7 ] .hh .v.RH ; 
  1433.   while ( q != memtop - 7 ) { 
  1434.     curp = mem [(long) q ] .hh .v.RH ; 
  1435.     if ( mem [(long) q ] .hh.b0 == 2 ) 
  1436.     freenode ( q , 7 ) ; 
  1437.     else freenode ( q , 3 ) ; 
  1438.     q = curp ; 
  1439.   } 
  1440.   q = passive ; 
  1441.   while ( q != 0 ) { 
  1442.     curp = mem [(long) q ] .hh .v.RH ; 
  1443.     freenode ( q , 2 ) ; 
  1444.     q = curp ; 
  1445.   } 
  1446.   packbeginlin = 0 ; 
  1447. newhyphexcep () { /* 21 10 40 45 30 */ r_newhyphexcep 
  1448.   smallnumber n ; 
  1449.   smallnumber j ; 
  1450.   hyphpointer h ; 
  1451.   strnumber k ; 
  1452.   halfword p ; 
  1453.   halfword q ; 
  1454.   strnumber s, t ; 
  1455.   poolpointer u, v ; 
  1456.   scanleftbrac () ; 
  1457.   n = 0 ; 
  1458.   p = 0 ; 
  1459.   while ( true ) { 
  1460.     getxtoken () ; 
  1461.     lab21: switch ( curcmd ) 
  1462.     {case 11 : 
  1463.     case 12 : 
  1464.     case 67 : 
  1465.       if ( curchr == 45 ) 
  1466.       {
  1467.     if ( n > 1 ) 
  1468.     {
  1469.       q = getavail () ; 
  1470.       mem [(long) q ] .hh .v.RH = p ; 
  1471.       mem [(long) q ] .hh .v.LH = n ; 
  1472.       p = q ; 
  1473.     } 
  1474.       } 
  1475.       else { 
  1476.     if ( ( curchr > 127 ) || ( eqtb [ 4755 + curchr ] .hh .v.RH == 0 ) ) 
  1477.     {
  1478.       {
  1479.         if ( interaction == 3 ) 
  1480.         wakeuptermin () ; 
  1481.         printnl ( 133 ) ; 
  1482.         print ( 797 ) ; 
  1483.       } 
  1484.       {
  1485.         helpptr = 2 ; 
  1486.         helpline [ 1 ] = 798 ; 
  1487.         helpline [ 0 ] = 799 ; 
  1488.       } 
  1489.       error () ; 
  1490.     } 
  1491.     else if ( n < 63 ) 
  1492.     {
  1493.       incr ( n ) ; 
  1494.       hc [ n ] = eqtb [ 4755 + curchr ] .hh .v.RH - 1 ; 
  1495.     } 
  1496.       } 
  1497.       break ; 
  1498.     case 16 : 
  1499.       {
  1500.     scancharnum () ; 
  1501.     curchr = curval ; 
  1502.     curcmd = 67 ; 
  1503.     goto lab21 ; 
  1504.       } 
  1505.       break ; 
  1506.     case 10 : 
  1507.     case 2 : 
  1508.       {
  1509.     if ( n > 4 ) 
  1510.     {
  1511.       {
  1512.         if ( poolptr + n > poolsize ) 
  1513.         overflow ( 128 , poolsize - initpoolptr ) ; 
  1514.       } 
  1515.       h = 0 ; 
  1516.       for ( j = 1 ; j <= n ; j ++ ) 
  1517.       {
  1518.         h = ( h + h + hc [ j ] ) % 307 ; 
  1519.         {
  1520.           strpool [ poolptr ] = hc [ j ] ; 
  1521.           incr ( poolptr ) ; 
  1522.         } 
  1523.       } 
  1524.       s = makestring () ; 
  1525.       while ( true ) { 
  1526.         if ( p == 0 ) 
  1527.         goto lab30 ; 
  1528.         if ( mem [(long) p ] .hh .v.LH < n - 2 ) 
  1529.         goto lab30 ; 
  1530.         q = mem [(long) p ] .hh .v.RH ; 
  1531.         {
  1532.           mem [(long) p ] .hh .v.RH = avail ; 
  1533.           avail = p ; 
  1534.  
  1535. #ifdef STAT
  1536.           decr ( dynused ) ; 
  1537. #endif /* STAT */
  1538.         } 
  1539.         p = q ; 
  1540.       } 
  1541.       lab30: if ( hyphcount == 307 ) 
  1542.       overflow ( 800 , 307 ) ; 
  1543.       incr ( hyphcount ) ; 
  1544.       while ( hyphword [ h ] != 0 ) { 
  1545.         k = hyphword [ h ] ; 
  1546.         if ( ( strstart [ k + 1 ] - strstart [ k ] ) < ( strstart [ s + 1 
  1547.         ] - strstart [ s ] ) ) 
  1548.         goto lab40 ; 
  1549.         if ( ( strstart [ k + 1 ] - strstart [ k ] ) > ( strstart [ s + 1 
  1550.         ] - strstart [ s ] ) ) 
  1551.         goto lab45 ; 
  1552.         u = strstart [ k ] ; 
  1553.         v = strstart [ s ] ; 
  1554.         do { if ( strpool [ u ] < strpool [ v ] ) 
  1555.           goto lab40 ; 
  1556.           if ( strpool [ u ] > strpool [ v ] ) 
  1557.           goto lab45 ; 
  1558.           incr ( u ) ; 
  1559.           incr ( v ) ; 
  1560.         } while ( ! ( u == strstart [ k + 1 ] ) ) ; 
  1561.         lab40: q = hyphlist [ h ] ; 
  1562.         hyphlist [ h ] = p ; 
  1563.         p = q ; 
  1564.         t = hyphword [ h ] ; 
  1565.         hyphword [ h ] = s ; 
  1566.         s = t ; 
  1567.         lab45: ; 
  1568.         if ( h > 0 ) 
  1569.         decr ( h ) ; 
  1570.         else h = 307 ; 
  1571.       } 
  1572.       hyphword [ h ] = s ; 
  1573.       hyphlist [ h ] = p ; 
  1574.     } 
  1575.     if ( curcmd == 2 ) 
  1576.     return ; 
  1577.     n = 0 ; 
  1578.     p = 0 ; 
  1579.       } 
  1580.       break ; 
  1581.     default : 
  1582.       {
  1583.     {
  1584.       if ( interaction == 3 ) 
  1585.       wakeuptermin () ; 
  1586.       printnl ( 133 ) ; 
  1587.       print ( 536 ) ; 
  1588.     } 
  1589.     printesc ( 793 ) ; 
  1590.     print ( 794 ) ; 
  1591.     {
  1592.       helpptr = 2 ; 
  1593.       helpline [ 1 ] = 795 ; 
  1594.       helpline [ 0 ] = 796 ; 
  1595.     } 
  1596.     error () ; 
  1597.       } 
  1598.       break ; 
  1599.     } 
  1600.   } 
  1601.  
  1602. #ifdef INITEX
  1603. quarterword znewtrieop ( d , n , v ) 
  1604. smallnumber d , n ; 
  1605. quarterword v ; 
  1606. {/* 10 */ register quarterword Result; r_newtrieop 
  1607.   halfword h ; 
  1608.   quarterword u ; 
  1609.   h = abs ( toint ( n ) + 313 * toint ( d ) + 361 * toint ( v ) ) % 510 ; 
  1610.   while ( true ) { 
  1611.     u = trieophash [ h ] ; 
  1612.     if ( u == 0 ) 
  1613.     {
  1614.       if ( trieopptr == 255 ) 
  1615.       {
  1616.     Result = 0 ; 
  1617.     return(Result) ; 
  1618.       } 
  1619.       incr ( trieopptr ) ; 
  1620.       hyfdistance [ trieopptr ] = d ; 
  1621.       hyfnum [ trieopptr ] = n ; 
  1622.       hyfnext [ trieopptr ] = v ; 
  1623.       trieophash [ h ] = trieopptr ; 
  1624.       Result = trieopptr ; 
  1625.       return(Result) ; 
  1626.     } 
  1627.     if ( ( hyfdistance [ u ] == d ) && ( hyfnum [ u ] == n ) && ( hyfnext [ u 
  1628.     ] == v ) ) 
  1629.     {
  1630.       Result = u ; 
  1631.       return(Result) ; 
  1632.     } 
  1633.     if ( h > 0 ) 
  1634.     decr ( h ) ; 
  1635.     else h = 510 ; 
  1636.   } 
  1637.   return(Result) ; 
  1638. triepointer ztrienode ( p ) 
  1639. triepointer p ; 
  1640. {/* 10 */ register triepointer Result; r_trienode 
  1641.   triepointer h ; 
  1642.   triepointer q ; 
  1643.   h = abs ( toint ( triec [ p ] ) + 1009 * toint ( trieo [ p ] ) + 2718 * 
  1644.   toint ( triel [ p ] ) + 3142 * toint ( trier [ p ] ) ) % triesize ; 
  1645.   while ( true ) { 
  1646.     q = triehash [ h ] ; 
  1647.     if ( q == 0 ) 
  1648.     {
  1649.       triehash [ h ] = p ; 
  1650.       Result = p ; 
  1651.       return(Result) ; 
  1652.     } 
  1653.     if ( ( triec [ q ] == triec [ p ] ) && ( trieo [ q ] == trieo [ p ] ) && ( 
  1654.     triel [ q ] == triel [ p ] ) && ( trier [ q ] == trier [ p ] ) ) 
  1655.     {
  1656.       Result = q ; 
  1657.       return(Result) ; 
  1658.     } 
  1659.     if ( h > 0 ) 
  1660.     decr ( h ) ; 
  1661.     else h = triesize ; 
  1662.   } 
  1663.   return(Result) ; 
  1664. triepointer zcompresstrie ( p ) 
  1665. triepointer p ; 
  1666. {register triepointer Result; r_compresstrie 
  1667.   if ( p == 0 ) 
  1668.   Result = 0 ; 
  1669.   else { 
  1670.     triel [ p ] = compresstrie ( triel [ p ] ) ; 
  1671.     trier [ p ] = compresstrie ( trier [ p ] ) ; 
  1672.     Result = trienode ( p ) ; 
  1673.   } 
  1674.   return(Result) ; 
  1675. initpatternm () { r_initpatternm 
  1676.   halfword h ; 
  1677.   triepointer p ; 
  1678.   for ( h = 0 ; h <= 510 ; h ++ ) 
  1679.   trieophash [ h ] = 0 ; 
  1680.   trieopptr = 0 ; 
  1681.   triel [ 0 ] = 0 ; 
  1682.   triec [ 0 ] = 0 ; 
  1683.   trieptr = 0 ; 
  1684.   for ( p = 0 ; p <= triesize ; p ++ ) 
  1685.   triehash [ p ] = 0 ; 
  1686. inittriememo () { r_inittriememo 
  1687.   triepointer p ; 
  1688.   for ( p = 0 ; p <= trieptr ; p ++ ) 
  1689.   triehash [ p ] = 0 ; 
  1690.   triemax = 128 ; 
  1691.   triemin = 128 ; 
  1692.   trie [ 0 ] .v.RH = 1 ; 
  1693.   trietaken [ 0 ] = false ; 
  1694.   for ( p = 1 ; p <= 128 ; p ++ ) 
  1695.   {
  1696.     trie [ p ] .v.LH = p - 1 ; 
  1697.     trie [ p ] .v.RH = p + 1 ; 
  1698.     trietaken [ p ] = false ; 
  1699.   } 
  1700. zfirstfit ( p ) 
  1701. triepointer p ; 
  1702. {/* 45 40 */ r_firstfit 
  1703.   triepointer h ; 
  1704.   triepointer z ; 
  1705.   triepointer q ; 
  1706.   ASCIIcode c ; 
  1707.   c = triec [ p ] ; 
  1708.   if ( c < triemin ) 
  1709.   triemin = c ; 
  1710.   z = trie [ triemin - 1 ] .v.RH ; 
  1711.   while ( true ) { 
  1712.     if ( z < c ) 
  1713.     goto lab45 ; 
  1714.     h = z - c ; 
  1715.     if ( triemax < h + 128 ) 
  1716.     {
  1717.       if ( triesize <= h + 128 ) 
  1718.       overflow ( 801 , triesize ) ; 
  1719.       do { incr ( triemax ) ; 
  1720.     trietaken [ triemax ] = false ; 
  1721.     trie [ triemax ] .v.RH = triemax + 1 ; 
  1722.     trie [ triemax ] .v.LH = triemax - 1 ; 
  1723.       } while ( ! ( triemax == h + 128 ) ) ; 
  1724.     } 
  1725.     if ( trietaken [ h ] ) 
  1726.     goto lab45 ; 
  1727.     q = trier [ p ] ; 
  1728.     while ( q > 0 ) { 
  1729.       if ( trie [ h + triec [ q ] ] .v.RH == 0 ) 
  1730.       goto lab45 ; 
  1731.       q = trier [ q ] ; 
  1732.     } 
  1733.     goto lab40 ; 
  1734.     lab45: z = trie [ z ] .v.RH ; 
  1735.   } 
  1736.   lab40: trietaken [ h ] = true ; 
  1737.   triehash [ p ] = h ; 
  1738.   q = p ; 
  1739.   do { z = h + triec [ q ] ; 
  1740.     trie [ trie [ z ] .v.RH ] .v.LH = trie [ z ] .v.LH ; 
  1741.     trie [ trie [ z ] .v.LH ] .v.RH = trie [ z ] .v.RH ; 
  1742.     trie [ z ] .v.RH = 0 ; 
  1743.     q = trier [ q ] ; 
  1744.   } while ( ! ( q == 0 ) ) ; 
  1745. ztriepack ( p ) 
  1746. triepointer p ; 
  1747. {r_triepack 
  1748.   triepointer q ; 
  1749.   do { q = triel [ p ] ; 
  1750.     if ( ( q > 0 ) && ( triehash [ q ] == 0 ) ) 
  1751.     {
  1752.       firstfit ( q ) ; 
  1753.       triepack ( q ) ; 
  1754.     } 
  1755.     p = trier [ p ] ; 
  1756.   } while ( ! ( p == 0 ) ) ; 
  1757. ztriefix ( p ) 
  1758. triepointer p ; 
  1759. {r_triefix 
  1760.   triepointer q ; 
  1761.   ASCIIcode c ; 
  1762.   triepointer z ; 
  1763.   z = triehash [ p ] ; 
  1764.   while ( p != 0 ) { 
  1765.     q = triel [ p ] ; 
  1766.     c = triec [ p ] ; 
  1767.     trie [ z + c ] .v.RH = triehash [ q ] ; 
  1768.     trie [ z + c ] .b1 = c ; 
  1769.     trie [ z + c ] .b0 = trieo [ p ] ; 
  1770.     if ( q > 0 ) 
  1771.     triefix ( q ) ; 
  1772.     p = trier [ p ] ; 
  1773.   } 
  1774. newpatterns () { /* 30 31 */ r_newpatterns 
  1775.   smallnumber k, l ; 
  1776.   boolean digitsensed ; 
  1777.   quarterword v ; 
  1778.   triepointer p, q ; 
  1779.   boolean firstchild ; 
  1780.   ASCIIcode c ; 
  1781.   triepointer r, s ; 
  1782.   twohalves h ; 
  1783.   scanleftbrac () ; 
  1784.   initpatternm () ; 
  1785.   k = 0 ; 
  1786.   hyf [ 0 ] = 0 ; 
  1787.   digitsensed = false ; 
  1788.   while ( true ) { 
  1789.     getxtoken () ; 
  1790.     switch ( curcmd ) 
  1791.     {case 11 : 
  1792.     case 12 : 
  1793.       if ( digitsensed || ( curchr < 48 ) || ( curchr > 57 ) ) 
  1794.       {
  1795.     if ( curchr == 46 ) 
  1796.     curchr = 128 ; 
  1797.     else { 
  1798.       curchr = eqtb [ 4755 + curchr ] .hh .v.RH ; 
  1799.       if ( curchr == 0 ) 
  1800.       {
  1801.         {
  1802.           if ( interaction == 3 ) 
  1803.           wakeuptermin () ; 
  1804.           printnl ( 133 ) ; 
  1805.           print ( 805 ) ; 
  1806.         } 
  1807.         {
  1808.           helpptr = 1 ; 
  1809.           helpline [ 0 ] = 804 ; 
  1810.         } 
  1811.         error () ; 
  1812.         curchr = 128 ; 
  1813.       } 
  1814.     } 
  1815.     if ( k < 63 ) 
  1816.     {
  1817.       incr ( k ) ; 
  1818.       hc [ k ] = curchr - 1 ; 
  1819.       hyf [ k ] = 0 ; 
  1820.       digitsensed = false ; 
  1821.     } 
  1822.       } 
  1823.       else { 
  1824.     hyf [ k ] = curchr - 48 ; 
  1825.     if ( k < 63 ) 
  1826.     digitsensed = true ; 
  1827.       } 
  1828.       break ; 
  1829.     case 10 : 
  1830.     case 2 : 
  1831.       {
  1832.     if ( k > 0 ) 
  1833.     {
  1834.       if ( hc [ 1 ] == 127 ) 
  1835.       hyf [ 0 ] = 0 ; 
  1836.       if ( hc [ k ] == 127 ) 
  1837.       hyf [ k ] = 0 ; 
  1838.       l = k ; 
  1839.       v = 0 ; 
  1840.       while ( true ) { 
  1841.         if ( hyf [ l ] != 0 ) 
  1842.         v = newtrieop ( k - l , hyf [ l ] , v ) ; 
  1843.         if ( l > 0 ) 
  1844.         decr ( l ) ; 
  1845.         else goto lab31 ; 
  1846.       } 
  1847.       lab31: ; 
  1848.       q = 0 ; 
  1849.       while ( l < k ) { 
  1850.         incr ( l ) ; 
  1851.         c = hc [ l ] ; 
  1852.         p = triel [ q ] ; 
  1853.         firstchild = true ; 
  1854.         while ( ( p > 0 ) && ( c > triec [ p ] ) ) { 
  1855.           q = p ; 
  1856.           p = trier [ q ] ; 
  1857.           firstchild = false ; 
  1858.         } 
  1859.         if ( ( p == 0 ) || ( c < triec [ p ] ) ) 
  1860.         {
  1861.           if ( trieptr == triesize ) 
  1862.           overflow ( 801 , triesize ) ; 
  1863.           incr ( trieptr ) ; 
  1864.           trier [ trieptr ] = p ; 
  1865.           p = trieptr ; 
  1866.           triel [ p ] = 0 ; 
  1867.           if ( firstchild ) 
  1868.           triel [ q ] = p ; 
  1869.           else trier [ q ] = p ; 
  1870.           triec [ p ] = c ; 
  1871.           trieo [ p ] = 0 ; 
  1872.         } 
  1873.         q = p ; 
  1874.       } 
  1875.       if ( trieo [ q ] != 0 ) 
  1876.       {
  1877.         {
  1878.           if ( interaction == 3 ) 
  1879.           wakeuptermin () ; 
  1880.           printnl ( 133 ) ; 
  1881.           print ( 806 ) ; 
  1882.         } 
  1883.         {
  1884.           helpptr = 1 ; 
  1885.           helpline [ 0 ] = 804 ; 
  1886.         } 
  1887.         error () ; 
  1888.       } 
  1889.       trieo [ q ] = v ; 
  1890.     } 
  1891.     if ( curcmd == 2 ) 
  1892.     goto lab30 ; 
  1893.     k = 0 ; 
  1894.     hyf [ 0 ] = 0 ; 
  1895.     digitsensed = false ; 
  1896.       } 
  1897.       break ; 
  1898.     default : 
  1899.       {
  1900.     {
  1901.       if ( interaction == 3 ) 
  1902.       wakeuptermin () ; 
  1903.       printnl ( 133 ) ; 
  1904.       print ( 802 ) ; 
  1905.     } 
  1906.     printesc ( 803 ) ; 
  1907.     {
  1908.       helpptr = 1 ; 
  1909.       helpline [ 0 ] = 804 ; 
  1910.     } 
  1911.     error () ; 
  1912.       } 
  1913.       break ; 
  1914.     } 
  1915.   } 
  1916.   lab30: ; 
  1917.   triel [ 0 ] = compresstrie ( triel [ 0 ] ) ; 
  1918.   inittriememo () ; 
  1919.   if ( triel [ 0 ] != 0 ) 
  1920.   {
  1921.     firstfit ( triel [ 0 ] ) ; 
  1922.     triepack ( triel [ 0 ] ) ; 
  1923.   } 
  1924.   r = 0 ; 
  1925.   while ( trietaken [ r ] ) incr ( r ) ; 
  1926.   triehash [ 0 ] = r ; 
  1927.   triefix ( triel [ 0 ] ) ; 
  1928.   r = 0 ; 
  1929.   h .v.RH = 0 ; 
  1930.   h .b0 = 0 ; 
  1931.   h .b1 = 0 ; 
  1932.   do { s = trie [ r ] .v.RH ; 
  1933.     trie [ r ] = h ; 
  1934.     r = s ; 
  1935.   } while ( ! ( r > triemax ) ) ; 
  1936. #endif /* INITEX */
  1937. halfword zprunepagetop ( p ) 
  1938. halfword p ; 
  1939. {register halfword Result; r_prunepagetop 
  1940.   halfword prevp ; 
  1941.   halfword q ; 
  1942.   prevp = memtop - 3 ; 
  1943.   mem [(long) memtop - 3 ] .hh .v.RH = p ; 
  1944.   while ( p != 0 ) switch ( mem [(long) p ] .hh.b0 ) 
  1945.   {case 0 : 
  1946.   case 1 : 
  1947.   case 2 : 
  1948.     {
  1949.       q = newskipparam ( 10 ) ; 
  1950.       mem [(long) prevp ] .hh .v.RH = q ; 
  1951.       mem [(long) q ] .hh .v.RH = p ; 
  1952.       if ( mem [(long) tempptr + 1 ] .cint > mem [(long) p + 3 ] .cint ) 
  1953.       mem [(long) tempptr + 1 ] .cint = mem [(long) tempptr + 1 ] .cint - mem [(long) p + 3 ] 
  1954.       .cint ; 
  1955.       else mem [(long) tempptr + 1 ] .cint = 0 ; 
  1956.       p = 0 ; 
  1957.     } 
  1958.     break ; 
  1959.   case 8 : 
  1960.   case 4 : 
  1961.   case 3 : 
  1962.     {
  1963.       prevp = p ; 
  1964.       p = mem [(long) prevp ] .hh .v.RH ; 
  1965.     } 
  1966.     break ; 
  1967.   case 10 : 
  1968.   case 11 : 
  1969.   case 12 : 
  1970.     {
  1971.       q = p ; 
  1972.       p = mem [(long) q ] .hh .v.RH ; 
  1973.       mem [(long) q ] .hh .v.RH = 0 ; 
  1974.       mem [(long) prevp ] .hh .v.RH = p ; 
  1975.       flushnodelis ( q ) ; 
  1976.     } 
  1977.     break ; 
  1978.   default : 
  1979.     confusion ( 807 ) ; 
  1980.     break ; 
  1981.   } 
  1982.   Result = mem [(long) memtop - 3 ] .hh .v.RH ; 
  1983.   return(Result) ; 
  1984. halfword zvertbreak ( p , h , d ) 
  1985. halfword p ; 
  1986. scaled h , d ; 
  1987. {/* 30 45 90 */ register halfword Result; r_vertbreak 
  1988.   halfword prevp ; 
  1989.   halfword q, r ; 
  1990.   integer pi ; 
  1991.   integer b ; 
  1992.   integer leastcost ; 
  1993.   halfword bestplace ; 
  1994.   scaled prevdp ; 
  1995.   smallnumber t ; 
  1996.   prevp = p ; 
  1997.   leastcost = 1073741823 ; 
  1998.   activewidth [ 1 ] = 0 ; 
  1999.   activewidth [ 2 ] = 0 ; 
  2000.   activewidth [ 3 ] = 0 ; 
  2001.   activewidth [ 4 ] = 0 ; 
  2002.   activewidth [ 5 ] = 0 ; 
  2003.   activewidth [ 6 ] = 0 ; 
  2004.   prevdp = 0 ; 
  2005.   while ( true ) { 
  2006.     if ( p == 0 ) 
  2007.     pi = - 10000 ; 
  2008.     else switch ( mem [(long) p ] .hh.b0 ) 
  2009.     {case 0 : 
  2010.     case 1 : 
  2011.     case 2 : 
  2012.       {
  2013.     activewidth [ 1 ] = activewidth [ 1 ] + prevdp + mem [(long) p + 3 ] .cint ; 
  2014.     prevdp = mem [(long) p + 2 ] .cint ; 
  2015.     goto lab45 ; 
  2016.       } 
  2017.       break ; 
  2018.     case 8 : 
  2019.       goto lab45 ; 
  2020.       break ; 
  2021.     case 10 : 
  2022.       if ( ( mem [(long) prevp ] .hh.b0 < 9 ) ) 
  2023.       pi = 0 ; 
  2024.       else goto lab90 ; 
  2025.       break ; 
  2026.     case 11 : 
  2027.       {
  2028.     if ( mem [(long) p ] .hh .v.RH == 0 ) 
  2029.     t = 12 ; 
  2030.     else t = mem [(long) mem [(long) p ] .hh .v.RH ] .hh.b0 ; 
  2031.     if ( t == 10 ) 
  2032.     pi = 0 ; 
  2033.     else goto lab90 ; 
  2034.       } 
  2035.       break ; 
  2036.     case 12 : 
  2037.       pi = mem [(long) p + 1 ] .cint ; 
  2038.       break ; 
  2039.     case 4 : 
  2040.     case 3 : 
  2041.       goto lab45 ; 
  2042.       break ; 
  2043.     default : 
  2044.       confusion ( 808 ) ; 
  2045.       break ; 
  2046.     } 
  2047.     if ( pi < 10000 ) 
  2048.     {
  2049.       if ( activewidth [ 1 ] < h ) 
  2050.       if ( ( activewidth [ 3 ] != 0 ) || ( activewidth [ 4 ] != 0 ) || ( 
  2051.       activewidth [ 5 ] != 0 ) ) 
  2052.       b = 0 ; 
  2053.       else b = badness ( h - activewidth [ 1 ] , activewidth [ 2 ] ) ; 
  2054.       else if ( activewidth [ 1 ] - h > activewidth [ 6 ] ) 
  2055.       b = 1073741823 ; 
  2056.       else b = badness ( activewidth [ 1 ] - h , activewidth [ 6 ] ) ; 
  2057.       if ( b < 1073741823 ) 
  2058.       if ( pi <= - 10000 ) 
  2059.       b = pi ; 
  2060.       else if ( b < 10000 ) 
  2061.       b = b + pi ; 
  2062.       else b = 100000 ; 
  2063.       if ( b <= leastcost ) 
  2064.       {
  2065.     bestplace = p ; 
  2066.     leastcost = b ; 
  2067.     bestheightpl = activewidth [ 1 ] + prevdp ; 
  2068.       } 
  2069.       if ( ( b == 1073741823 ) || ( pi <= - 10000 ) ) 
  2070.       goto lab30 ; 
  2071.     } 
  2072.     if ( ( mem [(long) p ] .hh.b0 < 10 ) || ( mem [(long) p ] .hh.b0 > 11 ) ) 
  2073.     goto lab45 ; 
  2074.     lab90: if ( mem [(long) p ] .hh.b0 == 11 ) 
  2075.     q = p ; 
  2076.     else { 
  2077.       q = mem [(long) p + 1 ] .hh .v.LH ; 
  2078.       activewidth [ 2 + mem [(long) q ] .hh.b0 ] = activewidth [ 2 + mem [(long) q ] 
  2079.       .hh.b0 ] + mem [(long) q + 2 ] .cint ; 
  2080.       activewidth [ 6 ] = activewidth [ 6 ] + mem [(long) q + 3 ] .cint ; 
  2081.       if ( ( mem [(long) q ] .hh.b1 != 0 ) && ( mem [(long) q + 3 ] .cint != 0 ) ) 
  2082.       {
  2083.     {
  2084.       if ( interaction == 3 ) 
  2085.       wakeuptermin () ; 
  2086.       printnl ( 133 ) ; 
  2087.       print ( 809 ) ; 
  2088.     } 
  2089.     {
  2090.       helpptr = 4 ; 
  2091.       helpline [ 3 ] = 810 ; 
  2092.       helpline [ 2 ] = 811 ; 
  2093.       helpline [ 1 ] = 812 ; 
  2094.       helpline [ 0 ] = 776 ; 
  2095.     } 
  2096.     error () ; 
  2097.     r = newspec ( q ) ; 
  2098.     mem [(long) r ] .hh.b1 = 0 ; 
  2099.     deletegluere ( q ) ; 
  2100.     mem [(long) p + 1 ] .hh .v.LH = r ; 
  2101.       } 
  2102.     } 
  2103.     activewidth [ 1 ] = activewidth [ 1 ] + prevdp + mem [(long) q + 1 ] .cint ; 
  2104.     prevdp = 0 ; 
  2105.     lab45: if ( prevdp > d ) 
  2106.     {
  2107.       activewidth [ 1 ] = activewidth [ 1 ] + prevdp - d ; 
  2108.       prevdp = d ; 
  2109.     } 
  2110.     prevp = p ; 
  2111.     p = mem [(long) prevp ] .hh .v.RH ; 
  2112.   } 
  2113.   lab30: Result = bestplace ; 
  2114.   return(Result) ; 
  2115.