diff options
Diffstat (limited to 'dviware/quicspool/src/tfm2difont.c')
-rw-r--r-- | dviware/quicspool/src/tfm2difont.c | 489 |
1 files changed, 489 insertions, 0 deletions
diff --git a/dviware/quicspool/src/tfm2difont.c b/dviware/quicspool/src/tfm2difont.c new file mode 100644 index 0000000000..4fa2c12560 --- /dev/null +++ b/dviware/quicspool/src/tfm2difont.c @@ -0,0 +1,489 @@ +#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); +} |