Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <ctype.h>
5 #include "common.h"
6 #include "tr2post.h"
7 #include "comments.h"
8 #include "path.h"
10 char *printdesclang = 0;
11 char *encoding = 0;
12 int devres;
13 int unitwidth;
14 int nspechars = 0;
15 struct charent spechars[MAXSPECHARS];
17 #define NDESCTOKS 9
18 static char *desctoks[NDESCTOKS] = {
19 "PDL",
20 "Encoding",
21 "fonts",
22 "sizes",
23 "res",
24 "hor",
25 "vert",
26 "unitwidth",
27 "charset"
28 };
30 char *spechar[MAXSPECHARS];
32 int
33 hash(char *s, int l) {
34 unsigned i;
36 for (i=0; *s; s++)
37 i = i*10 + *s;
38 return(i % l);
39 }
41 BOOLEAN
42 readDESC(void) {
43 char token[MAXTOKENSIZE];
44 char *descnameformat = "%s/dev%s/DESC";
45 char *descfilename = 0;
46 Biobuf *bfd;
47 Biobuf *Bfd;
48 int i, state = -1;
49 int fontindex = 0;
51 if (debug) Bprint(Bstderr, "readDESC()\n");
52 descfilename = galloc(descfilename, strlen(descnameformat)+strlen(FONTDIR)
53 +strlen(devname), "readdesc");
54 sprint(descfilename, descnameformat, FONTDIR, devname);
55 if ((bfd = Bopen(unsharp(descfilename), OREAD)) == 0) {
56 error(WARNING, "cannot open file %s\n", descfilename);
57 return(0);
58 }
59 Bfd = bfd; /* &(bfd->Biobufhdr); */
61 while (Bgetfield(Bfd, 's', token, MAXTOKENSIZE) > 0) {
62 for (i=0; i<NDESCTOKS; i++) {
63 if (strcmp(desctoks[i], token) == 0) {
64 state = i;
65 break;
66 }
67 }
68 if (i<NDESCTOKS) continue;
69 switch (state) {
70 case 0:
71 printdesclang=galloc(printdesclang, strlen(token)+1, "readdesc:");
72 strcpy(printdesclang, token);
73 if (debug) Bprint(Bstderr, "PDL %s\n", token);
74 break;
75 case 1:
76 encoding=galloc(encoding, strlen(token)+1, "readdesc:");
77 strcpy(encoding, token);
78 if (debug) Bprint(Bstderr, "encoding %s\n", token);
79 break;
80 case 2:
81 if (fontmnt <=0) {
82 if (!isdigit((uchar)*token)) {
83 error(WARNING, "readdesc: expecting number of fonts in mount table.\n");
84 return(FALSE);
85 }
86 fontmnt = atoi(token) + 1;
87 fontmtab = galloc(fontmtab, fontmnt*sizeof(char *), "readdesc:");
89 for (i=0; i<fontmnt; i++)
90 fontmtab[i] = 0;
91 fontindex = 0;
92 } else {
93 mountfont(++fontindex, token);
94 findtfn(token, TRUE);
95 }
96 break;
97 case 3:
98 /* I don't really care about sizes */
99 break;
100 case 4:
101 /* device resolution in dots per inch */
102 if (!isdigit((uchar)*token)) {
103 error(WARNING, "readdesc: expecting device resolution.\n");
104 return(FALSE);
106 devres = atoi(token);
107 if (debug) Bprint(Bstderr, "res %d\n", devres);
108 break;
109 case 5:
110 /* I don't really care about horizontal motion resolution */
111 if (debug) Bprint(Bstderr, "ignoring horizontal resolution\n");
112 break;
113 case 6:
114 /* I don't really care about vertical motion resolution */
115 if (debug) Bprint(Bstderr, "ignoring vertical resolution\n");
116 break;
117 case 7:
118 /* unitwidth is the font size at which the character widths are 1:1 */
119 if (!isdigit((uchar)*token)) {
120 error(WARNING, "readdesc: expecting unitwidth.\n");
121 return(FALSE);
123 unitwidth = atoi(token);
124 if (debug) Bprint(Bstderr, "unitwidth %d\n", unitwidth);
125 break;
126 case 8:
127 /* I don't really care about this list of special characters */
128 if (debug) Bprint(Bstderr, "ignoring special character <%s>\n", token);
129 break;
130 default:
131 if (*token == '#')
132 Brdline(Bfd, '\n');
133 else
134 error(WARNING, "unknown token %s in DESC file.\n", token);
135 break;
138 Bterm(Bfd);
139 return 0;