home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / source / TeX / tex / readfont.c < prev    next >
C/C++ Source or Header  |  1991-08-11  |  10KB  |  432 lines

  1. #define EXTERN extern
  2. #include "texd.h"
  3.  
  4.    static void
  5. start_font_error_message(halfword u, strnumber nom, strnumber aire, scaled s)
  6. {
  7.     print_err("Font ");
  8.     sprintcs ( u );
  9.     printchar ( 61 );
  10.     printfilename ( nom , aire , 335 );
  11.     if ( s >= 0 ) {
  12.       print( STR_AT_ );
  13.       printscaled ( s );
  14.       print( STR_PT );
  15.     } else if ( s != -1000 ) {
  16.       c_print(" scaled ");
  17.       printint ( - (integer) s );
  18.     }
  19. }
  20.  
  21.  
  22. internalfontnumber readfontinfo ( halfword u, strnumber nom, strnumber aire,
  23.                   scaled s )
  24. { readfontinfo_regmem 
  25.   fontindex k  ; 
  26.   boolean fileopened  ; 
  27.   register halfword lf, lh, bc, ec, nw, nh, nd, ni, nl, nk, ne, np  ; 
  28.   register internalfontnumber f  ; 
  29.   register internalfontnumber g  ; 
  30.   register eightbits a, b, c, d  ; 
  31.   fourquarters qw  ; 
  32.   register scaled sw  ; 
  33.   register integer bchlabel  ; 
  34.   register short bchar  ; 
  35.   register scaled z  ; 
  36.   register integer alpha  ; 
  37.   register schar beta  ; 
  38.  
  39.   bytefile tfmfile;
  40.   unsigned short tfmheader[12];
  41.   halfword filelen;
  42.  
  43.  
  44.   g = nullfont;
  45.   fileopened = false;
  46.   packfilename( nom, aire, STR_DOT_TFM );
  47.   if ( ! bopenin ( tfmfile ) )
  48.     goto lab11;
  49.  
  50.   fileopened = true;
  51.  
  52.   /* delete the getc for TFM-Files in open_input () !! */
  53.  
  54.  
  55.   /* 565. Read the TFM size fields */
  56.  
  57.   if( fread((char *)tfmheader, 2, 12, tfmfile) != 12 )
  58.     goto lab11;
  59.  
  60.   if( (lf = tfmheader[0]) > 0x7fff || (lh = tfmheader[1]) > 0x7fff
  61.    || (bc = tfmheader[2]) > 0x7fff || (ec = tfmheader[3]) > 0x7fff )
  62.     goto lab11;
  63.  
  64.   if ( ( bc > ec + 1 ) || ( ec > 255 ) )
  65.     goto lab11;
  66.  
  67.   if ( bc > 255 ) {        /* bc = 256 && ec = 255 */
  68.       bc = 1;  ec = 0;
  69.   }
  70.  
  71.   if( (nw = tfmheader[4]) > 0x7fff || (nh = tfmheader[5]) > 0x7fff
  72.     || (nd = tfmheader[6]) > 0x7fff  || (ni = tfmheader[7]) > 0x7fff
  73.     || (nl = tfmheader[8]) > 0x7fff  || (nk = tfmheader[9]) > 0x7fff
  74.     || (ne = tfmheader[10]) > 0x7fff || (np = tfmheader[11]) > 0x7fff )
  75.      goto lab11;
  76.  
  77.   if( lf != 6 + lh + (ec-bc+1) + nw + nh + nd + ni + nl + nk + ne + np )
  78.     goto lab11;
  79.  
  80.  
  81.   /* 566. Use size fields to allocate font information */
  82.  
  83.   lf = lf - 6 - lh;    /* |lf| words should be loaded into |font_info| */
  84.   filelen = lf;        /* Read |filelen| * 4 Bytes from TFM-File */
  85.   if ( np < 7 )
  86.     lf = lf + 7 - np;
  87.  
  88.   if ( ( fontptr == fontmax ) || ( fmemptr + lf > fontmemsize ) ) {
  89.     start_font_error_message( u, nom, aire, s);
  90.     c_print(" not loaded: Not enough room left");
  91.     zhelp1( STR_H_IMAFRAID_FONT );
  92.     error();
  93.     goto lab30;
  94.   }
  95.  
  96.   f = fontptr + 1;
  97.  
  98. #ifdef FONTPTR
  99. #  define F_PTR_OFFSET    (&fontinfo[0])
  100. #  define F_PTR_SIZE    sizeof(fontinfo[0])
  101.   charbase(f)   = &fontinfo[fmemptr - bc];
  102. #else
  103. #  define F_PTR_OFFSET    0
  104. #  define F_PTR_SIZE    1
  105.   charbase(f)   = fmemptr - bc;
  106. #endif
  107.   widthbase(f)  = charbase(f) + ec + 1;
  108.   heightbase(f) = widthbase(f) + nw;
  109.   depthbase(f)  = heightbase(f) + nh;
  110.   italicbase(f) = depthbase(f) + nd;
  111.   ligkernbase(f) = italicbase(f) + ni /*** - F_PTR_OFFSET ***/ ;
  112.   kernbase(f)    = ligkernbase(f) + nl - kernbaseoffset;
  113.  
  114.   /* These are really indizedes in fontinfo[] */
  115.   extenbase(f)   = (kernbase(f) - F_PTR_OFFSET) + kernbaseoffset + nk;
  116.   parambase(f)   = extenbase(f) + ne;
  117.  
  118.   /* 568. Read the TFM header */
  119.  
  120.   if ( lh < 2 ) 
  121.     goto lab11;
  122.  
  123.   qw.b0 = getc ( tfmfile );  qw.b1 = getc ( tfmfile );
  124.   qw.b2 = getc ( tfmfile );  qw.b3 = getc ( tfmfile );
  125.   fontcheck(f) = qw;
  126.  
  127.   z = getc ( tfmfile );
  128.   if ( z > 127 )
  129.     goto lab11;
  130.   z = z * 256 + getc ( tfmfile );
  131.   z = z * 256 + getc ( tfmfile );
  132.   z = ( z * 16 ) + ( getc(tfmfile) / 16 );
  133.  
  134.   if ( z < unity ) 
  135.     goto lab11;
  136.  
  137.   while ( lh > 2 ) {
  138.       (void) getc ( tfmfile );  (void) getc ( tfmfile );
  139.       (void) getc ( tfmfile );  (void) getc ( tfmfile );
  140.       decr ( lh );
  141.   }
  142.  
  143.   fontdsize(f) = z;
  144.   if ( s != -1000 )
  145.     if ( s >= 0 )
  146.       z = s;
  147.     else
  148.       z = xnoverd ( z , - (integer) s , 1000 );
  149.   fontsize(f) = z;
  150.  
  151.  
  152.   /* (br) Read the whole thing by one fread() */
  153.   /* if (eof()) at end of function could be deleted */
  154.   if(fread( (char *)&fontinfo[fmemptr], sizeof(fontinfo[0]), filelen, tfmfile)
  155.     != filelen)
  156.     goto lab11;
  157.  
  158.     
  159.   /* 569. Read character data */
  160.  
  161.   for( k = fmemptr ; k <= (widthbase(f) - F_PTR_OFFSET) - 1 ; k++ ) {
  162.  
  163.     a = fontinfo[k].qqqq.b0;  b = fontinfo[k].qqqq.b1;
  164.     c = fontinfo[k].qqqq.b2;  d = fontinfo[k].qqqq.b3;
  165.  
  166.     if ( ( a >= nw ) || ( b/16 >= nh ) || ( b%16 >= nd ) || ( c/4 >= ni ) )
  167.       goto lab11;
  168.  
  169.     switch ( c % 4 ) {
  170.       case ligtag:
  171.     if ( d >= nl ) 
  172.       goto lab11;
  173.     break;
  174.       case exttag:
  175.     if ( d >= ne )
  176.       goto lab11;
  177.     break;
  178.       case listtag:   /* 570. Check for charlist cycle */
  179.     if ( ( d < bc ) || ( d > ec ) )
  180.       goto lab11;
  181.     while ( d < k + bc - fmemptr ) {
  182.       qw = CharInfo( f, d );
  183.       if ( chartag(qw) != listtag )
  184.         goto lab45;
  185.       d = rembyte(qw);
  186.     }
  187.     if ( d == k + bc - fmemptr )
  188.       goto lab11;
  189. lab45:
  190.     break;
  191.       default: 
  192.     break;
  193.     }
  194.   }
  195.  
  196.  
  197.   /* 571. Read box dimensions */
  198.  
  199.   alpha = 16;
  200.   while ( z >= 8388608L ) {
  201.     z = z / 2;
  202.     alpha = alpha + alpha;
  203.   }
  204.   beta = 256 / alpha;
  205.   alpha = alpha * z;
  206.  
  207.   for( k = (widthbase(f) - F_PTR_OFFSET) ;
  208.     k <= (ligkernbase(f) - F_PTR_OFFSET ) - 1 ; k++ ) {
  209.  
  210.     a = fontinfo[k].qqqq.b0;  b = fontinfo[k].qqqq.b1;
  211.     c = fontinfo[k].qqqq.b2;  d = fontinfo[k].qqqq.b3;
  212.  
  213.     sw = ( ( ( ( (d*z) / 256 ) + (c*z) ) / 256 ) + ( b * z ) ) / beta;
  214.     if ( a == 0 )
  215.       fontinfo [ k ] .cint = sw;
  216.     else if ( a == 255 ) 
  217.       fontinfo [ k ] .cint = sw - alpha;
  218.     else
  219.       goto lab11;
  220.   }
  221.  
  222.   if ( fontinfo [ widthbase(f) - F_PTR_OFFSET ] .cint != 0 ) 
  223.     goto lab11 ; 
  224.   if ( fontinfo [ heightbase(f) - F_PTR_OFFSET ] .cint != 0 ) 
  225.     goto lab11 ; 
  226.   if ( fontinfo [ depthbase(f) - F_PTR_OFFSET ] .cint != 0 ) 
  227.     goto lab11 ; 
  228.   if ( fontinfo [ italicbase(f) - F_PTR_OFFSET ] .cint != 0 ) 
  229.     goto lab11 ; 
  230.  
  231.  
  232.   /* 573. Read ligature/kern program */
  233.  
  234.   bchlabel = 32767;
  235.   bchar = 256;
  236.   if ( nl > 0 ) {
  237.     for( k = (ligkernbase(f) - F_PTR_OFFSET) ;
  238.      k <= (kernbase(f) - F_PTR_OFFSET) + kernbaseoffset - 1 ; k++ ) {
  239.  
  240.       a = fontinfo[k].qqqq.b0;  b = fontinfo[k].qqqq.b1;
  241.       c = fontinfo[k].qqqq.b2;  d = fontinfo[k].qqqq.b3;
  242.  
  243.       if ( a > 128 ) {
  244.     if ( 256 * c + d >= nl )
  245.       goto lab11;
  246.     if ( a == 255 )
  247.       if ( k == (ligkernbase(f) - F_PTR_OFFSET) )
  248.         bchar = b;
  249.       } else {
  250.     if ( b != bchar ) {
  251.       if ( ( b < bc ) || ( b > ec ) )
  252.         goto lab11;
  253.       qw = zcharinfo ( f ,  b );
  254.       if ( ! charexists ( qw ) )
  255.         goto lab11;
  256.     }
  257.     if ( c < 128 ) {
  258.       if ( ( d < bc ) || ( d > ec ) )
  259.         goto lab11 ; 
  260.       qw = zcharinfo ( f ,  d ) ; 
  261.       if ( ! charexists ( qw ) ) 
  262.         goto lab11;
  263.     } else if ( 256 * ( c - 128 ) + d >= nk )
  264.       goto lab11;
  265.  
  266.     if ( a < 128 ) 
  267.       if ( k - (ligkernbase(f) - F_PTR_OFFSET) + a + 1 >= nl ) 
  268.         goto lab11;
  269.       }
  270.     }
  271.     if ( a == 255 )
  272.       bchlabel = 256 * c + d;
  273.   } /* if ... */
  274.  
  275.   for( k = (kernbase(f) - F_PTR_OFFSET) + kernbaseoffset ;
  276.     k <= extenbase(f) - 1 ; k++ ) {
  277.  
  278.     a = fontinfo[k].qqqq.b0;  b = fontinfo[k].qqqq.b1;
  279.     c = fontinfo[k].qqqq.b2;  d = fontinfo[k].qqqq.b3;
  280.  
  281.     sw = ( ( ( ( (d*z) / 256 ) + (c*z) ) / 256 ) + ( b * z ) ) / beta;
  282.     if ( a == 0 ) 
  283.       fontinfo [ k ] .cint = sw ; 
  284.     else if ( a == 255 ) 
  285.       fontinfo [ k ] .cint = sw - alpha ; 
  286.     else
  287.       goto lab11;
  288.   }
  289.  
  290.  
  291.   /* 574. Read extensible character recipes */
  292.  
  293.   for( k = extenbase(f) ; k <= parambase(f) - 1 ; k++ ) {
  294.  
  295.     a = fontinfo[k].qqqq.b0;  b = fontinfo[k].qqqq.b1;
  296.     c = fontinfo[k].qqqq.b2;  d = fontinfo[k].qqqq.b3;
  297.  
  298.     if ( a != 0 ) {
  299.     {
  300.       if ( ( a < bc ) || ( a > ec ) ) 
  301.       goto lab11 ; 
  302.     } 
  303.     qw = zcharinfo ( f ,  a ) ; 
  304.     if ( ! charexists ( qw ) ) 
  305.     goto lab11 ; 
  306.       } 
  307.       if ( b != 0 ) {
  308.     {
  309.       if ( ( b < bc ) || ( b > ec ) ) 
  310.       goto lab11 ; 
  311.     } 
  312.     qw = zcharinfo ( f ,  b ) ; 
  313.     if ( ! charexists ( qw ) ) 
  314.     goto lab11 ; 
  315.       } 
  316.       if ( c != 0 ) {
  317.     {
  318.       if ( ( c < bc ) || ( c > ec ) ) 
  319.       goto lab11 ; 
  320.     } 
  321.     qw = zcharinfo ( f ,  c ) ; 
  322.     if ( ! charexists ( qw ) ) 
  323.     goto lab11 ; 
  324.       }
  325.       {
  326.     {
  327.       if ( ( d < bc ) || ( d > ec ) ) 
  328.       goto lab11 ; 
  329.     } 
  330.     qw = zcharinfo ( f ,  d ) ; 
  331.     if ( ! charexists ( qw ) ) 
  332.     goto lab11 ; 
  333.       } 
  334.   }
  335.  
  336.  
  337.   /* 575. Read font parameter */
  338.  
  339.   for( k = 1 ; k <= np ; k++ ) {
  340.  
  341.     a = fontinfo[parambase(f)+k-1].qqqq.b0;
  342.     b = fontinfo[parambase(f)+k-1].qqqq.b1;
  343.     c = fontinfo[parambase(f)+k-1].qqqq.b2;
  344.     d = fontinfo[parambase(f)+k-1].qqqq.b3;
  345. #if 0
  346.     qw = fontinfo [ parambase(f) + k - 1].qqqq;
  347.     a = qw.b0;  b = qw.b1;  c = qw.b2;  d = qw.b3;
  348. #endif
  349.  
  350.     if ( k == 1 ) {
  351.       sw = a;
  352.       if ( sw > 127 ) 
  353.     sw = sw - 256;
  354.       sw = sw * 256 + b;
  355.       sw = sw * 256 + c;
  356.       fontinfo [ parambase(f) ].cint = ( sw * 16 ) + ( d / 16 );
  357.     } else {
  358.       sw = ( ( ( ( (d*z) / 256 ) + (c*z) ) / 256 ) + ( b * z ) ) / beta;
  359.       if ( a == 0 ) 
  360.     fontinfo [ parambase(f) + k - 1 ] .cint = sw;
  361.       else if ( a == 255 ) 
  362.     fontinfo [ parambase(f) + k - 1 ] .cint = sw - alpha;
  363.       else goto lab11 ; 
  364.     }
  365.   }
  366.  
  367.  
  368. #if 0        /* (br) not necessary, because of the fread()-call */
  369.   if ( feof ( tfmfile ) )
  370.     goto lab11;
  371. #endif
  372.  
  373.   for( k = np + 1 ; k <= 7 ; k++ ) {
  374.     fontinfo [ parambase(f) + k - 1 ] .cint = 0 ; 
  375.   }
  376.  
  377.  
  378.   /* 576. Make final adjustments and goto done */
  379.  
  380.   if ( np >= 7 )
  381.     fontparams(f) = np;
  382.   else
  383.     fontparams(f) = 7;
  384.  
  385.   hyphenchar(f) = defaulthyphenchar;
  386.   skewchar(f) = defaultskewchar;
  387.  
  388.   if ( bchlabel < nl )
  389.     bcharlabel(f) = bchlabel + (ligkernbase(f) - F_PTR_OFFSET);
  390.   else
  391.     bcharlabel(f) = nonaddress;
  392.  
  393.   fontbchar(f) = bchar;
  394.   fontfalsebchar(f) = bchar;
  395.   if( ( bchar <= ec ) && ( bchar >= bc ) ) {
  396.     qw = zcharinfo( f, bchar );
  397.     if ( charexists(qw) )
  398.       fontfalsebchar(f) = nonchar;
  399.   }
  400.  
  401.   fontname(f) = nom;
  402.   fontarea(f) = aire;
  403.   fontbc(f)   = bc;
  404.   fontec(f)   = ec;
  405.   fontglue(f) = 0;
  406.  
  407.   decr ( parambase(f) );
  408.   fmemptr = fmemptr + lf;
  409.   fontptr = f;
  410.   g = f;
  411.   goto lab30;
  412.  
  413. lab11:
  414.   start_font_error_message( u, nom, aire, s);
  415.  
  416.   c_print(" not loadable: ");
  417.   if ( fileopened )
  418.     c_print("Bad metric (TFM) file");
  419.   else
  420.     c_print("Metric (TFM) file not found");
  421.   zhelp1( STR_H_IWASNT_READSIZE );
  422.   error();
  423.  
  424. lab30:
  425.   if ( fileopened )
  426.     bclose( tfmfile );
  427.  
  428.   return(g);
  429. }
  430.  
  431. /* -- end -- */
  432.