home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / source / TeX / tex / itex.c < prev    next >
C/C++ Source or Header  |  1993-10-12  |  36KB  |  1,456 lines

  1. #define EXTERN extern
  2. #include "texd.h"
  3.  
  4.  
  5. void initialize ( void )
  6. { initialize_regmem 
  7.   register integer i ;
  8.   register integer k ;
  9.   register hyphpointer z ;
  10.  
  11. #ifndef TEXCONFIG        /* see init.c */
  12.  
  13. #if !defined(atarist) && !defined(AMIGA)
  14.   xchr [ 32 ] = ' ' ; 
  15.   xchr [ 33 ] = '!' ; 
  16.   xchr [ 34 ] = '"' ; 
  17.   xchr [ 35 ] = '#' ; 
  18.   xchr [ 36 ] = '$' ; 
  19.   xchr [ 37 ] = '%' ; 
  20.   xchr [ 38 ] = '&' ; 
  21.   xchr [ 39 ] = '\'' ; 
  22.   xchr [ 40 ] = '(' ; 
  23.   xchr [ 41 ] = ')' ; 
  24.   xchr [ 42 ] = '*' ; 
  25.   xchr [ 43 ] = '+' ; 
  26.   xchr [ 44 ] = ',' ; 
  27.   xchr [ 45 ] = '-' ; 
  28.   xchr [ 46 ] = '.' ; 
  29.   xchr [ 47 ] = '/' ; 
  30.   xchr [ 48 ] = '0' ; 
  31.   xchr [ 49 ] = '1' ; 
  32.   xchr [ 50 ] = '2' ; 
  33.   xchr [ 51 ] = '3' ; 
  34.   xchr [ 52 ] = '4' ; 
  35.   xchr [ 53 ] = '5' ; 
  36.   xchr [ 54 ] = '6' ; 
  37.   xchr [ 55 ] = '7' ; 
  38.   xchr [ 56 ] = '8' ; 
  39.   xchr [ 57 ] = '9' ; 
  40.   xchr [ 58 ] = ':' ; 
  41.   xchr [ 59 ] = ';' ; 
  42.   xchr [ 60 ] = '<' ; 
  43.   xchr [ 61 ] = '=' ; 
  44.   xchr [ 62 ] = '>' ; 
  45.   xchr [ 63 ] = '?' ; 
  46.   xchr [ 64 ] = '@' ; 
  47.   xchr [ 65 ] = 'A' ; 
  48.   xchr [ 66 ] = 'B' ; 
  49.   xchr [ 67 ] = 'C' ; 
  50.   xchr [ 68 ] = 'D' ; 
  51.   xchr [ 69 ] = 'E' ; 
  52.   xchr [ 70 ] = 'F' ; 
  53.   xchr [ 71 ] = 'G' ; 
  54.   xchr [ 72 ] = 'H' ; 
  55.   xchr [ 73 ] = 'I' ; 
  56.   xchr [ 74 ] = 'J' ; 
  57.   xchr [ 75 ] = 'K' ; 
  58.   xchr [ 76 ] = 'L' ; 
  59.   xchr [ 77 ] = 'M' ; 
  60.   xchr [ 78 ] = 'N' ; 
  61.   xchr [ 79 ] = 'O' ; 
  62.   xchr [ 80 ] = 'P' ; 
  63.   xchr [ 81 ] = 'Q' ; 
  64.   xchr [ 82 ] = 'R' ; 
  65.   xchr [ 83 ] = 'S' ; 
  66.   xchr [ 84 ] = 'T' ; 
  67.   xchr [ 85 ] = 'U' ; 
  68.   xchr [ 86 ] = 'V' ; 
  69.   xchr [ 87 ] = 'W' ; 
  70.   xchr [ 88 ] = 'X' ; 
  71.   xchr [ 89 ] = 'Y' ; 
  72.   xchr [ 90 ] = 'Z' ; 
  73.   xchr [ 91 ] = '[' ; 
  74.   xchr [ 92 ] = '\\' ; 
  75.   xchr [ 93 ] = ']' ; 
  76.   xchr [ 94 ] = '^' ; 
  77.   xchr [ 95 ] = '_' ; 
  78.   xchr [ 96 ] = '`' ; 
  79.   xchr [ 97 ] = 'a' ; 
  80.   xchr [ 98 ] = 'b' ; 
  81.   xchr [ 99 ] = 'c' ; 
  82.   xchr [ 100 ] = 'd' ; 
  83.   xchr [ 101 ] = 'e' ; 
  84.   xchr [ 102 ] = 'f' ; 
  85.   xchr [ 103 ] = 'g' ; 
  86.   xchr [ 104 ] = 'h' ; 
  87.   xchr [ 105 ] = 'i' ; 
  88.   xchr [ 106 ] = 'j' ; 
  89.   xchr [ 107 ] = 'k' ; 
  90.   xchr [ 108 ] = 'l' ; 
  91.   xchr [ 109 ] = 'm' ; 
  92.   xchr [ 110 ] = 'n' ; 
  93.   xchr [ 111 ] = 'o' ; 
  94.   xchr [ 112 ] = 'p' ; 
  95.   xchr [ 113 ] = 'q' ; 
  96.   xchr [ 114 ] = 'r' ; 
  97.   xchr [ 115 ] = 's' ; 
  98.   xchr [ 116 ] = 't' ; 
  99.   xchr [ 117 ] = 'u' ; 
  100.   xchr [ 118 ] = 'v' ; 
  101.   xchr [ 119 ] = 'w' ; 
  102.   xchr [ 120 ] = 'x' ; 
  103.   xchr [ 121 ] = 'y' ; 
  104.   xchr [ 122 ] = 'z' ; 
  105.   xchr [ 123 ] = '{' ; 
  106.   xchr [ 124 ] = '|' ; 
  107.   xchr [ 125 ] = '}' ; 
  108.   xchr [ 126 ] = '~' ; 
  109.   {register integer for_end; i = 0 ; for_end = 31 ; if ( i <= for_end) do 
  110.     xchr [ i ] = chr ( i ) ; 
  111.   while ( i++ < for_end ) ; } 
  112.   {register integer for_end; i = 127 ; for_end = 255 ; if ( i <= for_end) do 
  113.     xchr [ i ] = chr ( i ) ; 
  114.   while ( i++ < for_end ) ; } 
  115.   {register integer for_end; i = 0 ; for_end = 255 ; if ( i <= for_end) do 
  116.     xord [ chr ( i ) ] = 127 ; 
  117.   while ( i++ < for_end ) ; } 
  118.   {register integer for_end; i = 128 ; for_end = 255 ; if ( i <= for_end) do 
  119.     xord [ xchr [ i ] ] = i ; 
  120.   while ( i++ < for_end ) ; } 
  121.   {register integer for_end; i = 0 ; for_end = 126 ; if ( i <= for_end) do 
  122.     xord [ xchr [ i ] ] = i ; 
  123.   while ( i++ < for_end ) ; } 
  124. #else
  125.   /* ST and AMIGA use an ASCII encoding, so ... (save space) */
  126.   /* There should be a CodePage support here, which uses xchr[] & xord[] */
  127.   for( i = 0; i < 255; i++ ) {
  128.     xchr[i] = chr(i);
  129.     /* ... and the rest is just this: (only for this xchr[] !!) */
  130.     xord[i] = i;    /* xord[xchr[i]] = i;  xord[127] = 127; */
  131.   }
  132. #endif
  133.  
  134. #endif    /* TEXCONFIG */
  135.  
  136.   interaction = errorstopmode ;
  137.   deletionsallowed = true ;
  138.   setboxallowed = true ;
  139.   errorcount = 0 ;
  140. #if 0
  141.   helpptr = 0 ; 
  142. #else
  143.   help0 ;
  144. #endif
  145.   useerrhelp = false ; 
  146.   interrupt = 0 ; 
  147.   OKtointerrupt = true ; 
  148.  
  149. #ifdef DEBUG
  150.   wasmemend = memmin ; 
  151.   waslomax = memmin ; 
  152.   washimin = memmax ; 
  153.   panicking = false ; 
  154. #endif /* DEBUG */
  155.   nestptr = 0 ; 
  156.   maxneststack = 0 ; 
  157.   curlist .modefield = vmode ;
  158.   curlist .headfield = contribhead ; 
  159.   curlist .tailfield = contribhead ; 
  160.   curlist .auxfield .cint = ignoredepth ; 
  161.   curlist .mlfield = 0 ; 
  162. #if 0  /* 3.1415 */
  163.   curlist .lhmfield = 0 ; 
  164.   curlist .rhmfield = 0 ; 
  165. #endif
  166. #ifdef TEXXET
  167.   LR_save = 0 ;
  168. #endif
  169.   curlist .pgfield = 0 ; 
  170.   shownmode = 0 ; 
  171.   pagecontents = 0 ; 
  172.   pagetail = pagehead ; 
  173.   link ( pagehead ) = 0 ; 
  174.   lastglue = maxhalfword ; 
  175.   lastpenalty = 0 ; 
  176.   lastkern = 0 ; 
  177.   pagesofar [ 7 ] = 0 ; 
  178.   pagemaxdepth = 0 ;
  179.   for( k = intbase ; k <= eqtbsize ; k++ ) {
  180.     xeqlevel [ k ] = levelone ; 
  181.   }
  182.   nonewcontrolsequence = true ; 
  183.   next ( hashbase ) = 0 ; 
  184.   ztext ( hashbase ) = 0 ; 
  185.   for( k = hashbase + 1 ; k <= undefinedcontrolsequence - 1 ; k++ ) {
  186.     hash [ k ] = hash [ hashbase ] ; 
  187.   }
  188.   saveptr = 0 ; 
  189.   curlevel = levelone ; 
  190.   curgroup = bottomlevel ; 
  191.   curboundary = 0 ; 
  192.   maxsavestack = 0 ; 
  193.   /* magset = 0 ; */ /* local nach preparemag() */
  194.   topmark = 0 ; 
  195.   firstmark = 0 ; 
  196.   botmark = 0 ; 
  197.   splitfirstmark = 0 ; 
  198.   splitbotmark = 0 ; 
  199.   curval = 0 ; 
  200.   curvallevel = intval ; 
  201.   radix = 0 ; 
  202.   curorder = 0 ; 
  203.   for( k = 16 ; k >= 0 ; --k )
  204.     readopen [ k ] = closed;
  205.   condptr = 0 ; 
  206.   iflimit = normal ; 
  207.   curif = 0 ; 
  208.   ifline = 0 ; 
  209.   for( k = fontmax ; k >= 0 ; --k )
  210.     fontused(k) = false;
  211.   nullcharacter .b0 = 0 ; 
  212.   nullcharacter .b1 = 0 ; 
  213.   nullcharacter .b2 = 0 ; 
  214.   nullcharacter .b3 = 0 ; 
  215.   totalpages = 0 ; 
  216.   maxv = 0 ; 
  217.   maxh = 0 ; 
  218.   maxpush = 0 ; 
  219.   lastbop = -1 ; 
  220.   doingleaders = false ; 
  221.   deadcycles = 0 ; 
  222. /* curs = -1 ; */
  223.   halfbuf = dvibufsize / 2 ; 
  224.   dvilimit = dvibufsize ; 
  225.   dviptr = 0 ; 
  226.   dvioffset = 0 ; 
  227.   dvigone = 0 ; 
  228. /* downptr = 0 ; */
  229. /* rightptr = 0 ; */
  230.   adjusttail = 0 ; 
  231.   lastbadness = 0 ; 
  232.   packbeginline = 0 ; 
  233.   emptyfield .v.RH = 0 ; 
  234.   emptyfield .v.LH = 0 ; 
  235.   nulldelimiter .b0 = 0 ; 
  236.   nulldelimiter .b1 = 0 ; 
  237.   nulldelimiter .b2 = 0 ; 
  238.   nulldelimiter .b3 = 0 ; 
  239.   alignptr = 0 ; 
  240.   curalign = 0 ; 
  241.   curspan = 0 ; 
  242.   curloop = 0 ; 
  243.   curhead = 0 ; 
  244.   curtail = 0 ; 
  245.   {register integer for_end; z = 0 ; for_end = hyphsize ; if ( z <= for_end) 
  246.   do 
  247.     {
  248.       hyphword(z) = 0 ; 
  249.       hyphlist(z) = 0 ; 
  250.     } 
  251.   while ( z++ < for_end ) ; } 
  252.   hyphcount = 0 ; 
  253.   outputactive = false ; 
  254.   insertpenalties = 0 ; 
  255.   ligaturepresent = false ; 
  256.   /* cancelboundary = false ; */ /* (br) local in main_control() */
  257.   lfthit = false ; 
  258.   rthit = false ;
  259.   /* insdisc = false ; */ /* (br) local in main_control() */
  260.   aftertoken = 0 ; 
  261.   longhelpseen = false ; 
  262.   formatident = 0 ; 
  263.   for( k = 17 ; k >= 0 ; --k )
  264.     writeopen [ k ] = false;
  265.   editnamestart = 0 ; 
  266. #ifdef INITEX
  267.   {register integer for_end; k = membot + 1 ; for_end = lomemstatmax ; if ( k 
  268.   <= for_end) do 
  269.     mem [ k ] .cint = 0 ; 
  270.   while ( k++ < for_end ) ; } 
  271.   k = membot ; 
  272.   while ( k <= lomemstatmax ) {
  273.     gluerefcount ( k ) = 1 ; 
  274.     stretchorder ( k ) = normal ; 
  275.     shrinkorder ( k ) = normal ; 
  276.     k = k + gluespecsize ; 
  277.   } 
  278.   stretch ( filglue ) = unity ; 
  279.   stretchorder ( filglue ) = fil ; 
  280.   stretch ( fillglue ) = unity ; 
  281.   stretchorder ( fillglue ) = fill ; 
  282.   stretch ( ssglue ) = unity ; 
  283.   stretchorder ( ssglue ) = fil ; 
  284.   shrink ( ssglue ) = unity ; 
  285.   shrinkorder ( ssglue ) = fil ; 
  286.   stretch ( filnegglue ) = - (integer) unity ; 
  287.   stretchorder ( filnegglue ) = fil ; 
  288.   rover = lomemstatmax + 1 ; 
  289.   link ( rover ) = emptyflag ; 
  290.   nodesize ( rover ) = 1000 ; 
  291.   llink ( rover ) = rover ; 
  292.   rlink ( rover ) = rover ; 
  293.   lomemmax = rover + 1000 ; 
  294.   link ( lomemmax ) = 0 ; 
  295.   info ( lomemmax ) = 0 ; 
  296.   {register integer for_end; k = himemstatmin ; for_end = memtop ; if ( k <= 
  297.   for_end) do 
  298.     mem [ k ] = mem [ lomemmax ] ; 
  299.   while ( k++ < for_end ) ; } 
  300.   info ( omittemplate ) = endtemplatetoken ; 
  301.   link ( endspan ) = maxquarterword + 1 ; 
  302.   info ( endspan ) = 0 ; 
  303.   ztype ( lastactive ) = hyphenated ; 
  304.   zlinenumber ( lastactive ) = maxhalfword ; 
  305.   subtype ( lastactive ) = 0 ; 
  306.   subtype ( pageinshead ) = 255 ; 
  307.   ztype ( pageinshead ) = splitup ; 
  308.   link ( pageinshead ) = pageinshead ; 
  309.   ztype ( pagehead ) = gluenode ; 
  310.   subtype ( pagehead ) = normal ; 
  311.   avail = 0 ; 
  312.   memend = memtop ; 
  313.   himemmin = himemstatmin ; 
  314.   varused = lomemstatmax + 1 - membot ; 
  315.   dynused = himemstatusage ; 
  316.   eqtype ( undefinedcontrolsequence ) = undefinedcs ; 
  317.   equiv ( undefinedcontrolsequence ) = 0 ; 
  318.   eqlevel ( undefinedcontrolsequence ) = levelzero ; 
  319.   for( k = activebase ; k <= undefinedcontrolsequence - 1 ; k++ ) {
  320.     eqtb [ k ] = eqtb [ undefinedcontrolsequence ] ; 
  321.   }
  322.   equiv ( gluebase ) = zeroglue ; 
  323.   eqlevel ( gluebase ) = levelone ; 
  324.   eqtype ( gluebase ) = glueref ; 
  325.   for( k = gluebase + 1 ; k <= localbase - 1 ; k++ ) {
  326.     eqtb [ k ] = eqtb [ gluebase ] ; 
  327.   }
  328.   gluerefcount ( zeroglue ) = gluerefcount ( zeroglue ) + localbase - gluebase;
  329.   parshapeptr = 0 ; 
  330.   eqtype ( parshapeloc ) = shaperef ; 
  331.   eqlevel ( parshapeloc ) = levelone ; 
  332.   for( k = outputroutineloc ; k <= toksbase + 255 ; k++ ) {
  333.     eqtb [ k ] = eqtb [ undefinedcontrolsequence ] ; 
  334.   }
  335.   box ( 0 ) = 0 ; 
  336.   eqtype ( boxbase ) = boxref ; 
  337.   eqlevel ( boxbase ) = levelone ; 
  338.   for( k = boxbase + 1 ; k <= boxbase + 255 ; k++ ) {
  339.     eqtb [ k ] = eqtb [ boxbase ] ; 
  340.   }
  341.   curfont = nullfont ; 
  342.   eqtype ( curfontloc ) = data ; 
  343.   eqlevel ( curfontloc ) = levelone ; 
  344.   {register integer for_end; k = mathfontbase ; for_end = mathfontbase + 47 
  345.   ; if ( k <= for_end) do 
  346.     eqtb [ k ] = eqtb [ curfontloc ] ; 
  347.   while ( k++ < for_end ) ; } 
  348.   equiv ( catcodebase ) = 0 ; 
  349.   eqtype ( catcodebase ) = data ; 
  350.   eqlevel ( catcodebase ) = levelone ; 
  351.   {register integer for_end; k = catcodebase + 1 ; for_end = intbase - 1 
  352.   ; if ( k <= for_end) do 
  353.     eqtb [ k ] = eqtb [ catcodebase ] ; 
  354.   while ( k++ < for_end ) ; } 
  355.   for( k = 255 ; k >= 0 ; --k ) {
  356.       catcode ( k ) = 12 ; 
  357.       mathcode ( k ) = k ; 
  358.       sfcode ( k ) = 1000 ; 
  359.   }
  360.   catcode ( 13 ) = 5 ; 
  361.   catcode ( 32 ) = 10 ; 
  362.   catcode ( 92 ) = 0 ; 
  363.   catcode ( 37 ) = 14 ; 
  364.   catcode ( 127 ) = 15 ; 
  365.   catcode ( 0 ) = 9 ; 
  366.   {register integer for_end; k = 48 ; for_end = 57 ; if ( k <= for_end) do 
  367.     mathcode ( k ) = k + varcode ; 
  368.   while ( k++ < for_end ) ; } 
  369.   {register integer for_end; k = 65 ; for_end = 90 ; if ( k <= for_end) do 
  370.     {
  371.       catcode ( k ) = 11 ; 
  372.       catcode ( k + 32 ) = 11 ; 
  373.       mathcode ( k ) = k + varcode + 256 ; 
  374.       mathcode ( k + 32 ) = k + 32 + varcode + 256 ; 
  375.       lccode ( k ) = k + 32 ; 
  376.       lccode ( k + 32 ) = k + 32 ; 
  377.       uccode ( k ) = k ; 
  378.       uccode ( k + 32 ) = k ; 
  379.       sfcode ( k ) = 999 ; 
  380.     } 
  381.   while ( k++ < for_end ) ; } 
  382.   {register integer for_end; k = intbase ; for_end = delcodebase - 1 ; if ( k 
  383.   <= for_end) do 
  384.     eqtb [ k ] .cint = 0 ; 
  385.   while ( k++ < for_end ) ; } 
  386.   mag = 1000 ; 
  387.   tolerance = 10000 ; 
  388.   hangafter = 1 ; 
  389.   maxdeadcycles = 25 ;
  390. #ifdef MLTEX
  391.   char_sub_def_max = 0;
  392.   tracing_char_sub_def = 0;
  393. #endif
  394.   escapechar = 92 ; 
  395.   endlinechar = 13 ; 
  396. #ifdef ERW_INTERACTION
  397.   interaction = errorstopmode;
  398. #endif
  399.   for( k = 255 ; k >= 0 ; --k ) {
  400.     delcode ( k ) = -1 ;
  401.   }
  402.  
  403.   delcode ( 46 ) = 0 ; 
  404.   {register integer for_end; k = dimenbase ; for_end = eqtbsize ; if ( k <= 
  405.   for_end) do 
  406.     eqtb [ k ] .cint = 0 ; 
  407.   while ( k++ < for_end ) ; } 
  408.   hashused = frozencontrolsequence ; 
  409.   cscount = 0 ; 
  410.   eqtype ( frozendontexpand ) = dontexpand ; 
  411.   ztext ( frozendontexpand ) = 498 ; 
  412.   fontptr = nullfont ; 
  413.   fmemptr = 7 ; 
  414.   fontname(nullfont) = STR_NULLFONT;
  415.   fontarea(nullfont) = 335 ; 
  416.   hyphenchar(nullfont) = 45 ; 
  417.   skewchar(nullfont) = -1 ; 
  418.   bcharlabel(nullfont) = nonaddress ; 
  419.   fontbchar(nullfont) = nonchar ; 
  420.   fontfalsebchar(nullfont) = nonchar;
  421.   fontbc(nullfont) = 1 ; 
  422.   fontec(nullfont) = 0 ; 
  423.   fontsize(nullfont) = 0 ; 
  424.   fontdsize(nullfont) = 0 ;
  425. #ifdef FONTPTR
  426.   charbase(nullfont) = &fontinfo[0] ; 
  427.   widthbase(nullfont) = &fontinfo[0] ; 
  428.   heightbase(nullfont) = &fontinfo[0] ; 
  429.   depthbase(nullfont) = &fontinfo[0] ; 
  430.   italicbase(nullfont) = &fontinfo[0] ; 
  431.   ligkernbase(nullfont) = &fontinfo[0] ; 
  432.   kernbase(nullfont) = &fontinfo[0] ; 
  433. #else
  434.   charbase(nullfont) = 0 ; 
  435.   widthbase(nullfont) = 0 ; 
  436.   heightbase(nullfont) = 0 ; 
  437.   depthbase(nullfont) = 0 ; 
  438.   italicbase(nullfont) = 0 ; 
  439.   ligkernbase(nullfont) = 0 ; 
  440.   kernbase(nullfont) = 0 ; 
  441. #endif
  442.   extenbase(nullfont) = 0 ; 
  443.   fontglue(nullfont) = 0 ; 
  444.   fontparams(nullfont) = 7 ; 
  445.   parambase(nullfont) = -1 ; 
  446.   for( k = 6 ; k >= 0 ; --k ) {
  447.     fontinfo [ k ].cint = 0 ;
  448.   }
  449.  
  450.   {register integer for_end; k = - (integer) trieopsize ; for_end = 
  451.   trieopsize ; if ( k <= for_end) do 
  452.     trieophash [ k ] = 0 ; 
  453.   while ( k++ < for_end ) ; } 
  454.   for( k = 255 ; k >= 0 ; --k ) {
  455.     trieused [ k ] = mintrieop ;
  456.   }
  457.   maxopused = mintrieop ; 
  458.   trieopptr = 0;
  459.   trienotready = true;
  460.   triel[0] = 0;
  461.   triec[0] = 0;
  462.   trieptr = 0;
  463.  
  464.   ztext ( frozenprotection ) = STR_INACCESSIBLE;
  465.   formatident = STR_INITEX ;
  466.   ztext ( endwrite ) = STR_ENDWRITE; 
  467.   eqlevel ( endwrite ) = levelone ; 
  468.   eqtype ( endwrite ) = outercall ; 
  469.   equiv ( endwrite ) = 0 ; 
  470. #endif /* INITEX */
  471. }
  472.  
  473.  
  474. #ifdef INITEX
  475. #if defined(MLTEX) || defined(TEXXET) || defined(ERW_INTERACTION)
  476. static void insert_c_string(char *s, strnumber n)
  477. {
  478.   if( poolptr + strlen(s) + stringvacancies > poolsize ) {
  479.     wakeupterminal ();
  480.     (void) printf("! You have to increase POOLSIZE.\n");
  481.     exit(1);
  482.   }
  483.  
  484.   while( *s != '\0' ) {
  485.     appendchar( *s++ );   /* oder xord[*s], falls Umlaute, ... erlaubt */
  486.   }
  487.  
  488.   if( n != makestring() ) {
  489.     wakeupterminal ();
  490.     (void) printf("! tex.pool doesn't match; wrong tex.pool file.\n");
  491.     (void) printf("! number of strings in pool file is wrong.\n");
  492.     exit(1);
  493.   }
  494. }
  495. #endif
  496.  
  497.  
  498. boolean getstringsstarted ( void )
  499. { getstringsstarted_regmem
  500.   register signed short k, l;
  501.   register short m, n;        /* ASCIIcode */
  502.   register strnumber g;
  503.   register integer a;
  504.   alphafile poolfile;
  505.  
  506.   poolptr = 0;
  507.   strptr = 0;
  508.   strstart[0] = 0;
  509.  
  510.   /* 48. Make the first 256 strings */
  511.   for( k = 0 ; k <= 255 ; k++ ) {
  512. #ifdef ERW_CODEPAGE
  513.     appendchar ( k );
  514.     g = makestring ();
  515. #else
  516. #ifdef NONASCII
  517.     if ( printable[k] )
  518. #else
  519.     if ( k < 32 || k > 126 )
  520. #endif
  521.     {
  522.     appendchar ( 94 );  appendchar ( 94 );
  523.     if ( k < 64 )
  524.       appendchar ( k + 64 );
  525.     else if ( k < 128 )
  526.       appendchar ( k - 64 );
  527.     else {
  528.       l = k / 16;  appendchar ( l + ( (l < 10) ? 48 : 87 ) );
  529.       l = k % 16;  appendchar ( l + ( (l < 10) ? 48 : 87 ) );
  530.     }
  531.     } else
  532.     appendchar ( k );
  533.     g = makestring ();
  534. #endif
  535.   }
  536.  
  537.  
  538.   /* 51. Read the other strings from TEX.POOL file ... */
  539.   vstrcpy ( nameoffile + 1 , poolname );
  540.   nameoffile [ 0 ] = ' ';
  541.   nameoffile [ strlen ( poolname ) + 1 ] = ' ';
  542.   namelength = strlen(poolname);  /* added br */
  543.   if ( aopenin(poolfile, TEXPOOLPATH) == false ) {
  544.     wakeupterminal ();
  545.     (void) printf("! I can't read tex.pool.\n");
  546.     return(false);
  547.   }
  548.  
  549.   while(true) {
  550.     /* 52. Read one string, but return |false| ... */
  551.     if( (m = getc(poolfile)) == EOF  ||  (n = getc(poolfile)) == EOF ) {
  552.       wakeupterminal ();
  553.       (void) printf("! tex.pool has no check sum.\n");
  554.       aclose ( poolfile );
  555.       return(false);
  556.     }
  557.  
  558.     if ( m == '*' ) {    /* 53. Check the pool check sum */
  559.       a = 0;  k = 9;
  560.       do {
  561.     if ( xord[n] < 48 || xord[n] > 57 ) {
  562.       wakeupterminal ();
  563.       (void) printf("! tex.pool check sum doesn't have nine digits.\n"); 
  564.       aclose ( poolfile );
  565.       return(false);
  566.     }
  567.     a = 10 * a + xord[n] - 48;
  568.       } while( --k > 0  &&  (n = getc(poolfile)) != EOF );
  569.  
  570.       if ( a != 127541212L ) {
  571.     wakeupterminal ();
  572.     (void) printf("! tex.pool doesn't match; wrong tex.pool file.\n");
  573.     aclose ( poolfile );
  574.     return(false);
  575.       }
  576.       break;    /*  leave loop ---v  */
  577.  
  578.     } else {
  579.       if ( xord[m] < 48 || xord[m] > 57 || xord[n] < 48 || xord[n] > 57 ) {
  580.     wakeupterminal ();
  581.     (void) printf("! tex.pool line doesn't begin with two digits.\n");
  582.     aclose ( poolfile );
  583.     return(false);
  584.       }
  585.       l = xord[m] * 10 + xord[n] - 48 * 11;    /* ... - "0" * 10 - "0" */
  586.       if ( poolptr + l + stringvacancies > poolsize ) {
  587.     wakeupterminal ();
  588.     (void) printf("! You have to increase POOLSIZE.\n");
  589.     aclose ( poolfile );
  590.     return(false);
  591.       }
  592.       while( --l >= 0 ) {
  593.     if( (m = getc(poolfile)) == EOF  ||  m == '\n' )    /* eoln() */
  594.       m = ' ';
  595.     appendchar ( xord[m] );
  596.       }
  597.       while( (m = getc(poolfile)) != EOF  &&  m != '\n' )
  598.     ;            /* == readln ( poolfile ); */
  599.       g = makestring();
  600.     }
  601.   }
  602.  
  603.   aclose ( poolfile );
  604.  
  605. #ifdef MLTEX
  606.   /* Insert the new strings at the end by hand,
  607.    * so we can use the old tex.pool file
  608.    */
  609.   insert_c_string("charsubdefmax", STR_CHARSUBDEFMAX);
  610.   insert_c_string("tracingcharsubdef", STR_TRACING_CHARSUBDEF);
  611.   insert_c_string("charsubdef", STR_CHARSUBDEF);
  612. #endif
  613.  
  614. #ifdef ERW_INTERACTION
  615.   insert_c_string("interactionmode", STR_INTERACTION_MODE);
  616. #endif
  617.  
  618. #ifdef TEXXET
  619.   insert_c_string("beginL", STR_BEGINL);
  620.   insert_c_string("beginR", STR_BEGINR);
  621.   insert_c_string("endL", STR_ENDL);
  622.   insert_c_string("endR", STR_ENDR);
  623. #endif
  624.  
  625.   return(true);
  626. }
  627. #endif /* INITEX */
  628.  
  629. #ifdef INITEX
  630. void sortavail ( void )
  631. { sortavail_regmem 
  632.   register halfword p, q, r ;
  633.   halfword oldrover;
  634.  
  635.   /* p = */ (void) getnode ( 1073741824L );
  636.   p = rlink ( rover );
  637.   rlink ( rover ) = maxhalfword;
  638.   oldrover = rover;
  639.   while ( p != oldrover )
  640.     if ( p < rover ) {
  641.       q = p ; 
  642.       p = rlink ( q ) ; 
  643.       rlink ( q ) = rover ; 
  644.       rover = q ; 
  645.     } else {
  646.       q = rover ; 
  647.       while ( rlink ( q ) < p )
  648.     q = rlink ( q ) ; 
  649.       r = rlink ( p ) ; 
  650.       rlink ( p ) = rlink ( q ) ; 
  651.       rlink ( q ) = p ; 
  652.       p = r ; 
  653.     }
  654.   p = rover ; 
  655.   while ( rlink ( p ) != maxhalfword ) {
  656.     llink ( rlink ( p ) ) = p ; 
  657.     p = rlink ( p ) ; 
  658.   } 
  659.   rlink ( p ) = rover ; 
  660.   llink ( rover ) = p ; 
  661. #endif /* INITEX */
  662.  
  663. #if 0
  664.  
  665. #ifdef INITEX
  666. void zprimitive ( strnumber s, quarterword c, halfword o );
  667. #endif /* INITEX */
  668.  
  669. #endif
  670.  
  671. #ifdef INITEX
  672. trieopcode newtrieop ( smallnumber d, smallnumber n, trieopcode v )
  673. { newtrieop_regmem 
  674.   register integer h ;
  675.   trieopcode u ;
  676.   register integer l ;
  677.  
  678.   h = abs ( toint ( n ) + 313 * toint ( d ) + 361 * toint ( v ) + 1009 * toint 
  679.     ( curlang ) ) % ( trieopsize + trieopsize ) - trieopsize ; 
  680.   while ( true ) {
  681.     l = trieophash [ h ];
  682.     if ( l == 0 ) {
  683.       if ( trieopptr == trieopsize ) 
  684.         overflow(13, trieopsize);
  685.       u = trieused [ curlang ] ; 
  686.       if ( u == maxtrieop ) 
  687.         overflow(14, maxtrieop - mintrieop);
  688.       incr ( trieopptr ) ; 
  689.       incr ( u ) ; 
  690.       trieused [ curlang ] = u ; 
  691.       if ( u > maxopused ) 
  692.         maxopused = u ; 
  693.       hyfdistance(trieopptr) = d;
  694.       hyfnum(trieopptr) = n ; 
  695.       hyfnext(trieopptr) = v ; 
  696.       trieoplang [ trieopptr ] = curlang ; 
  697.       trieophash [ h ] = trieopptr ; 
  698.       trieopval [ trieopptr ] = u ; 
  699.       return(u) ; 
  700.     }
  701.     if ( ( hyfdistance(l) == d ) && ( hyfnum(l) == n )
  702.     && ( hyfnext(l) == v ) && ( trieoplang [ l ] == curlang ) ) {
  703.       return(trieopval [ l ]);
  704.     }
  705.     if ( h > - (integer) trieopsize ) 
  706.       decr ( h ) ; 
  707.     else h = trieopsize ; 
  708.   }
  709. }
  710.  
  711. triepointer trienode ( triepointer p )
  712. { trienode_regmem 
  713.   register triepointer h ;
  714.   register triepointer q ; 
  715.  
  716. #ifdef ORIGTRIE
  717.   h = abs ( toint ( triec [ p ] ) + 1009 * toint ( trieo [ p ] ) + 2718 * 
  718.     toint ( triel [ p ] ) + 3142 * toint ( trier [ p ] ) ) % triesize ; 
  719. #else
  720.   h = abs ( toint ( triec[p] ) + 1009 * toint ( ztrie[p].trieo ) +
  721.     2718 * toint ( triel[p] ) + 3142 * toint ( trier[p] ) ) % triesize;
  722. #endif
  723.   while ( true ) {
  724.     q = triehash [ h ] ; 
  725.     if ( q == 0 ) {
  726.       triehash [ h ] = p ; 
  727.       return(p) ; 
  728.     } 
  729.     if ( ( triec [ q ] == triec [ p ] ) && (
  730. #ifdef ORIGTRIE
  731.                         trieo [ q ] == trieo [ p ]
  732. #else
  733.                     ztrie[q].trieo == ztrie[p].trieo
  734. #endif
  735.                                     )
  736.     && ( triel [ q ] == triel [ p ] ) && ( trier [ q ] == trier [ p ] ) ) {
  737.       return(q) ; 
  738.     }
  739.     if ( h > 0 )
  740.       decr ( h ) ; 
  741.     else
  742.       h = triesize ; 
  743.   }
  744. }
  745.  
  746. triepointer compresstrie ( triepointer p )
  747. { compresstrie_regmem 
  748.  
  749.   if ( p == 0 ) 
  750.     return( (triepointer)0L );
  751.   else {
  752.     triel [ p ] = compresstrie ( triel [ p ] ) ; 
  753.     trier [ p ] = compresstrie ( trier [ p ] ) ; 
  754.     return( trienode ( p ) );
  755.   }
  756. }
  757.  
  758. void firstfit ( triepointer p )
  759. { firstfit_regmem
  760.   register triepointer q;
  761.   register triepointer h;
  762.  
  763.  {triepointer z;
  764.   ASCIIcode c;
  765.  
  766.   c = triec [ p ] ; 
  767.   z = triemin [ c ] ; 
  768.   while ( true ) {
  769.     h = z - c ; 
  770.     if ( triemax < h + 256 ) {
  771.       if ( triesize <= h + 256 ) 
  772.     overflow(15, triesize);
  773.       do {
  774.     incr ( triemax ) ;
  775. #ifdef ORIGTRIE
  776.     trietaken [ triemax ] = false ; 
  777. #else
  778.     ztrie[triemax].trietaken = false;
  779. #endif
  780.     trietrl [ triemax ] = triemax + 1 ; 
  781.     trietro [ triemax ] = triemax - 1 ; 
  782.       } while ( ! ( triemax == h + 256 ) ) ; 
  783.     }
  784. #ifdef ORIGTRIE
  785.     if ( trietaken [ h ] ) 
  786.     goto lab45 ; 
  787. #else
  788.     if ( ztrie[h].trietaken )
  789.     goto lab45 ; 
  790. #endif
  791.     q = trier [ p ] ; 
  792.     while ( q > 0 ) {
  793.       if ( trietrl [ h + triec [ q ] ] == 0 ) 
  794.       goto lab45 ; 
  795.       q = trier [ q ] ; 
  796.     } 
  797.     goto lab40 ; 
  798. lab45:
  799.     z = trietrl [ z ] ; 
  800.   }
  801.  
  802. lab40:
  803. #ifdef ORIGTRIE
  804.   trietaken [ h ] = true ; 
  805. #else
  806.   ztrie[h].trietaken = true;
  807. #endif
  808.   triehash [ p ] = h ; 
  809.  }
  810.  
  811.   q = p;
  812.   do {
  813.     register triepointer l, r;
  814.     triepointer z;
  815.  
  816.     z = h + triec [ q ] ; 
  817.     l = trietro [ z ] ; 
  818.     r = trietrl [ z ] ; 
  819.     trietro [ r ] = l ; 
  820.     trietrl [ l ] = r ; 
  821.     trietrl [ z ] = 0 ; 
  822.     if ( l < 256 ) {
  823.       register short ll;
  824.  
  825.       if ( z < 256 )
  826.         ll = z;
  827.       else
  828.     ll = 256;
  829.       do {
  830.     triemin [ l ] = r;
  831.     incr ( l );
  832.       } while( l != ll );
  833.     } 
  834.     q = trier [ q ];
  835.   } while ( q != 0 );
  836. }
  837.  
  838. void triepack ( triepointer p )
  839. { triepack_regmem 
  840.   register triepointer q;
  841.  
  842.   do {
  843.     q = triel [ p ] ; 
  844.     if ( ( q > 0 ) && ( triehash [ q ] == 0 ) ) {
  845.       firstfit ( q ) ; 
  846.       triepack ( q ) ; 
  847.     } 
  848.     p = trier [ p ] ; 
  849.   } while ( ! ( p == 0 ) ) ; 
  850. }
  851.  
  852. void triefix ( triepointer p )
  853. { triefix_regmem 
  854.   register triepointer q  ; 
  855.   register ASCIIcode c  ; 
  856.   register triepointer z  ; 
  857.  
  858.   z = triehash [ p ] ; 
  859.   do {
  860.     q = triel [ p ] ; 
  861.     c = triec [ p ] ; 
  862.     trietrl [ z + c ] = triehash [ q ] ; 
  863.     trietrc [ z + c ] = c ; 
  864. #ifdef ORIGTRIE
  865.     trietro [ z + c ] = trieo [ p ] ; 
  866. #else
  867.     trietro [ z + c ] = ztrie[p].trieo;
  868. #endif
  869.     if ( q > 0 )
  870.     triefix ( q ) ; 
  871.     p = trier [ p ] ; 
  872.   } while ( p != 0 );
  873.  
  874. void newpatterns ( void )
  875. { newpatterns_regmem
  876.   register short k, l;
  877.   boolean digitsensed;
  878.   trieopcode v;
  879.   register triepointer p, q;
  880.   boolean firstchild;
  881.   register ASCIIcode c;
  882.  
  883.   if ( ! trienotready ) {
  884.     print_err("Too late for ");
  885.     printesc( STR_PATTERNS );
  886.     zhelp1( STR_H_ALL_PATTERNS );
  887.     error();
  888.     link ( garbage ) = scantoks ( false , false ) ; 
  889.     flushlist ( defref ) ; 
  890.     return;
  891.   }
  892.  
  893.   if ( language <= 0 ) 
  894.     curlang = 0 ; 
  895.   else if ( language > 255 ) 
  896.     curlang = 0 ; 
  897.   else curlang = language ; 
  898.  
  899.   scanleftbrace () ; 
  900.  
  901.   k = 0 ; 
  902.   hyf [ 0 ] = 0 ; 
  903.   digitsensed = false ; 
  904.  
  905.   while ( true ) {
  906.     register /* eightbits */ long_halfword r_curcmd;
  907.  
  908.     r_curcmd = getxtoken () ; 
  909.     switch ( r_curcmd ) {
  910.     case letter : 
  911.     case otherchar :
  912.     { register halfword r_curchr = curchr;
  913.  
  914.     if ( digitsensed || ( r_curchr < 48 ) || ( r_curchr > 57 ) ) {
  915.       if ( r_curchr == 46 )
  916.         r_curchr = 0 ; 
  917.       else {
  918.         r_curchr = lccode ( r_curchr ) ; 
  919.         if ( r_curchr == 0 ) {
  920.           curchr = r_curchr;
  921.           print_err("Nonletter");
  922.           zhelp1( STR_H_SEE_APP_H );
  923.           error(); 
  924.           r_curchr = curchr; 
  925.         } 
  926.       } 
  927.       if ( k < 63 ) {
  928.         incr ( k ) ; 
  929.         hc [ k ] = r_curchr ; 
  930.         hyf [ k ] = 0 ; 
  931.         digitsensed = false ; 
  932.       } 
  933.     } else if ( k < 63 ) {
  934.       hyf [ k ] = r_curchr - 48 ; 
  935.       digitsensed = true ; 
  936.     }
  937.     }
  938.     break ; 
  939.     case spacer : 
  940.     case right_brace : 
  941.     {
  942.       if ( k > 0 ) {
  943.         if ( hc [ 1 ] == 0 ) 
  944.           hyf [ 0 ] = 0 ; 
  945.         if ( hc [ k ] == 0 ) 
  946.           hyf [ k ] = 0 ; 
  947.         l = k ; 
  948.         v = mintrieop ; 
  949.         while ( true ) {
  950.           if ( hyf [ l ] != 0 ) 
  951.         v = newtrieop ( k - l , hyf [ l ] , v ) ; 
  952.           if ( l > 0 ) 
  953.         decr ( l ) ; 
  954.           else goto lab31 ; 
  955.         }
  956. lab31: ; 
  957.         q = 0 ; 
  958.         hc [ 0 ] = curlang ; 
  959.         while ( l <= k ) {
  960.           c = hc [ l ] ; 
  961.           incr ( l ) ; 
  962.           p = triel [ q ] ; 
  963.           firstchild = true ; 
  964.           while ( ( p > 0 ) && ( c > triec [ p ] ) ) {
  965.         q = p ; 
  966.         p = trier [ q ] ; 
  967.         firstchild = false ; 
  968.           } 
  969.           if ( ( p == 0 ) || ( c < triec [ p ] ) ) {
  970.         if ( trieptr == triesize ) 
  971.           overflow(15, triesize);
  972.         incr ( trieptr ) ; 
  973.         trier [ trieptr ] = p ; 
  974.         p = trieptr ; 
  975.         triel [ p ] = 0 ; 
  976.         if ( firstchild ) 
  977.           triel [ q ] = p ; 
  978.         else trier [ q ] = p ; 
  979.           triec [ p ] = c ; 
  980. #ifdef ORIGTRIE
  981.         trieo [ p ] = mintrieop ; 
  982. #else
  983.         ztrie[p].trieo = mintrieop;
  984. #endif
  985.           } 
  986.           q = p ; 
  987.         } 
  988.         if (
  989. #ifdef ORIGTRIE
  990.         trieo [ q ] != mintrieop
  991. #else
  992.         ztrie[q].trieo != mintrieop
  993. #endif
  994.                         ) {
  995.           print_err("Duplicate pattern");
  996.           zhelp1( STR_H_SEE_APP_H );
  997.           error();
  998.         } 
  999. #ifdef ORIGTRIE
  1000.         trieo [ q ] = v ; 
  1001. #else
  1002.         ztrie[q].trieo = v;
  1003. #endif
  1004.       } 
  1005.       if ( curcmd == right_brace )
  1006.         goto lab30;
  1007.  
  1008.       k = 0 ; 
  1009.       hyf [ 0 ] = 0 ; 
  1010.       digitsensed = false ; 
  1011.     } 
  1012.     break ; 
  1013.     default: 
  1014.     print_err("Bad ");
  1015.     printesc( STR_PATTERNS );
  1016.     zhelp1( STR_H_SEE_APP_H );
  1017.     error();
  1018.     break;
  1019.       }
  1020.   }        /* while ( true ) */
  1021. lab30: ; 
  1022. }
  1023.  
  1024. void inittrie ( void )
  1025. { inittrie_regmem 
  1026.  
  1027.  {register integer j;
  1028.  
  1029.   opstart [ 0 ] = - (integer) mintrieop ; 
  1030.   for( j = 1 ; j <= 255 ; j++ ) {
  1031.     opstart [ j ] = opstart [ j - 1 ] + trieused [ j - 1 ] ; 
  1032.   }
  1033.   {register integer for_end; j = 1 ; for_end = trieopptr ; if ( j <= for_end) 
  1034.   do 
  1035.     trieophash [ j ] = opstart [ trieoplang [ j ] ] + trieopval [ j ] ; 
  1036.   while ( j++ < for_end ) ; } 
  1037.  
  1038.   for( j = 1 ; j <= trieopptr ; j++ ) {
  1039.     while ( trieophash [ j ] > j ) {
  1040.       register integer k, t;
  1041.  
  1042.       k = trieophash [ j ] ; 
  1043.       t = hyfdistance(k); hyfdistance(k) = hyfdistance(j); hyfdistance(j) = t;
  1044.       t = hyfnum(k); hyfnum(k) = hyfnum(j); hyfnum(j) = t;
  1045.       t = hyfnext(k); hyfnext(k) = hyfnext(j); hyfnext(j) = t;
  1046.       trieophash [ j ] = trieophash [ k ] ; 
  1047.       trieophash [ k ] = k ; 
  1048.     }
  1049.   }
  1050.  }
  1051.  
  1052.  {register triepointer p;
  1053.  
  1054.   {register integer for_end; p = 0 ; for_end = triesize ; if ( p <= for_end) 
  1055.   do 
  1056.     triehash [ p ] = 0 ; 
  1057.   while ( p++ < for_end ) ; } 
  1058.  
  1059.   triel [ 0 ] = compresstrie ( triel [ 0 ] ) ; 
  1060.  
  1061.   {register integer for_end; p = 0 ; for_end = trieptr ; if ( p <= for_end) 
  1062.   do 
  1063.     triehash [ p ] = 0 ; 
  1064.   while ( p++ < for_end ) ; } 
  1065.  
  1066.   for( p = 0 ; p <= 255 ; p++ ) {
  1067.     triemin [ p ] = p + 1 ; 
  1068.   }
  1069.  }
  1070.  
  1071.   trietrl [ 0 ] = 1 ; 
  1072.   triemax = 0 ; 
  1073.   if ( triel [ 0 ] != 0 ) {
  1074.     firstfit ( triel [ 0 ] ) ; 
  1075.     triepack ( triel [ 0 ] ) ; 
  1076.   } 
  1077.   if ( triel [ 0 ] == 0 ) {
  1078.     register triepointer r;
  1079.  
  1080.     for( r = 0 ; r <= 256 ; r++ ) {
  1081.     trietrc [ r ] = 0 ; 
  1082.     trietrl [ r ] = 0 ; 
  1083.     trietro [ r ] = mintrieop ; 
  1084.     }
  1085.     triemax = 256 ; 
  1086.   } else {
  1087.     triefix ( triel [ 0 ] ) ; 
  1088.     { register triepointer r = 0;
  1089.  
  1090.       do {
  1091.     register triepointer s;
  1092.  
  1093.     s = trietrl [ r ] ; 
  1094.     trietrl [ r ] = 0 ; 
  1095.     trietro [ r ] = mintrieop ; 
  1096.     trietrc [ r ] = 0 ; 
  1097.     r = s ; 
  1098.       } while ( r <= triemax );
  1099.     }
  1100.   }
  1101.   trietrc [ 0 ] = 63 ; 
  1102.   trienotready = false ; 
  1103. }
  1104. #endif /* INITEX */
  1105.  
  1106.  
  1107.     /*
  1108.      * prefixedcommand() wurde nach tex8.c verlegt und nur der
  1109.      * Teil, der in initex/virtex anders ist, hier als separate
  1110.      * Funktion realisiert.
  1111.      * returnvalue: initex=0, virtex!=0
  1112.      */
  1113. int call_new_patterns(void)
  1114. {
  1115. #ifdef INITEX
  1116.   newpatterns();
  1117.   return(0);
  1118. #else /* ! INITEX */
  1119.   call_new_patterns_regmem
  1120.  
  1121.   print_err("Patterns can be loaded only by INITEX");
  1122.   help0;
  1123.   error();
  1124.   { register eightbits r_curcmd;
  1125.  
  1126.     do {
  1127.       r_curcmd = gettoken();
  1128.     } while( r_curcmd != right_brace );
  1129.   }
  1130.   return(1);
  1131. #endif
  1132. }
  1133.  
  1134.  
  1135. #if 0
  1136.  
  1137. #ifdef INITEX
  1138. void storefmtfile ( ) 
  1139. #endif /* INITEX */
  1140.  
  1141. boolean loadfmtfile ( ) 
  1142.  
  1143. #endif
  1144.  
  1145.  
  1146. void finalcleanup ( void )
  1147. {/* 10 */ finalcleanup_regmem 
  1148.   register smallnumber c  ; 
  1149.  
  1150.   c = curchr ; 
  1151.   if ( jobname == 0 ) 
  1152.     openlogfile () ; 
  1153.   while ( openparens > 0 ) {
  1154.     c_print(" )");
  1155.     decr ( openparens ) ; 
  1156.   } 
  1157.   if ( curlevel > levelone ) {
  1158.     printnl ( 40 ) ; 
  1159.     c_printesc("end occurred ");
  1160.     c_print("inside a group at level ");
  1161.     printint ( curlevel - levelone ) ; 
  1162.     printchar ( 41 ) ; 
  1163.   } 
  1164.   while ( condptr != 0 ) {
  1165.     printnl ( 40 ) ; 
  1166.     c_printesc("end occurred ");
  1167.     c_print("when ");
  1168.     printcmdchr ( iftest , curif ) ; 
  1169.     if ( ifline != 0 ) {
  1170.       c_print(" on line ");
  1171.       printint ( ifline );
  1172.     } 
  1173.     c_print(" was incomplete)");
  1174.     ifline = iflinefield ( condptr ) ; 
  1175.     curif = subtype ( condptr ) ; 
  1176.     condptr = link ( condptr ) ; 
  1177.   } 
  1178.   if ( history != spotless ) 
  1179.   if ( ( ( history == warningissued ) || ( interaction < errorstopmode ) ) ) 
  1180.   if ( selector == termandlog ) 
  1181.   {
  1182.     selector = termonly ; 
  1183.     c_printnl("(see the transcript file for additional information)");
  1184.     selector = termandlog ; 
  1185.   } 
  1186.   if ( c == 1 ) {
  1187. #ifdef INITEX
  1188.     storefmtfile () ; 
  1189. #else  /* ! INITEX */
  1190.     c_printnl("(\\dump is performed only by INITEX)");
  1191. #endif /* ! INITEX */
  1192.     return ; 
  1193.   } 
  1194.  
  1195. #if 0
  1196.  
  1197. #ifdef INITEX
  1198. void initprim ( ) 
  1199. #endif /* INITEX */
  1200.  
  1201. #endif
  1202.  
  1203.  
  1204.    static boolean
  1205. check_consistency(void)
  1206. { char bad = 0;
  1207.   char *extra_info = NULL;
  1208.  
  1209.   if ( halferrorline < 30 || halferrorline > errorline - 15 ) {
  1210.     bad = 1;
  1211.     extra_info = "`halferrorline' should be between 30 and (errorline-15)";
  1212.   }
  1213.   if ( maxprintline < 60 ) {
  1214.     bad = 2;
  1215.     extra_info = "`maxprintline' should be at least 60";
  1216.   }
  1217.   if ( (dvibufsize < 32) && (dvibufsize % 8 != 0) ) {
  1218.     bad = 3;
  1219.     extra_info = "`dvibufsize' must be >= 32 and a multiple of 8";
  1220.   }
  1221.   if ( membot + 1100 > memtop ) {
  1222.     bad = 4;
  1223.     extra_info = "`memtop' should be at least 1100";
  1224.   }
  1225.   if ( hashprime > hashsize )
  1226.     bad = 5;
  1227.   if ( maxinopen >= 128 ) {
  1228.     bad = 6;
  1229.     extra_info = "`maxinopen' must not exceed 127";
  1230.   }
  1231.   if ( memtop < 267 )
  1232.     bad = 7;
  1233.  
  1234. #ifdef INITEX
  1235.   if ( memmin != membot || memmax != memtop ) {
  1236.     bad = 10;
  1237.     extra_info = "`memmax' = `memtop' for IniTeX";
  1238.   }
  1239. #else
  1240.   if ( memmin > membot || memmax < memtop ) {
  1241.     bad = 10;
  1242.     extra_info = "`memmax' >= `memtop'";
  1243.   }
  1244. #endif /* INITEX */
  1245.   if ( 0 > 0 || maxquarterword < 127 )
  1246.     bad = 11;
  1247.   if ( 0 > 0 || maxhalfword < 32767 )
  1248.     bad = 12;
  1249.   if ( 0 < 0 || maxquarterword > maxhalfword )
  1250.     bad = 13;
  1251.   if ( memmin < 0 || memmax >= maxhalfword || (membot-memmin > maxhalfword+1)) {
  1252.     bad = 14;
  1253. #ifdef BIG
  1254.     /* fuer 524286 memwords benoetigt man 0.5M * 8 bytes = 4MB Speicher */
  1255. #ifdef INITEX
  1256.     extra_info = "`memtop' must not exceed 524286";
  1257. #else
  1258.     extra_info = "`memmax' must not exceed 524286";
  1259. #endif
  1260. #else
  1261. #ifdef INITEX
  1262.     extra_info = "`memtop' must not exceed 65534";
  1263. #else
  1264.     extra_info = "`memmax' must not exceed 65534";
  1265. #endif
  1266. #endif
  1267.   }
  1268.   if ( 0 < 0 || fontmax > maxquarterword ) {
  1269.     bad = 15;
  1270.     extra_info = "`fontmax' must not exceed 255";
  1271.   }
  1272.   if ( fontmax > 256 )
  1273.     bad = 16;
  1274.   if ( savesize > maxhalfword || maxstrings > maxhalfword ) {
  1275.     bad = 17;
  1276.     extra_info = "`savesize' and `maxstrings' must not exceed 65535";
  1277.   }
  1278.   if ( bufsize > maxhalfword ) {
  1279.     bad = 18;
  1280.     extra_info = "`bufsize' must not exceed 65535";
  1281.   }
  1282.   if ( maxquarterword - 0 < 255 ) 
  1283.     bad = 19;
  1284.   if ( cstokenflag + undefinedcontrolsequence > maxhalfword ) 
  1285.     bad = 21;
  1286.   if ( formatdefaultlength > FILENAMESIZE ) 
  1287.     bad = 31;
  1288.   if ( 2 * maxhalfword < memtop - memmin ) 
  1289.     bad = 41;
  1290.   if ( bad > 0 ) {
  1291.     (void) printf("\
  1292. Ouch---my internal constants have been clobbered!---case %ld\n" , (long)bad );
  1293.     if( extra_info != NULL )
  1294.       (void) printf("Check: %s!\n", extra_info);
  1295.     return(false);
  1296.   }
  1297.   return(true);
  1298. }
  1299.  
  1300.  
  1301. void texbody ( void )
  1302. { texbody_regmem 
  1303.  
  1304.   history = fatalerrorstop ; 
  1305.   setpaths ( TEXFORMATPATHBIT+TEXINPUTPATHBIT+TEXPOOLPATHBIT+TFMFILEPATHBIT );
  1306.   if ( readyalready == 314159L ) 
  1307.     goto lab1 ; 
  1308.  
  1309.   if( ! check_consistency() )
  1310.     goto lab9999;
  1311.  
  1312.   initialize () ;
  1313. #ifdef INITEX
  1314.   if ( ! getstringsstarted () ) 
  1315.     goto lab9999 ; 
  1316.   initprim () ; 
  1317.   initstrptr = strptr ; 
  1318.   initpoolptr = poolptr ; 
  1319.   dateandtime ( ztime , zday , zmonth , zyear ) ; 
  1320. #endif /* INITEX */
  1321.   readyalready = 314159L ; 
  1322.  
  1323. lab1:
  1324.   selector = termonly ; 
  1325.   tally = 0 ; 
  1326.   termoffset = 0 ; 
  1327.   fileoffset = 0 ; 
  1328. #if 0
  1329.   (void) Fputs( stdout ,  "This is TeX, C Version 3.14t2" ) ; 
  1330. #else
  1331.   (void) Fputs( stdout ,  banner );
  1332. #endif
  1333.  
  1334. #ifdef INITEX
  1335. #if defined(MLTEX) && defined(TEXXET)
  1336.   if( is_ML_TeX && is_TeX_XeT)
  1337.     (void) Fputs(stdout, "\nThis is TeX--XeT (1.0) with ML-TeX (V.3)");
  1338.   else if( is_ML_TeX )
  1339.     (void) Fputs(stdout, "\nThis is ML-TeX, Version 3");
  1340.   else if( is_TeX_XeT )
  1341.     (void) Fputs(stdout, "\nThis is TeX--XeT (1.0)");
  1342. #else
  1343. # ifdef MLTEX
  1344.   /* if user has given ML-TeX switch in IniTeX, output a second line */
  1345.   if( is_ML_TeX )
  1346.     (void) Fputs(stdout, "\nThis is ML-TeX, Version 3");
  1347. # endif
  1348. # ifdef TEXXET
  1349.   /* if user has given TeX-XeT switch in IniTeX, output a second line */
  1350.   if( is_TeX_XeT )
  1351.     (void) Fputs(stdout, "\nThis is TeX--XeT (1.0)");
  1352. # endif
  1353. #endif
  1354. #endif
  1355.  
  1356.   if ( formatident > 0 ) 
  1357. #if 0  /* TeX 3.141 */
  1358.     print( formatident );
  1359. #else
  1360.     slowprint( formatident );
  1361. #endif
  1362.   println ();
  1363.   flush ( stdout );
  1364.   jobname = 0;
  1365.   nameinprogress = false;
  1366.   logopened = false;
  1367.   outputfilename = 0;
  1368.  
  1369.   inputptr = 0;
  1370. #ifdef INP_PTR
  1371.   curinput_ptr = &inputstack[ /* inputptr */ 0 ];
  1372. #endif
  1373.   maxinstack = 0;
  1374.   inopen = 0 ; 
  1375.   openparens = 0 ; 
  1376.   maxbufstack = 0 ; 
  1377.   paramptr = 0 ; 
  1378.   maxparamstack = 0 ; 
  1379.   first = bufsize ; 
  1380.   do {
  1381.     buffer [ first ] = 0 ; 
  1382.     decr ( first ) ; 
  1383.   } while ( first != 0 ) ; 
  1384.   scannerstatus = normal ; 
  1385.   warningindex = 0 ; 
  1386.   first = 1 ; 
  1387.   curinput .statefield = 33 ; 
  1388.   curinput .startfield = 1 ; 
  1389.   curinput .indexfield = 0 ; 
  1390.   line = 0 ; 
  1391.   curinput .namefield = 0 ; 
  1392.   forceeof = false ; 
  1393.   alignstate = 1000000L ; 
  1394.   if ( ! initterminal () ) 
  1395.     goto lab9999 ; 
  1396.   curinput .limitfield = last ; 
  1397.   first = last + 1 ; 
  1398.  
  1399.   if ( ( formatident == 0 ) || ( buffer [ curinput .locfield ] == 38 ) ) {
  1400.     if ( formatident != 0 ) 
  1401.     initialize () ; 
  1402.     if ( ! openfmtfile () ) 
  1403.     goto lab9999 ; 
  1404.     if ( ! loadfmtfile () ) {
  1405.     wclose ( fmtfile ) ; 
  1406.     goto lab9999 ; 
  1407.     } 
  1408.     wclose ( fmtfile ) ; 
  1409.     while ( ( curinput .locfield < curinput .limitfield ) && ( buffer [ 
  1410.       curinput .locfield ] == 32 ) )
  1411.     incr ( curinput .locfield ) ; 
  1412.   }
  1413.   if ( endlinecharinactive () ) 
  1414.     decr ( curinput .limitfield ) ; 
  1415.   else
  1416.     buffer [ curinput .limitfield ] = endlinechar ; 
  1417.   dateandtime ( ztime , zday , zmonth , zyear ) ; 
  1418. #if 0    /* (br) nicht mehr benoetigt */
  1419.   magicoffset = strstart [ 885 ] - 9 * ordnoad ; 
  1420. #endif
  1421.  
  1422.   /* (br) added: Has User set a \language ? */
  1423.   if( user_language >= 0 )
  1424.     geqworddefine( intbase+languagecode, user_language );
  1425.  
  1426.   /* (br) added: Has User set another Interaction Level ? */
  1427.   if( user_interaction != -1 )
  1428.     interaction = user_interaction;
  1429.  
  1430.   if ( interaction <= batchmode )
  1431.     selector = noprint ; 
  1432.   else selector = termonly ; 
  1433.   if ( ( curinput .locfield < curinput .limitfield )
  1434.     && ( catcode ( buffer [ curinput .locfield ] ) != 0 ) ) 
  1435.     startinput();
  1436.  
  1437.   history = spotless ; 
  1438.   maincontrol () ; 
  1439.   finalcleanup () ; 
  1440.   closefilesandterminate () ; 
  1441.  
  1442. lab9999:
  1443.   {
  1444.     flush ( stdout ) ; 
  1445.     readyalready = 0 ; 
  1446.     if ( ( history != spotless ) && ( history != warningissued ) ) 
  1447.       uexit ( 1 ) ; 
  1448.     else uexit ( 0 ) ; 
  1449.   } 
  1450. }
  1451.  
  1452. /* -- end -- */
  1453.