home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / source / TeX / tex / filename.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-09  |  20.1 KB  |  793 lines

  1. /* =========  Part 29: File Names =========== */
  2.  
  3. #define EXTERN extern
  4. #include "texd.h"
  5.  
  6.  
  7. /* Diese Routinen sollte man so abaendern, dass sie vielleicht statt dem
  8.  * String Pool feste oder dynamische C-Arrays benutzen.  TeX hat jetzt die
  9.  * unangenehme Eigenschaft, fuer jeden(!) Filenamen, selbst wenn er schon
  10.  * vorhanden ist, einen neuen String zu verwenden.
  11.  */
  12.  
  13.  
  14. /* Als erste einfache Abhilfe werden die letzten FNCACHELEN Stringnummern
  15.  * fuer Files in `fncache[]' eingetragen... und bevor ein neuer String fuer
  16.  * einen Filenamen erzeugt wird, wird dort nachgesehen.
  17.  */
  18. #ifdef FILENAMECACHE
  19.  
  20. static strnumber fn_cache[FNCACHELEN];
  21. static char  fn_cache_sc[FNCACHELEN];  /* Second Chance Zaehler */
  22. static short fn_cache_rover = 0;       /* letzte Position */
  23.  
  24.  
  25. #if 0
  26.  
  27. /* Die Funktion `flushstring' kann nur den zuletzt erzeugten String
  28.  * entfernen.  `deletestring(s)' entfernt den beliebigen String Nummer `s'.
  29.  * Dabei sollte `s' nicht allzuweit vom Ende des Pools entfernt sein, da es
  30.  * sonst etwas langsam vor sich geht.
  31.  * Ausserdem darf keiner der Strings > s schon irgendwo abgespeichert
  32.  * worden sein, d.h. die Stringnummern duerfen nicht im Cache sein oder
  33.  * in einer der Variablen curarea, curname, curext....
  34.  */
  35.  
  36.   static void
  37. delete_string(strnumber s)
  38. { long len;
  39.  
  40. c_printnl("Deleting: "); print(s); println();
  41.  
  42.   if( s >= strptr ) {
  43.     printf("!! Internal Error (Filename Cache [%d]) !!\n", 1);
  44.     return;
  45.   }
  46.  
  47.   len = length(s);
  48.  
  49. c_printnl("Str1: "); printf(
  50. "poolptr: %d  str: %d  str-1: %d  str+1 %d  len: %d strptr: %d",
  51. poolptr, strstart[strptr], strstart[strptr-1], strstart[strptr+1],
  52. len, strptr);
  53. println();
  54. c_printnl("Str1: "); printf(
  55. "s: %d  s: %d  s-1: %d  s+1 %d", s, strstart[s], strstart[s-1], strstart[s+1]);
  56. println();
  57.  
  58.   /* Kopiere den restlichen Stringpool "herunter" */
  59.   /* memcpy( dst, src, size ); */
  60.   memcpy( &strpool[strstart[s]], &strpool[strstart[s+1]],
  61.           poolptr - strstart[s+1] );
  62.  
  63.   /* poolptr und strptr erniedrigen... */
  64.   poolptr -= len;
  65.   --strptr;
  66.  
  67.   /* Passe strstart[] oberhalb des Strings an (nicht strstart[s]!) */
  68.   s++;
  69.   while( s <= strptr ) {
  70.     strstart[s] = strstart[s+1] - len;
  71.     s++;
  72.   }
  73.  
  74. c_printnl("Str2: "); printf(
  75. "poolptr: %d  str: %d  str-1: %d  str+1 %d  len: %d strptr: %d",
  76. poolptr, strstart[strptr], strstart[strptr-1], strstart[strptr+1],
  77. len, strptr);
  78. println();
  79. c_printnl("Str2: "); printf(
  80. "s: %d  s: %d  s-1: %d  s+1 %d", s, strstart[s], strstart[s-1], strstart[s+1]);
  81. println();
  82.  
  83.   if( poolptr != strstart[strptr] )
  84.     printf("!! Internal Error (Filename Cache [%d]) !!\n", 2);
  85. }
  86. #endif
  87.  
  88.  
  89. /* Suchen im Filename-Cache, liefert neue Stringnummer zurueck, alter String
  90.  * wird geloescht (Man huete sich davor lookup_fncache() mit einer String-
  91.  * nummer aufzurufen, die im Cache schon ist und spaeter noch benoetigt wird!)
  92.  */
  93.  
  94.   static int
  95. lookup_fncache(strnumber search)
  96. { short cur_ptr = fn_cache_rover;
  97.  
  98.   /* Verhindere, dass die festen Strings gesucht und evtl. geloescht werden
  99.    * ( makenamestring() liefert z.B. auch 63 zurueck).
  100.    * Und da ist es gleich besser, nur den zuletzt mit makestring() erzeugten
  101.    * String (und den gerade in endname() erzeugten) zuzulassen.
  102.    */
  103.   if( search < (strptr - 1) )
  104.     return( 0 );    /* not found */
  105.  
  106.   while( 1 ) {
  107.  
  108.     /* Stringnummer im Cache ?? */
  109.     if( fn_cache[cur_ptr] != 0 ) {   /* gueltiger Eintrag?? */
  110.  
  111.       /* Der Vergleich
  112.        *     fn_cache[cur_ptr] < strptr
  113.        * ist notwendig, da ab TeX 3.1415 in \S 1260 Code enthalten ist,
  114.        * der den neuen gelesenen Fontnamen von schon vorhandenen Fonts
  115.        * loescht und den alten verwendet.  Dabei koennte dieser Name
  116.        * schon hier eingetragen sein!!
  117.        * Dieser Test alleine bringt's jedoch nicht, deshalb wird vorher
  118.        * schon explizit gegen alle Fontnamen abgeprueft!
  119.        */
  120.       if( fn_cache[cur_ptr] >= strptr ) {  /* wirklich: gueltiger Eintrag?? */
  121.     fn_cache[cur_ptr] = 0;  /* nein: Eintrag loeschen */
  122.       } else {
  123.     if( str_eq_str(search, fn_cache[cur_ptr]) ) {
  124.       fn_cache_rover = cur_ptr;
  125.       /* Second Chance Zaehler auf `belegt' setzen */
  126.           fn_cache_sc[cur_ptr] = 0;
  127.       /* und Stringnummer aus Cache zurueckgeben */
  128.       return( fn_cache[cur_ptr] );
  129.     }
  130.       }
  131.     }
  132.  
  133.     /* Zeiger erhoehen (und am Cache-Ende wieder auf den Anfang setzen) */
  134.     cur_ptr++;  cur_ptr %= FNCACHELEN;
  135.  
  136.     /* schon einmal im Kreis herum und immer noch nicht gefunden...? */
  137.     if( cur_ptr == fn_cache_rover )
  138.     break;
  139.   }
  140.  
  141.   /* Nicht gefunden, jetzt mit ``Second Chance'' verdraengen. */
  142.  
  143.   while( 1 ) {
  144.     /* Zeiger erhoehen (und am Cache-Ende wieder auf den Anfang setzen) */
  145.     cur_ptr++;  cur_ptr %= FNCACHELEN;
  146.  
  147.     /* keine Second Chance mehr ? */
  148.     if( fn_cache_sc[cur_ptr] >= 2 )
  149.     break;
  150.  
  151.     /* Second Chance Zaehler, von `belegt' (0) auf `gealtert' (1)
  152.      * bzw. von `gealtert' auf `frei' (2) setzen.
  153.      */
  154.     fn_cache_sc[cur_ptr] += 1;
  155.   }
  156.  
  157.   fn_cache_rover = cur_ptr;
  158.  
  159.   /* String eintragen und als `belegt' markieren */
  160.   fn_cache[cur_ptr] = search;
  161.   fn_cache_sc[cur_ptr] = 0;
  162.  
  163.   return( 0 );    /* not found */
  164. }
  165.  
  166.  
  167. /* Ersetze einen moeglichen Eintrag des Strings `old' im Cache durch
  168.  * den String `new'.
  169.  * Dies ist immer dann notwendig, wenn ein String durch einen anderen
  170.  * (mit gleichem Inhalt!) ersetzt wird und der alte mit `flushstring()'
  171.  * geloescht wird.
  172.  * Momentan nur in \S 1260 new_font() benoetigt...
  173.  * und dort tritt dies nur auf, wenn ein Fontname gescannt wird, der
  174.  * nicht mehr im Cache ist und deshalb unter der Nummer eingetragen
  175.  * wird.  Anschliessend ersetzt der Original-TeX-Code diesen String
  176.  * durch den in `fontname(f)' gefundenen und dies muss auch im Cache
  177.  * nachvollzogen werden!
  178.  */
  179.  
  180.   static void
  181. update_fncache(strnumber old, strnumber new)
  182. { short cur_ptr;
  183.   char errorflag = 0;
  184.  
  185.   /* fn_cache[] enthaelt 0 als Anzeichen fuer einen leeren Eintrag.
  186.    * `old' sollte nie 0 sein, da die Bedingung in der Schleife
  187.    * eigentlich
  188.    *    if( fn_cache[cur_ptr] != 0 && fn_cache[cur_ptr] == old )
  189.    * lautet.  Stringnummer 0 steht im Grunde fuer "@" und koennte
  190.    * vorkommen, wird aber von `lookup_fncache()' nie zurueckgeliefert
  191.    * und auch nicht in den Cache eingetragen (wieso wohl?!).
  192.    * Vorsichtshalber trotzdem abpruefen...
  193.    */
  194.   if ( old == 0 ) {
  195.     printf("\n!! Internal Error (Filename Cache Update [%d]) !!\n", 1);
  196.     return;
  197.   }
  198.  
  199.   for( cur_ptr = FNCACHELEN - 1 ; cur_ptr >= 0 ; cur_ptr-- ) {
  200.     if( fn_cache[cur_ptr] == old ) {
  201.       fn_cache[cur_ptr] = new;
  202.       /* Der zu ersetzende Eintrag sollte nur einmal drin sein!! */
  203.       if ( errorflag )
  204.         printf("\n!! Internal Error (Filename Cache Update [%d]) !!\n", 2);
  205.       errorflag = 1;
  206.     }
  207.   }
  208. }
  209.  
  210. #endif   /* FILENAMECACHE */
  211.  
  212.  
  213.  
  214. /*
  215.  *  Die naechsten drei Routinen werden nur von scanfilename() und
  216.  *  promptfilename() aufgerufen.
  217.  */
  218.  
  219.   static
  220. void beginname ( void )
  221. { beginname_regmem 
  222.  
  223.   areadelimiter = 0;
  224.   extdelimiter = 0;
  225.  
  226.  
  227.   static
  228. boolean morename ( ASCIIcode c )
  229. { morename_regmem
  230.  
  231.   if ( c == 32 )
  232.     return(false);
  233.  
  234.   strroom( 1 );
  235.   appendchar( c );
  236.   if ( c == 47 ) {        /* / */
  237.     areadelimiter = curlength;
  238.     extdelimiter = 0;
  239.   } else if ( c == 46 )        /* . */
  240.     extdelimiter = curlength;
  241.  
  242.   return(true);
  243. }
  244.  
  245.  
  246.   static
  247. void endname ( void )
  248. { endname_regmem
  249.   strnumber tempstr;
  250.   long i;
  251.  
  252.   if ( strptr + 3 > maxstrings )
  253.     overflow(1, maxstrings - initstrptr);
  254.  
  255.   /* Falls kein Directory angegeben wurde, ist curarea = "",
  256.    * ansonsten wird curarea auf das Directory gesetzt.
  257.    */
  258.   if ( areadelimiter == 0 )
  259.     curarea = 335;
  260.   else {
  261.     curarea = strptr;
  262.     strstart[strptr + 1] = strstart[strptr] + areadelimiter;
  263.     incr ( strptr );
  264. #ifdef FILENAMECACHE
  265.     if( (tempstr = lookup_fncache(curarea)) != 0 ) {
  266.     curarea = tempstr;
  267.     decr(strptr);    /* nicht flushstring, da sonst poolptr falsch */
  268.  
  269.     /* Name + Ext des Filenamens herunterkopieren */
  270.     for( i = strstart[strptr + 1] ; i < poolptr ; i++ )
  271.       strpool[i - areadelimiter] = strpool[i];
  272.     /* Poolpointer korrigieren */
  273.     poolptr -= areadelimiter;
  274.     }
  275. #endif
  276.   }
  277.  
  278.   /* Falls keine Extension angegeben wurde, ist curext = "" und curname
  279.    * der aktuelle String.
  280.    * Ansonsten ist curname der String bis zu curext und curext der restliche
  281.    * aktuelle String.
  282.    */
  283.   if ( extdelimiter == 0 ) {
  284.     curext = 335;
  285. #ifdef FILENAMECACHE
  286.     if( curlength == 0 ) {
  287.       curname = 335;
  288.     } else {
  289.       curname = makestring();
  290.       if( (tempstr = lookup_fncache(curname)) != 0 ) {
  291.     curname = tempstr;
  292.     flushstring;    /* poolptr wird automatisch richtig gesetzt */
  293.       }
  294.     }
  295. #else
  296.     curname = makestring();
  297. #endif
  298.   } else {
  299.     curname = strptr;
  300.     strstart[strptr+1] = strstart[strptr] + extdelimiter - areadelimiter - 1;
  301.     incr ( strptr );
  302. #ifdef FILENAMECACHE
  303.     if( (tempstr = lookup_fncache(curname)) != 0 ) {
  304.     curname = tempstr;
  305.     decr(strptr);    /* nicht flushstring, da sonst poolptr falsch */
  306.  
  307.     /* Extension des Filenamens herunterkopieren */
  308.     for( i = strstart[strptr+1] ; i < poolptr; i++ )
  309.       strpool[i - extdelimiter + areadelimiter + 1] = strpool[i];
  310.     poolptr = poolptr - extdelimiter + areadelimiter + 1;
  311.     }
  312. #endif
  313.  
  314.     curext = makestring();
  315. #ifdef FILENAMECACHE
  316.     /* Zuerst mal auf ".tex" abpruefen.. */
  317.     if( str_eq_str(STR_DOT_TEX, curext) ) {
  318.     curext = STR_DOT_TEX;
  319.     flushstring;
  320.     } else if( (tempstr = lookup_fncache(curext)) != 0 ) {
  321.     curext = tempstr;
  322.     flushstring;
  323.     }
  324. #endif
  325.   }
  326. }
  327.  
  328.  
  329.  
  330. void packfilename( strnumber n, strnumber a, strnumber e )
  331. { packfilename_regmem
  332.   register integer k;
  333.   register ASCIIcode c;
  334.   register poolpointer j;
  335.  
  336.   k = 0;
  337.   { register integer for_end;
  338.     j = strstart[a];  for_end = strstart[a + 1] - 1;
  339.     if ( j <= for_end) do {
  340.       c = strpool[j];
  341.       incr ( k );
  342.       if ( k <= FILENAMESIZE-1 )
  343.     nameoffile [ k ] = xchr [ c ];
  344.     } while ( j++ < for_end ); 
  345.   }
  346.   { register integer for_end;
  347.     j = strstart [ n ] ; for_end = strstart [ n + 1 ] - 1 ;
  348.     if ( j <= for_end) do {
  349.       c = strpool [ j ];
  350.       incr ( k ) ; 
  351.       if ( k <= FILENAMESIZE-1 )
  352.     nameoffile [ k ] = xchr [ c ] ; 
  353.     } while ( j++ < for_end ) ;
  354.   }
  355.   { register integer for_end;
  356.     j = strstart [ e ] ; for_end = strstart [ e + 1 ] - 1 ;
  357.     if ( j <= for_end) do {
  358.       c = strpool [ j ];
  359.       incr ( k );
  360.       if ( k <= FILENAMESIZE-1 ) 
  361.     nameoffile [ k ] = xchr [ c ];
  362.     } while ( j++ < for_end );
  363.   }
  364.  
  365.   if ( k <= FILENAMESIZE-1 )
  366.     namelength = k;
  367.   else
  368.     namelength = FILENAMESIZE-1;
  369.  
  370.   { register integer for_end;
  371.     k = namelength + 1 ; for_end = FILENAMESIZE;
  372.     if ( k <= for_end) do 
  373.       nameoffile [ k ] = ' ';
  374.     while ( k++ < for_end );
  375.   }
  376. }
  377.  
  378.  
  379. void packbufferedname ( smallnumber n, integer a, integer b )
  380. { packbufferedname_regmem 
  381.   register integer k;
  382.   register ASCIIcode c;
  383.   register integer j;
  384.  
  385.   if ( n + b - a + 5 > FILENAMESIZE-1 ) 
  386.     b = a + (FILENAMESIZE-1) - n - 5;
  387.   k = 0;
  388.   { register integer for_end;
  389.     j = 1; for_end = n;
  390.     if ( j <= for_end) do {
  391.       c = xord [ TEXformatdefault[j] ];
  392.       incr ( k );
  393.       if ( k <= FILENAMESIZE-1 )
  394.     nameoffile [ k ] = xchr [ c ];
  395.     } while ( j++ < for_end );
  396.   }
  397.   { register integer for_end;
  398.     j = a; for_end = b;
  399.     if ( j <= for_end) do {
  400.       c = buffer [ j ];
  401.       incr ( k );
  402.       if ( k <= FILENAMESIZE-1 )
  403.     nameoffile [ k ] = xchr [ c ];
  404.     } while ( j++ < for_end );
  405.   }
  406.   { register integer for_end;
  407.     j = formatdefaultlength - 3; for_end = formatdefaultlength;
  408.     if ( j <= for_end) do {
  409.       c = xord [ TEXformatdefault[j] ];
  410.       incr ( k );
  411.       if ( k <= FILENAMESIZE-1 )
  412.     nameoffile [ k ] = xchr [ c ];
  413.     } while ( j++ < for_end );
  414.   }
  415.   if ( k <= FILENAMESIZE-1 )
  416.     namelength = k;
  417.   else
  418.     namelength = FILENAMESIZE-1;
  419.  
  420.   { register integer for_end;
  421.     k = namelength + 1; for_end = FILENAMESIZE;
  422.     if ( k <= for_end) do 
  423.       nameoffile [ k ] = ' ';
  424.     while ( k++ < for_end );
  425.   }
  426. }
  427.  
  428.  
  429. strnumber makenamestring ( void )
  430. { makenamestring_regmem
  431.   register integer k;
  432.  
  433.   if ( ( poolptr + namelength > poolsize ) || ( strptr == maxstrings )
  434.     || ( curlength > 0 ) )
  435.     return( (strnumber)63 );   /* "?" */
  436.  
  437.   { register integer for_end; k = 1 ; for_end = namelength;
  438.     if ( k <= for_end) do 
  439.       appendchar ( xord [ nameoffile [ k ] ] ) ; 
  440.     while ( k++ < for_end );
  441.   }
  442.  
  443.   return( makestring () );
  444. }
  445.  
  446.  
  447. void scanfilename ( void )
  448. { scanfilename_regmem
  449.   register eightbits r_curcmd;
  450.  
  451.   nameinprogress = true;
  452.   beginname();
  453.   r_curcmd = getxnbtoken(0);
  454.  
  455.   while ( true ) {
  456.     if ( r_curcmd > 12 || (curchr > 255) ) {
  457.       backinput ();
  458.       goto lab30;
  459.     }
  460.     if ( ! morename( curchr ) )
  461.       goto lab30;
  462.     r_curcmd = getxtoken();
  463.   }
  464.  
  465. lab30:
  466.   endname();
  467.   nameinprogress = false;
  468. }
  469.  
  470.  
  471. void packjobname ( strnumber s )
  472. { packjobname_regmem
  473.  
  474.   curarea = 335 ;
  475.   curext = s ;
  476.   curname = jobname ;
  477.   packfilename ( curname , curarea , curext );
  478. }
  479.  
  480.  
  481. /* Da wir nach der Adresse des naechsten Strings abfragen (ist schneller
  482.  * als `strcmp()', wird er hier einmalig angelegt.
  483.  */
  484. static char input_file_name[] = "input file name";
  485.  
  486.  
  487. void promptfilename ( char *s, strnumber e )
  488. {/* 30 */ promptfilename_regmem 
  489.   register integer k  ; 
  490.  
  491.   if ( interaction == scrollmode ) 
  492.     wakeupterminal () ; 
  493.   if ( s == input_file_name ) {
  494.     print_err("I can't find file `");
  495.   } else {
  496.     print_err("I can't write on file `");
  497.   } 
  498.   printfilename ( curname , curarea , curext ) ; 
  499.   c_print("'.");
  500.   if ( e == STR_DOT_TEX )
  501.     showcontext();
  502.   c_printnl("Please type another ");
  503.   c_print ( s );
  504.   if ( interaction < scrollmode ) 
  505.     fatalerror( STR_H_FE_JOBAB_FILE );
  506.   clearterminal () ; 
  507.   terminput(": ");
  508.   {
  509.     beginname () ; 
  510.     k = first ; 
  511.     while ( ( buffer [ k ] == 32 ) && ( k < last ) )
  512.       incr ( k );
  513.     while ( true ) {
  514.       if ( k == last ) 
  515.     goto lab30 ; 
  516.       if ( ! morename ( buffer [ k ] ) ) 
  517.     goto lab30 ; 
  518.       incr ( k ) ; 
  519.     }
  520. lab30:
  521.     endname () ; 
  522.   } 
  523.   if ( curext == 335 ) 
  524.     curext = e;
  525.   packfilename ( curname , curarea , curext ) ; 
  526. }
  527.  
  528.  
  529. void openlogfile ( void )
  530. { openlogfile_regmem 
  531.   integer oldsetting;
  532.   register integer k;
  533.   register integer l;
  534.   ccharpointer months;
  535.  
  536.   oldsetting = selector;
  537.  
  538.   if ( jobname == 0 ) 
  539.     jobname = STR_TEXPUT;
  540.   packjobname( STR_DOT_LOG );  
  541.   while ( ! aopenout ( logfile ) ) {
  542.     selector = termonly ; 
  543.     promptfilename("transcript file name", STR_DOT_LOG );
  544.   }
  545.   logname = amakenamestring ( logfile ) ; 
  546.   selector = logonly ; 
  547.   logopened = true ; 
  548.   {
  549. #if 0
  550.     (void) Fputs( logfile ,  "This is TeX, C Version 3.1t2" ) ; 
  551. #else
  552.     (void) Fputs( logfile, banner );
  553. #endif
  554. #ifdef MLTEX
  555.   /* if user has given ML-TeX switch in IniTeX, output a second line */
  556.   if( is_ML_TeX )
  557.     (void) Fputs(logfile, "\nThis is ML-TeX, Version 3");
  558. #endif
  559. #ifdef TEXXET
  560.   if( is_TeX_XeT )
  561.     (void) Fputs(logfile, "\nThis is TeX--XeT (1.0)");
  562. #endif
  563.     slowprint ( formatident );  /* TeX 3.141 */
  564.     c_print("  ");
  565.     printint ( zday ) ; 
  566.     printchar ( 32 ) ; 
  567.     months = "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC";
  568.     {register integer for_end; k = 3 * zmonth - 3 ; for_end = 3 * zmonth - 1
  569.     ; if ( k <= for_end) do 
  570.       (void) putc( months [ k ] ,  logfile );
  571.     while ( k++ < for_end ) ; } 
  572.     printchar ( 32 ) ; 
  573.     printint ( zyear ) ; 
  574.     printchar ( 32 ) ; 
  575.     printtwo ( ztime / 60 ) ; 
  576.     printchar ( 58 ) ; 
  577.     printtwo ( ztime % 60 ) ; 
  578.   }
  579. #ifdef INP_PTR
  580.   /*  Da bei INP_PTR curinput auf oberstes Element von inputstack[] zeigt ..
  581.    *  ist nichts zu tun.
  582.    */
  583. #else
  584.   inputstack [ inputptr ] = curinput; 
  585. #endif
  586.   c_printnl("**");
  587.   l = inputstack [ 0 ] .limitfield ; 
  588.   if ( buffer [ l ] == endlinechar ) 
  589.     decr ( l );
  590.   {register integer for_end; k = 1 ; for_end = l ; if ( k <= for_end) do 
  591.     print ( buffer [ k ] ) ; 
  592.   while ( k++ < for_end ) ; } 
  593.   println () ; 
  594.   selector = oldsetting + 2 ; 
  595. }
  596.  
  597.  
  598. void startinput ( void )
  599. {/* 30 */ startinput_regmem 
  600.  
  601.   scanfilename ();
  602.   if ( curext == 335 ) 
  603.     packfilename ( curname , curarea , STR_DOT_TEX );
  604.   else
  605.     packfilename ( curname , curarea , curext );
  606.  
  607.   while ( true ) {
  608.     beginfilereading () ; 
  609.     if ( aopenin ( inputfile [ curinput.indexfield ] , TEXINPUTPATH ) ) 
  610.       goto lab30 ; 
  611.     if ( curext == 335 ) {
  612.       packfilename ( curname , curarea , curext ) ; 
  613.       if ( aopenin ( inputfile [ curinput.indexfield ] , TEXINPUTPATH ) ) 
  614.       goto lab30 ; 
  615.     } 
  616.     endfilereading () ; 
  617.     promptfilename( input_file_name, STR_DOT_TEX );
  618.   }
  619. lab30:
  620.   curinput.namefield = amakenamestring ( inputfile[curinput.indexfield] );
  621. #ifdef FILENAMECACHE
  622.   { strnumber tempstr;
  623.     if( (tempstr = lookup_fncache( curinput.namefield )) != 0 ) {
  624.     curinput.namefield = tempstr;
  625.     flushstring;
  626.     }
  627.   }
  628. #endif
  629.   if ( jobname == 0 ) {
  630.     jobname = curname;
  631.     openlogfile();
  632.   }
  633.   if ( termoffset + length ( curinput.namefield ) > maxprintline - 3 )
  634.     println();
  635.   else if ( ( termoffset > 0 ) || ( fileoffset > 0 ) )
  636.     printchar ( 32 );
  637.   printchar ( 40 );
  638.   incr ( openparens );
  639. #if 0  /* TeX 3.141 */
  640.   print ( curinput.namefield );
  641. #else
  642.   slowprint ( curinput.namefield );
  643. #endif
  644.   flush ( stdout );
  645.   curinput.statefield = 33;
  646.  
  647.   line = 1;
  648.   if ( inputln ( inputfile[ curinput.indexfield ], false ) )
  649.     ;
  650.  
  651.   curinput.limitfield = last;    /* (br) added */
  652.   if ( pausing > 0 )        /* (br) added */
  653.     firmuptheline () ;
  654.  
  655.   if ( endlinecharinactive () ) 
  656.     decr ( curinput.limitfield );
  657.   else
  658.     buffer [ curinput.limitfield ] = endlinechar;
  659.   first = curinput.limitfield + 1;
  660.   curinput.locfield = curinput.startfield;
  661. }
  662.  
  663.  
  664. /* aus tex7.c: */
  665.  
  666. static char err_illegal_mag[] =
  667.     "Illegal magnification has been changed to 1000"; /* 548 */
  668.  
  669. void preparemag ( void )
  670. { preparemag_regmem 
  671.  
  672.   static long magset = 0L;
  673.  
  674.   if ( ( magset > 0 ) && ( mag != magset ) ) {
  675.     print_err("Incompatible magnification (");
  676.     printint ( mag );
  677.     c_print(");");
  678.     c_printnl(" the previous value will be retained");
  679.     zhelp1( STR_H_ICAN_MAGRATIO );
  680.     interror( magset );
  681.     geqworddefine ( intbase + magcode , magset );
  682.   } 
  683.   if ( ( mag <= 0 ) || ( mag > 32768L ) ) {
  684.     print_err(err_illegal_mag);
  685.     zhelp1( STR_H_THEMAGRATIO );
  686.     interror ( mag ) ; 
  687.     geqworddefine ( intbase + magcode , 1000 ) ; 
  688.   } 
  689.   magset = mag;
  690. }
  691.  
  692.  
  693. void newfont ( smallnumber a )
  694. { newfont_regmem
  695.   register scaled s;
  696.   register internalfontnumber f;
  697.   register halfword u;
  698.   strnumber t;
  699.   strnumber flushablestring;
  700.  
  701.   if ( jobname == 0 )
  702.     openlogfile();
  703.  
  704.   getrtoken();
  705.   u = curcs;
  706.   if ( u >= hashbase )
  707.     t = ztext ( u );
  708.   else if ( u >= singlebase )
  709.     if ( u == nullcs )
  710.       t = STR_FONT_;
  711.     else
  712.       t = u - singlebase;
  713.   else {
  714.     register integer oldsetting;
  715.  
  716.     oldsetting = selector;
  717.     selector = newstring;
  718.     print( STR_FONT_ );
  719.     print( u - activebase );
  720.     selector = oldsetting;
  721.     strroom ( 1 );
  722.     t = makestring();
  723.   }
  724.  
  725.   if ( ( a >= 4 ) )
  726.     geqdefine( u, set_font, nullfont );
  727.   else
  728.     eqdefine( u, set_font, nullfont );
  729.  
  730.   scanoptionalequals ();
  731.   scanfilename ();
  732.   nameinprogress = true;
  733.  
  734.   if ( scankeyword ( STR_AT ) ) {
  735.     s = scandimen ( false , false , false );
  736.     if ( s <= 0 || s >= 134217728L ) {
  737.       print_err("Improper `at' size (");
  738.       printscaled ( s ) ; 
  739.       c_print("pt), replaced by 10pt");
  740.       zhelp1( STR_H_ICANONLYHANDLE );
  741.       error();
  742.       s = 10 * unity;
  743.     } 
  744.   } else if ( scankeyword ( STR_SCALED ) ) {
  745.     s = scanint ();    /* s = - (integer) curval; */
  746.     if ( s <= 0 || s > 32768L ) {
  747.       print_err(err_illegal_mag);
  748.       zhelp1( STR_H_THEMAGRATIO );
  749.       interror ( s );
  750.       s = -1000;
  751.     } else
  752.       s = -s;
  753.   } else
  754.     s = -1000;
  755.  
  756.   nameinprogress = false;
  757.   flushablestring = strptr - 1;  /* TeX 3.141 */
  758.   {register integer for_end; f = 1 ; for_end = fontptr ; if ( f <= for_end) 
  759.   do 
  760. #if 0        /* (br) changed */
  761.     if ( streqstr(fontname(f), curname) && streqstr(fontarea(f), curarea) )
  762. #else
  763.     if( str_eq_str(curname, fontname(f)) && str_eq_str(curarea, fontarea(f)) )
  764. #endif
  765.     {
  766.       if ( curname == flushablestring    /* TeX 3.141 */
  767.         && curname != fontname(f) ) {   /* notwendig mit lookup_fncache()!! */
  768. #ifdef FILENAMECACHE
  769.     update_fncache(curname, fontname(f));
  770. #endif
  771.     flushstring;
  772.     curname = fontname(f);
  773.       }
  774.       if ( s > 0 ) {
  775.     if ( s == fontsize(f) ) 
  776.     goto lab50 ; 
  777.       } else if ( fontsize(f) == xnoverd( fontdsize(f), - (integer) s, 1000 ) )
  778.     goto lab50;
  779.     }
  780.   while ( f++ < for_end ) ; } 
  781.  
  782.   f = readfontinfo ( u , curname , curarea , s ) ;
  783.  
  784. lab50:
  785.   equiv ( u ) = f ; 
  786.   eqtb [ fontidbase + f ] = eqtb [ u ] ; 
  787.   fontidtext ( f ) = t ; 
  788. }
  789.  
  790.  
  791. /* -- end -- */
  792.