home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / source / TeX / tex / tex3.c < prev    next >
C/C++ Source or Header  |  1992-11-08  |  25KB  |  1,153 lines

  1. #define EXTERN extern
  2. #include "texd.h"
  3.  
  4.  
  5. long_halfword strtoks ( poolpointer b )
  6. { strtoks_regmem 
  7.   register long_halfword p;
  8.   register halfword t;
  9.   register poolpointer k;
  10.  
  11.   strroom ( 1 ) ; 
  12.   p = temphead ; 
  13.   link ( p ) = 0 ; 
  14.   k = b;
  15.   while ( k < poolptr ) {
  16.     t = strpool[k];
  17.     if ( t == 32 ) 
  18.       t = spacetoken ; 
  19.     else
  20.       t = othertoken + t ; 
  21.     faststorenewtoken ( t ) ; 
  22.     incr ( k );
  23.   }
  24.   poolptr = b;
  25.   return(p);
  26. }
  27.  
  28.  
  29. long_halfword thetoks ( void )
  30. { register integer r_curval;
  31.  
  32.   getxtoken ();
  33.   r_curval = scansomethinginternal( tokval, false );
  34.  { thetoks_regmem
  35.  
  36.   if ( curvallevel >= identval ) {
  37.     long_halfword p;
  38.  
  39.     p = temphead;
  40.     link ( p ) = 0;
  41.     if ( curvallevel == identval )
  42.       storenewtoken ( cstokenflag + r_curval );
  43.     else if ( r_curval != 0 ) {
  44.       register halfword r;
  45.  
  46.       r = link ( r_curval );
  47.       while ( r != 0 ) {
  48.     faststorenewtoken ( info ( r ) );
  49.     r = link ( r );
  50.       }
  51.     }
  52.     return(p);
  53.   } else {
  54.     poolpointer b;
  55.     integer oldsetting;
  56.  
  57.     oldsetting = selector ; 
  58.     selector = newstring ; 
  59.     b = poolptr;
  60.     switch ( curvallevel ) {
  61.     case intval : 
  62.       printint ( r_curval );
  63.       break;
  64.     case dimenval : 
  65.     printscaled ( r_curval );
  66.     print( STR_PT );
  67.       break;
  68.     case glueval : 
  69.     printspec( r_curval, STR_PT );
  70.     deleteglueref ( r_curval ) ; 
  71.       break ; 
  72.     case muval : 
  73.     printspec ( r_curval, STR_MU );
  74.     deleteglueref ( r_curval );
  75.       break ; 
  76.     } 
  77.     selector = oldsetting ; 
  78.     return( strtoks ( b ) );
  79.   }
  80.  }
  81. }
  82.  
  83.  
  84. void insthetoks ( void )
  85. { insthetoks_regmem 
  86.  
  87.   link ( garbage ) = thetoks();
  88.   begintokenlist( link(temphead), inserted );
  89. }
  90.  
  91.  
  92. void convtoks ( void )
  93. { convtoks_regmem
  94.   register integer c;
  95.   integer oldsetting;
  96.   poolpointer b;
  97.  
  98.   c = curchr ; 
  99.   switch ( c ) {
  100.   case numbercode : 
  101.   case romannumeralcode : 
  102.     scanint ();
  103.     break;
  104.   case stringcode :
  105.   case meaningcode :
  106.     { register smallnumber savescannerstatus;
  107.  
  108.       savescannerstatus = scannerstatus;
  109.       scannerstatus = normal;
  110.       gettoken();
  111.       scannerstatus = savescannerstatus;
  112.     }
  113.     break;
  114.   case fontnamecode : 
  115.     scanfontident ();
  116.     break;
  117.   case jobnamecode : 
  118.     if ( jobname == 0 )
  119.       openlogfile();
  120.     break;
  121.   }
  122.  
  123.   oldsetting = selector ; 
  124.   selector = newstring ; 
  125.   b = poolptr ; 
  126.   switch ( c ) {
  127.   case numbercode : 
  128.     printint ( curval ) ; 
  129.     break ; 
  130.   case romannumeralcode : 
  131.     printromanint ( curval ) ; 
  132.     break ; 
  133.   case stringcode : 
  134.     if ( curcs != 0 ) 
  135.       sprintcs ( curcs );
  136.     else
  137.       printchar ( curchr );
  138.     break;
  139.   case meaningcode : 
  140.     printmeaning ();
  141.     break;
  142.   case fontnamecode : 
  143.     { register integer r_curval = curval;
  144.  
  145.       print ( fontname(r_curval) );
  146.       if ( fontsize(r_curval) != fontdsize(r_curval) ) {
  147.     print( STR_AT_ );
  148.     printscaled ( fontsize(r_curval) );
  149.     print( STR_PT );
  150.       }
  151.     }
  152.     break;
  153.   case jobnamecode:
  154.     print( jobname );
  155.     break;
  156.   }
  157.   selector = oldsetting;
  158.   link ( garbage ) = strtoks ( b );
  159.   begintokenlist( link(temphead), inserted );
  160. }
  161.  
  162.  
  163. long_halfword scantoks ( boolean macrodef, boolean xpand )
  164. { scantoks_regmem
  165.   register halfword t, s;
  166.   register long_halfword p;
  167.   register halfword unbalance, hashbrace;
  168.  
  169.   if ( macrodef )
  170.     scannerstatus = defining ; 
  171.   else
  172.     scannerstatus = absorbing ; 
  173.   warningindex = curcs ; 
  174. #if 0
  175.   defref = getavail () ; 
  176.   tokenrefcount ( defref ) = 0 ; 
  177.  
  178.   p = defref;
  179. #else
  180.   p = getavail();
  181.   tokenrefcount( p ) = 0 ; 
  182.  
  183.   defref = p;
  184. #endif
  185.   hashbrace = 0;
  186.   t = zerotoken;
  187.  
  188.   if ( macrodef ) {
  189.     while ( true ) {
  190.       gettoken () ; 
  191.       if ( curtok < rightbracelimit )
  192.     goto lab31;
  193.       if ( curcmd == 6 ) {
  194.     s = matchtoken + curchr ; 
  195.     if( (eightbits)gettoken() == 1 ) {
  196.       hashbrace = curtok;
  197.       storenewtoken ( curtok );
  198.       storenewtoken ( endmatchtoken );
  199.       goto lab30;
  200.     }
  201.     if ( t == zerotoken + 9 ) {
  202.       print_err("You already have nine parameters");
  203.       zhelp1( STR_H_IMGOING_TABSIGN );
  204.       error();
  205.     } else {
  206.       incr ( t ) ; 
  207.       if ( curtok != t ) {
  208.         print_err("Parameters must be numbered consecutively");
  209.         zhelp1( STR_H_IVEINSERTED_DIGIT );
  210.         backerror () ; 
  211.       }
  212.       curtok = s;
  213.     }
  214.       }
  215.       storenewtoken( curtok );
  216.     }            /* while ( true ) */
  217.  
  218. lab31:
  219.     storenewtoken ( endmatchtoken );
  220.     if ( curcmd == 2 ) {
  221.       p_print_err( STR_H_MISSING_LEFTBRACE );
  222.       incr ( alignstate );
  223.       zhelp1( STR_H_WHEREWAS_LEFTBRACE );
  224.       error();
  225.       goto lab40;
  226.     }
  227. lab30: ; 
  228.  
  229.   } else
  230.  
  231.     scanleftbrace();
  232.  
  233.   unbalance = 1;
  234.   while ( true ) {
  235.     if ( xpand ) {
  236.       while ( true ) {
  237.     if( (eightbits)getnext() <= maxcommand )
  238.       goto lab32 ; 
  239.     if ( curcmd != the ) 
  240.       expand();
  241.     else {
  242.       register long_halfword q;
  243.  
  244.       q = thetoks();
  245.       if ( link ( temphead ) != 0 ) {
  246.         link ( p ) = link ( temphead ) ; 
  247.         p = q;
  248.       }
  249.     }
  250.       }     /* while ( true ) */
  251. lab32:
  252.       xtoken();
  253.     } else
  254.       gettoken();
  255.  
  256.     if ( curtok < rightbracelimit ) {
  257.       if ( curcmd < 2 ) 
  258.     incr ( unbalance ) ; 
  259.       else {
  260.     decr ( unbalance ) ; 
  261.     if ( unbalance == 0 ) 
  262.       goto lab40 ; 
  263.       }
  264.     } else if ( curcmd == 6 ) 
  265.       if ( macrodef ) {
  266.     s = curtok ; 
  267.     if( (eightbits)( (xpand) ? getxtoken() : gettoken() ) != 6 ) {
  268.       if ( ( curtok <= zerotoken ) || ( curtok > t ) ) {
  269.         print_err("Illegal parameter number in definition of ");
  270.         sprintcs ( warningindex );
  271.         zhelp1( STR_H_YOUMEANT_TAB );
  272.         backerror();
  273.         curtok = s;
  274.       } else
  275.         curtok = outparamtoken - 48 + curchr;
  276.     }
  277.       }
  278.     storenewtoken ( curtok ) ; 
  279.   }        /* while (true) */
  280.  
  281. lab40:
  282.   scannerstatus = normal ; 
  283.   if ( hashbrace != 0 ) 
  284.     storenewtoken ( hashbrace );
  285.  
  286.   return(p);
  287. }
  288.  
  289.  
  290. void readtoks ( integer n, halfword r )
  291. { readtoks_regmem 
  292.   register halfword p;
  293.   integer s;
  294.   register smallnumber m;
  295.  
  296.   scannerstatus = defining ; 
  297.   warningindex = r ; 
  298.   defref = getavail () ; 
  299.   tokenrefcount ( defref ) = 0 ; 
  300.   p = defref ; 
  301.   storenewtoken ( endmatchtoken ) ; 
  302.   if ( n < 0 || n > 15 )
  303.     m = 16 ; 
  304.   else
  305.     m = n ; 
  306.   s = alignstate ; 
  307.   alignstate = 1000000L ; 
  308.  
  309.   do {
  310.     beginfilereading () ; 
  311.     curinput .namefield = m + 1 ; 
  312.     if ( readopen [ m ] == closed ) 
  313.       if ( interaction > nonstopmode ) 
  314.     if ( n < 0 ) 
  315.       terminput("");
  316.     else {
  317.       wakeupterminal () ; 
  318.       println () ; 
  319.       sprintcs ( r ) ; 
  320.       terminput("=");
  321.       n = -1 ; 
  322.     } 
  323.       else
  324.     fatalerror( STR_H_FE_CANNOTREAD );
  325.     else if ( readopen [ m ] == justopen ) 
  326.       if ( inputln ( readfile [ m ] , false ) ) 
  327.     readopen [ m ] = normal ; 
  328.       else {
  329.     aclose ( readfile [ m ] ) ; 
  330.     readopen [ m ] = closed ; 
  331.       }
  332.     else {
  333.       if ( ! inputln ( readfile [ m ] , true ) ) {
  334.     aclose ( readfile [ m ] ) ; 
  335.     readopen [ m ] = closed ; 
  336.     if ( alignstate != 1000000L ) {
  337.       runaway () ; 
  338.       print_err("File ended within ");
  339.       printesc( STR_READ );
  340.       zhelp1( STR_H_THISREADHASUNBALANCED );
  341.       alignstate = 1000000L ; 
  342.       error () ; 
  343.     }
  344.       }
  345.     }
  346.     curinput .limitfield = last ; 
  347.     if ( endlinecharinactive () ) 
  348.       decr ( curinput .limitfield ) ; 
  349.     else
  350.       buffer [ curinput .limitfield ] = endlinechar ; 
  351.     first = curinput .limitfield + 1 ; 
  352.     curinput .locfield = curinput .startfield ; 
  353.     curinput .statefield = 33 ; 
  354.     while ( true ) {
  355.       gettoken();
  356.       if ( curtok == 0 )
  357.     goto lab30;
  358.       /* TeX 3.141 change begin */
  359.       if ( alignstate < 1000000L ) {
  360.     do {
  361.       gettoken();
  362.     } while( curtok != 0 );
  363.     alignstate = 1000000L;
  364.     goto lab30;
  365.       }
  366.       /* TeX 3.141 change end */
  367.       storenewtoken( curtok );
  368.     }
  369. lab30:
  370.     endfilereading();
  371.   } while ( alignstate != 1000000L );
  372.  
  373.   curval = defref ; 
  374.   scannerstatus = normal ; 
  375.   alignstate = s;
  376. }
  377.  
  378.  
  379. void passtext ( void )
  380. { passtext_regmem
  381.   register integer l;
  382.   smallnumber savescannerstatus;
  383.  
  384.   savescannerstatus = scannerstatus ; 
  385.   scannerstatus = skipping ; 
  386.   l = 0 ; 
  387.   skipline = line ; 
  388.   while ( true ) {
  389.     register eightbits r_curcmd;
  390.  
  391.     r_curcmd = getnext () ; 
  392.     if ( r_curcmd == fiorelse ) {
  393.       if ( l == 0 )
  394.     goto lab30 ; 
  395.       if ( curchr == ficode ) 
  396.     decr ( l ) ; 
  397.     } else if ( r_curcmd == iftest )
  398.       incr ( l ) ; 
  399.   }
  400. lab30:
  401.   scannerstatus = savescannerstatus ; 
  402. }
  403.  
  404.  
  405. void changeiflimit ( smallnumber l, halfword p )
  406. { changeiflimit_regmem 
  407.   register halfword q;
  408.  
  409.   if ( p == condptr ) 
  410.     iflimit = l ; 
  411.   else {
  412.     q = condptr ; 
  413.     while ( true ) {
  414.       if ( q == 0 ) 
  415.      confusion("if");
  416.       if ( link ( q ) == p ) {
  417.     ztype ( q ) = l ; 
  418.     return ; 
  419.       } 
  420.       q = link ( q ) ; 
  421.     } 
  422.   }
  423. }
  424.  
  425.  
  426. void conditional ( void )
  427. { conditional_regmem 
  428.   boolean b;
  429.   register integer m, n;
  430.   register halfword p, q;
  431.   halfword savecondptr;
  432.   register smallnumber thisif;
  433.  
  434.   {
  435.     p = getnode ( ifnodesize ) ; 
  436.     link ( p ) = condptr ; 
  437.     ztype ( p ) = iflimit ; 
  438.     subtype ( p ) = curif ; 
  439.     iflinefield ( p ) = ifline ; 
  440.     condptr = p ; 
  441.     curif = curchr ; 
  442.     iflimit = ifcode ; 
  443.     ifline = line ; 
  444.   }
  445.   savecondptr = condptr ; 
  446.   thisif = curchr ; 
  447.  
  448.   switch ( thisif ) {
  449.   case ifcharcode : 
  450.   case ifcatcode : 
  451.     { register eightbits r_curcmd;
  452.  
  453.       getxtokenoractivechar;
  454.       if ( r_curcmd > 13 || curchr > 255 ) {
  455.     m = 0;
  456.     n = 256;
  457.       } else {      
  458.     m = r_curcmd;
  459.     n = curchr;
  460.       } 
  461.       getxtokenoractivechar;
  462.       if ( r_curcmd > 13 || curchr > 255 ) {
  463.     curcmd = r_curcmd = 0;
  464.     curchr = 256;
  465.       } 
  466. #ifdef ERW_TRACING
  467.     /*  zeige nachdem die beiden Tokens gelesen wurde, die entsprechenden
  468.      *  Werte im log-file
  469.      */
  470.       if ( tracingcommands > 2 ) {
  471.     begindiagnostic ();
  472.     printchar( 123 );
  473. #if 0
  474.     if( thisif == ifcharcode ) {
  475.       print(STR_IF);  printchar(' ');
  476.       printint(n);  c_print(" = ");  printint(curchr);
  477.     } else {
  478.       print(STR_IFCAT);  printchar(' ');
  479.       printcmdchr(m, n);  c_print(" = ");  printcmdchr(r_curcmd, curchr);
  480.     }
  481. #else
  482.     /* Format: {if<cat> <cmdchr1> (<num1>) = <cmdchr2> (<num2>)}
  483.      */
  484.     print( (thisif == ifcharcode) ? STR_IF : STR_IFCAT );  printchar(' ');
  485.     printcmdchr(m, n);  c_print(" (");
  486.     printint( (thisif == ifcharcode) ? n : m ); c_print(") = ");
  487.     printcmdchr(r_curcmd, curchr); c_print(" (");
  488.     printint( (thisif == ifcharcode) ? curchr : r_curcmd );
  489.     printchar(')');
  490. #endif
  491.     printchar( 125 );
  492.     enddiagnostic ( false );
  493.       }
  494. #endif
  495.       if ( thisif == ifcharcode )
  496.     b = ( n == curchr );
  497.       else
  498.     b = ( m == r_curcmd );
  499.     }
  500.     break;
  501.   case ifintcode:
  502.   case ifdimcode:
  503.     { schar r;
  504.  
  505.       if ( thisif == ifintcode )
  506.     n = scanint ();
  507.       else
  508.     n = scandimen ( false , false , false );
  509.       (void) getxnbtoken(0);
  510.  
  511.       if ( ( curtok >= othertoken + 60 ) && ( curtok <= othertoken + 62 ) ) 
  512.     r = curtok - othertoken - 60;
  513.       else {
  514.     print_err("Missing = inserted for ");
  515.     printcmdchr( iftest, thisif );
  516.     zhelp1( STR_H_IWASEXPECTING_DIDNT );
  517.     backerror();
  518.     r = 1 /* 61 */;
  519.       }
  520.  
  521.       if ( thisif == ifintcode ) 
  522.     m = scanint ();
  523.       else
  524.     m = scandimen ( false , false , false );
  525.  
  526.       switch ( r ) {
  527.       case 0 /* 60 */:
  528.     b = ( n < m );
  529.     break;
  530.       case 1 /* 61 */: 
  531.     b = ( n == m );
  532.     break;
  533.       case 2 /* 62 */: 
  534.     b = ( n > m );
  535.     break;
  536.       }
  537.     }
  538.     break ; 
  539.   case ifoddcode : 
  540.     b = odd( scanint() );
  541.     break ; 
  542.   case ifvmodecode : 
  543.     b = ( abs ( curlist .modefield ) == vmode );
  544.     break ; 
  545.   case ifhmodecode : 
  546.     b = ( abs ( curlist .modefield ) == hmode );
  547.     break ; 
  548.   case ifmmodecode : 
  549.     b = ( abs ( curlist .modefield ) == mmode );
  550.     break ; 
  551.   case ifinnercode : 
  552.     b = ( curlist .modefield < 0 );
  553.     break;
  554.   case ifvoidcode : 
  555.   case ifhboxcode : 
  556.   case ifvboxcode : 
  557.     {
  558.       p = box( scaneightbitint() );
  559.       if ( thisif == ifvoidcode )
  560.     b = ( p == 0 );
  561.       else if ( p == 0 )
  562.     b = false;
  563.       else if ( thisif == ifhboxcode )
  564.     b = ( ztype ( p ) == hlistnode );
  565.       else
  566.     b = ( ztype ( p ) == vlistnode );
  567.     }
  568.     break ; 
  569.   case ifxcode : 
  570.     { smallnumber savescannerstatus;
  571.  
  572.       savescannerstatus = scannerstatus;
  573.       scannerstatus = normal;
  574.       p = getnext();
  575.       n = curcs;
  576.       /* p = curcmd; */
  577.       q = curchr;
  578.       getnext();
  579. #ifdef ERW_TRACING
  580.     /*  zeige die beiden Tokens bzw. falls Commands gleich und Makros
  581.      * wird Teil der Definition im log-file gezeigt.
  582.      */
  583.     /* Format:
  584.      *   {ifx <type> <<macroname>:<definition>.>
  585.      *      = <type> <<macroname>:<definition>.>}
  586.      */
  587.       if ( tracingcommands > 2 ) {
  588.     begindiagnostic ();
  589.     printchar( 123 );
  590.     print(STR_IFX);  printchar(' ');
  591.     printcmdchr(p, q);
  592.     if( p >= call ) {
  593.       if ( n != 0 ) {
  594.         printchar(' ');
  595.         sprintcs( n );
  596.       }
  597.       if( q != 0 ) {
  598.         printchar(':');
  599.         showtokenlist( link(q), 0, 32 );  /* maxprintline/2 - 13 */
  600.         printchar('.');
  601.       }
  602.     }
  603.     println(); c_print("   = ");
  604.     printcmdchr(curcmd, curchr);
  605.     if( curcmd >= call ) {
  606.       if( curcs != 0 ) {
  607.         printchar(' ');
  608.         sprintcs( curcs );
  609.       }
  610.       if( curchr != 0 ) {
  611.         printchar(':');
  612.         showtokenlist( link(curchr), 0, 32 );
  613.         printchar('.');
  614.       }
  615.     }
  616.     printchar( 125 );
  617.     enddiagnostic ( false );
  618.       }
  619. #endif
  620.       if ( curcmd != p )
  621.     b = false;
  622.       else if ( p /*curcmd*/ < call )    /* es gilt: curcmd == p */
  623.     b = ( curchr == q );
  624.       else {                /* und jetzt: curcmd/p >= call */
  625.     p = link ( curchr );
  626.     q = link ( equiv(n) );
  627.     if ( p == q ) {
  628.       b = true;
  629.     } else {
  630. #if 0
  631.       while ( ( p != 0 ) && ( q != 0 ) ) {
  632.         if ( info ( p ) != info ( q ) )
  633.           p = 0;
  634.         else {
  635.           p = link ( p );
  636.           q = link ( q );
  637.         }
  638.       }
  639.       b = ( ( p == 0 ) && ( q == 0 ) );
  640. #else
  641.       b = false;
  642.       while( 1 ) {
  643.         if( (p == 0) || (q == 0) ) {
  644.           if( p == q )  /* <==> ( (p == 0) && (q == 0) ) */
  645.         b = true;
  646.           break;
  647.         }
  648.         if ( info(p) != info(q) ) {
  649.           break;
  650.         }
  651.         p = link(p); q = link(q);
  652.       }
  653. #endif
  654.     }
  655.       }
  656.       scannerstatus = savescannerstatus;
  657.     }
  658.     break;
  659.   case ifeofcode :
  660.     n = scanfourbitint ();
  661.     b = ( readopen [ /*curval*/ n ] == closed );
  662.     break;
  663.   case iftruecode : 
  664.     b = true ; 
  665.     break ; 
  666.   case iffalsecode : 
  667.     b = false ; 
  668.     break ; 
  669.   case ifcasecode : 
  670.     {
  671.       n = scanint ();
  672.       if ( tracingcommands > 1 ) {
  673.     begindiagnostic () ; 
  674.     c_print("{case ");
  675.     printint ( n ) ; 
  676.     printchar ( 125 ) ; 
  677.     enddiagnostic ( false ) ; 
  678.       } 
  679.       while ( n != 0 ) {
  680.     passtext();
  681.     if ( condptr == savecondptr )
  682.       if ( curchr == orcode )
  683.         decr ( n );
  684.       else
  685.         goto lab50;
  686.     else if ( curchr == ficode ) {
  687.       p = condptr;
  688.       ifline = iflinefield ( p );
  689.       curif = subtype ( p );
  690.       iflimit = ztype ( p );
  691.       condptr = link ( p );
  692.       freenode( p, ifnodesize );
  693.     }
  694.       }
  695.       changeiflimit( orcode, savecondptr );
  696.       return;
  697.     }
  698.     break;
  699.   }
  700.  
  701.   if ( tracingcommands > 1 ) {
  702.     begindiagnostic ();
  703.     c_print( b ? "{true}" : "{false}" );
  704.     enddiagnostic ( false );
  705.   }
  706.  
  707.   if ( b ) {
  708.     changeiflimit ( elsecode, savecondptr );
  709.     return;
  710.   }
  711.  
  712.   while ( true ) {
  713.     passtext();
  714.     if ( condptr == savecondptr ) {
  715.       if ( curchr != orcode ) 
  716.     goto lab50 ; 
  717.       print_err("Extra ");
  718.       printesc( STR_OR );
  719.       zhelp1( STR_H_IMIGNORING_IF );
  720.       error () ; 
  721.     } else if ( curchr == ficode ) {
  722.       p = condptr ; 
  723.       ifline = iflinefield ( p ) ; 
  724.       curif = subtype ( p ) ; 
  725.       iflimit = ztype ( p ) ; 
  726.       condptr = link ( p ) ; 
  727.       freenode ( p , ifnodesize ) ; 
  728.     }
  729.   }
  730. lab50:
  731.   if ( curchr == ficode ) {
  732.     p = condptr ; 
  733.     ifline = iflinefield ( p ) ; 
  734.     curif = subtype ( p ) ; 
  735.     iflimit = ztype ( p ) ; 
  736.     condptr = link ( p ) ; 
  737.     freenode ( p , ifnodesize ) ; 
  738.   } else
  739.     iflimit = ficode ; 
  740. }
  741.  
  742. #if 0        /* nach filename.c */
  743.  
  744. /* =========  Part 29: File Names =========== */
  745.  
  746. /* Diese Routinen sollte man so abaendern, dass sie vielleicht statt dem
  747.  * String Pool feste oder dynamische C-Arrays benutzen.  TeX hat jetzt die
  748.  * unangenehme Eigenschaft, fuer jeden(!) Filenamen, selbst wenn er schon
  749.  * vorhanden ist, einen neuen String yu verwenden.
  750.  */
  751.  
  752. /*
  753.  *  Die naechsten drei Routinen werden nur von scanfilename() und
  754.  *  promptfilename() aufgerufen.
  755.  */
  756.  
  757.   static
  758. void beginname ( void )
  759. { beginname_regmem 
  760.  
  761.   areadelimiter = 0;
  762.   extdelimiter = 0;
  763.  
  764.   static
  765. boolean morename ( ASCIIcode c )
  766. { morename_regmem
  767.  
  768.   if ( c == 32 )
  769.     return(false);
  770.  
  771.   strroom( 1 );
  772.   appendchar( c );
  773.   if ( c == 47 ) {        /* / */
  774.     areadelimiter = curlength;
  775.     extdelimiter = 0;
  776.   } else if ( c == 46 )        /* . */
  777.     extdelimiter = curlength;
  778.  
  779.   return(true);
  780. }
  781.  
  782.   static
  783. void endname ( void )
  784. { endname_regmem
  785.  
  786.   if ( strptr + 3 > maxstrings )
  787.     overflow(1, maxstrings - initstrptr);
  788.  
  789.   /* Falls kein Directory angegeben wurde, ist curarea = "",
  790.    * ansonsten wird curarea auf das Directory gesetzt.
  791.    */
  792.   if ( areadelimiter == 0 )
  793.     curarea = 335;
  794.   else {
  795.     curarea = strptr;
  796.     strstart [ strptr + 1 ] = strstart [ strptr ] + areadelimiter;
  797.     incr ( strptr );
  798.   }
  799.  
  800.   /* Falls keine Extension angegeben wurde, ist curext = "" und curname
  801.    * der aktuelle String.
  802.    * Ansonsten ist curname der String bis zu curext und curext der restliche
  803.    * aktuelle String.
  804.    */
  805.   if ( extdelimiter == 0 ) {
  806.     curext = 335;
  807.     curname = makestring();
  808.   } else {
  809.     curname = strptr;
  810.     strstart[strptr+1] = strstart[strptr] + extdelimiter - areadelimiter - 1;
  811.     incr ( strptr );
  812.     curext = makestring();
  813.   }
  814. }
  815.  
  816.  
  817.  
  818. void packfilename( strnumber n, strnumber a, strnumber e )
  819. { packfilename_regmem
  820.   register integer k;
  821.   register ASCIIcode c;
  822.   register poolpointer j;
  823.  
  824.   k = 0;
  825.   {register integer for_end; j = strstart [ a ] ; for_end = strstart [ a + 1 
  826.   ] - 1 ; if ( j <= for_end) do 
  827.     {
  828.       c = strpool [ j ] ; 
  829.       incr ( k ) ; 
  830.       if ( k <= FILENAMESIZE ) 
  831.       nameoffile [ k ] = xchr [ c ] ; 
  832.     } 
  833.   while ( j++ < for_end ) ; } 
  834.   {register integer for_end; j = strstart [ n ] ; for_end = strstart [ n + 1 
  835.   ] - 1 ; if ( j <= for_end) do 
  836.     {
  837.       c = strpool [ j ] ; 
  838.       incr ( k ) ; 
  839.       if ( k <= FILENAMESIZE ) 
  840.       nameoffile [ k ] = xchr [ c ] ; 
  841.     } 
  842.   while ( j++ < for_end ) ; } 
  843.   {register integer for_end; j = strstart [ e ] ; for_end = strstart [ e + 1 
  844.   ] - 1 ; if ( j <= for_end) do 
  845.     {
  846.       c = strpool [ j ] ; 
  847.       incr ( k ) ; 
  848.       if ( k <= FILENAMESIZE ) 
  849.       nameoffile [ k ] = xchr [ c ] ; 
  850.     } 
  851.   while ( j++ < for_end ) ; } 
  852.  
  853.   if ( k <= FILENAMESIZE ) 
  854.    namelength = k ; 
  855.   else
  856.     namelength = FILENAMESIZE ; 
  857.  
  858.   {register integer for_end; k = namelength + 1 ; for_end = FILENAMESIZE 
  859.   ; if ( k <= for_end) do 
  860.     nameoffile [ k ] = ' ' ; 
  861.   while ( k++ < for_end ) ; } 
  862. }
  863.  
  864.  
  865. void packbufferedname ( smallnumber n, integer a, integer b )
  866. { packbufferedname_regmem 
  867.   register integer k  ; 
  868.   register ASCIIcode c  ; 
  869.   register integer j  ; 
  870.  
  871.   if ( n + b - a + 5 > FILENAMESIZE ) 
  872.     b = a + FILENAMESIZE - n - 5 ; 
  873.   k = 0 ; 
  874.   {register integer for_end; j = 1 ; for_end = n ; if ( j <= for_end) do 
  875.     {
  876.       c = xord [ TEXformatdefault [ j ] ] ; 
  877.       incr ( k ) ; 
  878.       if ( k <= FILENAMESIZE ) 
  879.       nameoffile [ k ] = xchr [ c ] ; 
  880.     } 
  881.   while ( j++ < for_end ) ; } 
  882.   {register integer for_end; j = a ; for_end = b ; if ( j <= for_end) do 
  883.     {
  884.       c = buffer [ j ] ; 
  885.       incr ( k ) ; 
  886.       if ( k <= FILENAMESIZE ) 
  887.       nameoffile [ k ] = xchr [ c ] ; 
  888.     } 
  889.   while ( j++ < for_end ) ; } 
  890.   {register integer for_end; j = formatdefaultlength - 3 ; for_end = 
  891.   formatdefaultlength ; if ( j <= for_end) do 
  892.     {
  893.       c = xord [ TEXformatdefault [ j ] ] ; 
  894.       incr ( k ) ; 
  895.       if ( k <= FILENAMESIZE ) 
  896.       nameoffile [ k ] = xchr [ c ] ; 
  897.     } 
  898.   while ( j++ < for_end ) ; } 
  899.   if ( k <= FILENAMESIZE ) 
  900.   namelength = k ; 
  901.   else namelength = FILENAMESIZE ; 
  902.   {register integer for_end; k = namelength + 1 ; for_end = FILENAMESIZE 
  903.   ; if ( k <= for_end) do 
  904.     nameoffile [ k ] = ' ' ; 
  905.   while ( k++ < for_end ) ; } 
  906. }
  907.  
  908.  
  909. strnumber makenamestring ( void )
  910. { makenamestring_regmem 
  911.   register integer k  ; 
  912.  
  913.   if ( ( poolptr + namelength > poolsize ) || ( strptr == maxstrings )
  914.     || ( curlength > 0 ) )
  915.     return( (strnumber)63 );
  916.  
  917.   {register integer for_end; k = 1 ; for_end = namelength ; if ( k <= 
  918.   for_end) do 
  919.     appendchar ( xord [ nameoffile [ k ] ] ) ; 
  920.   while ( k++ < for_end ) ; } 
  921.  
  922.   return( makestring () );
  923.  
  924.  
  925. #if 0
  926. strnumber amakenamestring ( alphafile f )
  927. { amakenamestring_regmem
  928.  
  929.   return( makenamestring () );
  930. }
  931.  
  932.  
  933. strnumber bmakenamestring ( bytefile f )
  934. { bmakenamestring_regmem 
  935.  
  936.   return( makenamestring () );
  937. }
  938.  
  939.  
  940. strnumber wmakenamestring ( wordfile f )
  941. { wmakenamestring_regmem 
  942.  
  943.   return( makenamestring () );
  944. }
  945. #endif
  946.  
  947.  
  948. void scanfilename ( void )
  949. { scanfilename_regmem
  950.   register eightbits r_curcmd;
  951.  
  952.   nameinprogress = true;
  953.   beginname();
  954.   r_curcmd = getxnbtoken(0);
  955.  
  956.   while ( true ) {
  957.     if ( r_curcmd > 12 || (curchr > 255) ) {
  958.       backinput ();
  959.       goto lab30;
  960.     }
  961.     if ( ! morename( curchr ) )
  962.       goto lab30;
  963.     r_curcmd = getxtoken();
  964.   }
  965.  
  966. lab30:
  967.   endname();
  968.   nameinprogress = false;
  969. }
  970.  
  971.  
  972. void packjobname ( strnumber s )
  973. { packjobname_regmem
  974.  
  975.   curarea = 335 ;
  976.   curext = s ;
  977.   curname = jobname ;
  978.   packfilename ( curname , curarea , curext );
  979. }
  980.  
  981.  
  982. /* Da wir nach der Adresse des naechsten Strings abfragen (ist schneller
  983.  * als `strcmp()', wird er hier einmalig angelegt.
  984.  */
  985. static char input_file_name[] = "input file name";
  986.  
  987.  
  988. void promptfilename ( char *s, strnumber e )
  989. {/* 30 */ promptfilename_regmem 
  990.   register integer k  ; 
  991.  
  992.   if ( interaction == scrollmode ) 
  993.     wakeupterminal () ; 
  994.   if ( s == input_file_name ) {
  995.     print_err("I can't find file `");
  996.   } else {
  997.     print_err("I can't write on file `");
  998.   } 
  999.   printfilename ( curname , curarea , curext ) ; 
  1000.   c_print("'.");
  1001.   if ( e == STR_DOT_TEX )
  1002.     showcontext();
  1003.   c_printnl("Please type another ");
  1004.   c_print ( s );
  1005.   if ( interaction < scrollmode ) 
  1006.     fatalerror( STR_H_FE_JOBAB_FILE );
  1007.   clearterminal () ; 
  1008.   terminput(": ");
  1009.   {
  1010.     beginname () ; 
  1011.     k = first ; 
  1012.     while ( ( buffer [ k ] == 32 ) && ( k < last ) )
  1013.       incr ( k );
  1014.     while ( true ) {
  1015.       if ( k == last ) 
  1016.     goto lab30 ; 
  1017.       if ( ! morename ( buffer [ k ] ) ) 
  1018.     goto lab30 ; 
  1019.       incr ( k ) ; 
  1020.     }
  1021. lab30:
  1022.     endname () ; 
  1023.   } 
  1024.   if ( curext == 335 ) 
  1025.     curext = e;
  1026.   packfilename ( curname , curarea , curext ) ; 
  1027. }
  1028.  
  1029.  
  1030. void openlogfile ( void )
  1031. { openlogfile_regmem 
  1032.   integer oldsetting;
  1033.   register integer k;
  1034.   register integer l;
  1035.   ccharpointer months;
  1036.  
  1037.   oldsetting = selector;
  1038.  
  1039.   if ( jobname == 0 ) 
  1040.     jobname = STR_TEXPUT;
  1041.   packjobname( STR_DOT_LOG );  
  1042.   while ( ! aopenout ( logfile ) ) {
  1043.     selector = termonly ; 
  1044.     promptfilename("transcript file name", STR_DOT_LOG );
  1045.   }
  1046.   logname = amakenamestring ( logfile ) ; 
  1047.   selector = logonly ; 
  1048.   logopened = true ; 
  1049.   {
  1050. #if 0
  1051.     (void) Fputs( logfile ,  "This is TeX, C Version 3.1t2" ) ; 
  1052. #else
  1053.     (void) Fputs( logfile, banner );
  1054. #endif
  1055. #ifdef MLTEX
  1056.   /* if user has given ML-TeX switch in IniTeX, output a second line */
  1057.   if( is_ML_TeX )
  1058.     (void) Fputs(logfile, "\nThis is ML-TeX, C Version 3+");
  1059. #endif
  1060.     print ( formatident ) ; 
  1061.     c_print("  ");
  1062.     printint ( zday ) ; 
  1063.     printchar ( 32 ) ; 
  1064.     months = "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC";
  1065.     {register integer for_end; k = 3 * zmonth - 3 ; for_end = 3 * zmonth - 1
  1066.     ; if ( k <= for_end) do 
  1067.       (void) putc( months [ k ] ,  logfile );
  1068.     while ( k++ < for_end ) ; } 
  1069.     printchar ( 32 ) ; 
  1070.     printint ( zyear ) ; 
  1071.     printchar ( 32 ) ; 
  1072.     printtwo ( ztime / 60 ) ; 
  1073.     printchar ( 58 ) ; 
  1074.     printtwo ( ztime % 60 ) ; 
  1075.   }
  1076. #ifdef INP_PTR
  1077.   /*  Da bei INP_PTR curinput auf oberstes Element von inputstack[] zeigt ..
  1078.    *  ist nichts zu tun.
  1079.    */
  1080. #else
  1081.   inputstack [ inputptr ] = curinput ; 
  1082. #endif
  1083.   c_printnl("**");
  1084.   l = inputstack [ 0 ] .limitfield ; 
  1085.   if ( buffer [ l ] == endlinechar ) 
  1086.     decr ( l );
  1087.   {register integer for_end; k = 1 ; for_end = l ; if ( k <= for_end) do 
  1088.     print ( buffer [ k ] ) ; 
  1089.   while ( k++ < for_end ) ; } 
  1090.   println () ; 
  1091.   selector = oldsetting + 2 ; 
  1092. }
  1093.  
  1094.  
  1095. void startinput ( void )
  1096. {/* 30 */ startinput_regmem 
  1097.  
  1098.   scanfilename ();
  1099.   if ( curext == 335 ) 
  1100.     packfilename ( curname , curarea , STR_DOT_TEX );
  1101.   else
  1102.     packfilename ( curname , curarea , curext );
  1103.  
  1104.   while ( true ) {
  1105.     beginfilereading () ; 
  1106.     if ( aopenin ( inputfile [ curinput .indexfield ] , TEXINPUTPATH ) ) 
  1107.       goto lab30 ; 
  1108.     if ( curext == 335 ) {
  1109.       packfilename ( curname , curarea , curext ) ; 
  1110.       if ( aopenin ( inputfile [ curinput .indexfield ] , TEXINPUTPATH ) ) 
  1111.       goto lab30 ; 
  1112.     } 
  1113.     endfilereading () ; 
  1114.     promptfilename( input_file_name, STR_DOT_TEX );
  1115.   }
  1116. lab30:
  1117.   curinput .namefield = amakenamestring ( inputfile[curinput.indexfield] );
  1118.   if ( jobname == 0 ) {
  1119.     jobname = curname;
  1120.     openlogfile();
  1121.   }
  1122.   if ( termoffset + length ( curinput .namefield ) > maxprintline - 3 )
  1123.     println();
  1124.   else if ( ( termoffset > 0 ) || ( fileoffset > 0 ) )
  1125.     printchar ( 32 );
  1126.   printchar ( 40 );
  1127.   incr ( openparens );
  1128.   print ( curinput .namefield );
  1129.   flush ( stdout );
  1130.   curinput .statefield = 33;
  1131.  
  1132.   line = 1;
  1133.   if ( inputln ( inputfile [ curinput .indexfield ] , false ) )
  1134.     ;
  1135.  
  1136.   curinput.limitfield = last;    /* (br) added */
  1137.   if ( pausing > 0 )        /* (br) added */
  1138.     firmuptheline () ;
  1139.  
  1140.   if ( endlinecharinactive () ) 
  1141.     decr ( curinput .limitfield ) ; 
  1142.   else
  1143.     buffer [ curinput .limitfield ] = endlinechar ; 
  1144.   first = curinput .limitfield + 1 ; 
  1145.   curinput .locfield = curinput .startfield ; 
  1146. }
  1147.  
  1148. #endif
  1149.  
  1150. /* -- end -- */
  1151.