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