Blame


1 5cedca1b 2004-05-15 devnull #include "tdef.h"
2 5cedca1b 2004-05-15 devnull #include "fns.h"
3 5cedca1b 2004-05-15 devnull #include "ext.h"
4 5cedca1b 2004-05-15 devnull
5 5cedca1b 2004-05-15 devnull #define MAXCH NCHARS /* maximum number of global char names */
6 5cedca1b 2004-05-15 devnull char *chnames[MAXCH]; /* chnames[n-ALPHABET] -> name of char n */
7 5cedca1b 2004-05-15 devnull int nchnames; /* number of Cxy names currently seen */
8 5cedca1b 2004-05-15 devnull
9 5cedca1b 2004-05-15 devnull #define MAXPS 100 /* max number of point sizes */
10 5cedca1b 2004-05-15 devnull int pstab[MAXPS]; /* point sizes */
11 5cedca1b 2004-05-15 devnull int nsizes; /* number in DESC */
12 5cedca1b 2004-05-15 devnull
13 5cedca1b 2004-05-15 devnull Font fonts[MAXFONTS+1]; /* font info + ptr to width info */
14 5cedca1b 2004-05-15 devnull
15 5cedca1b 2004-05-15 devnull
16 5cedca1b 2004-05-15 devnull #define skipline(f) while (getc(f) != '\n')
17 5cedca1b 2004-05-15 devnull
18 5cedca1b 2004-05-15 devnull #define eq(s1, s2) (strcmp(s1, s2) == 0)
19 5cedca1b 2004-05-15 devnull
20 c5561c23 2004-05-16 devnull int
21 5cedca1b 2004-05-15 devnull getdesc(char *name)
22 5cedca1b 2004-05-15 devnull {
23 5cedca1b 2004-05-15 devnull FILE *fin;
24 5cedca1b 2004-05-15 devnull char cmd[100], s[100];
25 5cedca1b 2004-05-15 devnull int i, v;
26 5cedca1b 2004-05-15 devnull
27 1f72bc47 2004-05-17 devnull if ((fin = fopen(unsharp(name), "r")) == NULL)
28 5cedca1b 2004-05-15 devnull return -1;
29 5cedca1b 2004-05-15 devnull while (fscanf(fin, "%s", cmd) != EOF) {
30 5cedca1b 2004-05-15 devnull if (strcmp(cmd, "res") == 0) {
31 5cedca1b 2004-05-15 devnull fscanf(fin, "%d", &Inch);
32 5cedca1b 2004-05-15 devnull } else if (strcmp(cmd, "hor") == 0) {
33 5cedca1b 2004-05-15 devnull fscanf(fin, "%d", &Hor);
34 5cedca1b 2004-05-15 devnull } else if (strcmp(cmd, "vert") == 0) {
35 5cedca1b 2004-05-15 devnull fscanf(fin, "%d", &Vert);
36 5cedca1b 2004-05-15 devnull } else if (strcmp(cmd, "unitwidth") == 0) {
37 5cedca1b 2004-05-15 devnull fscanf(fin, "%d", &Unitwidth);
38 5cedca1b 2004-05-15 devnull } else if (strcmp(cmd, "sizes") == 0) {
39 5cedca1b 2004-05-15 devnull nsizes = 0;
40 5cedca1b 2004-05-15 devnull while (fscanf(fin, "%d", &v) != EOF && v != 0 && nsizes < MAXPS)
41 5cedca1b 2004-05-15 devnull pstab[nsizes++] = v;
42 5cedca1b 2004-05-15 devnull } else if (strcmp(cmd, "fonts") == 0) {
43 5cedca1b 2004-05-15 devnull fscanf(fin, "%d", &nfonts);
44 5cedca1b 2004-05-15 devnull for (i = 1; i <= nfonts; i++) {
45 5cedca1b 2004-05-15 devnull fscanf(fin, "%s", s);
46 5cedca1b 2004-05-15 devnull fontlab[i] = PAIR(s[0], s[1]);
47 5cedca1b 2004-05-15 devnull }
48 5cedca1b 2004-05-15 devnull } else if (strcmp(cmd, "charset") == 0) { /* add any names */
49 5cedca1b 2004-05-15 devnull while (fscanf(fin, "%s", s) != EOF)
50 5cedca1b 2004-05-15 devnull chadd(s, Troffchar, Install);
51 5cedca1b 2004-05-15 devnull break;
52 5cedca1b 2004-05-15 devnull }
53 fa325e9b 2020-01-10 cross /* else
54 5cedca1b 2004-05-15 devnull just skip anything else */
55 5cedca1b 2004-05-15 devnull skipline(fin);
56 5cedca1b 2004-05-15 devnull }
57 5cedca1b 2004-05-15 devnull fclose(fin);
58 5cedca1b 2004-05-15 devnull return 1;
59 5cedca1b 2004-05-15 devnull }
60 5cedca1b 2004-05-15 devnull
61 5cedca1b 2004-05-15 devnull static int checkfont(char *name)
62 5cedca1b 2004-05-15 devnull { /* in case it's not really a font description file */
63 5cedca1b 2004-05-15 devnull /* really paranoid, but consider \f. */
64 5cedca1b 2004-05-15 devnull FILE *fp;
65 5cedca1b 2004-05-15 devnull char buf[300], buf2[300];
66 5cedca1b 2004-05-15 devnull int i, status = -1;
67 5cedca1b 2004-05-15 devnull
68 1f72bc47 2004-05-17 devnull if ((fp = fopen(unsharp(name), "r")) == NULL)
69 5cedca1b 2004-05-15 devnull return -1;
70 5cedca1b 2004-05-15 devnull for (i = 1; i <= 10; i++) {
71 5cedca1b 2004-05-15 devnull if (fgets(buf, sizeof buf, fp) == NULL)
72 5cedca1b 2004-05-15 devnull break;
73 5cedca1b 2004-05-15 devnull sscanf(buf, "%s", buf2);
74 5cedca1b 2004-05-15 devnull if (buf2[0] == '#') {
75 5cedca1b 2004-05-15 devnull i--;
76 5cedca1b 2004-05-15 devnull continue;
77 5cedca1b 2004-05-15 devnull }
78 5cedca1b 2004-05-15 devnull if (eq(buf2, "name") || eq(buf2, "fontname") ||
79 5cedca1b 2004-05-15 devnull eq(buf2, "special") || eq(buf2, "charset")) {
80 5cedca1b 2004-05-15 devnull status = 1;
81 5cedca1b 2004-05-15 devnull break;
82 5cedca1b 2004-05-15 devnull }
83 5cedca1b 2004-05-15 devnull }
84 5cedca1b 2004-05-15 devnull fclose(fp);
85 5cedca1b 2004-05-15 devnull return status;
86 fa325e9b 2020-01-10 cross
87 5cedca1b 2004-05-15 devnull }
88 5cedca1b 2004-05-15 devnull
89 c5561c23 2004-05-16 devnull int
90 5cedca1b 2004-05-15 devnull getfont(char *name, int pos) /* create width tab for font */
91 5cedca1b 2004-05-15 devnull {
92 5cedca1b 2004-05-15 devnull FILE *fin;
93 5cedca1b 2004-05-15 devnull Font *ftemp = &fonts[pos];
94 5cedca1b 2004-05-15 devnull Chwid chtemp[MAXCH];
95 5cedca1b 2004-05-15 devnull static Chwid chinit;
96 5cedca1b 2004-05-15 devnull int i, nw, n, wid, kern, code, type;
97 5cedca1b 2004-05-15 devnull char buf[100], ch[100], s1[100], s2[100], s3[100], cmd[300];
98 5cedca1b 2004-05-15 devnull
99 c5561c23 2004-05-16 devnull nw = code = 0;
100 5cedca1b 2004-05-15 devnull /* fprintf(stderr, "read font %s onto %d\n", name, pos); */
101 5cedca1b 2004-05-15 devnull if (checkfont(name) == -1)
102 5cedca1b 2004-05-15 devnull return -1;
103 1f72bc47 2004-05-17 devnull if ((fin = fopen(unsharp(name), "r")) == NULL)
104 5cedca1b 2004-05-15 devnull return -1;
105 5cedca1b 2004-05-15 devnull for (i = 0; i < ALPHABET; i++)
106 5cedca1b 2004-05-15 devnull chtemp[i] = chinit; /* zero out to begin with */
107 5cedca1b 2004-05-15 devnull ftemp->specfont = ftemp->ligfont = 0;
108 5cedca1b 2004-05-15 devnull ftemp->defaultwidth = ftemp->spacewidth = Inch * Unitwidth / 72 / 3; /* should be rounded */
109 5cedca1b 2004-05-15 devnull while (fscanf(fin, "%s", cmd) != EOF) {
110 5cedca1b 2004-05-15 devnull if (strcmp(cmd, "name") == 0)
111 5cedca1b 2004-05-15 devnull fscanf(fin, "%s", ftemp->longname);
112 5cedca1b 2004-05-15 devnull else if (strcmp(cmd, "special") == 0)
113 5cedca1b 2004-05-15 devnull ftemp->specfont = 1;
114 5cedca1b 2004-05-15 devnull else if (strcmp(cmd, "ligatures") == 0) {
115 5cedca1b 2004-05-15 devnull ftemp->ligfont = getlig(fin);
116 5cedca1b 2004-05-15 devnull } else if (strcmp(cmd, "spacewidth") == 0) {
117 5cedca1b 2004-05-15 devnull fscanf(fin, "%d", &ftemp->spacewidth);
118 5cedca1b 2004-05-15 devnull } else if (strcmp(cmd, "defaultwidth") == 0) {
119 5cedca1b 2004-05-15 devnull fscanf(fin, "%d", &ftemp->defaultwidth);
120 5cedca1b 2004-05-15 devnull } else if (strcmp(cmd, "charset") == 0) {
121 5cedca1b 2004-05-15 devnull wchar_t wc;
122 5cedca1b 2004-05-15 devnull skipline(fin);
123 5cedca1b 2004-05-15 devnull nw = ALPHABET;
124 5cedca1b 2004-05-15 devnull while (fgets(buf, sizeof buf, fin) != NULL) {
125 5cedca1b 2004-05-15 devnull sscanf(buf, "%s %s %s %s", ch, s1, s2, s3);
126 5cedca1b 2004-05-15 devnull if (s1[0] != '"') { /* genuine new character */
127 5cedca1b 2004-05-15 devnull sscanf(s1, "%d", &wid);
128 5cedca1b 2004-05-15 devnull sscanf(s2, "%d", &kern);
129 5cedca1b 2004-05-15 devnull code = strtol(s3, 0, 0); /* dec/oct/hex */
130 5cedca1b 2004-05-15 devnull }
131 5cedca1b 2004-05-15 devnull /* otherwise it's a synonym for prev character, */
132 5cedca1b 2004-05-15 devnull /* so leave previous values intact */
133 5cedca1b 2004-05-15 devnull
134 5cedca1b 2004-05-15 devnull
135 5cedca1b 2004-05-15 devnull /* decide what kind of alphabet it might come from here */
136 5cedca1b 2004-05-15 devnull
137 5cedca1b 2004-05-15 devnull
138 5cedca1b 2004-05-15 devnull if (strlen(ch) == 1) { /* it's ascii */
139 5cedca1b 2004-05-15 devnull n = ch[0]; /* origin includes non-graphics */
140 5cedca1b 2004-05-15 devnull chtemp[n].num = ch[0];
141 5cedca1b 2004-05-15 devnull } else if (ch[0] == '\\' && ch[1] == '0') {
142 5cedca1b 2004-05-15 devnull n = strtol(ch+1, 0, 0); /* \0octal or \0xhex */
143 5cedca1b 2004-05-15 devnull chtemp[n].num = n;
144 5cedca1b 2004-05-15 devnull #ifdef UNICODE
145 5cedca1b 2004-05-15 devnull } else if (mbtowc(&wc, ch, strlen(ch)) > 1) {
146 5cedca1b 2004-05-15 devnull chtemp[nw].num = chadd(ch, MBchar, Install);
147 5cedca1b 2004-05-15 devnull n = nw;
148 5cedca1b 2004-05-15 devnull nw++;
149 5cedca1b 2004-05-15 devnull #endif /*UNICODE*/
150 5cedca1b 2004-05-15 devnull } else {
151 5cedca1b 2004-05-15 devnull if (strcmp(ch, "---") == 0) { /* no name */
152 5cedca1b 2004-05-15 devnull sprintf(ch, "%d", code);
153 5cedca1b 2004-05-15 devnull type = Number;
154 5cedca1b 2004-05-15 devnull } else
155 5cedca1b 2004-05-15 devnull type = Troffchar;
156 5cedca1b 2004-05-15 devnull chtemp[nw].num = chadd(ch, type, Install);
157 5cedca1b 2004-05-15 devnull n = nw;
158 5cedca1b 2004-05-15 devnull nw++;
159 5cedca1b 2004-05-15 devnull }
160 5cedca1b 2004-05-15 devnull chtemp[n].wid = wid;
161 5cedca1b 2004-05-15 devnull chtemp[n].kern = kern;
162 5cedca1b 2004-05-15 devnull chtemp[n].code = code;
163 5cedca1b 2004-05-15 devnull /*fprintf(stderr, "font %2.2s char %4.4s num %3d wid %2d code %3d\n",
164 5cedca1b 2004-05-15 devnull ftemp->longname, ch, n, wid, code);
165 5cedca1b 2004-05-15 devnull */
166 5cedca1b 2004-05-15 devnull }
167 5cedca1b 2004-05-15 devnull break;
168 5cedca1b 2004-05-15 devnull }
169 5cedca1b 2004-05-15 devnull skipline(fin);
170 5cedca1b 2004-05-15 devnull }
171 5cedca1b 2004-05-15 devnull fclose(fin);
172 5cedca1b 2004-05-15 devnull chtemp[' '].wid = ftemp->spacewidth; /* width of space on this font */
173 5cedca1b 2004-05-15 devnull ftemp->nchars = nw;
174 5cedca1b 2004-05-15 devnull if (ftemp->wp)
175 5cedca1b 2004-05-15 devnull free(ftemp->wp); /* god help us if this wasn't allocated */
176 5cedca1b 2004-05-15 devnull ftemp->wp = (Chwid *) malloc(nw * sizeof(Chwid));
177 5cedca1b 2004-05-15 devnull if (ftemp->wp == NULL)
178 5cedca1b 2004-05-15 devnull return -1;
179 5cedca1b 2004-05-15 devnull for (i = 0; i < nw; i++)
180 5cedca1b 2004-05-15 devnull ftemp->wp[i] = chtemp[i];
181 5cedca1b 2004-05-15 devnull /*
182 5cedca1b 2004-05-15 devnull * printf("%d chars: ", nw);
183 5cedca1b 2004-05-15 devnull * for (i = 0; i < nw; i++)
184 5cedca1b 2004-05-15 devnull * if (ftemp->wp[i].num > 0 && ftemp->wp[i].num < ALPHABET) {
185 5cedca1b 2004-05-15 devnull * printf("%c %d ", ftemp->wp[i].num, ftemp->wp[i].wid);
186 5cedca1b 2004-05-15 devnull * else if (i >= ALPHABET)
187 5cedca1b 2004-05-15 devnull * printf("%d (%s) %d ", ftemp->wp[i].num,
188 5cedca1b 2004-05-15 devnull * chnames[ftemp->wp[i].num-ALPHABET], ftemp->wp[i].wid);
189 5cedca1b 2004-05-15 devnull * }
190 5cedca1b 2004-05-15 devnull * printf("\n");
191 5cedca1b 2004-05-15 devnull */
192 5cedca1b 2004-05-15 devnull return 1;
193 5cedca1b 2004-05-15 devnull }
194 5cedca1b 2004-05-15 devnull
195 c5561c23 2004-05-16 devnull int
196 5cedca1b 2004-05-15 devnull chadd(char *s, int type, int install) /* add s to global character name table; */
197 5cedca1b 2004-05-15 devnull { /* or just look it up */
198 5cedca1b 2004-05-15 devnull
199 5cedca1b 2004-05-15 devnull /* a temporary kludge: store the "type" as the first character */
200 5cedca1b 2004-05-15 devnull /* of the string, so we can remember from whence it came */
201 5cedca1b 2004-05-15 devnull
202 5cedca1b 2004-05-15 devnull char *p;
203 5cedca1b 2004-05-15 devnull int i;
204 5cedca1b 2004-05-15 devnull
205 5cedca1b 2004-05-15 devnull /* fprintf(stderr, "into chadd %s %c %c\n", s, type, install); /* */
206 5cedca1b 2004-05-15 devnull for (i = 0; i < nchnames; i++)
207 5cedca1b 2004-05-15 devnull if (type == chnames[i][0] && eq(s, chnames[i]+1)) /* +1 since type at front */
208 5cedca1b 2004-05-15 devnull break;
209 5cedca1b 2004-05-15 devnull /* fprintf(stderr, "i %d, nchnames %d\n", i, nchnames); /* */
210 5cedca1b 2004-05-15 devnull if (i < nchnames) /* found same type and bytes at position i */
211 5cedca1b 2004-05-15 devnull return ALPHABET + i;
212 5cedca1b 2004-05-15 devnull else if (install == Lookup) /* not found, and we were just looking */
213 5cedca1b 2004-05-15 devnull return -1;
214 5cedca1b 2004-05-15 devnull
215 5cedca1b 2004-05-15 devnull chnames[nchnames] = p = (char *) malloc(strlen(s)+1+1); /* type + \0 */
216 5cedca1b 2004-05-15 devnull if (p == NULL) {
217 5cedca1b 2004-05-15 devnull ERROR "out of space adding character %s", s WARN;
218 5cedca1b 2004-05-15 devnull return LEFTHAND;
219 5cedca1b 2004-05-15 devnull }
220 5cedca1b 2004-05-15 devnull if (nchnames >= NCHARS - ALPHABET) {
221 5cedca1b 2004-05-15 devnull ERROR "out of table space adding character %s", s WARN;
222 5cedca1b 2004-05-15 devnull return LEFTHAND;
223 5cedca1b 2004-05-15 devnull }
224 5cedca1b 2004-05-15 devnull strcpy(chnames[nchnames]+1, s);
225 5cedca1b 2004-05-15 devnull chnames[nchnames][0] = type;
226 5cedca1b 2004-05-15 devnull /* fprintf(stderr, "installed %c%s at %d\n", type, s, nchnames); /* */
227 5cedca1b 2004-05-15 devnull return nchnames++ + ALPHABET;
228 5cedca1b 2004-05-15 devnull }
229 5cedca1b 2004-05-15 devnull
230 5cedca1b 2004-05-15 devnull char *chname(int n) /* return string for char with index n */
231 5cedca1b 2004-05-15 devnull { /* includes type char at front, to be peeled off elsewhere */
232 5cedca1b 2004-05-15 devnull if (n >= ALPHABET && n < nchnames + ALPHABET)
233 5cedca1b 2004-05-15 devnull return chnames[n-ALPHABET];
234 5cedca1b 2004-05-15 devnull else
235 5cedca1b 2004-05-15 devnull return "";
236 5cedca1b 2004-05-15 devnull }
237 5cedca1b 2004-05-15 devnull
238 c5561c23 2004-05-16 devnull int
239 5cedca1b 2004-05-15 devnull getlig(FILE *fin) /* pick up ligature list */
240 5cedca1b 2004-05-15 devnull {
241 5cedca1b 2004-05-15 devnull int lig;
242 5cedca1b 2004-05-15 devnull char temp[200];
243 5cedca1b 2004-05-15 devnull
244 5cedca1b 2004-05-15 devnull lig = 0;
245 5cedca1b 2004-05-15 devnull while (fscanf(fin, "%s", temp) != EOF && strcmp(temp, "0") != 0) {
246 5cedca1b 2004-05-15 devnull if (strcmp(temp, "fi") == 0)
247 5cedca1b 2004-05-15 devnull lig |= LFI;
248 5cedca1b 2004-05-15 devnull else if (strcmp(temp, "fl") == 0)
249 5cedca1b 2004-05-15 devnull lig |= LFL;
250 5cedca1b 2004-05-15 devnull else if (strcmp(temp, "ff") == 0)
251 5cedca1b 2004-05-15 devnull lig |= LFF;
252 5cedca1b 2004-05-15 devnull else if (strcmp(temp, "ffi") == 0)
253 5cedca1b 2004-05-15 devnull lig |= LFFI;
254 5cedca1b 2004-05-15 devnull else if (strcmp(temp, "ffl") == 0)
255 5cedca1b 2004-05-15 devnull lig |= LFFL;
256 5cedca1b 2004-05-15 devnull else
257 5cedca1b 2004-05-15 devnull fprintf(stderr, "illegal ligature %s ignored\n", temp);
258 5cedca1b 2004-05-15 devnull }
259 5cedca1b 2004-05-15 devnull return lig;
260 5cedca1b 2004-05-15 devnull }