DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T t

⟦25ccb7cdd⟧ TextFile

    Length: 18355 (0x47b3)
    Types: TextFile
    Names: »tfm2difont.c«

Derivation

└─⟦060c9c824⟧ Bits:30007080 DKUUG TeX 2/12/89
    └─⟦this⟧ »./DVIware/laser-setters/quicspool/src/tfm2difont.c« 
└─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12
    └─⟦af5ba6c8e⟧ »unix3.0/DVIWARE.tar.Z« 
        └─⟦ca79c7339⟧ 
            └─⟦this⟧ »DVIware/laser-setters/quicspool/src/tfm2difont.c« 

TextFile

#ifndef lint
static char *rcs = "$Header: tfm2difont.c,v 1.1 88/01/15 13:05:47 simpson Rel $";
#endif
/*
$Log:	tfm2difont.c,v $
 * Revision 1.1  88/01/15  13:05:47  simpson
 * initial release
 * 
 * Revision 0.2  88/01/06  08:57:45  simpson
 * added l. and L. for pic dots
 * 
 * Revision 0.1  87/12/11  18:31:24  simpson
 * beta test
 * 
*/
#include <stdio.h>
#include <local/standard.h>
#include "constants.h"
#include "dev.h"

/* An octal number designates that the character isn't normally in troff */
char    *NormalSequences[][5] = {	/* Troff representations */
    /* Put the 1/6 em \| in the 000 position */
    /* 000 */ "\\|", NULL, NULL, NULL, NULL,
    /* 001 */ "fi", NULL, NULL, NULL, NULL,
    /* 002 */ "fl", NULL, NULL, NULL, NULL,
    /* 003 */ "ff", NULL, NULL, NULL, NULL,
    /* 004 */ "\\-", "en", NULL, NULL, NULL,
    /* 005 */ "ru", NULL, NULL, NULL, NULL,
    /* 006 */ "em", NULL, NULL, NULL, NULL,
    /* 007 */ "bu", NULL, NULL, NULL, NULL,
    /* 010 */ "sq", NULL, NULL, NULL, NULL,
    /* 011 */ "fI", "Fi", NULL, NULL, NULL,
    /* 012 */ "fL", "Fl", NULL, NULL, NULL,
    /* 013 */ "de", NULL, NULL, NULL, NULL,
    /* 014 */ "dg", NULL, NULL, NULL, NULL,
    /* 015 */ "fm", NULL, NULL, NULL, NULL,
    /* 016 */ "co", NULL, NULL, NULL, NULL,
    /* 017 */ "rg", NULL, NULL, NULL, NULL,
    /* 020 */ "ct", NULL, NULL, NULL, NULL,
    /* 021 */ "14", NULL, NULL, NULL, NULL,
    /* 022 */ "12", NULL, NULL, NULL, NULL,
    /* 023 */ "34", NULL, NULL, NULL, NULL,
    /* The following four characters (box, open bullet, umlaut and cedilla) */
    /* are not in otroff but are in ditroff. */
    /* 024 */ "bx", NULL, NULL, NULL, NULL,
    /* 025 */ "ob", NULL, NULL, NULL, NULL,
    /* 026 */ "..", NULL, NULL, NULL, NULL,
    /* 027 */ "cd", NULL, NULL, NULL, NULL,
    /* 030 */ "L.", "l.", NULL, NULL, NULL,
    /* 031 */ "\031", NULL, NULL, NULL, NULL,
    /* 032 */ "\032", NULL, NULL, NULL, NULL,
    /* 033 */ "\033", NULL, NULL, NULL, NULL,
    /* 034 */ "\034", NULL, NULL, NULL, NULL,
    /* 035 */ "\035", NULL, NULL, NULL, NULL,
    /* 036 */ "\036", NULL, NULL, NULL, NULL,
    /* 037 */ "\037", NULL, NULL, NULL, NULL,
    /* 040 */ " ", NULL, NULL, NULL, NULL,
    /* 041 */ "!", NULL, NULL, NULL, NULL,
    /* 042 */ "\042", NULL, NULL, NULL, NULL,
    /* 043 */ "\043", NULL, NULL, NULL, NULL,
    /* 044 */ "$", NULL, NULL, NULL, NULL,
    /* 045 */ "%", NULL, NULL, NULL, NULL,
    /* 046 */ "&", NULL, NULL, NULL, NULL,
    /* 047 */ "\047", NULL, NULL, NULL, NULL,
    /* 050 */ "(", NULL, NULL, NULL, NULL,
    /* 051 */ ")", NULL, NULL, NULL, NULL,
    /* 052 */ "*", NULL, NULL, NULL, NULL,
    /* 053 */ "+", NULL, NULL, NULL, NULL,
    /* 054 */ ",", NULL, NULL, NULL, NULL,
    /* 055 */ "-", "hy", NULL, NULL, NULL,
    /* 056 */ ".", NULL, NULL, NULL, NULL,
    /* 057 */ "/", NULL, NULL, NULL, NULL,
    /* 060 */ "0", NULL, NULL, NULL, NULL,
    /* 061 */ "1", NULL, NULL, NULL, NULL,
    /* 062 */ "2", NULL, NULL, NULL, NULL,
    /* 063 */ "3", NULL, NULL, NULL, NULL,
    /* 064 */ "4", NULL, NULL, NULL, NULL,
    /* 065 */ "5", NULL, NULL, NULL, NULL,
    /* 066 */ "6", NULL, NULL, NULL, NULL,
    /* 067 */ "7", NULL, NULL, NULL, NULL,
    /* 070 */ "8", NULL, NULL, NULL, NULL,
    /* 071 */ "9", NULL, NULL, NULL, NULL,
    /* 072 */ ":", NULL, NULL, NULL, NULL,
    /* 073 */ ";", NULL, NULL, NULL, NULL,
    /* 074 */ "\074", NULL, NULL, NULL, NULL,
    /* 075 */ "\075", NULL, NULL, NULL, NULL,
    /* 076 */ "\076", NULL, NULL, NULL, NULL,
    /* 077 */ "?", NULL, NULL, NULL, NULL,
    /* 100 */ "\100", NULL, NULL, NULL, NULL,
    /* 101 */ "A", NULL, NULL, NULL, NULL,
    /* 102 */ "B", NULL, NULL, NULL, NULL,
    /* 103 */ "C", NULL, NULL, NULL, NULL,
    /* 104 */ "D", NULL, NULL, NULL, NULL,
    /* 105 */ "E", NULL, NULL, NULL, NULL,
    /* 106 */ "F", NULL, NULL, NULL, NULL,
    /* 107 */ "G", NULL, NULL, NULL, NULL,
    /* 110 */ "H", NULL, NULL, NULL, NULL,
    /* 111 */ "I", NULL, NULL, NULL, NULL,
    /* 112 */ "J", NULL, NULL, NULL, NULL,
    /* 113 */ "K", NULL, NULL, NULL, NULL,
    /* 114 */ "L", NULL, NULL, NULL, NULL,
    /* 115 */ "M", NULL, NULL, NULL, NULL,
    /* 116 */ "N", NULL, NULL, NULL, NULL,
    /* 117 */ "O", NULL, NULL, NULL, NULL,
    /* 120 */ "P", NULL, NULL, NULL, NULL,
    /* 121 */ "Q", NULL, NULL, NULL, NULL,
    /* 122 */ "R", NULL, NULL, NULL, NULL,
    /* 123 */ "S", NULL, NULL, NULL, NULL,
    /* 124 */ "T", NULL, NULL, NULL, NULL,
    /* 125 */ "U", NULL, NULL, NULL, NULL,
    /* 126 */ "V", NULL, NULL, NULL, NULL,
    /* 127 */ "W", NULL, NULL, NULL, NULL,
    /* 130 */ "X", NULL, NULL, NULL, NULL,
    /* 131 */ "Y", NULL, NULL, NULL, NULL,
    /* 132 */ "Z", NULL, NULL, NULL, NULL,
    /* 133 */ "[", NULL, NULL, NULL, NULL,
    /* 134 */ "\134", NULL, NULL, NULL, NULL,
    /* 135 */ "]", NULL, NULL, NULL, NULL,
    /* 136 */ "\136", NULL, NULL, NULL, NULL,
    /* 137 */ "_", NULL, NULL, NULL, NULL,
    /* 140 */ "\140", NULL, NULL, NULL, NULL,
    /* 141 */ "a", NULL, NULL, NULL, NULL,
    /* 142 */ "b", NULL, NULL, NULL, NULL,
    /* 143 */ "c", NULL, NULL, NULL, NULL,
    /* 144 */ "d", NULL, NULL, NULL, NULL,
    /* 145 */ "e", NULL, NULL, NULL, NULL,
    /* 146 */ "f", NULL, NULL, NULL, NULL,
    /* 147 */ "g", NULL, NULL, NULL, NULL,
    /* 150 */ "h", NULL, NULL, NULL, NULL,
    /* 151 */ "i", NULL, NULL, NULL, NULL,
    /* 152 */ "j", NULL, NULL, NULL, NULL,
    /* 153 */ "k", NULL, NULL, NULL, NULL,
    /* 154 */ "l", NULL, NULL, NULL, NULL,
    /* 155 */ "m", NULL, NULL, NULL, NULL,
    /* 156 */ "n", NULL, NULL, NULL, NULL,
    /* 157 */ "o", NULL, NULL, NULL, NULL,
    /* 160 */ "p", NULL, NULL, NULL, NULL,
    /* 161 */ "q", NULL, NULL, NULL, NULL,
    /* 162 */ "r", NULL, NULL, NULL, NULL,
    /* 163 */ "s", NULL, NULL, NULL, NULL,
    /* 164 */ "t", NULL, NULL, NULL, NULL,
    /* 165 */ "u", NULL, NULL, NULL, NULL,
    /* 166 */ "v", NULL, NULL, NULL, NULL,
    /* 167 */ "w", NULL, NULL, NULL, NULL,
    /* 170 */ "x", NULL, NULL, NULL, NULL,
    /* 171 */ "y", NULL, NULL, NULL, NULL,
    /* 172 */ "z", NULL, NULL, NULL, NULL,
    /* 173 */ "\173", NULL, NULL, NULL, NULL,
    /* 174 */ "|", NULL, NULL, NULL, NULL,
    /* 175 */ "\175", NULL, NULL, NULL, NULL,
    /* 176 */ "\176", NULL, NULL, NULL, NULL,
    /* Put the 1/12 em \^ in this position */
    /* 177 */ "\\^", NULL, NULL, NULL, NULL,
    NULL, NULL, NULL, NULL, NULL
};
char    *SpecialSequences[][5] = {	/* Troff representations */
    /* 000 */ "\000", NULL, NULL, NULL, NULL,
    /* 001 */ "if", NULL, NULL, NULL, NULL,
    /* 002 */ "ip", NULL, NULL, NULL, NULL,
    /* 003 */ "pt", NULL, NULL, NULL, NULL,
    /* 004 */ "rh", NULL, NULL, NULL, NULL,
    /* 005 */ "cu", NULL, NULL, NULL, NULL,
    /* 006 */ "rn", NULL, NULL, NULL, NULL,
    /* 007 */ "bs", NULL, NULL, NULL, NULL,
    /* 010 */ "+-", NULL, NULL, NULL, NULL,
    /* 011 */ "<=", NULL, NULL, NULL, NULL,
    /* 012 */ ">=", NULL, NULL, NULL, NULL,
    /* 013 */ "sr", NULL, NULL, NULL, NULL,
    /* 014 */ "ts", NULL, NULL, NULL, NULL,
    /* 015 */ "is", NULL, NULL, NULL, NULL,
    /* 016 */ "sl", NULL, NULL, NULL, NULL,
    /* 017 */ "bv", NULL, NULL, NULL, NULL,
    /* 020 */ "lf", NULL, NULL, NULL, NULL,
    /* 021 */ "rf", NULL, NULL, NULL, NULL,
    /* 022 */ "lc", NULL, NULL, NULL, NULL,
    /* 023 */ "rc", NULL, NULL, NULL, NULL,
    /* 024 */ "lt", NULL, NULL, NULL, NULL,
    /* 025 */ "lb", NULL, NULL, NULL, NULL,
    /* 026 */ "rt", NULL, NULL, NULL, NULL,
    /* 027 */ "rb", NULL, NULL, NULL, NULL,
    /* 030 */ "lk", NULL, NULL, NULL, NULL,
    /* 031 */ "rk", NULL, NULL, NULL, NULL,
    /* 032 */ "sb", NULL, NULL, NULL, NULL,
    /* 033 */ "sp", NULL, NULL, NULL, NULL,
    /* 034 */ "ca", NULL, NULL, NULL, NULL,
    /* 035 */ "no", NULL, NULL, NULL, NULL,
    /* 036 */ "lh", NULL, NULL, NULL, NULL,
    /* 037 */ "mo", NULL, NULL, NULL, NULL,
    /* 040 */ "\040", NULL, NULL, NULL, NULL,
    /* 041 */ "ul", "\\_", NULL, NULL, NULL,
    /* 042 */ "\"", NULL, NULL, NULL, NULL,
    /* 043 */ "#", NULL, NULL, NULL, NULL,
    /* 044 */ "Sl", NULL, NULL, NULL, NULL,
    /* 045 */ "\045", NULL, NULL, NULL, NULL,
    /* 046 */ "\046", NULL, NULL, NULL, NULL,
    /* 047 */ "'", "aa", NULL, NULL, NULL,
    /* 050 */ "gr", NULL, NULL, NULL, NULL,
    /* 051 */ "\051", NULL, NULL, NULL, NULL,
    /* 052 */ "mu", NULL, NULL, NULL, NULL,
    /* 053 */ "pl", NULL, NULL, NULL, NULL,
    /* 054 */ "\054", NULL, NULL, NULL, NULL,
    /* 055 */ "mi", NULL, NULL, NULL, NULL,
    /* 056 */ "\056", NULL, NULL, NULL, NULL,
    /* 057 */ "di", NULL, NULL, NULL, NULL,
    /* 060 */ "==", NULL, NULL, NULL, NULL,
    /* 061 */ "~=", "~~", NULL, NULL, NULL,
    /* 062 */ "ap", NULL, NULL, NULL, NULL,
    /* 063 */ "!=", NULL, NULL, NULL, NULL,
    /* 064 */ "<-", NULL, NULL, NULL, NULL,
    /* 065 */ "->", NULL, NULL, NULL, NULL,
    /* 066 */ "ua", NULL, NULL, NULL, NULL,
    /* 067 */ "da", NULL, NULL, NULL, NULL,
    /* 070 */ "sc", NULL, NULL, NULL, NULL,
    /* 071 */ "**", NULL, NULL, NULL, NULL,
    /* 072 */ "\072", NULL, NULL, NULL, NULL,
    /* 073 */ "\073", NULL, NULL, NULL, NULL,
    /* 074 */ "<", NULL, NULL, NULL, NULL,
    /* 075 */ "=", "eq", NULL, NULL, NULL,
    /* 076 */ ">", NULL, NULL, NULL, NULL,
    /* 077 */ "\077", NULL, NULL, NULL, NULL,
    /* 100 */ "@", NULL, NULL, NULL, NULL,
    /* 101 */ "*A", NULL, NULL, NULL, NULL,
    /* 102 */ "*B", NULL, NULL, NULL, NULL,
    /* 103 */ "*G", NULL, NULL, NULL, NULL,
    /* 104 */ "*D", NULL, NULL, NULL, NULL,
    /* 105 */ "*E", NULL, NULL, NULL, NULL,
    /* 106 */ "*Z", NULL, NULL, NULL, NULL,
    /* 107 */ "*Y", NULL, NULL, NULL, NULL,
    /* 110 */ "*H", NULL, NULL, NULL, NULL,
    /* 111 */ "*I", NULL, NULL, NULL, NULL,
    /* 112 */ "*K", NULL, NULL, NULL, NULL,
    /* 113 */ "*L", NULL, NULL, NULL, NULL,
    /* 114 */ "*M", NULL, NULL, NULL, NULL,
    /* 115 */ "*N", NULL, NULL, NULL, NULL,
    /* 116 */ "*C", NULL, NULL, NULL, NULL,
    /* 117 */ "*O", NULL, NULL, NULL, NULL,
    /* 120 */ "*P", NULL, NULL, NULL, NULL,
    /* 121 */ "*R", NULL, NULL, NULL, NULL,
    /* 122 */ "*S", NULL, NULL, NULL, NULL,
    /* 123 */ "*T", NULL, NULL, NULL, NULL,
    /* 124 */ "*U", "U", NULL, NULL, NULL,
    /* 125 */ "*F", NULL, NULL, NULL, NULL,
    /* 126 */ "*X", NULL, NULL, NULL, NULL,
    /* 127 */ "*Q", NULL, NULL, NULL, NULL,
    /* 130 */ "*W", NULL, NULL, NULL, NULL,
    /* 131 */ "dd", NULL, NULL, NULL, NULL,
    /* 132 */ "br", NULL, NULL, NULL, NULL,
    /* 133 */ "ib", NULL, NULL, NULL, NULL,
    /* 134 */ "\\", NULL, NULL, NULL, NULL,
    /* 135 */ "ci", NULL, NULL, NULL, NULL,
    /* 136 */ "^", NULL, NULL, NULL, NULL,
    /* 137 */ "_", NULL, NULL, NULL, NULL,
    /* 140 */ "`", "ga", NULL, NULL, NULL,
    /* 141 */ "*a", NULL, NULL, NULL, NULL,
    /* 142 */ "*b", NULL, NULL, NULL, NULL,
    /* 143 */ "*g", NULL, NULL, NULL, NULL,
    /* 144 */ "*d", NULL, NULL, NULL, NULL,
    /* 145 */ "*e", NULL, NULL, NULL, NULL,
    /* 146 */ "*z", NULL, NULL, NULL, NULL,
    /* 147 */ "*y", NULL, NULL, NULL, NULL,
    /* 150 */ "*h", NULL, NULL, NULL, NULL,
    /* 151 */ "*i", NULL, NULL, NULL, NULL,
    /* 152 */ "*k", NULL, NULL, NULL, NULL,
    /* 153 */ "*l", NULL, NULL, NULL, NULL,
    /* 154 */ "*m", NULL, NULL, NULL, NULL,
    /* 155 */ "*n", NULL, NULL, NULL, NULL,
    /* 156 */ "*c", NULL, NULL, NULL, NULL,
    /* 157 */ "*o", NULL, NULL, NULL, NULL,
    /* 160 */ "*p", NULL, NULL, NULL, NULL,
    /* 161 */ "*r", NULL, NULL, NULL, NULL,
    /* 162 */ "*s", NULL, NULL, NULL, NULL,
    /* 163 */ "*t", NULL, NULL, NULL, NULL,
    /* 164 */ "*u", NULL, NULL, NULL, NULL,
    /* 165 */ "*f", NULL, NULL, NULL, NULL,
    /* 166 */ "*x", NULL, NULL, NULL, NULL,
    /* 167 */ "*q", NULL, NULL, NULL, NULL,
    /* 170 */ "*w", NULL, NULL, NULL, NULL,
    /* 171 */ "pd", NULL, NULL, NULL, NULL,
    /* 172 */ "es", NULL, NULL, NULL, NULL,
    /* 173 */ "{", NULL, NULL, NULL, NULL,
    /* 174 */ "or", "vr", NULL, NULL, NULL,
    /* 175 */ "}", NULL, NULL, NULL, NULL,
    /* 176 */ "~", NULL, NULL, NULL, NULL,
    /* 177 */ "\177", NULL, NULL, NULL, NULL,
    NULL, NULL, NULL, NULL, NULL
};

char	TfmName[81];	    /* Only used in error routine */
char	*WhoAmI;	    /* Argv[0] */
char	*Usage = "Usage: %s [-s] [-w width] [-l ligature]... file...\n";
Boolean	Special = FALSE;    /* Designates whether font is special. */
Bits	Ligatures;	    /* Ligatures the font does not contain. */
int	ExitStatus = SUCCEED;
int	Width = -1;	    /* "spacewidth" in font desc. file. -1==omit */

main(argc,argv)
int	argc;
char	*argv[];
{
    extern int	optind;
    extern char	*optarg;
    int		c;
    FILE	*infile, *outfile;
    void	seteoffunction(), tfmeofsoexit(), convert();
    char	*strcpy();

    WhoAmI = argv[0];
    while ((c = getopt(argc, argv, "sl:w:")) != EOF)
	switch (c) {
	case 's':
	    Special = TRUE;
	    break;
	case 'w':
	    Width = atoi(optarg);
	    break;
	case 'l':
	    if (EQ(optarg, "ff"))
		Ligatures |= LFF;
	    else if (EQ(optarg, "fi"))
		Ligatures |= LFI;
	    else if (EQ(optarg, "fl"))
		Ligatures |= LFL;
	    else if (EQ(optarg, "ffi"))
		Ligatures |= LFFI;
	    else if (EQ(optarg, "ffl"))
		Ligatures |= LFFL;
	    break;
	case '?':
	    fprintf(stderr, Usage, WhoAmI);
	    exit(FAIL);
	}
    seteoffunction(tfmeofsoexit);
    for (; optind < argc; optind++) {
	if (strlen(argv[optind]) < 5 || !EQ(".tfm",
	&argv[optind][strlen(argv[optind])-4])) {
	    fprintf(stderr, "%s: invalid input file name %s\n", WhoAmI,
	    argv[optind]);
	    ExitStatus = FAIL;
	    continue;
	}
	if (!(infile = fopen(argv[optind], "r"))) {
	    fprintf(stderr, "%s: cannot open input file %s\n", WhoAmI,
	    argv[optind]);
	    ExitStatus = FAIL;
	    continue;
	}
	(void)strcpy(TfmName, argv[optind]);
	argv[optind][strlen(argv[optind])-4] = '\0';
	if (!(outfile = fopen(argv[optind], "w"))) {
	    fprintf(stderr, "%s: cannot open output file %s\n", WhoAmI,
	    argv[optind]);
	    ExitStatus = FAIL;
	    continue;
	}
	convert(infile, outfile, argv[optind]);
	(void)fclose(infile), (void)fclose(outfile);
    }
    exit(ExitStatus);
}

/* The main routine which converts a tfm file to a troff width table file.
 */
void convert(infile, outfile, outname)
FILE	*infile, *outfile;
char	*outname;	/* Output file name */
{
    int		    aheight, i, j, widthindex, heightanddepth, width, 
		    height, depth, kerning;
    unsigned long   uinteger(), lh, bc, ec, nw, nh, designsize, utemp;
    long	    integer(), temp;

    fprintf(outfile, "name %s\ninternalname %s\n", outname, outname);
    if (Special)
	fputs("special\n", outfile);
    if (!Special && Ligatures != 0x1F) {
	fputs("ligatures ", outfile);
	if (!(Ligatures & LFF))
	    fputs("ff ", outfile);
	if (!(Ligatures & LFI))
	    fputs("fi ", outfile);
	if (!(Ligatures & LFL))
	    fputs("fl ", outfile);
	if (!(Ligatures & LFFI))
	    fputs("ffi ", outfile);
	if (!(Ligatures & LFFL))
	    fputs("ffl ", outfile);
	fputs("0\n", outfile);
    }
    if (Width != -1)
	fprintf(outfile, "spacewidth %d\n", Width);
    if (!Special) {
	if ((aheight = getaheight(infile)) == MAX_INTEGER) {
	    fprintf(stderr, "%s: no letter 'a' in file %s.tfm\n", WhoAmI,
	    outname);
	    fprintf(stderr, "\tsetting height to zero\n");
	    aheight = 0;
	}
	(void)fseek(infile, 0L, 0);	
    }
    fputs("charset\n", outfile);
    (void)uinteger(infile, 2);	/* lf */
    lh = uinteger(infile, 2);
    bc = uinteger(infile, 2);
    ec = uinteger(infile, 2);
    nw = uinteger(infile, 2);
    nh = uinteger(infile, 2);
    (void)uinteger(infile, 2);  /* nd */
    (void)uinteger(infile, 2);  /* ni */
    (void)uinteger(infile, 2);  /* nl */
    (void)uinteger(infile, 2);	/* nk */
    (void)uinteger(infile, 2);	/* ne */
    (void)uinteger(infile, 2);  /* np */
    (void)uinteger(infile, 4);	    /* Skip checksum */
    designsize = uinteger(infile, 4) / FIX;
    for (i = bc; i <= ec; i++) {
	(void)fseek(infile, 24L + 4*lh + (i-bc)*4, 0);
	widthindex = uinteger(infile, 1);
	heightanddepth = uinteger(infile, 1);
	if (widthindex == 0)
	    continue;
	(void)fseek(infile, 24L + 4*lh + (ec-bc+1)*4 + widthindex*4, 0);
	temp = integer(infile, 4);
	width = ROUND((temp / (double)FIX * designsize) / PPI * RESOLUTION);
	(void)fseek(infile, 24L + 4*lh + (ec-bc+1)*4 + nw*4 +
	(heightanddepth>>4)*4, 0);
        utemp = uinteger(infile, 4);
	height = ROUND((utemp / (double)FIX * designsize) / PPI * RESOLUTION);
	(void)fseek(infile, 24L + 4*lh + (ec-bc+1)*4 + nw*4 + nh*4 +
	(heightanddepth&0xF)*4, 0);
	utemp = uinteger(infile, 4);
	depth = ROUND((utemp / (double)FIX * designsize) / PPI * RESOLUTION);
	kerning = 0;
	if (height > aheight)
	    kerning |= 2;
	if (depth > 0)
	    kerning |= 1;
	for (j = 0; Special ? SpecialSequences[i][j] : NormalSequences[i][j];
	j++)
	    if (j == 0)
		fprintf(outfile, "%s\t%d\t%d\t%d\n", Special ? 
		SpecialSequences[i][j] : NormalSequences[i][j], width, 
		Special ? 0 : kerning, i);
	    else
	        fprintf(outfile, "%s\t\"\n", Special ? SpecialSequences[i][j] :
		NormalSequences[i][j]);
    }
}

/* Returns the height of the letter 'a' in the font passed as a parameter.
 * The height is returned in pixels since troff likes to use pixels as its
 * unit.  If the letter 'a' is not found, MAX_INTEGER is returned.
 */
int getaheight(in)
FILE	*in;
{
    unsigned long lh, bc, ec, nw, uinteger(), designsize;

    (void)fseek(in, 0L, 0);
    (void)uinteger(in, 2);	/* lf */
    lh = uinteger(in, 2);
    bc = uinteger(in, 2);
    ec = uinteger(in, 2);
    nw = uinteger(in, 2);
    (void)uinteger(in, 2);	/* nh */
    (void)uinteger(in, 2);	/* nd */
    (void)uinteger(in, 2);	/* ni */
    (void)uinteger(in, 2);	/* nl */
    (void)uinteger(in, 2);	/* nk */
    (void)uinteger(in, 2);	/* ne */
    (void)uinteger(in, 2);	/* np */
    if (bc > 'a' || ec < 'a')
	return MAX_INTEGER;
    (void)uinteger(in, 4);		    /* Skip checksum */
    designsize = uinteger(in, 4) / FIX;    /* Convert from FIXes */
    (void)fseek(in, 24L + lh*4 + ('a'-bc)*4, 0);
    if (uinteger(in, 1) == 0)
	return MAX_INTEGER;
    (void)fseek(in, 24L + lh*4 + (ec-bc+1)*4 + nw*4 + (uinteger(in,1) >> 4)*4,
    0);
    return ROUND((uinteger(in, 4) / (double)FIX * designsize) / PPI *
    RESOLUTION);
}

void tfmeofsoexit()
{
    fprintf(stderr, "%s: unexpected end of tfm file %s\n", WhoAmI, TfmName);
    exit(FAIL);
}