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