home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / source / TeX / tex / tex2.c < prev    next >
C/C++ Source or Header  |  1991-08-24  |  22KB  |  1,008 lines

  1. #define EXTERN extern
  2. #include "texd.h"
  3.  
  4. /* preparemag() nach tex7.c */
  5.  
  6. void tokenshow ( halfword p )
  7. { tokenshow_regmem 
  8.  
  9.   if ( p != 0 ) 
  10.     showtokenlist ( link ( p ) , 0 , 10000000L ) ; 
  11. }
  12.  
  13. void printmeaning ( void )
  14. { printmeaning_regmem 
  15.  
  16.   printcmdchr ( curcmd , curchr ) ; 
  17.   if ( curcmd >= call ) {
  18.     printchar ( 58 ) ; 
  19.     println () ; 
  20.     tokenshow ( curchr ) ; 
  21.   } else if ( curcmd == topbotmark ) {
  22.     printchar ( 58 ) ; 
  23.     println () ; 
  24.     tokenshow ( curmark [ curchr ] ) ; 
  25.   } 
  26. }
  27.  
  28.  
  29. void showcurcmdchr ( void )
  30. { showcurcmdchr_regmem 
  31.  
  32.   begindiagnostic () ; 
  33.   printnl ( 123 ) ; 
  34.   if ( curlist .modefield != shownmode ) {
  35.     printmode ( curlist .modefield ) ; 
  36.     c_print(": "); /* 564 */
  37.     shownmode = curlist .modefield ; 
  38.   }
  39.   printcmdchr ( curcmd , curchr ) ; 
  40.   printchar ( 125 ) ; 
  41.   enddiagnostic ( false ) ; 
  42. }
  43.  
  44.  
  45. void showcontext ( void )
  46. {/* 30 */ showcontext_regmem 
  47.   register integer oldsetting  ; 
  48.   register integer nn  ; 
  49.   boolean bottomline  ; 
  50.   register integer i  ; 
  51.   register integer j  ; 
  52.   register integer l  ; 
  53.   register integer m  ; 
  54.   register integer n  ; 
  55.   register integer p  ; 
  56.   register integer q  ; 
  57.  
  58.   baseptr = inputptr ; 
  59. #ifndef INP_PTR
  60.   inputstack [ baseptr ] = curinput ; 
  61. #endif
  62.   nn = -1 ; 
  63.   bottomline = false ; 
  64.   while ( true ) {
  65. #ifdef INP_PTR
  66.     curinput_ptr = &inputstack [ baseptr ] ; 
  67. #else
  68.     curinput = inputstack [ baseptr ] ;
  69. #endif
  70.     if ( ( curinput .statefield != tokenlist ) ) 
  71.       if ( ( curinput .namefield > 17 ) || ( baseptr == 0 ) ) 
  72.     bottomline = true ; 
  73.     if ( baseptr == inputptr || bottomline || nn < errorcontextlines ) {
  74.       if ( ( baseptr == inputptr ) || ( curinput .statefield != tokenlist )
  75.        || ( tokentype != backedup ) || ( curinput .locfield != 0 ) ) {
  76.     tally = 0 ; 
  77.     oldsetting = selector ; 
  78.     if ( curinput .statefield != tokenlist ) {
  79.       if ( curinput .namefield <= 17 )
  80.         if ( ( curinput .namefield == 0 ) ) 
  81.           if ( baseptr == 0 ) 
  82.         c_printnl("<*>");
  83.           else
  84.         c_printnl("<insert> ");
  85.         else {
  86.           c_printnl("<read ");
  87.           if ( curinput .namefield == 17 ) 
  88.         printchar ( 42 ) ; 
  89.           else
  90.         printint ( curinput .namefield - 1 ) ; 
  91.           printchar ( 62 ) ; 
  92.         }
  93.       else {
  94.         c_printnl("l.");
  95.         printint ( line ) ; 
  96.       } 
  97.       printchar ( 32 ) ; 
  98.       {
  99.         l = tally ; 
  100.         tally = 0 ; 
  101.         selector = pseudo ; 
  102.         trickcount = 1000000L ; 
  103.       } 
  104.       if ( buffer [ curinput .limitfield ] == endlinechar ) 
  105.         j = curinput .limitfield ; 
  106.       else
  107.         j = curinput .limitfield + 1 ; 
  108.       if ( j > 0 ) 
  109.         for ( i = curinput .startfield ; i <= j - 1 ; i++ ) {
  110.           if ( i == curinput .locfield ) {
  111.         firstcount = tally ; 
  112.         trickcount = tally + 1 + errorline - halferrorline ; 
  113.         if ( trickcount < errorline ) 
  114.         trickcount = errorline ; 
  115.           }
  116.           print ( buffer [ i ] ) ; 
  117.         }
  118.     } else {
  119.       switch ( tokentype ) {
  120.       case parameter : 
  121.         c_printnl("<argument> ");
  122.         break ; 
  123.       case utemplate : 
  124.       case vtemplate : 
  125.         c_printnl("<template> ");
  126.         break ; 
  127.       case backedup : 
  128.         if ( curinput .locfield == 0 ) 
  129.           c_printnl("<recently read> ");
  130.         else
  131.           c_printnl("<to be read again> ");
  132.         break ; 
  133.       case inserted : 
  134.         c_printnl("<inserted text> ");
  135.         break ; 
  136.       case macro : 
  137.         println () ; 
  138.         printcs ( curinput .namefield ) ; 
  139.         break ; 
  140.       case outputtext : 
  141.         c_printnl("<output> ");
  142.         break ; 
  143.       case everypartext : 
  144.         c_printnl("<everypar> ");
  145.         break ; 
  146.       case everymathtext : 
  147.         c_printnl("<everymath> ");
  148.         break ; 
  149.       case everydisplaytext : 
  150.         c_printnl("<everydisplay> ");
  151.         break ; 
  152.       case everyhboxtext : 
  153.         c_printnl("<everyhbox> ");
  154.         break ; 
  155.       case everyvboxtext : 
  156.         c_printnl("<everyvbox> ");
  157.         break ; 
  158.       case everyjobtext : 
  159.         c_printnl("<everyjob> ");
  160.         break ; 
  161.       case everycrtext : 
  162.         c_printnl("<everycr> ");
  163.         break ; 
  164.       case marktext : 
  165.         c_printnl("<mark> ");
  166.         break ; 
  167.       case writetext : 
  168.         c_printnl("<write> ");
  169.         break ; 
  170.       default: 
  171.         printnl ( 63 );
  172.         break ; 
  173.       }
  174.       {
  175.         l = tally ; 
  176.         tally = 0 ; 
  177.         selector = pseudo ; 
  178.         trickcount = 1000000L ; 
  179.       }
  180.       if ( tokentype < macro ) 
  181.         showtokenlist (curinput .startfield, curinput .locfield, 100000L);
  182.       else
  183.         showtokenlist ( link ( curinput .startfield ),
  184.                 curinput .locfield, 100000L );
  185.     }
  186.     selector = oldsetting ; 
  187.     if ( trickcount == 1000000L ) {
  188.       firstcount = tally ; 
  189.       trickcount = tally + 1 + errorline - halferrorline ; 
  190.       if ( trickcount < errorline ) 
  191.         trickcount = errorline ;
  192.     }
  193.     m = ( (tally < trickcount) ? tally : trickcount ) - firstcount;
  194.     if ( l + firstcount <= halferrorline ) {
  195.       p = 0 ; 
  196.       n = l + firstcount ; 
  197.     } else {
  198.       print ( 275 ) ; 
  199.       p = l + firstcount - halferrorline + 3 ; 
  200.       n = halferrorline ; 
  201.     } 
  202.     for( q = p ; q <= firstcount - 1 ; q++ ) {
  203.       printchar ( trickbuf [ q % errorline ] ) ;
  204.     }
  205.     println () ; 
  206.     for( q = n ; q >= 1 ; --q ) {
  207.       printchar ( 32 ) ;
  208.     }
  209.     if ( m + n <= errorline ) 
  210.       p = firstcount + m ; 
  211.     else
  212.       p = firstcount + ( errorline - n - 3 ) ; 
  213.     for( q = firstcount ; q <= p - 1 ; q++ ) {
  214.       printchar ( trickbuf [ q % errorline ] ) ;
  215.     }
  216.     if ( m + n > errorline ) 
  217.       print ( 275 ) ;
  218.     incr ( nn ) ; 
  219.       }
  220.     } else if ( nn == errorcontextlines ) {
  221.       printnl ( 275 ) ; 
  222.       incr ( nn ) ; 
  223.     }
  224.     if ( bottomline ) 
  225.       goto lab30 ; 
  226.     decr ( baseptr ) ; 
  227.   }
  228. lab30:
  229. #ifdef INP_PTR
  230.   curinput_ptr = &inputstack [ inputptr ] ; 
  231. #else
  232.   curinput = inputstack [ inputptr ] ; 
  233. #endif
  234. }
  235.  
  236.  
  237. void begintokenlist ( halfword p, quarterword t )
  238. { begintokenlist_regmem
  239.  
  240.   {
  241.     if ( inputptr > maxinstack ) {
  242.       maxinstack = inputptr ; 
  243.       if ( inputptr == stacksize )        /* hier evtl. noch aendern */
  244.         overflow(8, stacksize);
  245.     }
  246. #ifdef INP_PTR
  247.     incr ( inputptr ) ;
  248.     curinput_ptr++;
  249. #else
  250.     inputstack [ inputptr ] = curinput ; 
  251.     incr ( inputptr ) ; 
  252. #endif
  253.   } 
  254.  
  255.   {
  256. #ifndef INP_PTR
  257.     register instaterecord *curinputPTR = &curinput;
  258. #   define curinput (*curinputPTR)
  259. #endif
  260.  
  261.   curinput .statefield = tokenlist ; 
  262.   tokentype = t ; 
  263.   curinput .startfield = p ; 
  264.   if ( t >= macro ) {
  265.     addtokenref ( p ) ; 
  266.     if ( t == macro ) 
  267.       paramstart = paramptr ; 
  268.     else {
  269.       curinput .locfield = link ( p ) ; 
  270.       if ( tracingmacros > 1 ) {
  271.     begindiagnostic () ; 
  272.     c_printnl("");
  273.     switch ( t ) {
  274.     case marktext : 
  275.       printesc ( 348 ) ; 
  276.       break ; 
  277.     case writetext : 
  278.       printesc ( STR_WRITE );
  279.       break ; 
  280.     default: 
  281.       printcmdchr( assign_toks, t - outputtext + outputroutineloc );
  282.       break ; 
  283.     }
  284.     c_print("->");
  285.     tokenshow ( p ) ; 
  286.     enddiagnostic ( false ) ; 
  287.       } 
  288.     }
  289.   } else
  290.     curinput .locfield = p ;
  291.  
  292. #ifndef INP_PTR
  293. # undef curinput
  294. #endif
  295.   }
  296. }
  297.  
  298.  
  299. void endtokenlist ( void )
  300. { endtokenlist_regmem 
  301.  
  302. #ifndef INP_PTR
  303.   register instaterecord *curinputPTR = &curinput;
  304. # define curinput (*curinputPTR)
  305. #endif
  306.  
  307.   if ( tokentype >= backedup ) {
  308.     if ( tokentype <= inserted ) 
  309.       flushlist ( curinput.startfield ) ; 
  310.     else {
  311.       deletetokenref ( curinput.startfield ) ; 
  312.       if ( tokentype == macro ) {
  313. #if 0 /* def PARAM_PTR */
  314.     long anzahl = paramptr - paramstart;
  315.     halfword *psp = ¶mstack[paramptr];
  316.  
  317.     while ( anzahl-- > 0 ) {
  318.       flushlist( *psp );
  319.       psp--;
  320.     }
  321.     paramptr = paramstart;
  322. #else
  323.     while ( paramptr > paramstart ) {
  324.       decr ( paramptr ) ; 
  325.       flushlist ( paramstack [ paramptr ] ) ; 
  326.     } 
  327. #endif
  328.       }
  329.     }
  330.   } else if ( tokentype == utemplate ) 
  331.     if ( alignstate > 500000L ) 
  332.       alignstate = 0 ; 
  333.     else fatalerror( STR_H_FE_INTERWOVEN );
  334.  
  335.   {
  336.     decr ( inputptr ) ; 
  337. #ifdef INP_PTR
  338.     --curinput_ptr;
  339. #else
  340.     curinput = inputstack [ inputptr ] ; 
  341. #endif
  342.   } 
  343.   {
  344.     if ( interrupt != 0 ) 
  345.     pauseforinstructions () ; 
  346.   }
  347. #ifndef INP_PTR
  348. # undef curinput
  349. #endif
  350. }
  351.  
  352.  
  353. void backinput ( void )
  354. {
  355. #ifndef INP_PTR
  356.   register instaterecord *curinputPTR = &curinput;
  357. # define curinput (*curinputPTR)
  358. #endif
  359.  
  360.   while ( curinput .statefield == tokenlist && curinput .locfield == 0 )
  361.     endtokenlist();
  362.  
  363.   { register long_halfword p;
  364.  
  365.   p = getavail();
  366.  
  367.   { backinput_regmem 
  368.     register halfword r_curtok = curtok;
  369.  
  370.   info ( p ) = r_curtok ; 
  371.   if ( r_curtok < rightbracelimit )
  372.     if ( r_curtok < leftbracelimit )
  373.       decr ( alignstate ) ;
  374.     else
  375.       incr ( alignstate ) ;
  376.   }
  377.  
  378.   { register integer r_inputptr = inputptr;
  379.  
  380.     if ( r_inputptr > maxinstack ) {
  381.       maxinstack = r_inputptr ; 
  382.       if ( r_inputptr == stacksize ) 
  383.         overflow(8, stacksize); 
  384.     }
  385. #ifdef INP_PTR
  386.     incr ( r_inputptr ) ;
  387.     curinput_ptr++;
  388. #else
  389.     inputstack [ r_inputptr ] = curinput ; 
  390.     incr ( r_inputptr ) ;
  391. #endif
  392.  
  393.     inputptr = r_inputptr;
  394.   }
  395.   curinput .statefield = tokenlist ; 
  396.   tokentype = backedup ; 
  397.   curinput .startfield = p ; 
  398.   curinput .locfield = p ; 
  399.   }
  400. #ifndef INP_PTR
  401. # undef curinput
  402. #endif
  403. }
  404.  
  405.  
  406. void backerror ( void )
  407. { backerror_regmem 
  408.  
  409.   OKtointerrupt = false ; 
  410.   backinput () ; 
  411.   OKtointerrupt = true ; 
  412.   error () ; 
  413.  
  414.  
  415. void inserror ( void )
  416. { inserror_regmem
  417.  
  418.   OKtointerrupt = false ; 
  419.   backinput () ; 
  420.   tokentype = inserted ; 
  421.   OKtointerrupt = true ; 
  422.   error () ; 
  423.  
  424.  
  425. void beginfilereading ( void )
  426. { beginfilereading_regmem 
  427.  
  428.   if ( inopen == maxinopen ) 
  429.     overflow(9, maxinopen);
  430.   if ( first == bufsize ) 
  431.     overflow(1, bufsize);
  432.   incr ( inopen ) ; 
  433.   {
  434.     if ( inputptr > maxinstack ) {
  435.       maxinstack = inputptr ; 
  436.       if ( inputptr == stacksize ) 
  437.     overflow(8, stacksize);
  438.     } 
  439. #ifdef INP_PTR
  440.     incr ( inputptr ) ; 
  441.     curinput_ptr++;
  442.     curinput.locfield = (*(curinput_ptr-1)).locfield;
  443.     curinput.limitfield = (*(curinput_ptr-1)).limitfield;
  444. #else
  445.     inputstack [ inputptr ] = curinput ; 
  446.     incr ( inputptr ) ; 
  447. #endif
  448.   } 
  449.   curinput .indexfield = inopen ; 
  450.   linestack [ curinput .indexfield ] = line ; 
  451.   curinput .startfield = first ; 
  452.   curinput .statefield = 1 ; 
  453.   curinput .namefield = 0 ; 
  454. }
  455.  
  456.  
  457. void endfilereading ( void )
  458. { endfilereading_regmem 
  459.  
  460.   first = curinput .startfield ; 
  461.   line = linestack [ curinput .indexfield ] ; 
  462.   if ( curinput .namefield > 17 ) 
  463.     aclose ( inputfile [ curinput .indexfield ] ) ; 
  464.   {
  465.     decr ( inputptr ) ; 
  466. #ifdef INP_PTR
  467.     --curinput_ptr;
  468. #else
  469.     curinput = inputstack [ inputptr ] ; 
  470. #endif
  471.   } 
  472.   decr ( inopen ) ; 
  473. }
  474.  
  475.  
  476. void clearforerrorprompt ( void )
  477. { clearforerrorprompt_regmem 
  478.  
  479.   while ( ( curinput .statefield != tokenlist )
  480.     && ( curinput .namefield == 0 )
  481.     && ( inputptr > 0 )
  482.     && ( curinput .locfield > curinput .limitfield ) )
  483.     endfilereading () ;
  484.   println () ; 
  485.   clearterminal () ; 
  486.  
  487.  
  488. void checkoutervalidity ( void )
  489. { checkoutervalidity_regmem 
  490.  
  491.   if ( scannerstatus != normal ) {
  492.     deletionsallowed = false ; 
  493.     if ( curcs != 0 ) {
  494.       if ( ( curinput .statefield == tokenlist )
  495.         || ( curinput .namefield < 1 )
  496.         || ( curinput .namefield > 17 ) ) {
  497.     register long_halfword p;
  498.  
  499.     p = getavail();
  500.     info ( p ) = cstokenflag + curcs;
  501.     begintokenlist( p, backedup );
  502.       }
  503.       curcmd = 10 ; 
  504.       curchr = 32 ; 
  505.     }
  506.     if ( scannerstatus > skipping ) {
  507.       runaway () ; 
  508.       if ( curcs == 0 ) {
  509.     print_err("File ended");
  510.       } else {
  511.     curcs = 0 ; 
  512.     print_err("Forbidden control sequence found");
  513.       }
  514.       c_print(" while scanning ");
  515.  
  516.      { register halfword p;
  517.  
  518.       p = getavail () ; 
  519.       switch ( scannerstatus ) {
  520.       case defining : 
  521.     {
  522.       c_print("definition");
  523.       info ( p ) = rightbracetoken + 125 ; 
  524.     } 
  525.     break ; 
  526.       case matching : 
  527.     {
  528.       c_print("use");
  529.       info ( p ) = partoken ; 
  530.       longstate = outercall ; 
  531.     } 
  532.     break ; 
  533.       case aligning : 
  534.     { register halfword q;
  535.  
  536.       c_print("preamble");
  537.       info ( p ) = rightbracetoken + 125 ; 
  538.       q = p ; 
  539.       p = getavail () ; 
  540.       link ( p ) = q ; 
  541.       info ( p ) = cstokenflag + frozencr ; 
  542.       alignstate = -1000000L ; 
  543.     }
  544.     break ; 
  545.       case absorbing :
  546.     {
  547.       c_print("text");
  548.       info ( p ) = rightbracetoken + 125;
  549.     }
  550.     break;
  551.       }
  552.       begintokenlist( p, inserted);
  553.      }
  554.       c_print(" of ");
  555.       sprintcs( warningindex );
  556.       zhelp1( STR_H_ISUSPECT_FORGOTTEN );
  557.       error();
  558.     } else {
  559.       print_err("Incomplete ");
  560.       printcmdchr( iftest, curif );
  561.       c_print("; all text was ignored after line ");
  562.       printint ( skipline );
  563.       if ( curcs != 0 ) {
  564.     zhelp2( STR_H_AFORBIDDEN_SKIPPED, STR_H_THISKIND_HAPPENS_IF );
  565.     curcs = 0;
  566.       } else {
  567.     zhelp2( STR_H_THEFILEENDEDWHILE, STR_H_THISKIND_HAPPENS_IF );
  568.       }
  569.       curtok = cstokenflag + frozenfi;
  570.       inserror();
  571.     }
  572.     deletionsallowed = true;
  573.   }
  574. }
  575.  
  576.  
  577. void firmuptheline ( void )
  578. { firmuptheline_regmem 
  579.   register integer k  ;
  580.  
  581. #if 0            /* (br) deleted */
  582.   curinput .limitfield = last ; 
  583.   if ( pausing > 0 )
  584. #endif
  585.   if ( interaction > nonstopmode ) {
  586.     wakeupterminal () ; 
  587.     println () ; 
  588.     if ( curinput .startfield < curinput .limitfield ) 
  589.     {register integer for_end; k = curinput .startfield ; for_end = curinput 
  590.     .limitfield - 1 ; if ( k <= for_end) do 
  591.       print ( buffer [ k ] ) ; 
  592.     while ( k++ < for_end ) ; } 
  593.     first = curinput .limitfield;
  594.     terminput("=>");
  595.     if ( last > first ) {
  596.       {register integer for_end; k = first ; for_end = last - 1 ; if ( k <= 
  597.       for_end) do 
  598.     buffer [ k + curinput .startfield - first ] = buffer [ k ] ; 
  599.       while ( k++ < for_end ) ; } 
  600.       curinput .limitfield = curinput .startfield + last - first ; 
  601.     }
  602.   }
  603. }
  604.  
  605.  
  606.  
  607. void macrocall ( void )
  608. { macrocall_regmem 
  609.   register halfword r;
  610.   halfword p;
  611.   register halfword s;
  612.   halfword rbraceptr; 
  613.   register smallnumber n;
  614.   register halfword unbalance;
  615.   register halfword m;
  616.   halfword refcount;
  617.   smallnumber savescannerstatus;
  618.   halfword savewarningindex;
  619.   ASCIIcode matchchr;
  620.  
  621.   savescannerstatus = scannerstatus ; 
  622.   savewarningindex = warningindex ; 
  623.   warningindex = curcs ; 
  624.   refcount = curchr;
  625.   r = link ( refcount ) ; 
  626.   n = 0 ; 
  627.   if ( tracingmacros > 0 ) {
  628.     begindiagnostic () ; 
  629.     println () ; 
  630.     printcs ( warningindex ) ; 
  631.     tokenshow ( refcount ) ; 
  632.     enddiagnostic ( false ) ; 
  633.   } 
  634.   if ( info ( r ) != endmatchtoken ) {
  635.     scannerstatus = matching ; 
  636.     unbalance = 0 ; 
  637.     longstate = eqtype ( curcs ) ; 
  638.     if ( longstate >= outercall ) 
  639.       longstate = longstate - 2 ; 
  640.     do {
  641.       link ( temphead ) = 0 ; 
  642.       if ( ( info ( r ) > matchtoken + 255 ) || ( info ( r ) < matchtoken ) ) 
  643.         s = 0 ; 
  644.       else {
  645.     matchchr = info ( r ) - matchtoken ; 
  646.     s = link ( r ) ; 
  647.     r = s ; 
  648.     p = temphead ; 
  649.     m = 0 ; 
  650.       }
  651. lab22: gettoken () ;
  652.       { register halfword r_curtok = curtok;
  653.  
  654.     if ( r_curtok == info ( r ) ) {
  655.       r = link ( r ) ; 
  656.       if ( ( info(r) >= matchtoken ) && ( info(r) <= endmatchtoken ) ) {
  657.         if ( r_curtok < leftbracelimit ) 
  658.           decr ( alignstate ) ; 
  659.         goto lab40 ; 
  660.       } else
  661.         goto lab22 ; 
  662.     }
  663.     if ( s != r ) 
  664.     if ( s == 0 ) {
  665.       print_err("Use of ");
  666.       sprintcs ( warningindex ) ; 
  667.       c_print(" doesn't match its definition");
  668.       zhelp1( STR_H_IFYOUSAY_DEFA );
  669.       error();
  670.       goto lab10 ; 
  671.     } else {
  672.       register halfword t;
  673.  
  674.       t = s ; 
  675.       do {
  676.         register halfword u, v;
  677.  
  678.         storenewtoken( info ( t ) );
  679.         incr ( m ) ; 
  680.         u = link ( t ) ; 
  681.         v = s;
  682.         while ( true ) {
  683.           if ( u == r ) 
  684.           if ( r_curtok != info ( v ) ) 
  685.             goto lab30 ; 
  686.           else {
  687.             r = link ( v ) ; 
  688.             goto lab22 ; 
  689.           }
  690.           if ( info ( u ) != info ( v ) ) 
  691.             goto lab30 ; 
  692.           u = link ( u ) ; 
  693.           v = link ( v ) ; 
  694.         }
  695. lab30:      t = link ( t ) ; 
  696.       } while ( ! ( t == r ) ) ; 
  697.       r = s ; 
  698.     }
  699.  
  700.     if ( r_curtok == partoken ) 
  701.     if ( longstate != longcall ) {
  702.       if ( longstate == call ) {
  703.         runaway () ; 
  704.         print_err("Paragraph ended before ");
  705.         sprintcs ( warningindex ) ; 
  706.         c_print(" was complete");
  707.         zhelp1( STR_H_ISUSPECT_CAUSING );
  708.         backerror () ; 
  709.       }
  710.       pstack [ n ] = link ( temphead ) ; 
  711.       alignstate = alignstate - unbalance ; 
  712.       for( m = 0 ; m <= n ; m++ ) {
  713.         flushlist ( pstack [ m ] ) ;
  714.       }
  715.       goto lab10 ; 
  716.     }
  717.  
  718.     if ( r_curtok < rightbracelimit ) 
  719.  
  720.     if ( r_curtok < leftbracelimit ) {
  721.       /* register halfword r_curtok = curtok; */
  722.  
  723.       unbalance = 1 ; 
  724.       while ( true ) {
  725.         faststorenewtoken ( r_curtok );
  726.         gettoken () ;
  727.         r_curtok = curtok;
  728.         if ( r_curtok == partoken ) 
  729.         if ( longstate != longcall ) {
  730.           if ( longstate == call ) {
  731.         runaway () ; 
  732.         print_err("Paragraph ended before ");
  733.         sprintcs ( warningindex ) ; 
  734.         c_print(" was complete");
  735.         zhelp1( STR_H_ISUSPECT_CAUSING );
  736.         backerror () ; 
  737.           }
  738.           pstack [ n ] = link ( temphead ) ; 
  739.           alignstate = alignstate - unbalance ; 
  740.           for( m = 0 ; m <= n ; m++ ) {
  741.         flushlist ( pstack [ m ] ) ;
  742.           }
  743.           goto lab10 ; 
  744.         }
  745.         if ( r_curtok < rightbracelimit ) 
  746.         if ( r_curtok < leftbracelimit ) 
  747.           incr ( unbalance ) ; 
  748.         else {
  749.           decr ( unbalance ) ; 
  750.           if ( unbalance == 0 ) 
  751.         goto lab31 ; 
  752.         }
  753.       }
  754. lab31:      rbraceptr = p ;
  755.       storenewtoken ( r_curtok );
  756.  
  757.     } else {
  758.       
  759.       backinput () ; 
  760.       print_err("Argument of ");
  761.       sprintcs ( warningindex ) ; 
  762.       c_print(" has an extra }");
  763.       zhelp1( STR_H_IVERUNACROSS );
  764.       incr ( alignstate ) ; 
  765.       longstate = call ; 
  766.       curtok = partoken ; 
  767.       inserror () ; 
  768.         }
  769.  
  770.         else {        /* (curtok >= rightbracelimit) */
  771.  
  772.       if ( r_curtok == spacetoken ) 
  773.       if ( info ( r ) <= endmatchtoken &&  info ( r ) >= matchtoken )
  774.         goto lab22 ; 
  775.  
  776.       storenewtoken ( r_curtok );
  777.     }
  778.       }
  779.  
  780.       incr ( m ) ; 
  781.       if ( info ( r ) > endmatchtoken ) 
  782.         goto lab22 ; 
  783.       if ( info ( r ) < matchtoken ) 
  784.         goto lab22 ;
  785. lab40:
  786.       if ( s != 0 ) {
  787.     if ( (m == 1) && ( info(p) < rightbracelimit ) && ( p != temphead ) ) {
  788.       link ( rbraceptr ) = 0 ; 
  789.       freeavail ( p ) ; 
  790.       p = link ( temphead ) ; 
  791.       pstack [ n ] = link ( p ) ; 
  792.       freeavail ( p ) ; 
  793.     } else
  794.       pstack [ n ] = link ( temphead ) ; 
  795.     incr ( n ) ; 
  796.     if ( tracingmacros > 0 ) {
  797.       begindiagnostic () ; 
  798.       printnl ( matchchr ) ; 
  799.       printint ( n ) ; 
  800.       c_print("<-");
  801.       showtokenlist ( pstack [ n - 1 ] , 0 , 1000 ) ; 
  802.       enddiagnostic ( false ) ; 
  803.     }
  804.       }
  805.     } while ( ! ( info ( r ) == endmatchtoken ) ) ; 
  806.   }
  807.  
  808.   while ( ( curinput.statefield == tokenlist ) && ( curinput.locfield == 0 ) )
  809.     endtokenlist ();
  810.  
  811.   begintokenlist ( refcount , macro ) ; 
  812.   curinput .namefield = warningindex ; 
  813.   curinput .locfield = link ( r ) ; 
  814.   if ( n > 0 ) {
  815.     if ( paramptr + n > maxparamstack ) {
  816.       maxparamstack = paramptr + n ; 
  817.       if ( maxparamstack > paramsize ) 
  818.       overflow(10, paramsize);
  819.     }
  820.     for( m = 0 ; m <= n - 1 ; m++ ) {
  821.       paramstack [ paramptr + m ] = pstack [ m ] ;
  822.     }
  823.     paramptr += n ;
  824.   } 
  825. lab10:
  826.   scannerstatus = savescannerstatus ; 
  827.   warningindex = savewarningindex ; 
  828. }
  829.  
  830.  
  831. void insertrelax ( void )
  832. { insertrelax_regmem 
  833.  
  834.   curtok = cstokenflag + curcs ; 
  835.   backinput () ; 
  836.   curtok = cstokenflag + frozenrelax ; 
  837.   backinput () ; 
  838.   tokentype = inserted ; 
  839. }
  840.  
  841.  
  842. void expand ( void )
  843. { expand_regmem 
  844.   integer cvbackup  ; 
  845.   smallnumber cvlbackup, radixbackup, cobackup  ; 
  846.   halfword backupbackup  ; 
  847.  
  848.   cvbackup = curval;
  849.   cvlbackup = curvallevel;
  850.   radixbackup = radix ; 
  851.   cobackup = curorder ; 
  852.   backupbackup = link ( backuphead ) ; 
  853.   if ( curcmd < call ) {
  854.     if ( tracingcommands > 1 ) 
  855.       showcurcmdchr () ; 
  856.     switch ( curcmd ) {
  857.     case topbotmark : 
  858.       if ( curmark [ curchr ] != 0 ) 
  859.     begintokenlist ( curmark [ curchr ] , marktext ) ; 
  860.       break ; 
  861.     case expandafter : 
  862.       { register halfword t;
  863.  
  864.     gettoken () ; 
  865.     t = curtok ; 
  866.     if( (halfword)gettoken() > maxcommand )
  867.       expand();
  868.     else
  869.       backinput();
  870.     curtok = t ; 
  871.     backinput();
  872.       } 
  873.       break ; 
  874.     case noexpand : 
  875.       { register halfword t;
  876.     register smallnumber savescannerstatus;
  877.  
  878.     savescannerstatus = scannerstatus ; 
  879.     scannerstatus = normal ; 
  880.     gettoken () ; 
  881.     scannerstatus = savescannerstatus ; 
  882.     t = curtok ; 
  883.     backinput () ; 
  884.     if ( t >= cstokenflag ) {
  885.       register halfword p;
  886.  
  887.       p = getavail () ; 
  888.       info ( p ) = cstokenflag + frozendontexpand ; 
  889.       link ( p ) = curinput .locfield ; 
  890.       curinput .startfield = p ; 
  891.       curinput .locfield = p ; 
  892.     }
  893.       }
  894.       break ; 
  895.     case csname : 
  896.       { register halfword p, r;
  897.     register integer j;
  898.  
  899.     r = getavail () ; 
  900.     p = r ; 
  901.     do {
  902.       getxtoken () ; 
  903.       if ( curcs == 0 )
  904.         storenewtoken ( curtok );
  905.     } while( curcs == 0 );
  906.  
  907.     if ( curcmd != 67 ) {
  908.       print_err("Missing ");
  909.       printesc( STR_ENDCSNAME );
  910.       c_print(" inserted");
  911.       zhelp1( STR_H_THECSMARKED );
  912.       backerror();
  913.     }
  914.     j = first ; 
  915.     p = link ( r ) ; 
  916.     while ( p != 0 ) {
  917.       if ( j >= maxbufstack ) {
  918.         maxbufstack = j + 1 ; 
  919.         if ( maxbufstack == bufsize ) 
  920.           overflow(1, bufsize);
  921.       } 
  922.       buffer [ j ] = info ( p ) % 256 ; 
  923.       incr ( j ) ; 
  924.       p = link ( p ) ; 
  925.     } 
  926.     if ( j > first + 1 ) {
  927.       nonewcontrolsequence = false ; 
  928.       curcs = idlookup ( first , j - first ) ; 
  929.       nonewcontrolsequence = true ; 
  930.     } else if ( j == first ) 
  931.       curcs = nullcs ; 
  932.     else
  933.       curcs = singlebase + buffer [ first ] ; 
  934.     flushlist ( r ) ; 
  935.     if ( eqtype ( curcs ) == undefinedcs ) {
  936.       eqdefine ( curcs , 0 , 256 ) ; 
  937.     } 
  938.     curtok = curcs + cstokenflag ; 
  939.     backinput () ; 
  940.       } 
  941.       break ; 
  942.     case convert : 
  943.       convtoks () ; 
  944.       break ; 
  945.     case the : 
  946.       insthetoks () ; 
  947.       break ; 
  948.     case iftest : 
  949.       conditional () ; 
  950.       break ; 
  951.     case fiorelse : 
  952.       if ( curchr > iflimit ) 
  953.       if ( iflimit == ifcode ) 
  954.     insertrelax () ; 
  955.       else {
  956.     print_err("Extra ");
  957.     printcmdchr ( fiorelse , curchr ) ; 
  958.     zhelp1( STR_H_IMIGNORING_IF );
  959.     error () ; 
  960.       } else {
  961.     while ( curchr != ficode )
  962.       passtext () ;
  963.  
  964.     { register halfword p;
  965.  
  966.       p = condptr ; 
  967.       ifline = iflinefield ( p ) ; 
  968.       curif = subtype ( p ) ; 
  969.       iflimit = ztype ( p ) ; 
  970.       condptr = link ( p ) ; 
  971.       freenode ( p , ifnodesize ) ; 
  972.     }
  973.       }
  974.       break ; 
  975.     case input : 
  976.       if ( curchr > 0 ) 
  977.     forceeof = true ; 
  978.       else if ( nameinprogress ) 
  979.     insertrelax () ; 
  980.       else startinput () ; 
  981.       break ; 
  982.     default: 
  983.       {
  984.     print_err("Undefined control sequence");
  985.     zhelp1( STR_H_THECSATTHEEND );
  986.     error();
  987.       }
  988.       break;
  989.     }
  990.   } else if ( curcmd < endtemplate ) 
  991.     macrocall () ; 
  992.   else {
  993.     curtok = cstokenflag + frozenendv ; 
  994.     backinput () ; 
  995.   } 
  996.   curval = cvbackup;
  997.   curvallevel = cvlbackup;
  998.   radix = radixbackup ; 
  999.   curorder = cobackup ; 
  1000.   link ( backuphead ) = backupbackup ; 
  1001. }
  1002.  
  1003.  
  1004. /* -- end -- */
  1005.