1219b2ee8SDavid du Colombier #include <u.h>
2219b2ee8SDavid du Colombier #include <libc.h>
3219b2ee8SDavid du Colombier #include <bio.h>
4219b2ee8SDavid du Colombier #include <ctype.h>
5219b2ee8SDavid du Colombier #include "common.h"
6219b2ee8SDavid du Colombier #include "tr2post.h"
7219b2ee8SDavid du Colombier #include "comments.h"
8219b2ee8SDavid du Colombier #include "path.h"
9219b2ee8SDavid du Colombier
10219b2ee8SDavid du Colombier char *printdesclang = 0;
11219b2ee8SDavid du Colombier char *encoding = 0;
12219b2ee8SDavid du Colombier int devres;
13219b2ee8SDavid du Colombier int unitwidth;
14219b2ee8SDavid du Colombier int nspechars = 0;
15219b2ee8SDavid du Colombier struct charent spechars[MAXSPECHARS];
16219b2ee8SDavid du Colombier
17219b2ee8SDavid du Colombier #define NDESCTOKS 9
18219b2ee8SDavid du Colombier static char *desctoks[NDESCTOKS] = {
19219b2ee8SDavid du Colombier "PDL",
20219b2ee8SDavid du Colombier "Encoding",
21219b2ee8SDavid du Colombier "fonts",
22219b2ee8SDavid du Colombier "sizes",
23219b2ee8SDavid du Colombier "res",
24219b2ee8SDavid du Colombier "hor",
25219b2ee8SDavid du Colombier "vert",
26219b2ee8SDavid du Colombier "unitwidth",
27219b2ee8SDavid du Colombier "charset"
28219b2ee8SDavid du Colombier };
29219b2ee8SDavid du Colombier
30219b2ee8SDavid du Colombier char *spechar[MAXSPECHARS];
31219b2ee8SDavid du Colombier
32219b2ee8SDavid du Colombier int
hash(char * s,int l)33219b2ee8SDavid du Colombier hash(char *s, int l) {
34219b2ee8SDavid du Colombier unsigned i;
35219b2ee8SDavid du Colombier
36219b2ee8SDavid du Colombier for (i=0; *s; s++)
37219b2ee8SDavid du Colombier i = i*10 + *s;
38219b2ee8SDavid du Colombier return(i % l);
39219b2ee8SDavid du Colombier }
40219b2ee8SDavid du Colombier
41219b2ee8SDavid du Colombier BOOLEAN
readDESC(void)42*6ca6a3e7SDavid du Colombier readDESC(void)
43*6ca6a3e7SDavid du Colombier {
44219b2ee8SDavid du Colombier char token[MAXTOKENSIZE];
45219b2ee8SDavid du Colombier char *descnameformat = "%s/dev%s/DESC";
46219b2ee8SDavid du Colombier char *descfilename = 0;
47219b2ee8SDavid du Colombier Biobuf *bfd;
48219b2ee8SDavid du Colombier Biobufhdr *Bfd;
49219b2ee8SDavid du Colombier int i, state = -1;
50219b2ee8SDavid du Colombier int fontindex = 0;
51219b2ee8SDavid du Colombier
52219b2ee8SDavid du Colombier if (debug) Bprint(Bstderr, "readDESC()\n");
53219b2ee8SDavid du Colombier descfilename = galloc(descfilename, strlen(descnameformat)+strlen(FONTDIR)
54219b2ee8SDavid du Colombier +strlen(devname), "readdesc");
55219b2ee8SDavid du Colombier sprint(descfilename, descnameformat, FONTDIR, devname);
56219b2ee8SDavid du Colombier if ((bfd = Bopen(descfilename, OREAD)) == 0) {
57219b2ee8SDavid du Colombier error(WARNING, "cannot open file %s\n", descfilename);
58*6ca6a3e7SDavid du Colombier return 0;
59219b2ee8SDavid du Colombier }
60219b2ee8SDavid du Colombier Bfd = &(bfd->Biobufhdr);
61219b2ee8SDavid du Colombier
62219b2ee8SDavid du Colombier while (Bgetfield(Bfd, 's', token, MAXTOKENSIZE) > 0) {
63219b2ee8SDavid du Colombier for (i=0; i<NDESCTOKS; i++) {
64219b2ee8SDavid du Colombier if (strcmp(desctoks[i], token) == 0) {
65219b2ee8SDavid du Colombier state = i;
66219b2ee8SDavid du Colombier break;
67219b2ee8SDavid du Colombier }
68219b2ee8SDavid du Colombier }
69219b2ee8SDavid du Colombier if (i<NDESCTOKS) continue;
70219b2ee8SDavid du Colombier switch (state) {
71219b2ee8SDavid du Colombier case 0:
72219b2ee8SDavid du Colombier printdesclang=galloc(printdesclang, strlen(token)+1, "readdesc:");
73219b2ee8SDavid du Colombier strcpy(printdesclang, token);
74219b2ee8SDavid du Colombier if (debug) Bprint(Bstderr, "PDL %s\n", token);
75219b2ee8SDavid du Colombier break;
76219b2ee8SDavid du Colombier case 1:
77219b2ee8SDavid du Colombier encoding=galloc(encoding, strlen(token)+1, "readdesc:");
78219b2ee8SDavid du Colombier strcpy(encoding, token);
79219b2ee8SDavid du Colombier if (debug) Bprint(Bstderr, "encoding %s\n", token);
80219b2ee8SDavid du Colombier break;
81219b2ee8SDavid du Colombier case 2:
82219b2ee8SDavid du Colombier if (fontmnt <=0) {
83219b2ee8SDavid du Colombier if (!isdigit(*token)) {
84219b2ee8SDavid du Colombier error(WARNING, "readdesc: expecting number of fonts in mount table.\n");
85*6ca6a3e7SDavid du Colombier return FALSE;
86219b2ee8SDavid du Colombier }
87219b2ee8SDavid du Colombier fontmnt = atoi(token) + 1;
88219b2ee8SDavid du Colombier fontmtab = galloc(fontmtab, fontmnt*sizeof(char *), "readdesc:");
89219b2ee8SDavid du Colombier
90219b2ee8SDavid du Colombier for (i=0; i<fontmnt; i++)
91219b2ee8SDavid du Colombier fontmtab[i] = 0;
92219b2ee8SDavid du Colombier fontindex = 0;
93219b2ee8SDavid du Colombier } else {
94219b2ee8SDavid du Colombier mountfont(++fontindex, token);
95219b2ee8SDavid du Colombier findtfn(token, TRUE);
96219b2ee8SDavid du Colombier }
97219b2ee8SDavid du Colombier break;
98219b2ee8SDavid du Colombier case 3:
99219b2ee8SDavid du Colombier /* I don't really care about sizes */
100219b2ee8SDavid du Colombier break;
101219b2ee8SDavid du Colombier case 4:
102219b2ee8SDavid du Colombier /* device resolution in dots per inch */
103219b2ee8SDavid du Colombier if (!isdigit(*token)) {
104219b2ee8SDavid du Colombier error(WARNING, "readdesc: expecting device resolution.\n");
105*6ca6a3e7SDavid du Colombier return FALSE;
106219b2ee8SDavid du Colombier }
107219b2ee8SDavid du Colombier devres = atoi(token);
108219b2ee8SDavid du Colombier if (debug) Bprint(Bstderr, "res %d\n", devres);
109219b2ee8SDavid du Colombier break;
110219b2ee8SDavid du Colombier case 5:
111219b2ee8SDavid du Colombier /* I don't really care about horizontal motion resolution */
112219b2ee8SDavid du Colombier if (debug) Bprint(Bstderr, "ignoring horizontal resolution\n");
113219b2ee8SDavid du Colombier break;
114219b2ee8SDavid du Colombier case 6:
115219b2ee8SDavid du Colombier /* I don't really care about vertical motion resolution */
116219b2ee8SDavid du Colombier if (debug) Bprint(Bstderr, "ignoring vertical resolution\n");
117219b2ee8SDavid du Colombier break;
118219b2ee8SDavid du Colombier case 7:
119219b2ee8SDavid du Colombier /* unitwidth is the font size at which the character widths are 1:1 */
120219b2ee8SDavid du Colombier if (!isdigit(*token)) {
121219b2ee8SDavid du Colombier error(WARNING, "readdesc: expecting unitwidth.\n");
122219b2ee8SDavid du Colombier return(FALSE);
123219b2ee8SDavid du Colombier }
124219b2ee8SDavid du Colombier unitwidth = atoi(token);
125219b2ee8SDavid du Colombier if (debug) Bprint(Bstderr, "unitwidth %d\n", unitwidth);
126219b2ee8SDavid du Colombier break;
127219b2ee8SDavid du Colombier case 8:
128219b2ee8SDavid du Colombier /* I don't really care about this list of special characters */
129219b2ee8SDavid du Colombier if (debug) Bprint(Bstderr, "ignoring special character <%s>\n", token);
130219b2ee8SDavid du Colombier break;
131219b2ee8SDavid du Colombier default:
132219b2ee8SDavid du Colombier if (*token == '#')
133219b2ee8SDavid du Colombier Brdline(Bfd, '\n');
134219b2ee8SDavid du Colombier else
135219b2ee8SDavid du Colombier error(WARNING, "unknown token %s in DESC file.\n", token);
136219b2ee8SDavid du Colombier break;
137219b2ee8SDavid du Colombier }
138219b2ee8SDavid du Colombier }
139219b2ee8SDavid du Colombier Bterm(Bfd);
140*6ca6a3e7SDavid du Colombier return 0;
141219b2ee8SDavid du Colombier }
142