home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / source / TeX / tex / tex7.c < prev    next >
C/C++ Source or Header  |  1994-04-18  |  37KB  |  1,626 lines

  1. #define EXTERN extern
  2. #include "texd.h"
  3.  
  4.  
  5. smallnumber normmin ( integer h )
  6. { normmin_regmem
  7.  
  8.   if ( h <= 0 ) 
  9.     return(1);
  10.  
  11.   if ( h >= 63 )
  12.    return(63);
  13.  
  14.   return(h);
  15.  
  16.  
  17. void newgraf ( boolean indented )
  18. { newgraf_regmem 
  19.  
  20.   curlist .pgfield = 0;
  21.   if ( curlist.modefield == vmode || curlist .headfield != curlist .tailfield )
  22.     tailappend ( newparamglue ( parskipcode ) ) ; 
  23. #if 0  /* 3.1415 */
  24.   curlist .lhmfield = normmin ( lefthyphenmin ) ; 
  25.   curlist .rhmfield = normmin ( righthyphenmin ) ; 
  26. #endif
  27.   pushnest ();
  28.   curlist .modefield = hmode;
  29.   curlist .auxfield .hh .v.LH = 1000;
  30. #if 0  /* 3.1415 */
  31.   curlist .auxfield .hh .v.RH = 0;
  32. #else
  33.   if ( language <= 0 || language > 255 )
  34.     curlang = 0;
  35.   else
  36.     curlang = language ; 
  37.   curlist .auxfield .hh .v.RH = curlang;
  38.   curlist .pgfield = ( normmin ( lefthyphenmin ) * 0x40
  39.             + normmin ( righthyphenmin ) ) * 0x10000L + curlang;
  40. #endif
  41.   if ( indented ) {
  42.     curlist .tailfield = newnullbox () ; 
  43.     link ( curlist .headfield ) = curlist .tailfield ; 
  44.     width ( curlist .tailfield ) = parindent ; 
  45.   }
  46.   if ( everypar != 0 )
  47.     begintokenlist( everypar, everypartext );
  48.   if ( nestptr == 1 )
  49.     buildpage();
  50. }
  51.  
  52.  
  53. void indentinhmode (  boolean indented /* void */ )
  54. { indentinhmode_regmem 
  55.   register long_halfword p;
  56.  
  57.   if ( indented /* curchr > 0 */ ) {
  58.     p = newnullbox ();
  59.     width ( p ) = parindent;
  60.     if ( abs ( curlist .modefield ) == hmode )
  61.       curlist .auxfield .hh .v.LH = 1000;
  62.     else {
  63.       register long_halfword q;
  64.  
  65.       q = newnoad ();
  66.       mathtype ( nucleus ( q ) ) = subbox;
  67.       info ( nucleus ( q ) ) = p;
  68.       p = q;
  69.     }
  70.     tailappend ( p );
  71.   }
  72. }
  73.  
  74.  
  75. void headforvmode ( void )
  76. { headforvmode_regmem 
  77.  
  78.   if ( curlist .modefield < 0 ) {
  79.     if ( curcmd != 36 )
  80.       offsave();
  81.     else {
  82.       p_print_err( STR_H_YOUCANTUSE );
  83.       printesc( STR_HRULE );
  84.       c_print("' here except with leaders");
  85.       zhelp1( STR_H_TOPUTAHORIZONTAL );
  86.       error ();
  87.     }
  88.   } else {
  89.     backinput ();
  90.     curtok = partoken;
  91.     backinput ();
  92.     tokentype = inserted;
  93.   }
  94. }
  95.  
  96.  
  97. void endgraf ( void )
  98. { endgraf_regmem 
  99.  
  100.   if ( curlist .modefield == hmode ) {
  101.     if ( curlist .headfield == curlist .tailfield ) 
  102.       popnest ();
  103.     else
  104.       linebreak ( widowpenalty );
  105. #ifdef TEXXET
  106.     if( LR_save != 0 ) {
  107.     flushlist(LR_save);
  108.     LR_save = 0;
  109.     }
  110. #endif
  111.     normalparagraph();
  112.     errorcount = 0;
  113.   }
  114. }
  115.  
  116.  
  117. void begininsertoradjust ( void )
  118. { begininsertoradjust_regmem 
  119.   register integer r_curval;
  120.  
  121.   if ( curcmd == 38 ) 
  122.     curval = r_curval = 255;
  123.   else {
  124.     r_curval = scaneightbitint ();
  125.     if ( r_curval == 255 ) {
  126.       print_err("You can't ");
  127.       printesc( STR_INSERT );
  128.       printint ( 255 ) ; 
  129.       zhelp1( STR_H_IMCHANGINGTOINSERT );
  130.       error () ; 
  131.       curval = r_curval = 0;
  132.     }
  133.   }
  134.   saved ( 0 ) = r_curval;
  135.   incr ( saveptr );
  136.   newsavelevel( insertgroup );
  137.   scanleftbrace();
  138.   normalparagraph();
  139.   pushnest();
  140.   curlist .modefield = -vmode;
  141.   curlist .auxfield .cint = ignoredepth;
  142. }
  143.  
  144.  
  145. void makemark ( void )
  146. {
  147.   scantoks( false, true );
  148.  
  149.  {makemark_regmem 
  150.   register long_halfword p;
  151.  
  152.   p = getnode ( smallnodesize );
  153.   /* ztype ( p ) = marknode ; subtype ( p ) = 0 ; */
  154.   set_type_subtype(p, marknode, 0);
  155.  
  156.   markptr ( p ) = defref;
  157.   link ( curlist .tailfield ) = p;
  158.   curlist .tailfield = p;
  159.  }
  160. }
  161.  
  162.  
  163. void appendpenalty ( void )
  164. { appendpenalty_regmem 
  165.   register integer r_curval;
  166.  
  167.   r_curval = scanint ();
  168.   tailappend ( newpenalty ( r_curval ) );
  169.   if ( curlist .modefield == vmode )
  170.     buildpage ();
  171. }
  172.  
  173.  
  174. void deletelast ( void )
  175. { deletelast_regmem
  176.  
  177.   if ( curlist.modefield == vmode && curlist.tailfield == curlist.headfield ) {
  178.     if ( ( curchr != gluenode ) || ( lastglue != maxhalfword ) ) {
  179.       youcant();
  180. #ifdef NEW_HELP
  181.       if ( curchr == kernnode )
  182.     zhelp2( STR_H_SORRY_CANTTAKETHINGS, STR_H_TRY_KERNLASTSKIP );
  183.       else if ( curchr != gluenode ) 
  184.     zhelp2( STR_H_SORRY_CANTTAKETHINGS, STR_H_PERHAPSYOUCAN_OUTPUT );
  185.       else
  186.     zhelp2( STR_H_SORRY_CANTTAKETHINGS, STR_H_TRY_VSKIPLASTSKIP );
  187. #else
  188.       zhelp2 ( STR_H_SORRY_CANTTAKETHINGS, STR_H_TRY_VSKIPLASTSKIP );
  189.       if ( curchr == kernnode ) 
  190.         helpline [ 0 ] = ( STR_H_TRY_KERNLASTSKIP );
  191.       else if ( curchr != gluenode ) 
  192.         helpline [ 0 ] = ( STR_H_PERHAPSYOUCAN_OUTPUT );
  193. #endif
  194.       error () ; 
  195.     }
  196.   } else {
  197.     if ( ! ischarnode ( curlist .tailfield ) ) 
  198.     if ( ztype ( curlist .tailfield ) == curchr ) {
  199.       register halfword p, q;
  200.  
  201.       q = curlist .headfield ; 
  202.       do {
  203.     p = q;
  204.     if ( ! ischarnode ( q ) ) 
  205.     if ( ztype ( q ) == discnode ) {
  206.       register quarterword m;
  207.  
  208.       for( m = replacecount ( q ) ; m >= 1 ; --m ) {
  209.         p = link ( p );
  210.       }
  211.       if ( p == curlist .tailfield ) 
  212.         return;
  213.     }
  214.     q = link ( p ) ; 
  215.       } while( q != curlist.tailfield );
  216.       link ( p ) = 0;
  217.       flushnodelist ( curlist .tailfield );
  218.       curlist .tailfield = p;
  219.     }
  220.   }
  221. }
  222.  
  223.  
  224. void unpackage ( void )
  225. { unpackage_regmem
  226.   register long_halfword p;
  227.   register schar c;
  228.  
  229.   c = curchr;
  230.   p = box( scaneightbitint() );
  231.   if ( p == 0 )
  232.     return;
  233.  
  234.   if ( ( abs ( curlist .modefield ) == mmode )
  235.   || ( ( abs ( curlist .modefield ) == vmode )
  236.     && ( ztype ( p ) != vlistnode ) )
  237.   || ( ( abs ( curlist .modefield ) == hmode )
  238.     && ( ztype ( p ) != hlistnode ) ) )
  239.   {
  240.     print_err("Incompatible list can't be unboxed");
  241.     zhelp1( STR_H_SORRYPANDORA );
  242.     error();
  243.     return;
  244.   }
  245.  
  246. #if 0
  247.   if ( c == 1 ) 
  248.     link ( curlist .tailfield ) = copynodelist ( listptr ( p ) ) ; 
  249.   else {
  250.     link ( curlist .tailfield ) = listptr ( p ) ; 
  251.     box ( curval ) = 0 ; 
  252.     freenode ( p , boxnodesize ) ; 
  253.   }
  254. #ifdef ERW_LANGUAGE
  255.   if ( abs( curlist .modefield ) == hmode ) {
  256.     register halfword p = 0;
  257.     while ( link ( curlist .tailfield ) != 0 ) {
  258.       curlist .tailfield = link ( curlist .tailfield ) ;
  259.       if (ischarnode(curlist .tailfield))
  260.     ;
  261.       else {
  262.     if (ztype(curlist .tailfield) == whatsitnode &&
  263.         subtype(curlist .tailfield) == languagenode) {
  264.       p = curlist .tailfield;
  265.     }
  266.       }
  267.     }
  268.     /* Abpruefen, ob language node in Box war... */
  269.     if( p != 0 ) {
  270.       if( whatlang(p) != curlist .auxfield .hh .v.RH ) {
  271.         /* Update `clang' */
  272.     curlist .auxfield .hh .v.RH = whatlang(p);
  273.     /* Insert additional languagenode, if \language != clang */
  274.     fixlanguage();
  275.       }
  276.     }
  277.   } else {
  278.     while ( link ( curlist .tailfield ) != 0 )
  279.       curlist .tailfield = link ( curlist .tailfield ) ;
  280.   }
  281. #else
  282.   while ( link ( curlist .tailfield ) != 0 )
  283.     curlist .tailfield = link ( curlist .tailfield ) ;
  284. #endif
  285.  
  286.  
  287. #else
  288.  
  289.   /* schneller geht die while-Schleife zum Schluss, wenn man `tail' in
  290.    * einer lokalen Variable haelt...
  291.    */
  292.   { register halfword ctf = curlist.tailfield;
  293.  
  294.     if ( c == 1 ) 
  295.       link(ctf) = copynodelist ( listptr(p) );
  296.     else {
  297.       link(ctf) = listptr(p);
  298.       box ( curval ) = 0;
  299.       freenode ( p, boxnodesize );
  300.     }
  301. #ifdef ERW_LANGUAGE
  302.     if ( abs( curlist .modefield ) == hmode ) {
  303.       if( link(ctf) != 0 ) {
  304.     register halfword p = 0;
  305.     do {
  306.       ctf = link( ctf );
  307.       if (ischarnode(ctf))
  308.         ;
  309.       else {
  310.         if (ztype(ctf) == whatsitnode && subtype(ctf) == languagenode) {
  311.           p = ctf;
  312.         }
  313.       }
  314.     } while( link(ctf) != 0 );
  315.     curlist.tailfield = ctf;
  316.     /* Abpruefen, ob... */
  317.     if( p != 0 ) {
  318.       if( whatlang(p) != curlist .auxfield .hh .v.RH ) {
  319.         /* Update `clang' */
  320.         curlist .auxfield .hh .v.RH = whatlang(p);
  321.         /* Insert additional languagenode, if \language != clang */
  322.         fixlanguage();
  323.       }
  324.     }
  325.       }
  326.     } else {
  327.       if( link(ctf) != 0 ) {
  328.     do {
  329.       ctf = link( ctf );
  330.     } while( link(ctf) != 0 );
  331.     curlist.tailfield = ctf;
  332.       }
  333.     }
  334. #else
  335.     if( link(ctf) != 0 ) {
  336.       do {
  337.     ctf = link( ctf );
  338.       } while( link(ctf) != 0 );
  339.       curlist.tailfield = ctf;
  340.     }
  341. #endif  /* ERW_LANGUAGE */
  342.   }
  343. #endif
  344. }
  345.  
  346.  
  347. void appenditaliccorrection ( void )
  348. { appenditaliccorrection_regmem
  349.   register halfword p;
  350.   register internalfontnumber f;
  351.  
  352.   if ( curlist .tailfield != curlist .headfield ) {
  353.     if ( ischarnode ( curlist .tailfield ) )
  354.     p = curlist .tailfield ; 
  355.     else if ( ztype ( curlist .tailfield ) == ligaturenode ) 
  356.     p = ligchar ( curlist .tailfield ) ; 
  357.     else
  358.     return;
  359.     f = font ( p );
  360.     tailappend ( newkern ( zcharitalic ( f, zcharinfo(f, character(p)) ) ) );
  361.     subtype ( curlist .tailfield ) = explicit ; 
  362.   }
  363. }
  364.  
  365.  
  366. void appenddiscretionary ( void )
  367. { appenddiscretionary_regmem
  368.   register integer c;
  369.  
  370.   tailappend ( newdisc () );
  371.   if ( curchr == 1 ) {
  372.     c = hyphenchar(curfont);
  373.     if ( c >= 0 && c < 256 )
  374.       prebreak ( curlist .tailfield ) = newcharacter( curfont, c );
  375.   } else {
  376.     incr ( saveptr );
  377.     saved ( -1 ) = 0;
  378.     newsavelevel ( discgroup );
  379.     scanleftbrace ();
  380.     pushnest();
  381.     curlist .modefield = -hmode;
  382.     curlist .auxfield .hh .v.LH = 1000;
  383.   }
  384. }
  385.  
  386.  
  387. void builddiscretionary ( void )
  388. { builddiscretionary_regmem 
  389.   register halfword p, q;
  390.   register integer n;
  391.  
  392.   unsave ();
  393.  
  394.   n = 0;
  395.   q = curlist .headfield;
  396.   p = link ( q );
  397.   while ( p != 0 ) {
  398.     if( !ischarnode(p) && ( ztype(p) > rulenode )
  399.     && ( ztype(p) != kernnode ) && ( ztype(p) != ligaturenode ) ) {
  400.       print_err("Improper discretionary list");
  401.       zhelp1( STR_H_DISCLISTS_MUST );
  402.       error();
  403.       begindiagnostic();
  404.       c_printnl("The following discretionary sublist has been deleted:");
  405.       showbox ( p );
  406.       enddiagnostic ( true );
  407.       flushnodelist ( p );
  408.       link ( q ) = 0;
  409.       goto lab30;
  410.     }
  411.     q = p;
  412.     p = link ( q );
  413.     incr ( n );
  414.   }
  415.  
  416. lab30:
  417.   p = link ( curlist .headfield );
  418.   popnest ();
  419.   switch ( saved ( -1 ) ) {
  420.   case 0:
  421.     prebreak ( curlist .tailfield ) = p;
  422.     break;
  423.   case 1:
  424.     postbreak ( curlist .tailfield ) = p;
  425.     break;
  426.   case 2:
  427.     {
  428.       if ( ( n > 0 ) && ( abs ( curlist .modefield ) == mmode ) ) {
  429.     print_err("Illegal math ");
  430.     printesc( STR_DISCRETIONARY );
  431.     zhelp1( STR_H_SORRY_THIRDPARTOFDISC );
  432.     flushnodelist ( p );
  433.     n = 0;
  434.     error();
  435.       } else
  436.     link ( curlist .tailfield ) = p;
  437.       if ( n <= maxquarterword )
  438.     replacecount ( curlist .tailfield ) = n;
  439.       else {
  440.     print_err("Discretionary list is too long");
  441.     zhelp1( STR_H_WOW_INEVERTHOUGHT );
  442.     error();
  443.       }
  444.       if ( n > 0 )
  445.     curlist .tailfield = q;
  446.       decr( saveptr );
  447.       return;
  448.     }
  449.     break ; 
  450.   }
  451.  
  452.   incr ( saved ( -1 ) );
  453.   newsavelevel ( discgroup );
  454.   scanleftbrace();
  455.   pushnest();
  456.   curlist .modefield = -hmode;
  457.   curlist .auxfield .hh .v.LH = 1000;
  458. }
  459.  
  460.  
  461. void makeaccent ( void )
  462. { makeaccent_regmem
  463.   real s, t;
  464.   register halfword p, q;
  465.   register internalfontnumber f;
  466.   register scaled a, h, x, w, delta;
  467.   fourquarters i;
  468.  
  469.   { register integer r_curval;
  470.  
  471.     r_curval = scancharnum ();
  472.     f = curfont;
  473.     p = newcharacter( f, r_curval );
  474.   }
  475.  
  476.   if ( p != 0 ) {
  477.     x = xheight ( f ) ; 
  478.     s = slant ( f ) / ((double) 65536.0 ) ; 
  479.     a = zcharwidth ( f ,  zcharinfo ( f ,  character ( p ) ) ) ; 
  480.  
  481.     doassignments();
  482.  
  483.     f = curfont ; 
  484.     if ( curcmd == 11 || curcmd == 12 || curcmd == 68 ) {
  485.       q = newcharacter ( f , curchr );
  486.     } else if ( curcmd == 16 ) {
  487.       q = newcharacter( f, scancharnum() );
  488.     } else {
  489.       q = 0;
  490.       backinput();
  491.     }
  492.  
  493.     if ( q != 0 ) {
  494.       t = slant ( f ) / ((double) 65536.0 );
  495.       i = zcharinfo( f, character ( q ) );
  496.       w = zcharwidth( f, i ) ; 
  497.       h = zcharheight( f, heightdepth ( i ) );
  498.       if ( h != x ) {
  499.     p = hpack( p, 0, 1 );
  500.     shiftamount ( p ) = x - h;
  501.       }
  502.       delta = round ( ( w - a ) / ((double) 2.0 ) + h * t - x * s ) ; 
  503.       { register long_halfword r;
  504.     r = newkern ( delta );
  505.     subtype ( r ) = acckern;
  506.     link ( curlist .tailfield ) = r;
  507.     link ( r ) = p;
  508.       }
  509.       curlist .tailfield = newkern ( - (integer) a - delta );
  510.       subtype ( curlist .tailfield ) = acckern;
  511.       link ( p ) = curlist .tailfield;
  512.       p = q;
  513.     }
  514.     link ( curlist .tailfield ) = p;
  515.     curlist .tailfield = p;
  516.     curlist .auxfield .hh .v.LH = 1000;
  517.   }
  518. }
  519.  
  520.  
  521. static char err_misplaced[] = "Misplaced "; /* 1107 */
  522.  
  523. void alignerror ( void )
  524. { alignerror_regmem 
  525.  
  526.   if ( abs ( alignstate ) > 2 ) {
  527.     print_err( err_misplaced );
  528.     printcmdchr ( curcmd , curchr ) ; 
  529.     if ( curtok == tabtoken + 38 ) {
  530.       zhelp3( STR_H_ICANTFIGURE_TABMARK, STR_H_HERE_AMPERSAND,
  531.         STR_H_UPABOVE_PREVALIGN );
  532.     } else {
  533.       zhelp3( STR_H_ICANTFIGURE_TABMARK, STR_H_ORCRORSPAN,
  534.         STR_H_UPABOVE_PREVALIGN );
  535.     }
  536.     error();
  537.   } else {
  538.     backinput();
  539.     if ( alignstate < 0 ) {
  540.       p_print_err( STR_H_MISSING_LEFTBRACE );
  541.       incr ( alignstate );
  542.       curtok = leftbracetoken + 123;
  543.     } else {
  544.       print_err("Missing } inserted");
  545.       decr ( alignstate );
  546.       curtok = rightbracetoken + 125;
  547.     }
  548.     zhelp1( STR_H_IVEPUTIN_TOFIX );
  549.     inserror();
  550.   }
  551. }
  552.  
  553.  
  554. void noalignerror ( void )
  555. { noalignerror_regmem 
  556.  
  557.   print_err( err_misplaced );
  558.   printesc( STR_NOALIGN );
  559.   zhelp2( STR_H_IEXPECT_NOALIGN, STR_H_AN_ALIGNMENT );
  560.   error();
  561. }
  562.  
  563.  
  564. void omiterror ( void )
  565. { omiterror_regmem 
  566.  
  567.   print_err( err_misplaced );
  568.   printesc( STR_OMIT );
  569.   zhelp2( STR_H_IEXPECT_OMIT, STR_H_AN_ALIGNMENT );
  570.   error();
  571. }
  572.  
  573.  
  574. void doendv ( void )
  575. { doendv_regmem 
  576.  
  577.   if ( curgroup == aligngroup ) {
  578.     endgraf ();
  579.     if ( fincol () )
  580.       finrow();
  581.   } else {
  582.     offsave();
  583.   }
  584. }
  585.  
  586.  
  587. void cserror ( void )
  588. { cserror_regmem 
  589.  
  590.   print_err("Extra ");
  591.   printesc( STR_ENDCSNAME );
  592.   zhelp1( STR_H_IMIGNORING_CSNAME );
  593.   error();
  594. }
  595.  
  596.  
  597. void pushmath ( groupcode c )
  598. { pushmath_regmem 
  599.  
  600.   pushnest();
  601.   curlist .modefield = -mmode;
  602.   curlist .auxfield .cint = 0;
  603.   newsavelevel ( c );
  604. }
  605.  
  606.  
  607.   static void
  608. go_into_ordinary_math(void)        /* added (br) */
  609. { gointoordinarymath_regmem
  610.  
  611.   pushmath ( mathshiftgroup );
  612.   eqworddefine ( intbase + curfamcode, -1 );
  613.   if ( everymath != 0 )
  614.     begintokenlist ( everymath, everymathtext );
  615. }
  616.  
  617.  
  618. void initmath ( void )
  619. {/* 21 40 45 30 */ initmath_regmem 
  620.   register scaled w  ; 
  621.   register scaled l  ; 
  622.   register scaled s  ; 
  623.   register halfword p  ; 
  624.   register halfword q  ; 
  625.   register internalfontnumber f  ; 
  626.   register integer n  ; 
  627.   register scaled v  ; 
  628.   register scaled d  ; 
  629.  
  630.   gettoken ();
  631.   if ( ( curcmd == 3 ) && ( curlist .modefield > 0 ) ) {
  632.     if ( curlist .headfield == curlist .tailfield ) {
  633.       popnest ();
  634.       w = - (integer) maxdimen;
  635.     } else {
  636.       linebreak ( displaywidowpenalty ) ; 
  637.       v = shiftamount ( justbox ) + 2 * quad ( curfont ) ; 
  638.       w = - (integer) maxdimen ; 
  639.       p = listptr ( justbox ) ; 
  640.       while ( p != 0 ) {
  641. lab21:
  642.     if ( ischarnode ( p ) ) {
  643.       f = font ( p ) ; 
  644.       d = zcharwidth ( f ,  zcharinfo ( f ,  character ( p ) ) ) ; 
  645.       goto lab40 ; 
  646.     } 
  647.     switch ( ztype ( p ) ) {
  648.     case hlistnode : 
  649.     case vlistnode : 
  650.     case rulenode : 
  651.         d = width ( p ) ; 
  652.         goto lab40 ; 
  653.       break ; 
  654.     case ligaturenode : 
  655.         mem [ ligtrick ] = mem [ ligchar ( p ) ] ; 
  656.         link ( ligtrick ) = link ( p ) ; 
  657.         p = ligtrick ; 
  658.         goto lab21 ; 
  659.       break ; 
  660.     case kernnode : 
  661.     case mathnode : 
  662.       d = width ( p ) ; 
  663.       break ; 
  664.     case gluenode : 
  665.         q = glueptr ( p ) ; 
  666.         d = width ( q ) ; 
  667.         if ( gluesign ( justbox ) == stretching ) {
  668.           if ( ( glueorder ( justbox ) == stretchorder ( q ) ) && ( 
  669.           stretch ( q ) != 0 ) ) 
  670.           v = maxdimen ; 
  671.         } else if ( gluesign ( justbox ) == shrinking ) {
  672.           if ( ( glueorder ( justbox ) == shrinkorder ( q ) ) && ( shrink 
  673.           ( q ) != 0 ) ) 
  674.           v = maxdimen ; 
  675.         } 
  676.         if ( subtype ( p ) >= aleaders ) 
  677.           goto lab40;
  678.       break ; 
  679.     case whatsitnode : 
  680.     default: 
  681.       d = 0 ; 
  682.       break ; 
  683.     }
  684.     if ( v < maxdimen ) 
  685.       v = v + d ; 
  686.     goto lab45 ; 
  687.  
  688. lab40:    if ( v < maxdimen ) {
  689.       v = v + d ; 
  690.       w = v ; 
  691.     } else {
  692.       w = maxdimen ; 
  693.       goto lab30 ; 
  694.     } 
  695. lab45:
  696.     p = link ( p ) ; 
  697.       }
  698. lab30: ; 
  699.     }
  700.  
  701.     if ( parshapeptr == 0 ) {
  702.     if ( ( hangindent != 0 )
  703.     && ( ( hangafter >= 0 && ( curlist .pgfield + 2 > hangafter ) )
  704.       || ( curlist .pgfield + 1 < - (integer) hangafter ) ) )
  705.       {
  706.     l = hsize - abs ( hangindent ) ; 
  707.     if ( hangindent > 0 ) 
  708.       s = hangindent ; 
  709.     else
  710.       s = 0 ; 
  711.       } else {
  712.     l = hsize ; 
  713.     s = 0 ; 
  714.       }
  715.     } else {
  716.       n = info ( parshapeptr ) ; 
  717.       if ( curlist .pgfield + 2 >= n ) 
  718.     p = parshapeptr + 2 * n ; 
  719.       else
  720.     p = parshapeptr + 2 * ( curlist .pgfield + 2 ) ; 
  721.       s = mem [ p - 1 ] .cint ; 
  722.       l = mem [ p ] .cint ; 
  723.     } 
  724.     pushmath ( mathshiftgroup ) ; 
  725.     curlist .modefield = mmode;
  726.     eqworddefine ( intbase + curfamcode , -1 ) ; 
  727.     eqworddefine ( dimenbase + predisplaysizecode , w ) ; 
  728.     eqworddefine ( dimenbase + displaywidthcode , l ) ; 
  729.     eqworddefine ( dimenbase + displayindentcode , s ) ; 
  730.     if ( everydisplay != 0 ) 
  731.       begintokenlist ( everydisplay , everydisplaytext ) ; 
  732.     if ( nestptr == 1 ) 
  733.       buildpage () ; 
  734.   } else {
  735.     backinput () ; 
  736.     go_into_ordinary_math();
  737.   }
  738. }
  739.  
  740.  
  741. void starteqno ( void )
  742. { starteqno_regmem 
  743.  
  744.   saved ( 0 ) = curchr;
  745.   incr ( saveptr );
  746.   go_into_ordinary_math();
  747. }
  748.  
  749.  
  750. void scanmath ( halfword p )
  751. { scanmath_regmem 
  752.   register integer c;
  753.   register eightbits r_curcmd;
  754.  
  755. lab20:
  756.   r_curcmd = getxnbtoken(1);
  757.  
  758. /*lab21:*/
  759.   switch ( r_curcmd ) {
  760.   case 16 :
  761.     curchr = scancharnum ();    /* curchr = curval; */
  762.     curcmd = 68;
  763. #if 0
  764.     r_curcmd = 68;
  765.     goto lab21 ;
  766.     break ;
  767. #else
  768.     /* Fall through */
  769. #endif
  770.   case 11 : 
  771.   case 12 : 
  772.   case 68 : 
  773.       c = mathcode ( curchr ) ; 
  774.       if ( c == 32768L ) {
  775.     {
  776.       curcs = curchr + activebase ; 
  777.       curcmd = eqtype ( curcs ) ; 
  778.       curchr = equiv ( curcs ) ; 
  779.       xtoken () ; 
  780.       backinput () ; 
  781.     } 
  782.     goto lab20 ; 
  783.       }
  784.     break ; 
  785.   case 17 : 
  786.     c = scanfifteenbitint ();        /* c = curval; */
  787.     break ; 
  788.   case 69 : 
  789.     c = curchr ; 
  790.     break ; 
  791.   case 15 : 
  792.     c = scantwentysevenbitint() / 4096;    /* c = curval / 4096; */
  793.     break ; 
  794.   default: 
  795.     {
  796.       backinput () ; 
  797.       scanleftbrace () ; 
  798.       saved ( 0 ) = p ; 
  799.       incr ( saveptr ) ; 
  800.       pushmath ( mathgroup ) ; 
  801.       return ; 
  802.     }
  803.     break ; 
  804.   }
  805.   mathtype ( p ) = mathchar ; 
  806.   character ( p ) = c % 256 ; 
  807.   if ( ( c >= varcode ) && ( ( curfam >= 0 ) && ( curfam < 16 ) ) ) 
  808.     fam ( p ) = curfam ; 
  809.   else
  810.     fam ( p ) = ( c / 256 ) % 16 ; 
  811. }
  812.  
  813.  
  814. void setmathchar ( integer c )
  815. { setmathchar_regmem 
  816.  
  817.   if ( c >= 32768L ) {
  818.     curcs = curchr + activebase ; 
  819.     curcmd = eqtype ( curcs ) ; 
  820.     curchr = equiv ( curcs ) ; 
  821.     xtoken () ; 
  822.     backinput () ; 
  823.   } else {
  824.     register long_halfword p;
  825.  
  826.     p = newnoad () ; 
  827.     mathtype ( nucleus ( p ) ) = mathchar ; 
  828.     character ( nucleus ( p ) ) = c % 256 ; 
  829.     fam ( nucleus ( p ) ) = ( c / 256 ) % 16 ; 
  830.     if ( c >= varcode ) {
  831.       if ( ( ( curfam >= 0 ) && ( curfam < 16 ) ) ) 
  832.     fam ( nucleus ( p ) ) = curfam ; 
  833.       ztype ( p ) = ordnoad ; 
  834.     } else
  835.       ztype ( p ) = ordnoad + ( c / 4096 ) ; 
  836.     link ( curlist .tailfield ) = p ; 
  837.     curlist .tailfield = p ; 
  838.   }
  839. }
  840.  
  841.  
  842. void mathlimitswitch ( void )
  843. { mathlimitswitch_regmem 
  844.  
  845.   if ( curlist .headfield != curlist .tailfield ) 
  846.   if ( ztype ( curlist .tailfield ) == opnoad ) {
  847.     subtype ( curlist .tailfield ) = curchr ; 
  848.     return ; 
  849.   }
  850.   print_err("Limit controls must follow a math operator");
  851.   zhelp1( STR_H_IMIGNORING_LIMITS );
  852.   error () ; 
  853. }
  854.  
  855.  
  856. void scandelimiter ( halfword p, boolean r )
  857. { scandelimiter_regmem 
  858.   register integer r_curval;
  859.  
  860.   if ( r ) 
  861.     r_curval = scantwentysevenbitint ();
  862.   else {
  863.     register eightbits r_curcmd;
  864.  
  865.     r_curcmd = getxnbtoken(1);
  866.     switch ( r_curcmd ) {
  867.     case 11 : 
  868.     case 12 : 
  869.       r_curval = delcode ( curchr );
  870.       break ; 
  871.     case 15 : 
  872.       r_curval = scantwentysevenbitint ();
  873.       break ;
  874.     default: 
  875.       r_curval = -1;
  876.       break ;
  877.     }
  878.     curval = r_curval;
  879.   }
  880.  
  881.   if ( r_curval < 0 ) {
  882.     print_err("Missing delimiter (. inserted)");
  883.     zhelp1( STR_H_IWASEXP_BRACE );
  884.     backerror();
  885.     curval = r_curval = 0;
  886.   }
  887.   smallfam ( p ) = ( r_curval / 1048576L ) % 16;
  888.   smallchar ( p ) = ( r_curval / 4096 ) % 256;
  889.   largefam ( p ) = ( r_curval / 256 ) % 16;
  890.   largechar ( p ) = r_curval % 256;
  891. }
  892.  
  893.  
  894. void mathradical ( void )
  895. { mathradical_regmem
  896.  
  897.   tailappend ( getnode ( radicalnoadsize ) ) ; 
  898.   ztype ( curlist .tailfield ) = radicalnoad ; 
  899.   subtype ( curlist .tailfield ) = normal ; 
  900.   mem [ nucleus ( curlist .tailfield ) ] .hh = emptyfield ; 
  901.   mem [ subscr ( curlist .tailfield ) ] .hh = emptyfield ; 
  902.   mem [ supscr ( curlist .tailfield ) ] .hh = emptyfield ; 
  903.   scandelimiter ( leftdelimiter ( curlist .tailfield ) , true ) ; 
  904.   scanmath ( nucleus ( curlist .tailfield ) ) ; 
  905. }
  906.  
  907.  
  908. void mathac ( void )
  909. { mathac_regmem 
  910.  
  911.   if ( curcmd == 45 ) {
  912.     print_err("Please use ");
  913.     printesc( STR_MATHACCENT );
  914.     c_print(" for accents in math mode");
  915.     zhelp1( STR_H_IMCHANGING_ACCENT );
  916.     error();
  917.   }
  918.   tailappend ( getnode ( accentnoadsize ) ) ; 
  919.   ztype ( curlist .tailfield ) = accentnoad ; 
  920.   subtype ( curlist .tailfield ) = normal ; 
  921.   mem [ nucleus ( curlist .tailfield ) ] .hh = emptyfield ; 
  922.   mem [ subscr ( curlist .tailfield ) ] .hh = emptyfield ; 
  923.   mem [ supscr ( curlist .tailfield ) ] .hh = emptyfield ; 
  924.   mathtype ( accentchr ( curlist .tailfield ) ) = mathchar ; 
  925.   { register integer r_curval;
  926.  
  927.     r_curval = scanfifteenbitint ();
  928.     character ( accentchr ( curlist .tailfield ) ) = r_curval % 256;
  929.     if ( r_curval >= varcode && ( curfam >= 0 && curfam < 16 ) )
  930.       fam ( accentchr ( curlist .tailfield ) ) = curfam;
  931.     else
  932.       fam ( accentchr ( curlist .tailfield ) ) = ( r_curval / 256 ) % 16 ;
  933.   }
  934.   scanmath ( nucleus ( curlist .tailfield ) ) ;
  935. }
  936.  
  937.  
  938. void appendchoices ( void )
  939. { appendchoices_regmem 
  940.  
  941.   tailappend ( newchoice () ) ; 
  942.   incr ( saveptr ) ; 
  943.   saved ( -1 ) = 0 ; 
  944.   pushmath ( mathchoicegroup ) ; 
  945.   scanleftbrace () ; 
  946. }
  947.  
  948.  
  949. halfword finmlist ( halfword p )
  950. { finmlist_regmem
  951.   register halfword q ;
  952.  
  953.   if ( curlist .auxfield .cint != 0 ) {
  954.     mathtype ( denominator ( curlist .auxfield .cint ) ) = submlist ; 
  955.     info ( denominator( curlist.auxfield.cint ) ) = link( curlist.headfield );
  956.     if ( p == 0 )
  957.       q = curlist .auxfield .cint ; 
  958.     else {
  959.       q = info ( numerator ( curlist .auxfield .cint ) ) ; 
  960.       if ( ztype ( q ) != leftnoad ) 
  961.     confusion("right");
  962.       info ( numerator ( curlist .auxfield .cint ) ) = link ( q ) ; 
  963.       link ( q ) = curlist .auxfield .cint ; 
  964.       link ( curlist .auxfield .cint ) = p ; 
  965.     } 
  966.   } else {
  967.     link ( curlist .tailfield ) = p ; 
  968.     q = link ( curlist .headfield ) ; 
  969.   } 
  970.   popnest () ; 
  971.  
  972.   return(q);
  973. }
  974.  
  975.  
  976. void buildchoices ( void )
  977. {/* 10 */ buildchoices_regmem 
  978.   register halfword p  ; 
  979.  
  980.   unsave () ; 
  981.   p = finmlist ( 0 ) ; 
  982.   switch ( saved ( -1 ) ) {
  983.   case 0 : 
  984.     displaymlist ( curlist .tailfield ) = p ; 
  985.     break ; 
  986.   case 1 : 
  987.     textmlist ( curlist .tailfield ) = p ; 
  988.     break ; 
  989.   case 2 : 
  990.     scriptmlist ( curlist .tailfield ) = p ; 
  991.     break ; 
  992.   case 3 : 
  993.     {
  994.       scriptscriptmlist ( curlist .tailfield ) = p ; 
  995.       decr ( saveptr ) ; 
  996.       return ; 
  997.     } 
  998.     break ; 
  999.   } 
  1000.   incr ( saved ( -1 ) ) ; 
  1001.   pushmath ( mathchoicegroup ) ; 
  1002.   scanleftbrace () ; 
  1003.  
  1004.  
  1005. void subsup ( void )
  1006. { subsup_regmem 
  1007.   register smallnumber t  ; 
  1008.   register halfword p  ; 
  1009.  
  1010.   t = 0 ; 
  1011.   p = 0 ; 
  1012.   if ( curlist .tailfield != curlist .headfield ) 
  1013.   if ( scriptsallowed ( curlist .tailfield ) ) {
  1014.     p = supscr ( curlist .tailfield ) + curcmd - 7 ; 
  1015.     t = mathtype ( p ) ; 
  1016.   } 
  1017.   if ( ( p == 0 ) || ( t != 0 ) ) {
  1018.     tailappend ( newnoad () ) ; 
  1019.     p = supscr ( curlist .tailfield ) + curcmd - 7 ; 
  1020.     if ( t != 0 ) {
  1021.       if ( curcmd == 7 ) {
  1022.     print_err("Double superscript");
  1023.     zhelp1( STR_H_ITREAT_XUP1UP2 );
  1024.       } else {
  1025.     print_err("Double subscript");
  1026.     zhelp1( STR_H_ITREAT_XDOWN1DOWN2 );
  1027.       } 
  1028.       error () ; 
  1029.     } 
  1030.   }
  1031.   scanmath ( p ) ; 
  1032. }
  1033.  
  1034.  
  1035. void mathfraction ( void )
  1036. { mathfraction_regmem 
  1037.   register smallnumber c  ; 
  1038.  
  1039.   c = curchr ; 
  1040.   if ( curlist .auxfield .cint != 0 ) {
  1041.     if ( c >= 3 ) {
  1042.       scandelimiter ( garbage , false ) ; 
  1043.       scandelimiter ( garbage , false ) ; 
  1044.     } 
  1045.     if ( c % 3 == 0 ) 
  1046.       scandimen( false, false, false );
  1047.     print_err("Ambiguous; you need another { and }");
  1048.     zhelp1( STR_H_IM_IGNORING_FRACTION );
  1049.     error();
  1050.   } else {
  1051.     curlist .auxfield .cint = getnode ( fractionnoadsize ) ; 
  1052.     ztype ( curlist .auxfield .cint ) = fractionnoad ; 
  1053.     subtype ( curlist .auxfield .cint ) = normal ; 
  1054.     mathtype ( numerator ( curlist .auxfield .cint ) ) = submlist ; 
  1055.     info ( numerator ( curlist.auxfield.cint ) ) = link ( curlist.headfield );
  1056.     mem [ denominator ( curlist .auxfield .cint ) ] .hh = emptyfield ; 
  1057.     mem [ leftdelimiter ( curlist .auxfield .cint ) ] .qqqq = nulldelimiter ; 
  1058.     mem [ rightdelimiter ( curlist .auxfield .cint ) ] .qqqq = nulldelimiter ; 
  1059.     link ( curlist .headfield ) = 0 ; 
  1060.     curlist .tailfield = curlist .headfield ; 
  1061.     if ( c >= 3 ) {
  1062.       scandelimiter ( leftdelimiter ( curlist .auxfield .cint ) , false ) ; 
  1063.       scandelimiter ( rightdelimiter ( curlist .auxfield .cint ) , false ) ; 
  1064.     }
  1065.     switch ( c % 3 ) {
  1066.     case 0 : 
  1067.       thickness( curlist.auxfield.cint ) = scandimen( false, false, false );
  1068.       break ; 
  1069.     case 1 : 
  1070.       thickness ( curlist .auxfield .cint ) = defaultcode ; 
  1071.       break ; 
  1072.     case 2 : 
  1073.       thickness ( curlist .auxfield .cint ) = 0 ; 
  1074.       break ; 
  1075.     } 
  1076.   }
  1077. }
  1078.  
  1079.  
  1080. void mathleftright ( void )
  1081. { mathleftright_regmem 
  1082.   register smallnumber t;
  1083.  
  1084.   t = curchr ; 
  1085.   if ( ( t == rightnoad ) && ( curgroup != mathleftgroup ) ) {
  1086.     if ( curgroup == mathshiftgroup ) {
  1087.       scandelimiter ( garbage , false ) ; 
  1088.       print_err("Extra ");
  1089.       printesc( STR_RIGHT );
  1090.       zhelp1( STR_H_IM_IGNORING_RIGHT );
  1091.       error();
  1092.     } else
  1093.       offsave ();
  1094.   } else {
  1095.     register halfword p;
  1096.  
  1097.     p = newnoad () ; 
  1098.     ztype ( p ) = t ; 
  1099.     scandelimiter ( delimiter ( p ) , false ) ; 
  1100.     if ( t == leftnoad ) {
  1101.       pushmath ( mathleftgroup ) ; 
  1102.       link ( curlist .headfield ) = p ; 
  1103.       curlist .tailfield = p ; 
  1104.     } else {
  1105.       p = finmlist ( p ) ; 
  1106.       unsave () ; 
  1107.       tailappend ( newnoad () ) ; 
  1108.       ztype ( curlist .tailfield ) = innernoad ; 
  1109.       mathtype ( nucleus ( curlist .tailfield ) ) = submlist ; 
  1110.       info ( nucleus ( curlist .tailfield ) ) = p ; 
  1111.     }
  1112.   }
  1113. }
  1114.  
  1115.  
  1116. void resumeafterdisplay ( void )
  1117. { resumeafterdisplay_regmem 
  1118.  
  1119.   if ( curgroup != mathshiftgroup ) 
  1120.     confusion("display");
  1121.   unsave () ; 
  1122.   curlist .pgfield = curlist .pgfield + 3 ; 
  1123.   pushnest () ; 
  1124.   curlist .modefield = hmode ;
  1125.   curlist .auxfield .hh .v.LH = 1000 ; 
  1126. #if 0  /* 3.1415 */
  1127.   curlist .auxfield .hh .v.RH = 0 ; 
  1128. #else
  1129.   if ( language <= 0 || language > 255 )
  1130.     curlang = 0;
  1131.   else
  1132.     curlang = language ; 
  1133.   curlist .auxfield .hh .v.RH = curlang;
  1134.   curlist .pgfield = ( normmin ( lefthyphenmin ) * 0x40
  1135.             + normmin ( righthyphenmin ) ) * 0x10000L + curlang;
  1136. #endif
  1137.  
  1138.   if ( (eightbits)getxtoken() != 10 )
  1139.     backinput();
  1140.  
  1141.   if ( nestptr == 1 ) 
  1142.     buildpage();
  1143. }
  1144.  
  1145.  
  1146. void getrtoken ( void )
  1147. { getrtoken_regmem 
  1148.  
  1149. lab20:
  1150.   do {
  1151.     gettoken();
  1152.   } while ( curtok == spacetoken );
  1153.  
  1154.   if ( ( curcs == 0 ) || ( curcs > frozencontrolsequence ) ) {
  1155.     print_err("Missing control sequence inserted");
  1156.     zhelp1( STR_H_PLEASEDONTSAYDEF );
  1157.     if ( curcs == 0 )
  1158.       backinput();
  1159.     curtok = cstokenflag + frozenprotection;
  1160.     inserror();
  1161.     goto lab20;
  1162.   }
  1163. }
  1164.  
  1165.  
  1166.   long_halfword
  1167. trapzeroglue ( long_halfword r_curval )
  1168. { trapzeroglue_regmem 
  1169.  
  1170.   if( width(r_curval) == 0 && stretch(r_curval) == 0 && shrink(r_curval) == 0 ) {
  1171.     addglueref ( zeroglue );
  1172.     deleteglueref ( r_curval );
  1173.     curval = r_curval = zeroglue;
  1174.   }
  1175.   return r_curval;
  1176. }
  1177.  
  1178.  
  1179. void doregistercommand ( smallnumber a )
  1180. { doregistercommand_regmem 
  1181.   register halfword l, q;
  1182.   register integer p;
  1183.   register integer r_curval;
  1184.  
  1185.   q = curcmd ; 
  1186.   if ( q != register_cmd ) {
  1187.     register eightbits r_curcmd;
  1188.  
  1189.     r_curcmd = getxtoken();
  1190.     if ( r_curcmd >= assign_int && r_curcmd <= assign_mu_glue ) {
  1191.     p = r_curcmd - assign_int;
  1192.     l = curchr ; 
  1193.     goto lab40 ; 
  1194.     } 
  1195.     if ( r_curcmd != register_cmd ) {
  1196.     p_print_err(  STR_H_YOUCANTUSE );
  1197.     printcmdchr ( r_curcmd , curchr );
  1198.     print( STR_H_AFTER );
  1199.     printcmdchr ( q , 0 );
  1200.     zhelp1( STR_H_IMFORGETTING );
  1201.     error () ; 
  1202.     return;
  1203.     }
  1204.   }
  1205.  
  1206.   p = curchr ; 
  1207.   r_curval = scaneightbitint ();
  1208.   switch ( p ) {
  1209.     case intval : 
  1210.       l = r_curval + countbase;
  1211.       break ; 
  1212.     case dimenval : 
  1213.       l = r_curval + scaledbase ; 
  1214.       break ; 
  1215.     case glueval : 
  1216.       l = r_curval + skipbase ; 
  1217.       break ; 
  1218.     case muval : 
  1219.       l = r_curval + muskipbase ; 
  1220.       break ; 
  1221.   }
  1222.  
  1223. lab40: ; 
  1224.   if ( q == register_cmd )
  1225.     scanoptionalequals () ; 
  1226.   else if ( scankeyword ( STR_BY ) )
  1227.     ;
  1228.  
  1229.   aritherror = false ; 
  1230.   if ( q < multiply ) {
  1231.  
  1232.   if ( p < glueval ) {
  1233.     if ( p == intval ) 
  1234.       r_curval = scanint ();
  1235.     else
  1236.       r_curval = scandimen ( false, false, false );
  1237.     if ( q == advance )
  1238.       r_curval = r_curval + eqtb [ l ] .cint;
  1239.   } else {
  1240.     r_curval = scanglue ( p );
  1241.     if ( q == advance ) {
  1242.       register long_halfword r;
  1243.  
  1244.       q = newspec ( r_curval ) ; 
  1245.       r = equiv ( l ) ; 
  1246.       deleteglueref ( r_curval ) ; 
  1247.       width ( q ) += width ( r );
  1248.       if ( stretch ( q ) == 0 ) 
  1249.     stretchorder ( q ) = normal ; 
  1250.       if ( stretchorder ( q ) == stretchorder ( r ) ) 
  1251.     stretch ( q ) += stretch ( r );
  1252.       else if ( ( stretchorder ( q ) < stretchorder ( r ) )
  1253.          && ( stretch ( r ) != 0 ) ) {
  1254.     stretch ( q ) = stretch ( r ) ; 
  1255.     stretchorder ( q ) = stretchorder ( r ) ; 
  1256.       }
  1257.       if ( shrink ( q ) == 0 )
  1258.     shrinkorder ( q ) = normal ; 
  1259.       if ( shrinkorder ( q ) == shrinkorder ( r ) ) 
  1260.     shrink ( q ) += shrink ( r );
  1261.       else if ( ( shrinkorder ( q ) < shrinkorder ( r ) )
  1262.          && ( shrink ( r ) != 0 ) ) {
  1263.     shrink ( q ) = shrink ( r ) ; 
  1264.     shrinkorder ( q ) = shrinkorder ( r ) ; 
  1265.       }
  1266.       r_curval = q ; 
  1267.     }
  1268.   }
  1269.  
  1270.   } else {
  1271.  
  1272.     r_curval = scanint ();
  1273.     if ( p < glueval ) {
  1274.       if ( q == multiply ) 
  1275.     if ( p == intval ) 
  1276.       r_curval = multandadd( eqtb[l].cint, r_curval, 0, 2147483647L );
  1277.     else
  1278.       r_curval = multandadd( eqtb[l].cint , r_curval, 0, 1073741823L );
  1279.       else
  1280.     r_curval = xovern( eqtb[l].cint, r_curval );
  1281.     } else {
  1282.       register long_halfword r, s;
  1283.  
  1284.       s = equiv ( l );
  1285.       r = newspec ( s );
  1286.       if ( q == multiply ) {
  1287.     width(r) = multandadd( width(s), r_curval, 0, 1073741823L ) ; 
  1288.     stretch(r) = multandadd( stretch(s), r_curval, 0, 1073741823L );
  1289.     shrink(r) = multandadd( shrink(s), r_curval, 0, 1073741823L );
  1290.       } else {
  1291.     width(r) = xovern( width(s), r_curval );
  1292.     stretch(r) = xovern( stretch(s), r_curval );
  1293.     shrink(r) = xovern( shrink(s), r_curval );
  1294.       }
  1295.       r_curval = r;
  1296.     }
  1297.   }
  1298.  
  1299.   if ( aritherror ) {
  1300.     print_err("Arithmetic overflow");
  1301.     zhelp1( STR_H_ICANTCARRYOUT );
  1302.     error ();
  1303.     return;
  1304.   }
  1305.  
  1306.   if ( p < glueval ) {
  1307.     if ( ( a >= 4 ) ) 
  1308.       geqworddefine( l, r_curval );
  1309.     else
  1310.       eqworddefine( l, r_curval );
  1311.   } else {
  1312.     r_curval = trapzeroglue(r_curval);
  1313.     if ( a >= 4 )
  1314.       geqdefine( l, glueref, r_curval );
  1315.     else
  1316.       eqdefine( l, glueref, r_curval );
  1317.   }
  1318. }
  1319.  
  1320.  
  1321. void alteraux ( void )
  1322. { alteraux_regmem
  1323.  
  1324.   if ( curchr != abs ( curlist .modefield ) )
  1325.     reportillegalcase ();
  1326.   else {
  1327.     register halfword c;
  1328.  
  1329.     c = curchr ; 
  1330.     scanoptionalequals();
  1331.     if ( c == vmode ) {
  1332.       curlist.auxfield.cint = scandimen( false, false, false );
  1333.     } else {
  1334.       register integer r_curval;
  1335.  
  1336.       r_curval = scanint ();
  1337.       if ( r_curval <= 0 || r_curval > 32767 ) {
  1338.     print_err("Bad space factor");
  1339.     zhelp1( STR_H_IALLOWONLYVALUES );
  1340.     interror ( r_curval );
  1341.       } else
  1342.     curlist .auxfield .hh .v.LH = r_curval;
  1343.     }
  1344.   }
  1345. }
  1346.  
  1347.  
  1348. void alterprevgraf ( void )
  1349. { alterprevgraf_regmem 
  1350.   register integer p;
  1351.   
  1352.   nest [ nestptr ] = curlist ; 
  1353.   p = nestptr ; 
  1354.   while ( abs ( nest [ p ] .modefield ) != vmode )
  1355.     decr ( p );
  1356.  
  1357.   scanoptionalequals ();
  1358.  
  1359.  { register integer r_curval;
  1360.  
  1361.   r_curval = scanint ();
  1362.   if ( r_curval < 0 ) {
  1363.     print_err("Bad ");
  1364.     printesc( STR_PREVGRAF );
  1365.     zhelp1( STR_H_IALLOWONLYNONNEG );
  1366.     interror ( r_curval ) ; 
  1367.   } else {
  1368.     nest[p].pgfield = r_curval;
  1369.     curlist = nest[nestptr];
  1370.   }
  1371.  }
  1372. }
  1373.  
  1374.  
  1375. void alterpagesofar ( void )
  1376. { alterpagesofar_regmem
  1377.   register schar c;
  1378.  
  1379.   c = curchr;
  1380.   scanoptionalequals ();
  1381.   pagesofar[c] = scandimen( false, false, false );
  1382. }
  1383.  
  1384.  
  1385. void alterinteger ( void )
  1386. { alterinteger_regmem
  1387.   register schar c;
  1388.  
  1389.   c = curchr;
  1390.   scanoptionalequals();
  1391.   if ( c == 0 ) 
  1392.     deadcycles = scanint();
  1393.   else
  1394.     insertpenalties = scanint();
  1395. }
  1396.  
  1397.  
  1398. void alterboxdimen ( void )
  1399. { alterboxdimen_regmem 
  1400.   register smallnumber c  ; 
  1401.   register eightbits b  ; 
  1402.  
  1403.   c = curchr ; 
  1404.   b = scaneightbitint ();    /* b = curval; */
  1405.   scanoptionalequals ();
  1406.   { register integer r_curval;
  1407.  
  1408.     r_curval = scandimen( false, false, false );
  1409.     if ( box ( b ) != 0 )
  1410.       mem [ box ( b ) + c ] .cint = r_curval;
  1411.   }
  1412. }
  1413.  
  1414.  
  1415.  
  1416. /* preparemag() & newfont() => filename.c */
  1417.  
  1418.  
  1419. void newinteraction ( void )
  1420. { newinteraction_regmem 
  1421.  
  1422.   println();
  1423. #ifdef ERW_INTERACTION
  1424.   geqworddefine ( intbase + interactionmodecode, curchr );
  1425. #else
  1426.   interaction = curchr;
  1427. #endif
  1428.   if ( interaction <= batchmode )
  1429.     selector = noprint;
  1430.   else selector = termonly;
  1431.   if ( logopened )
  1432.     selector = selector + 2;
  1433. }
  1434.  
  1435.  
  1436. void doassignments ( void )
  1437. { doassignments_regmem 
  1438.   register eightbits r_curcmd;
  1439.  
  1440.   while ( true ) {
  1441.     r_curcmd = getxnbtoken(1);
  1442.     if ( r_curcmd <= max_non_prefixed_command )
  1443.       return;
  1444.     setboxallowed = false;  /* TeX 3.141 */
  1445.     prefixedcommand();
  1446.     setboxallowed = true;   /* TeX 3.141 */
  1447.   }
  1448. }
  1449.  
  1450.  
  1451. void openorclosein ( void )
  1452. { openorclosein_regmem 
  1453.   register schar c;
  1454.   register schar n;
  1455.  
  1456.   c = curchr ; 
  1457.   n = scanfourbitint ();
  1458.   if ( readopen [ n ] != closed ) {
  1459.     aclose ( readfile [ n ] );
  1460.     readopen [ n ] = closed;
  1461.   }
  1462.   if ( c != 0 ) {
  1463.     scanoptionalequals ();
  1464.     scanfilename ();
  1465.     if ( curext == 335 )
  1466.       curext = STR_DOT_TEX;
  1467.     packfilename ( curname , curarea , curext );
  1468.     if ( aopenin ( readfile [ n ] , TEXINPUTPATH ) ) 
  1469.       readopen [ n ] = justopen;
  1470.   }
  1471. }
  1472.  
  1473.  
  1474. void issuemessage ( void )
  1475. { issuemessage_regmem
  1476.   register integer oldsetting;
  1477.   schar c;
  1478.   register strnumber s;
  1479.  
  1480.   c = curchr ; 
  1481.   link ( garbage ) = scantoks ( false , true ) ; 
  1482.  
  1483.   oldsetting = selector ; 
  1484.   selector = newstring ; 
  1485.   tokenshow ( defref ) ; 
  1486.   selector = oldsetting ; 
  1487.   flushlist ( defref ) ; 
  1488.  
  1489.   strroom ( 1 );
  1490.   s = makestring ();
  1491.   if ( c == 0 ) {
  1492.     if ( termoffset + length ( s ) > maxprintline - 2 )
  1493.       println ();
  1494.     else if ( ( termoffset > 0 ) || ( fileoffset > 0 ) )
  1495.       printchar( 32 );
  1496. #if 0 /* TeX 3.141 */
  1497.     print ( s );
  1498. #else
  1499.     slowprint( s );
  1500. #endif
  1501.     flush ( stdout );
  1502.   } else {
  1503. #if 0 /* TeX 3.141 */
  1504.     p_print_err ( s );
  1505. #else
  1506.     p_print_err ( 335 ); /* "" */  slowprint( s );
  1507. #endif
  1508.     if ( errhelp != 0 )
  1509.       useerrhelp = true;
  1510.     else if ( longhelpseen )
  1511.       zhelp1( STR_H_THATWASANOTHER );
  1512.     else {
  1513.       if ( interaction < errorstopmode )
  1514.     longhelpseen = true;
  1515.       zhelp1( STR_H_THISERRORMESSAGE );
  1516.     }
  1517.     error();
  1518.     useerrhelp = false;
  1519.   }
  1520.   flushstring;
  1521. }
  1522.  
  1523.  
  1524. void shiftcase ( void )
  1525. { shiftcase_regmem 
  1526.   register halfword b;
  1527.  
  1528.   b = curchr;
  1529.  
  1530.  { register halfword p;
  1531.  
  1532.   p = scantoks ( false , false );
  1533.   p = link ( defref );
  1534.   while ( p != 0 ) {
  1535.     register halfword t;
  1536.  
  1537.     t = info ( p ) ; 
  1538.     if ( t < cstokenflag + singlebase ) {
  1539.       register eightbits c;
  1540.  
  1541.       c = t % 256;
  1542.       if ( equiv ( b + c ) != 0 )
  1543.     info ( p ) = t - c + equiv ( b + c );
  1544.     }
  1545.     p = link ( p );
  1546.   }
  1547.  }
  1548.   begintokenlist ( link ( defref ) , backedup );
  1549.   freeavail ( defref );
  1550. }
  1551.  
  1552.  
  1553. void showwhatever ( void )
  1554. { showwhatever_regmem
  1555.   /* register halfword p; */
  1556.  
  1557.   switch ( curchr ) {
  1558.   case 3:
  1559.     begindiagnostic ();
  1560.     showactivities ();
  1561.     break;
  1562.   case 1:
  1563.     { register integer r_curval;
  1564.  
  1565.       r_curval = scaneightbitint();
  1566.       begindiagnostic();
  1567.       c_printnl("> \\box");
  1568.       printint ( r_curval );
  1569.       printchar( 61 );
  1570.       if ( box ( r_curval ) == 0 )
  1571.     c_print("void");
  1572.       else
  1573.     showbox( box(r_curval) );
  1574.     }
  1575.     break;
  1576.   case 0:
  1577.     {
  1578.       gettoken ();
  1579.       if ( interaction >= errorstopmode ) 
  1580.     wakeupterminal ();
  1581.       c_printnl("> ");
  1582.       if ( curcs != 0 ) {
  1583.     sprintcs ( curcs );
  1584.     printchar ( 61 );
  1585.       }
  1586.       printmeaning ();
  1587.       goto lab50;
  1588.     }
  1589.     break;
  1590.   default:
  1591.     {
  1592.       /* p = */ (void) thetoks ();
  1593.       if ( interaction >= errorstopmode ) 
  1594.     wakeupterminal ();
  1595.       c_printnl("> ");
  1596.       tokenshow ( temphead );
  1597.       flushlist ( link ( temphead ) );
  1598.       goto lab50 ; 
  1599.     } 
  1600.     break ; 
  1601.   } 
  1602.   enddiagnostic ( true );
  1603.   print_err("OK");
  1604.  
  1605.   if ( selector == termandlog ) 
  1606.   if ( tracingonline <= 0 ) {
  1607.     selector = termonly ; 
  1608.     c_print(" (see the transcript file)");
  1609.     selector = termandlog;
  1610.   }
  1611. lab50:
  1612.   if ( interaction < errorstopmode ) {
  1613.     help0;
  1614.     decr ( errorcount );
  1615.   } else if ( tracingonline > 0 ) {
  1616.     zhelp1( STR_H_THISISNTERR );
  1617.   } else {
  1618.     zhelp2( STR_H_THISISNTERR, STR_H_ANDTYPEITRACING );
  1619.   }
  1620.   error();
  1621. }
  1622.  
  1623. /* -- end -- */
  1624.