xref: /plan9/sys/src/cmd/postscript/tr2post/readDESC.c (revision 6ca6a3e703ee2ec4aed99c2177f71d7f127da6d9)
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