|
|
1.1 root 1: /*
2: * fonts.c
3: * Troff.
4: * Font loading.
5: */
6:
7: #include <ctype.h>
8: #include <canon.h>
9: #include "roff.h"
10:
11: static int errflag; /* font table read error flag */
12: int nfonts; /* number of fonts available */
13:
14: /*
15: * Map user font names to font numbers.
16: * Several troff font names can map to the same font number.
17: * Entries get added by .lf or .rf.
18: */
19: FTB fontab[NFNAMES];
20:
21: /*
22: * Font width table pointers, indexed by font number.
23: * The order of built-in entries corresponds to the indices in "fonts.h".
24: * The .lf request adds additional entries to this table.
25: */
26: FWTAB *fwptab[NFONTS];
27:
28: /* Read a canonical short from file. */
29: int
30: get_short(fp) register FILE *fp;
31: {
32: short s;
33:
34: if (fread(&s, sizeof s, 1, fp) != 1)
35: errflag = 1;
36: canint(s);
37: return (int)s;
38: }
39:
40: /*
41: * Read a NUL-terminated string from file.
42: * Return a pointer to a newly allocated copy of it.
43: * Die if it is too long.
44: */
45: #define NBUF 256
46: char *
47: get_str(fp) register FILE *fp;
48: {
49: static char buf[NBUF];
50: register char *s;
51: register int c;
52:
53: for (s = buf; s < &buf[NBUF]; ) {
54: c = fgetc(fp);
55: *s++ = c;
56: if (c == '\0')
57: break;
58: else if (c == EOF) {
59: errflag = 1;
60: return NULL;
61: }
62: }
63: if (s == &buf[NBUF]) {
64: errflag = 1;
65: return;
66: }
67: s = nalloc(strlen(buf) + 1);
68: strcpy(s, buf);
69: return s;
70: }
71:
72: void
73: load_font(s, file) char *s, *file;
74: {
75: register FWTAB *p;
76: register FILE *fp;
77: int i, new, newflag;
78:
79: if ((fp = fopen(file, "rb")) == NULL) {
80: /* Not found, look in default fwt directory. */
81: sprintf(miscbuf, "%s%sfwt/%s",
82: LIBDIR, (pflag) ? TPSDIR : TPCLDIR, file);
83: if ((fp = fopen(miscbuf, "rb")) == NULL) {
84: printe(".lf: cannot open file \"%s\"", file);
85: return;
86: }
87: }
88: if ((new = font_num(s)) == -1) {
89: /* Font does not already exist, allocate new FWTAB entry. */
90: if (nfonts >= NFONTS) {
91: printe(".lf: cannot load more than %d fonts", NFONTS);
92: return;
93: }
94: newflag = 1;
95: new = nfonts; /* assign new font number */
96: fwptab[new] = nalloc(sizeof(FWTAB)); /* allocate new FWTAB */
97: } else
98: newflag = 0;
99: errflag = 0;
100: p = fwptab[new];
101: p->f_descr = get_str(fp);
102: p->f_PSname = get_str(fp);
103: p->f_flags = get_short(fp);
104: p->f_fonttype = get_short(fp);
105: p->f_orientation = get_short(fp);
106: p->f_spacing = get_short(fp);
107: p->f_symset = get_short(fp);
108: p->f_pitch = get_short(fp);
109: p->f_psz = get_short(fp);
110: p->f_style= get_short(fp);
111: p->f_weight = get_short(fp);
112: p->f_face = get_short(fp);
113: p->f_num = get_short(fp);
114: p->f_den = get_short(fp);
115: for (i = 0; i < NWIDTH; i++)
116: p->f_width[i] = fgetc(fp);
117: i = fgetc(fp); /* should return EOF */
118: fclose(fp);
119: if (i != EOF || errflag) {
120: printe(".lf: %s, file \"%s\"",
121: (i != EOF) ? "bad font width table" : "read error",
122: file);
123: if (newflag)
124: free(p);
125: return;
126: } else if ((p->f_flags & F_PCL) == 0 && !pflag)
127: printe(".lf: \"%s\" is not a PCL font width table", file);
128: else if ((p->f_flags & F_PS) == 0 && pflag)
129: printe(".lf: \"%s\" is not a PostScript font width table", file);
130: fpsz[new] = p->f_psz; /* enter pointsize in env */
131: fcsz[new] = 0; /* enter const char size in env */
132: assign_font(s, new); /* and assign desired name */
133: if (newflag)
134: ++nfonts;
135: }
136:
137: /*
138: * List all the font names and descriptions in this version.
139: */
140: void
141: font_display()
142: {
143: register FTB *p;
144: register int a, b;
145:
146: fprintf(stderr, "Fonts available in this version:\n");
147: for (p = fontab; p < &fontab[NFNAMES]; p++) {
148: if ((a = p->f_name[0]) == 0)
149: break;
150: if ((b = p->f_name[1]) == 0)
151: b = ' ';
152: fprintf(stderr," %c%c %s\n", a, b, fwptab[p->f_font]->f_descr);
153: }
154: fprintf(stderr,
155: "Additional fonts may be loaded with the .lf request.\n"
156: "Fonts may be renamed with the .rf request.\n"
157: );
158: }
159:
160: /*
161: * Return fontname associated with font number n.
162: * Because the mapping is many->one, the user might have
163: * specified the font with a different name.
164: * The returned value points to a statically allocated buffer.
165: */
166: char *
167: fontname(n) register int n;
168: {
169: static char buf[3];
170: register FTB *p;
171:
172: for (p = fontab; p < &fontab[NFNAMES]; p++) {
173: if (p->f_font == n) {
174: buf[0] = p->f_name[0];
175: buf[1] = p->f_name[1];
176: buf[2] = '\0';
177: return buf;
178: }
179: }
180: return NULL;
181: }
182:
183: /* end of fonts.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.