home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / tex / tex31 / texsrc.lzh / TEXSRC.LZH / tex12.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-11-28  |  25.1 KB  |  1,011 lines

  1. #define EXTERN extern
  2. #include "texd.h"
  3.  
  4. halfword zvsplit ( n , h ) 
  5. eightbits n ; 
  6. scaled h ; 
  7. {/* 10 30 */ register halfword Result; vsplit_regmem 
  8.   halfword v  ; 
  9.   halfword p  ; 
  10.   halfword q  ; 
  11.   v = eqtb [ 4578 + n ] .hh .v.RH ; 
  12.   if ( curmark [ 3 ] != 0 ) 
  13.   {
  14.     deletetokenref ( curmark [ 3 ] ) ; 
  15.     curmark [ 3 ] = 0 ; 
  16.     deletetokenref ( curmark [ 4 ] ) ; 
  17.     curmark [ 4 ] = 0 ; 
  18.   } 
  19.   if ( v == 0 ) 
  20.   {
  21.     Result = 0 ; 
  22.     return(Result) ; 
  23.   } 
  24.   if ( mem [ v ] .hh.b0 != 1 ) 
  25.   {
  26.     {
  27.       if ( interaction == 3 ) 
  28.       wakeupterminal () ; 
  29.       printnl ( 262 ) ; 
  30.       print ( 335 ) ; 
  31.     } 
  32.     printesc ( 958 ) ; 
  33.     print ( 959 ) ; 
  34.     printesc ( 960 ) ; 
  35.     {
  36.       helpptr = 2 ; 
  37.       helpline [ 1 ] = 961 ; 
  38.       helpline [ 0 ] = 962 ; 
  39.     } 
  40.     error () ; 
  41.     Result = 0 ; 
  42.     return(Result) ; 
  43.   } 
  44.   q = vertbreak ( mem [ v + 5 ] .hh .v.RH , h , eqtb [ 6736 ] .cint ) ; 
  45.   p = mem [ v + 5 ] .hh .v.RH ; 
  46.   if ( p == q ) 
  47.   mem [ v + 5 ] .hh .v.RH = 0 ; 
  48.   else while ( true ) {
  49.       
  50.     if ( mem [ p ] .hh.b0 == 4 ) 
  51.     if ( curmark [ 3 ] == 0 ) 
  52.     {
  53.       curmark [ 3 ] = mem [ p + 1 ] .cint ; 
  54.       curmark [ 4 ] = curmark [ 3 ] ; 
  55.       mem [ curmark [ 3 ] ] .hh .v.LH = mem [ curmark [ 3 ] ] .hh .v.LH + 2 ; 
  56.     } 
  57.     else {
  58.     
  59.       deletetokenref ( curmark [ 4 ] ) ; 
  60.       curmark [ 4 ] = mem [ p + 1 ] .cint ; 
  61.       incr ( mem [ curmark [ 4 ] ] .hh .v.LH ) ; 
  62.     } 
  63.     if ( mem [ p ] .hh .v.RH == q ) 
  64.     {
  65.       mem [ p ] .hh .v.RH = 0 ; 
  66.       goto lab30 ; 
  67.     } 
  68.     p = mem [ p ] .hh .v.RH ; 
  69.   } 
  70.   lab30: ; 
  71.   q = prunepagetop ( q ) ; 
  72.   p = mem [ v + 5 ] .hh .v.RH ; 
  73.   freenode ( v , 7 ) ; 
  74.   if ( q == 0 ) 
  75.   eqtb [ 4578 + n ] .hh .v.RH = 0 ; 
  76.   else eqtb [ 4578 + n ] .hh .v.RH = vpackage ( q , 0 , 1 , 1073741823L ) ; 
  77.   Result = vpackage ( p , h , 0 , eqtb [ 6736 ] .cint ) ; 
  78.   return(Result) ; 
  79. void printtotals ( ) 
  80. {printtotals_regmem 
  81.   printscaled ( pagesofar [ 1 ] ) ; 
  82.   if ( pagesofar [ 2 ] != 0 ) 
  83.   {
  84.     print ( 310 ) ; 
  85.     printscaled ( pagesofar [ 2 ] ) ; 
  86.     print ( 335 ) ; 
  87.   } 
  88.   if ( pagesofar [ 3 ] != 0 ) 
  89.   {
  90.     print ( 310 ) ; 
  91.     printscaled ( pagesofar [ 3 ] ) ; 
  92.     print ( 309 ) ; 
  93.   } 
  94.   if ( pagesofar [ 4 ] != 0 ) 
  95.   {
  96.     print ( 310 ) ; 
  97.     printscaled ( pagesofar [ 4 ] ) ; 
  98.     print ( 971 ) ; 
  99.   } 
  100.   if ( pagesofar [ 5 ] != 0 ) 
  101.   {
  102.     print ( 310 ) ; 
  103.     printscaled ( pagesofar [ 5 ] ) ; 
  104.     print ( 972 ) ; 
  105.   } 
  106.   if ( pagesofar [ 6 ] != 0 ) 
  107.   {
  108.     print ( 311 ) ; 
  109.     printscaled ( pagesofar [ 6 ] ) ; 
  110.   } 
  111. void zfreezepagespecs ( s ) 
  112. smallnumber s ; 
  113. {freezepagespecs_regmem 
  114.   pagecontents = s ; 
  115.   pagesofar [ 0 ] = eqtb [ 6734 ] .cint ; 
  116.   pagemaxdepth = eqtb [ 6735 ] .cint ; 
  117.   pagesofar [ 7 ] = 0 ; 
  118.   pagesofar [ 1 ] = 0 ; 
  119.   pagesofar [ 2 ] = 0 ; 
  120.   pagesofar [ 3 ] = 0 ; 
  121.   pagesofar [ 4 ] = 0 ; 
  122.   pagesofar [ 5 ] = 0 ; 
  123.   pagesofar [ 6 ] = 0 ; 
  124.   leastpagecost = 1073741823L ; 
  125.     ;
  126. #ifdef STAT
  127.   if ( eqtb [ 6196 ] .cint > 0 ) 
  128.   {
  129.     begindiagnostic () ; 
  130.     printnl ( 980 ) ; 
  131.     printscaled ( pagesofar [ 0 ] ) ; 
  132.     print ( 981 ) ; 
  133.     printscaled ( pagemaxdepth ) ; 
  134.     enddiagnostic ( false ) ; 
  135.   } 
  136. #endif /* STAT */
  137. void zboxerror ( n ) 
  138. eightbits n ; 
  139. {boxerror_regmem 
  140.   error () ; 
  141.   begindiagnostic () ; 
  142.   printnl ( 829 ) ; 
  143.   showbox ( eqtb [ 4578 + n ] .hh .v.RH ) ; 
  144.   enddiagnostic ( true ) ; 
  145.   flushnodelist ( eqtb [ 4578 + n ] .hh .v.RH ) ; 
  146.   eqtb [ 4578 + n ] .hh .v.RH = 0 ; 
  147. void zensurevbox ( n ) 
  148. eightbits n ; 
  149. {ensurevbox_regmem 
  150.   halfword p  ; 
  151.   p = eqtb [ 4578 + n ] .hh .v.RH ; 
  152.   if ( p != 0 ) 
  153.   if ( mem [ p ] .hh.b0 == 0 ) 
  154.   {
  155.     {
  156.       if ( interaction == 3 ) 
  157.       wakeupterminal () ; 
  158.       printnl ( 262 ) ; 
  159.       print ( 982 ) ; 
  160.     } 
  161.     {
  162.       helpptr = 3 ; 
  163.       helpline [ 2 ] = 983 ; 
  164.       helpline [ 1 ] = 984 ; 
  165.       helpline [ 0 ] = 985 ; 
  166.     } 
  167.     boxerror ( n ) ; 
  168.   } 
  169. void zfireup ( c ) 
  170. halfword c ; 
  171. {/* 10 */ fireup_regmem 
  172.   halfword p, q, r, s  ; 
  173.   halfword prevp  ; 
  174.   unsigned char n  ; 
  175.   boolean wait  ; 
  176.   integer savevbadness  ; 
  177.   scaled savevfuzz  ; 
  178.   halfword savesplittopskip  ; 
  179.   if ( mem [ bestpagebreak ] .hh.b0 == 12 ) 
  180.   {
  181.     geqworddefine ( 6202 , mem [ bestpagebreak + 1 ] .cint ) ; 
  182.     mem [ bestpagebreak + 1 ] .cint = 10000 ; 
  183.   } 
  184.   else geqworddefine ( 6202 , 10000 ) ; 
  185.   if ( curmark [ 2 ] != 0 ) 
  186.   {
  187.     if ( curmark [ 0 ] != 0 ) 
  188.     deletetokenref ( curmark [ 0 ] ) ; 
  189.     curmark [ 0 ] = curmark [ 2 ] ; 
  190.     incr ( mem [ curmark [ 0 ] ] .hh .v.LH ) ; 
  191.     deletetokenref ( curmark [ 1 ] ) ; 
  192.     curmark [ 1 ] = 0 ; 
  193.   } 
  194.   if ( c == bestpagebreak ) 
  195.   bestpagebreak = 0 ; 
  196.   if ( eqtb [ 4833 ] .hh .v.RH != 0 ) 
  197.   {
  198.     {
  199.       if ( interaction == 3 ) 
  200.       wakeupterminal () ; 
  201.       printnl ( 262 ) ; 
  202.       print ( 335 ) ; 
  203.     } 
  204.     printesc ( 405 ) ; 
  205.     print ( 996 ) ; 
  206.     {
  207.       helpptr = 2 ; 
  208.       helpline [ 1 ] = 997 ; 
  209.       helpline [ 0 ] = 985 ; 
  210.     } 
  211.     boxerror ( 255 ) ; 
  212.   } 
  213.   insertpenalties = 0 ; 
  214.   savesplittopskip = eqtb [ 3792 ] .hh .v.RH ; 
  215.   if ( eqtb [ 6216 ] .cint <= 0 ) 
  216.   {
  217.     r = mem [ memtop ] .hh .v.RH ; 
  218.     while ( r != memtop ) {
  219.     
  220.       if ( mem [ r + 2 ] .hh .v.LH != 0 ) 
  221.       {
  222.     n = mem [ r ] .hh.b1 ; 
  223.     ensurevbox ( n ) ; 
  224.     if ( eqtb [ 4578 + n ] .hh .v.RH == 0 ) 
  225.     eqtb [ 4578 + n ] .hh .v.RH = newnullbox () ; 
  226.     p = eqtb [ 4578 + n ] .hh .v.RH + 5 ; 
  227.     while ( mem [ p ] .hh .v.RH != 0 ) p = mem [ p ] .hh .v.RH ; 
  228.     mem [ r + 2 ] .hh .v.RH = p ; 
  229.       } 
  230.       r = mem [ r ] .hh .v.RH ; 
  231.     } 
  232.   } 
  233.   q = memtop - 4 ; 
  234.   mem [ q ] .hh .v.RH = 0 ; 
  235.   prevp = memtop - 2 ; 
  236.   p = mem [ prevp ] .hh .v.RH ; 
  237.   while ( p != bestpagebreak ) {
  238.       
  239.     if ( mem [ p ] .hh.b0 == 3 ) 
  240.     {
  241.       if ( eqtb [ 6216 ] .cint <= 0 ) 
  242.       {
  243.     r = mem [ memtop ] .hh .v.RH ; 
  244.     while ( mem [ r ] .hh.b1 != mem [ p ] .hh.b1 ) r = mem [ r ] .hh .v.RH 
  245.     ; 
  246.     if ( mem [ r + 2 ] .hh .v.LH == 0 ) 
  247.     wait = true ; 
  248.     else {
  249.         
  250.       wait = false ; 
  251.       s = mem [ r + 2 ] .hh .v.RH ; 
  252.       mem [ s ] .hh .v.RH = mem [ p + 4 ] .hh .v.LH ; 
  253.       if ( mem [ r + 2 ] .hh .v.LH == p ) 
  254.       {
  255.         if ( mem [ r ] .hh.b0 == 1 ) 
  256.         if ( ( mem [ r + 1 ] .hh .v.LH == p ) && ( mem [ r + 1 ] .hh .v.RH 
  257.         != 0 ) ) 
  258.         {
  259.           while ( mem [ s ] .hh .v.RH != mem [ r + 1 ] .hh .v.RH ) s = mem 
  260.           [ s ] .hh .v.RH ; 
  261.           mem [ s ] .hh .v.RH = 0 ; 
  262.           eqtb [ 3792 ] .hh .v.RH = mem [ p + 4 ] .hh .v.RH ; 
  263.           mem [ p + 4 ] .hh .v.LH = prunepagetop ( mem [ r + 1 ] .hh .v.RH 
  264.           ) ; 
  265.           if ( mem [ p + 4 ] .hh .v.LH != 0 ) 
  266.           {
  267.         tempptr = vpackage ( mem [ p + 4 ] .hh .v.LH , 0 , 1 , 
  268.         1073741823L ) ; 
  269.         mem [ p + 3 ] .cint = mem [ tempptr + 3 ] .cint + mem [ 
  270.         tempptr + 2 ] .cint ; 
  271.         freenode ( tempptr , 7 ) ; 
  272.         wait = true ; 
  273.           } 
  274.         } 
  275.         mem [ r + 2 ] .hh .v.LH = 0 ; 
  276.         n = mem [ r ] .hh.b1 ; 
  277.         tempptr = mem [ eqtb [ 4578 + n ] .hh .v.RH + 5 ] .hh .v.RH ; 
  278.         freenode ( eqtb [ 4578 + n ] .hh .v.RH , 7 ) ; 
  279.         eqtb [ 4578 + n ] .hh .v.RH = vpackage ( tempptr , 0 , 1 , 
  280.         1073741823L ) ; 
  281.       } 
  282.       else {
  283.           
  284.         while ( mem [ s ] .hh .v.RH != 0 ) s = mem [ s ] .hh .v.RH ; 
  285.         mem [ r + 2 ] .hh .v.RH = s ; 
  286.       } 
  287.     } 
  288.     mem [ prevp ] .hh .v.RH = mem [ p ] .hh .v.RH ; 
  289.     mem [ p ] .hh .v.RH = 0 ; 
  290.     if ( wait ) 
  291.     {
  292.       mem [ q ] .hh .v.RH = p ; 
  293.       q = p ; 
  294.       incr ( insertpenalties ) ; 
  295.     } 
  296.     else {
  297.         
  298.       deleteglueref ( mem [ p + 4 ] .hh .v.RH ) ; 
  299.       freenode ( p , 5 ) ; 
  300.     } 
  301.     p = prevp ; 
  302.       } 
  303.     } 
  304.     else if ( mem [ p ] .hh.b0 == 4 ) 
  305.     {
  306.       if ( curmark [ 1 ] == 0 ) 
  307.       {
  308.     curmark [ 1 ] = mem [ p + 1 ] .cint ; 
  309.     incr ( mem [ curmark [ 1 ] ] .hh .v.LH ) ; 
  310.       } 
  311.       if ( curmark [ 2 ] != 0 ) 
  312.       deletetokenref ( curmark [ 2 ] ) ; 
  313.       curmark [ 2 ] = mem [ p + 1 ] .cint ; 
  314.       incr ( mem [ curmark [ 2 ] ] .hh .v.LH ) ; 
  315.     } 
  316.     prevp = p ; 
  317.     p = mem [ prevp ] .hh .v.RH ; 
  318.   } 
  319.   eqtb [ 3792 ] .hh .v.RH = savesplittopskip ; 
  320.   if ( p != 0 ) 
  321.   {
  322.     if ( mem [ memtop - 1 ] .hh .v.RH == 0 ) 
  323.     if ( nestptr == 0 ) 
  324.     curlist .tailfield = pagetail ; 
  325.     else nest [ 0 ] .tailfield = pagetail ; 
  326.     mem [ pagetail ] .hh .v.RH = mem [ memtop - 1 ] .hh .v.RH ; 
  327.     mem [ memtop - 1 ] .hh .v.RH = p ; 
  328.     mem [ prevp ] .hh .v.RH = 0 ; 
  329.   } 
  330.   savevbadness = eqtb [ 6190 ] .cint ; 
  331.   eqtb [ 6190 ] .cint = 10000 ; 
  332.   savevfuzz = eqtb [ 6739 ] .cint ; 
  333.   eqtb [ 6739 ] .cint = 1073741823L ; 
  334.   eqtb [ 4833 ] .hh .v.RH = vpackage ( mem [ memtop - 2 ] .hh .v.RH , bestsize 
  335.   , 0 , pagemaxdepth ) ; 
  336.   eqtb [ 6190 ] .cint = savevbadness ; 
  337.   eqtb [ 6739 ] .cint = savevfuzz ; 
  338.   if ( lastglue != 65535L ) 
  339.   deleteglueref ( lastglue ) ; 
  340.   pagecontents = 0 ; 
  341.   pagetail = memtop - 2 ; 
  342.   mem [ memtop - 2 ] .hh .v.RH = 0 ; 
  343.   lastglue = 65535L ; 
  344.   lastpenalty = 0 ; 
  345.   lastkern = 0 ; 
  346.   pagesofar [ 7 ] = 0 ; 
  347.   pagemaxdepth = 0 ; 
  348.   if ( q != memtop - 4 ) 
  349.   {
  350.     mem [ memtop - 2 ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ; 
  351.     pagetail = q ; 
  352.   } 
  353.   r = mem [ memtop ] .hh .v.RH ; 
  354.   while ( r != memtop ) {
  355.       
  356.     q = mem [ r ] .hh .v.RH ; 
  357.     freenode ( r , 4 ) ; 
  358.     r = q ; 
  359.   } 
  360.   mem [ memtop ] .hh .v.RH = memtop ; 
  361.   if ( ( curmark [ 0 ] != 0 ) && ( curmark [ 1 ] == 0 ) ) 
  362.   {
  363.     curmark [ 1 ] = curmark [ 0 ] ; 
  364.     incr ( mem [ curmark [ 0 ] ] .hh .v.LH ) ; 
  365.   } 
  366.   if ( eqtb [ 4313 ] .hh .v.RH != 0 ) 
  367.   if ( deadcycles >= eqtb [ 6203 ] .cint ) 
  368.   {
  369.     {
  370.       if ( interaction == 3 ) 
  371.       wakeupterminal () ; 
  372.       printnl ( 262 ) ; 
  373.       print ( 998 ) ; 
  374.     } 
  375.     printint ( deadcycles ) ; 
  376.     print ( 999 ) ; 
  377.     {
  378.       helpptr = 3 ; 
  379.       helpline [ 2 ] = 1000 ; 
  380.       helpline [ 1 ] = 1001 ; 
  381.       helpline [ 0 ] = 1002 ; 
  382.     } 
  383.     error () ; 
  384.   } 
  385.   else {
  386.       
  387.     outputactive = true ; 
  388.     incr ( deadcycles ) ; 
  389.     pushnest () ; 
  390.     curlist .modefield = -1 ; 
  391.     curlist .auxfield .cint = -65536000L ; 
  392.     curlist .mlfield = - (integer) line ; 
  393.     begintokenlist ( eqtb [ 4313 ] .hh .v.RH , 6 ) ; 
  394.     newsavelevel ( 8 ) ; 
  395.     normalparagraph () ; 
  396.     scanleftbrace () ; 
  397.     return ; 
  398.   } 
  399.   {
  400.     if ( mem [ memtop - 2 ] .hh .v.RH != 0 ) 
  401.     {
  402.       if ( mem [ memtop - 1 ] .hh .v.RH == 0 ) 
  403.       if ( nestptr == 0 ) 
  404.       curlist .tailfield = pagetail ; 
  405.       else nest [ 0 ] .tailfield = pagetail ; 
  406.       else mem [ pagetail ] .hh .v.RH = mem [ memtop - 1 ] .hh .v.RH ; 
  407.       mem [ memtop - 1 ] .hh .v.RH = mem [ memtop - 2 ] .hh .v.RH ; 
  408.       mem [ memtop - 2 ] .hh .v.RH = 0 ; 
  409.       pagetail = memtop - 2 ; 
  410.     } 
  411.     shipout ( eqtb [ 4833 ] .hh .v.RH ) ; 
  412.     eqtb [ 4833 ] .hh .v.RH = 0 ; 
  413.   } 
  414. void buildpage ( ) 
  415. {/* 10 30 31 22 80 90 */ buildpage_regmem 
  416.   halfword p  ; 
  417.   halfword q, r  ; 
  418.   integer b, c  ; 
  419.   integer pi  ; 
  420.   unsigned char n  ; 
  421.   scaled delta, h, w  ; 
  422.   if ( ( mem [ memtop - 1 ] .hh .v.RH == 0 ) || outputactive ) 
  423.   return ; 
  424.   do {
  425.       lab22: p = mem [ memtop - 1 ] .hh .v.RH ; 
  426.     if ( lastglue != 65535L ) 
  427.     deleteglueref ( lastglue ) ; 
  428.     lastpenalty = 0 ; 
  429.     lastkern = 0 ; 
  430.     if ( mem [ p ] .hh.b0 == 10 ) 
  431.     {
  432.       lastglue = mem [ p + 1 ] .hh .v.LH ; 
  433.       incr ( mem [ lastglue ] .hh .v.RH ) ; 
  434.     } 
  435.     else {
  436.     
  437.       lastglue = 65535L ; 
  438.       if ( mem [ p ] .hh.b0 == 12 ) 
  439.       lastpenalty = mem [ p + 1 ] .cint ; 
  440.       else if ( mem [ p ] .hh.b0 == 11 ) 
  441.       lastkern = mem [ p + 1 ] .cint ; 
  442.     } 
  443.     switch ( mem [ p ] .hh.b0 ) 
  444.     {case 0 : 
  445.     case 1 : 
  446.     case 2 : 
  447.       if ( pagecontents < 2 ) 
  448.       {
  449.     if ( pagecontents == 0 ) 
  450.     freezepagespecs ( 2 ) ; 
  451.     else pagecontents = 2 ; 
  452.     q = newskipparam ( 9 ) ; 
  453.     if ( mem [ tempptr + 1 ] .cint > mem [ p + 3 ] .cint ) 
  454.     mem [ tempptr + 1 ] .cint = mem [ tempptr + 1 ] .cint - mem [ p + 3 ] 
  455.     .cint ; 
  456.     else mem [ tempptr + 1 ] .cint = 0 ; 
  457.     mem [ q ] .hh .v.RH = p ; 
  458.     mem [ memtop - 1 ] .hh .v.RH = q ; 
  459.     goto lab22 ; 
  460.       } 
  461.       else {
  462.       
  463.     pagesofar [ 1 ] = pagesofar [ 1 ] + pagesofar [ 7 ] + mem [ p + 3 ] 
  464.     .cint ; 
  465.     pagesofar [ 7 ] = mem [ p + 2 ] .cint ; 
  466.     goto lab80 ; 
  467.       } 
  468.       break ; 
  469.     case 8 : 
  470.       goto lab80 ; 
  471.       break ; 
  472.     case 10 : 
  473.       if ( pagecontents < 2 ) 
  474.       goto lab31 ; 
  475.       else if ( ( mem [ pagetail ] .hh.b0 < 9 ) ) 
  476.       pi = 0 ; 
  477.       else goto lab90 ; 
  478.       break ; 
  479.     case 11 : 
  480.       if ( pagecontents < 2 ) 
  481.       goto lab31 ; 
  482.       else if ( mem [ p ] .hh .v.RH == 0 ) 
  483.       return ; 
  484.       else if ( mem [ mem [ p ] .hh .v.RH ] .hh.b0 == 10 ) 
  485.       pi = 0 ; 
  486.       else goto lab90 ; 
  487.       break ; 
  488.     case 12 : 
  489.       if ( pagecontents < 2 ) 
  490.       goto lab31 ; 
  491.       else pi = mem [ p + 1 ] .cint ; 
  492.       break ; 
  493.     case 4 : 
  494.       goto lab80 ; 
  495.       break ; 
  496.     case 3 : 
  497.       {
  498.     if ( pagecontents == 0 ) 
  499.     freezepagespecs ( 1 ) ; 
  500.     n = mem [ p ] .hh.b1 ; 
  501.     r = memtop ; 
  502.     while ( n >= mem [ mem [ r ] .hh .v.RH ] .hh.b1 ) r = mem [ r ] .hh 
  503.     .v.RH ; 
  504.     n = n ; 
  505.     if ( mem [ r ] .hh.b1 != n ) 
  506.     {
  507.       q = getnode ( 4 ) ; 
  508.       mem [ q ] .hh .v.RH = mem [ r ] .hh .v.RH ; 
  509.       mem [ r ] .hh .v.RH = q ; 
  510.       r = q ; 
  511.       mem [ r ] .hh.b1 = n ; 
  512.       mem [ r ] .hh.b0 = 0 ; 
  513.       ensurevbox ( n ) ; 
  514.       if ( eqtb [ 4578 + n ] .hh .v.RH == 0 ) 
  515.       mem [ r + 3 ] .cint = 0 ; 
  516.       else mem [ r + 3 ] .cint = mem [ eqtb [ 4578 + n ] .hh .v.RH + 3 ] 
  517.       .cint + mem [ eqtb [ 4578 + n ] .hh .v.RH + 2 ] .cint ; 
  518.       mem [ r + 2 ] .hh .v.LH = 0 ; 
  519.       q = eqtb [ 3800 + n ] .hh .v.RH ; 
  520.       if ( eqtb [ 6218 + n ] .cint == 1000 ) 
  521.       h = mem [ r + 3 ] .cint ; 
  522.       else h = xovern ( mem [ r + 3 ] .cint , 1000 ) * eqtb [ 6218 + n ] 
  523.       .cint ; 
  524.       pagesofar [ 0 ] = pagesofar [ 0 ] - h - mem [ q + 1 ] .cint ; 
  525.       pagesofar [ 2 + mem [ q ] .hh.b0 ] = pagesofar [ 2 + mem [ q ] 
  526.       .hh.b0 ] + mem [ q + 2 ] .cint ; 
  527.       pagesofar [ 6 ] = pagesofar [ 6 ] + mem [ q + 3 ] .cint ; 
  528.       if ( ( mem [ q ] .hh.b1 != 0 ) && ( mem [ q + 3 ] .cint != 0 ) ) 
  529.       {
  530.         {
  531.           if ( interaction == 3 ) 
  532.           wakeupterminal () ; 
  533.           printnl ( 262 ) ; 
  534.           print ( 991 ) ; 
  535.         } 
  536.         printesc ( 391 ) ; 
  537.         printint ( n ) ; 
  538.         {
  539.           helpptr = 3 ; 
  540.           helpline [ 2 ] = 992 ; 
  541.           helpline [ 1 ] = 993 ; 
  542.           helpline [ 0 ] = 915 ; 
  543.         } 
  544.         error () ; 
  545.       } 
  546.     } 
  547.     if ( mem [ r ] .hh.b0 == 1 ) 
  548.     insertpenalties = insertpenalties + mem [ p + 1 ] .cint ; 
  549.     else {
  550.         
  551.       mem [ r + 2 ] .hh .v.RH = p ; 
  552.       delta = pagesofar [ 0 ] - pagesofar [ 1 ] - pagesofar [ 7 ] + 
  553.       pagesofar [ 6 ] ; 
  554.       if ( eqtb [ 6218 + n ] .cint == 1000 ) 
  555.       h = mem [ p + 3 ] .cint ; 
  556.       else h = xovern ( mem [ p + 3 ] .cint , 1000 ) * eqtb [ 6218 + n ] 
  557.       .cint ; 
  558.       if ( ( ( h <= 0 ) || ( h <= delta ) ) && ( mem [ p + 3 ] .cint + mem 
  559.       [ r + 3 ] .cint <= eqtb [ 6751 + n ] .cint ) ) 
  560.       {
  561.         pagesofar [ 0 ] = pagesofar [ 0 ] - h ; 
  562.         mem [ r + 3 ] .cint = mem [ r + 3 ] .cint + mem [ p + 3 ] .cint ; 
  563.       } 
  564.       else {
  565.           
  566.         if ( eqtb [ 6218 + n ] .cint <= 0 ) 
  567.         w = 1073741823L ; 
  568.         else {
  569.         
  570.           w = pagesofar [ 0 ] - pagesofar [ 1 ] - pagesofar [ 7 ] ; 
  571.           if ( eqtb [ 6218 + n ] .cint != 1000 ) 
  572.           w = xovern ( w , eqtb [ 6218 + n ] .cint ) * 1000 ; 
  573.         } 
  574.         if ( w > eqtb [ 6751 + n ] .cint - mem [ r + 3 ] .cint ) 
  575.         w = eqtb [ 6751 + n ] .cint - mem [ r + 3 ] .cint ; 
  576.         q = vertbreak ( mem [ p + 4 ] .hh .v.LH , w , mem [ p + 2 ] .cint 
  577.         ) ; 
  578.         mem [ r + 3 ] .cint = mem [ r + 3 ] .cint + bestheightplusdepth ; 
  579.     ;
  580. #ifdef STAT
  581.         if ( eqtb [ 6196 ] .cint > 0 ) 
  582.         {
  583.           begindiagnostic () ; 
  584.           printnl ( 994 ) ; 
  585.           printint ( n ) ; 
  586.           print ( 995 ) ; 
  587.           printscaled ( w ) ; 
  588.           printchar ( 44 ) ; 
  589.           printscaled ( bestheightplusdepth ) ; 
  590.           print ( 924 ) ; 
  591.           if ( q == 0 ) 
  592.           printint ( -10000 ) ; 
  593.           else if ( mem [ q ] .hh.b0 == 12 ) 
  594.           printint ( mem [ q + 1 ] .cint ) ; 
  595.           else printchar ( 48 ) ; 
  596.           enddiagnostic ( false ) ; 
  597.         } 
  598. #endif /* STAT */
  599.         if ( eqtb [ 6218 + n ] .cint != 1000 ) 
  600.         bestheightplusdepth = xovern ( bestheightplusdepth , 1000 ) * eqtb 
  601.         [ 6218 + n ] .cint ; 
  602.         pagesofar [ 0 ] = pagesofar [ 0 ] - bestheightplusdepth ; 
  603.         mem [ r ] .hh.b0 = 1 ; 
  604.         mem [ r + 1 ] .hh .v.RH = q ; 
  605.         mem [ r + 1 ] .hh .v.LH = p ; 
  606.         if ( q == 0 ) 
  607.         insertpenalties = insertpenalties - 10000 ; 
  608.         else if ( mem [ q ] .hh.b0 == 12 ) 
  609.         insertpenalties = insertpenalties + mem [ q + 1 ] .cint ; 
  610.       } 
  611.     } 
  612.     goto lab80 ; 
  613.       } 
  614.       break ; 
  615.       default: 
  616.       confusion ( 986 ) ; 
  617.       break ; 
  618.     } 
  619.     if ( pi < 10000 ) 
  620.     {
  621.       if ( pagesofar [ 1 ] < pagesofar [ 0 ] ) 
  622.       if ( ( pagesofar [ 3 ] != 0 ) || ( pagesofar [ 4 ] != 0 ) || ( pagesofar 
  623.       [ 5 ] != 0 ) ) 
  624.       b = 0 ; 
  625.       else b = badness ( pagesofar [ 0 ] - pagesofar [ 1 ] , pagesofar [ 2 ] ) 
  626.       ; 
  627.       else if ( pagesofar [ 1 ] - pagesofar [ 0 ] > pagesofar [ 6 ] ) 
  628.       b = 1073741823L ; 
  629.       else b = badness ( pagesofar [ 1 ] - pagesofar [ 0 ] , pagesofar [ 6 ] ) 
  630.       ; 
  631.       if ( b < 1073741823L ) 
  632.       if ( pi <= -10000 ) 
  633.       c = pi ; 
  634.       else if ( b < 10000 ) 
  635.       c = b + pi + insertpenalties ; 
  636.       else c = 100000L ; 
  637.       else c = b ; 
  638.       if ( insertpenalties >= 10000 ) 
  639.       c = 1073741823L ; 
  640.     ;
  641. #ifdef STAT
  642.       if ( eqtb [ 6196 ] .cint > 0 ) 
  643.       {
  644.     begindiagnostic () ; 
  645.     printnl ( 37 ) ; 
  646.     print ( 920 ) ; 
  647.     printtotals () ; 
  648.     print ( 989 ) ; 
  649.     printscaled ( pagesofar [ 0 ] ) ; 
  650.     print ( 923 ) ; 
  651.     if ( b == 1073741823L ) 
  652.     printchar ( 42 ) ; 
  653.     else printint ( b ) ; 
  654.     print ( 924 ) ; 
  655.     printint ( pi ) ; 
  656.     print ( 990 ) ; 
  657.     if ( c == 1073741823L ) 
  658.     printchar ( 42 ) ; 
  659.     else printint ( c ) ; 
  660.     if ( c <= leastpagecost ) 
  661.     printchar ( 35 ) ; 
  662.     enddiagnostic ( false ) ; 
  663.       } 
  664. #endif /* STAT */
  665.       if ( c <= leastpagecost ) 
  666.       {
  667.     bestpagebreak = p ; 
  668.     bestsize = pagesofar [ 0 ] ; 
  669.     leastpagecost = c ; 
  670.     r = mem [ memtop ] .hh .v.RH ; 
  671.     while ( r != memtop ) {
  672.         
  673.       mem [ r + 2 ] .hh .v.LH = mem [ r + 2 ] .hh .v.RH ; 
  674.       r = mem [ r ] .hh .v.RH ; 
  675.     } 
  676.       } 
  677.       if ( ( c == 1073741823L ) || ( pi <= -10000 ) ) 
  678.       {
  679.     fireup ( p ) ; 
  680.     if ( outputactive ) 
  681.     return ; 
  682.     goto lab30 ; 
  683.       } 
  684.     } 
  685.     if ( ( mem [ p ] .hh.b0 < 10 ) || ( mem [ p ] .hh.b0 > 11 ) ) 
  686.     goto lab80 ; 
  687.     lab90: if ( mem [ p ] .hh.b0 == 11 ) 
  688.     q = p ; 
  689.     else {
  690.     
  691.       q = mem [ p + 1 ] .hh .v.LH ; 
  692.       pagesofar [ 2 + mem [ q ] .hh.b0 ] = pagesofar [ 2 + mem [ q ] .hh.b0 ] 
  693.       + mem [ q + 2 ] .cint ; 
  694.       pagesofar [ 6 ] = pagesofar [ 6 ] + mem [ q + 3 ] .cint ; 
  695.       if ( ( mem [ q ] .hh.b1 != 0 ) && ( mem [ q + 3 ] .cint != 0 ) ) 
  696.       {
  697.     {
  698.       if ( interaction == 3 ) 
  699.       wakeupterminal () ; 
  700.       printnl ( 262 ) ; 
  701.       print ( 987 ) ; 
  702.     } 
  703.     {
  704.       helpptr = 4 ; 
  705.       helpline [ 3 ] = 988 ; 
  706.       helpline [ 2 ] = 956 ; 
  707.       helpline [ 1 ] = 957 ; 
  708.       helpline [ 0 ] = 915 ; 
  709.     } 
  710.     error () ; 
  711.     r = newspec ( q ) ; 
  712.     mem [ r ] .hh.b1 = 0 ; 
  713.     deleteglueref ( q ) ; 
  714.     mem [ p + 1 ] .hh .v.LH = r ; 
  715.     q = r ; 
  716.       } 
  717.     } 
  718.     pagesofar [ 1 ] = pagesofar [ 1 ] + pagesofar [ 7 ] + mem [ q + 1 ] .cint 
  719.     ; 
  720.     pagesofar [ 7 ] = 0 ; 
  721.     lab80: if ( pagesofar [ 7 ] > pagemaxdepth ) 
  722.     {
  723.       pagesofar [ 1 ] = pagesofar [ 1 ] + pagesofar [ 7 ] - pagemaxdepth ; 
  724.       pagesofar [ 7 ] = pagemaxdepth ; 
  725.     } 
  726.     mem [ pagetail ] .hh .v.RH = p ; 
  727.     pagetail = p ; 
  728.     mem [ memtop - 1 ] .hh .v.RH = mem [ p ] .hh .v.RH ; 
  729.     mem [ p ] .hh .v.RH = 0 ; 
  730.     goto lab30 ; 
  731.     lab31: mem [ memtop - 1 ] .hh .v.RH = mem [ p ] .hh .v.RH ; 
  732.     mem [ p ] .hh .v.RH = 0 ; 
  733.     flushnodelist ( p ) ; 
  734.     lab30: ; 
  735.   } while ( ! ( mem [ memtop - 1 ] .hh .v.RH == 0 ) ) ; 
  736.   if ( nestptr == 0 ) 
  737.   curlist .tailfield = memtop - 1 ; 
  738.   else nest [ 0 ] .tailfield = memtop - 1 ; 
  739. void appspace ( ) 
  740. {appspace_regmem 
  741.   halfword q  ; 
  742.   if ( ( curlist .auxfield .hh .v.LH >= 2000 ) && ( eqtb [ 3795 ] .hh .v.RH != 
  743.   0 ) ) 
  744.   q = newparamglue ( 13 ) ; 
  745.   else {
  746.       
  747.     if ( eqtb [ 3794 ] .hh .v.RH != 0 ) 
  748.     mainp = eqtb [ 3794 ] .hh .v.RH ; 
  749.     else {
  750.     
  751.       mainp = fontglue [ eqtb [ 4834 ] .hh .v.RH ] ; 
  752.       if ( mainp == 0 ) 
  753.       {
  754.     mainp = newspec ( 0 ) ; 
  755.     maink = parambase [ eqtb [ 4834 ] .hh .v.RH ] + 2 ; 
  756.     mem [ mainp + 1 ] .cint = fontinfo [ maink ] .cint ; 
  757.     mem [ mainp + 2 ] .cint = fontinfo [ maink + 1 ] .cint ; 
  758.     mem [ mainp + 3 ] .cint = fontinfo [ maink + 2 ] .cint ; 
  759.     fontglue [ eqtb [ 4834 ] .hh .v.RH ] = mainp ; 
  760.       } 
  761.     } 
  762.     mainp = newspec ( mainp ) ; 
  763.     if ( curlist .auxfield .hh .v.LH >= 2000 ) 
  764.     mem [ mainp + 1 ] .cint = mem [ mainp + 1 ] .cint + fontinfo [ 7 + 
  765.     parambase [ eqtb [ 4834 ] .hh .v.RH ] ] .cint ; 
  766.     mem [ mainp + 2 ] .cint = xnoverd ( mem [ mainp + 2 ] .cint , curlist 
  767.     .auxfield .hh .v.LH , 1000 ) ; 
  768.     mem [ mainp + 3 ] .cint = xnoverd ( mem [ mainp + 3 ] .cint , 1000 , 
  769.     curlist .auxfield .hh .v.LH ) ; 
  770.     q = newglue ( mainp ) ; 
  771.     mem [ mainp ] .hh .v.RH = 0 ; 
  772.   } 
  773.   mem [ curlist .tailfield ] .hh .v.RH = q ; 
  774.   curlist .tailfield = q ; 
  775. void insertdollarsign ( ) 
  776. {insertdollarsign_regmem 
  777.   backinput () ; 
  778.   curtok = 804 ; 
  779.   {
  780.     if ( interaction == 3 ) 
  781.     wakeupterminal () ; 
  782.     printnl ( 262 ) ; 
  783.     print ( 1010 ) ; 
  784.   } 
  785.   {
  786.     helpptr = 2 ; 
  787.     helpline [ 1 ] = 1011 ; 
  788.     helpline [ 0 ] = 1012 ; 
  789.   } 
  790.   inserror () ; 
  791. void youcant ( ) 
  792. {youcant_regmem 
  793.   {
  794.     if ( interaction == 3 ) 
  795.     wakeupterminal () ; 
  796.     printnl ( 262 ) ; 
  797.     print ( 681 ) ; 
  798.   } 
  799.   printcmdchr ( curcmd , curchr ) ; 
  800.   print ( 1013 ) ; 
  801.   printmode ( curlist .modefield ) ; 
  802. void reportillegalcase ( ) 
  803. {reportillegalcase_regmem 
  804.   youcant () ; 
  805.   {
  806.     helpptr = 4 ; 
  807.     helpline [ 3 ] = 1014 ; 
  808.     helpline [ 2 ] = 1015 ; 
  809.     helpline [ 1 ] = 1016 ; 
  810.     helpline [ 0 ] = 1017 ; 
  811.   } 
  812.   error () ; 
  813. boolean privileged ( ) 
  814. {register boolean Result; privileged_regmem 
  815.   if ( curlist .modefield > 0 ) 
  816.   Result = true ; 
  817.   else {
  818.       
  819.     reportillegalcase () ; 
  820.     Result = false ; 
  821.   } 
  822.   return(Result) ; 
  823. boolean itsallover ( ) 
  824. {/* 10 */ register boolean Result; itsallover_regmem 
  825.   if ( privileged () ) 
  826.   {
  827.     if ( ( memtop - 2 == pagetail ) && ( curlist .headfield == curlist 
  828.     .tailfield ) && ( deadcycles == 0 ) ) 
  829.     {
  830.       Result = true ; 
  831.       return(Result) ; 
  832.     } 
  833.     backinput () ; 
  834.     {
  835.       mem [ curlist .tailfield ] .hh .v.RH = newnullbox () ; 
  836.       curlist .tailfield = mem [ curlist .tailfield ] .hh .v.RH ; 
  837.     } 
  838.     mem [ curlist .tailfield + 1 ] .cint = eqtb [ 6733 ] .cint ; 
  839.     {
  840.       mem [ curlist .tailfield ] .hh .v.RH = newglue ( 8 ) ; 
  841.       curlist .tailfield = mem [ curlist .tailfield ] .hh .v.RH ; 
  842.     } 
  843.     {
  844.       mem [ curlist .tailfield ] .hh .v.RH = newpenalty ( -1073741824L ) ; 
  845.       curlist .tailfield = mem [ curlist .tailfield ] .hh .v.RH ; 
  846.     } 
  847.     buildpage () ; 
  848.   } 
  849.   Result = false ; 
  850.   return(Result) ; 
  851. void appendglue ( ) 
  852. {appendglue_regmem 
  853.   smallnumber s  ; 
  854.   s = curchr ; 
  855.   switch ( s ) 
  856.   {case 0 : 
  857.     curval = 4 ; 
  858.     break ; 
  859.   case 1 : 
  860.     curval = 8 ; 
  861.     break ; 
  862.   case 2 : 
  863.     curval = 12 ; 
  864.     break ; 
  865.   case 3 : 
  866.     curval = 16 ; 
  867.     break ; 
  868.   case 4 : 
  869.     scanglue ( 2 ) ; 
  870.     break ; 
  871.   case 5 : 
  872.     scanglue ( 3 ) ; 
  873.     break ; 
  874.   } 
  875.   {
  876.     mem [ curlist .tailfield ] .hh .v.RH = newglue ( curval ) ; 
  877.     curlist .tailfield = mem [ curlist .tailfield ] .hh .v.RH ; 
  878.   } 
  879.   if ( s >= 4 ) 
  880.   {
  881.     decr ( mem [ curval ] .hh .v.RH ) ; 
  882.     if ( s > 4 ) 
  883.     mem [ curlist .tailfield ] .hh.b1 = 99 ; 
  884.   } 
  885. void appendkern ( ) 
  886. {appendkern_regmem 
  887.   quarterword s  ; 
  888.   s = curchr ; 
  889.   scandimen ( s == 99 , false , false ) ; 
  890.   {
  891.     mem [ curlist .tailfield ] .hh .v.RH = newkern ( curval ) ; 
  892.     curlist .tailfield = mem [ curlist .tailfield ] .hh .v.RH ; 
  893.   } 
  894.   mem [ curlist .tailfield ] .hh.b1 = s ; 
  895. void offsave ( ) 
  896. {offsave_regmem 
  897.   halfword p  ; 
  898.   if ( curgroup == 0 ) 
  899.   {
  900.     {
  901.       if ( interaction == 3 ) 
  902.       wakeupterminal () ; 
  903.       printnl ( 262 ) ; 
  904.       print ( 772 ) ; 
  905.     } 
  906.     printcmdchr ( curcmd , curchr ) ; 
  907.     {
  908.       helpptr = 1 ; 
  909.       helpline [ 0 ] = 1036 ; 
  910.     } 
  911.     error () ; 
  912.   } 
  913.   else {
  914.       
  915.     backinput () ; 
  916.     p = getavail () ; 
  917.     mem [ memtop - 3 ] .hh .v.RH = p ; 
  918.     {
  919.       if ( interaction == 3 ) 
  920.       wakeupterminal () ; 
  921.       printnl ( 262 ) ; 
  922.       print ( 621 ) ; 
  923.     } 
  924.     switch ( curgroup ) 
  925.     {case 14 : 
  926.       {
  927.     mem [ p ] .hh .v.LH = 7611 ; 
  928.     printesc ( 512 ) ; 
  929.       } 
  930.       break ; 
  931.     case 15 : 
  932.       {
  933.     mem [ p ] .hh .v.LH = 804 ; 
  934.     printchar ( 36 ) ; 
  935.       } 
  936.       break ; 
  937.     case 16 : 
  938.       {
  939.     mem [ p ] .hh .v.LH = 7612 ; 
  940.     mem [ p ] .hh .v.RH = getavail () ; 
  941.     p = mem [ p ] .hh .v.RH ; 
  942.     mem [ p ] .hh .v.LH = 3118 ; 
  943.     printesc ( 1035 ) ; 
  944.       } 
  945.       break ; 
  946.       default: 
  947.       {
  948.     mem [ p ] .hh .v.LH = 637 ; 
  949.     printchar ( 125 ) ; 
  950.       } 
  951.       break ; 
  952.     } 
  953.     print ( 622 ) ; 
  954.     begintokenlist ( mem [ memtop - 3 ] .hh .v.RH , 4 ) ; 
  955.     {
  956.       helpptr = 5 ; 
  957.       helpline [ 4 ] = 1030 ; 
  958.       helpline [ 3 ] = 1031 ; 
  959.       helpline [ 2 ] = 1032 ; 
  960.       helpline [ 1 ] = 1033 ; 
  961.       helpline [ 0 ] = 1034 ; 
  962.     } 
  963.     error () ; 
  964.   } 
  965. void extrarightbrace ( ) 
  966. {extrarightbrace_regmem 
  967.   {
  968.     if ( interaction == 3 ) 
  969.     wakeupterminal () ; 
  970.     printnl ( 262 ) ; 
  971.     print ( 1041 ) ; 
  972.   } 
  973.   switch ( curgroup ) 
  974.   {case 14 : 
  975.     printesc ( 512 ) ; 
  976.     break ; 
  977.   case 15 : 
  978.     printchar ( 36 ) ; 
  979.     break ; 
  980.   case 16 : 
  981.     printesc ( 870 ) ; 
  982.     break ; 
  983.   } 
  984.   {
  985.     helpptr = 5 ; 
  986.     helpline [ 4 ] = 1042 ; 
  987.     helpline [ 3 ] = 1043 ; 
  988.     helpline [ 2 ] = 1044 ; 
  989.     helpline [ 1 ] = 1045 ; 
  990.     helpline [ 0 ] = 1046 ; 
  991.   } 
  992.   error () ; 
  993.   incr ( alignstate ) ; 
  994.