| #include <u.h> |
| #include <libc.h> |
| #include <bio.h> |
| #include <ctype.h> |
| #include "common.h" |
| #include "tr2post.h" |
| #include "comments.h" |
| #include "path.h" |
| |
| char *printdesclang = 0; |
| char *encoding = 0; |
| int devres; |
| int unitwidth; |
| int nspechars = 0; |
| struct charent spechars[MAXSPECHARS]; |
| |
| #define NDESCTOKS 9 |
| static char *desctoks[NDESCTOKS] = { |
| "PDL", |
| "Encoding", |
| "fonts", |
| "sizes", |
| "res", |
| "hor", |
| "vert", |
| "unitwidth", |
| "charset" |
| }; |
| |
| char *spechar[MAXSPECHARS]; |
| |
| int |
| hash(char *s, int l) { |
| unsigned i; |
| |
| for (i=0; *s; s++) |
| i = i*10 + *s; |
| return(i % l); |
| } |
| |
| BOOLEAN |
| readDESC(void) { |
| char token[MAXTOKENSIZE]; |
| char *descnameformat = "%s/dev%s/DESC"; |
| char *descfilename = 0; |
| Biobuf *bfd; |
| Biobuf *Bfd; |
| int i, state = -1; |
| int fontindex = 0; |
| |
| if (debug) Bprint(Bstderr, "readDESC()\n"); |
| descfilename = galloc(descfilename, strlen(descnameformat)+strlen(FONTDIR) |
| +strlen(devname), "readdesc"); |
| sprint(descfilename, descnameformat, FONTDIR, devname); |
| if ((bfd = Bopen(unsharp(descfilename), OREAD)) == 0) { |
| error(WARNING, "cannot open file %s\n", descfilename); |
| return(0); |
| } |
| Bfd = bfd; /* &(bfd->Biobufhdr); */ |
| |
| while (Bgetfield(Bfd, 's', token, MAXTOKENSIZE) > 0) { |
| for (i=0; i<NDESCTOKS; i++) { |
| if (strcmp(desctoks[i], token) == 0) { |
| state = i; |
| break; |
| } |
| } |
| if (i<NDESCTOKS) continue; |
| switch (state) { |
| case 0: |
| printdesclang=galloc(printdesclang, strlen(token)+1, "readdesc:"); |
| strcpy(printdesclang, token); |
| if (debug) Bprint(Bstderr, "PDL %s\n", token); |
| break; |
| case 1: |
| encoding=galloc(encoding, strlen(token)+1, "readdesc:"); |
| strcpy(encoding, token); |
| if (debug) Bprint(Bstderr, "encoding %s\n", token); |
| break; |
| case 2: |
| if (fontmnt <=0) { |
| if (!isdigit((uchar)*token)) { |
| error(WARNING, "readdesc: expecting number of fonts in mount table.\n"); |
| return(FALSE); |
| } |
| fontmnt = atoi(token) + 1; |
| fontmtab = galloc(fontmtab, fontmnt*sizeof(char *), "readdesc:"); |
| |
| for (i=0; i<fontmnt; i++) |
| fontmtab[i] = 0; |
| fontindex = 0; |
| } else { |
| mountfont(++fontindex, token); |
| findtfn(token, TRUE); |
| } |
| break; |
| case 3: |
| /* I don't really care about sizes */ |
| break; |
| case 4: |
| /* device resolution in dots per inch */ |
| if (!isdigit((uchar)*token)) { |
| error(WARNING, "readdesc: expecting device resolution.\n"); |
| return(FALSE); |
| } |
| devres = atoi(token); |
| if (debug) Bprint(Bstderr, "res %d\n", devres); |
| break; |
| case 5: |
| /* I don't really care about horizontal motion resolution */ |
| if (debug) Bprint(Bstderr, "ignoring horizontal resolution\n"); |
| break; |
| case 6: |
| /* I don't really care about vertical motion resolution */ |
| if (debug) Bprint(Bstderr, "ignoring vertical resolution\n"); |
| break; |
| case 7: |
| /* unitwidth is the font size at which the character widths are 1:1 */ |
| if (!isdigit((uchar)*token)) { |
| error(WARNING, "readdesc: expecting unitwidth.\n"); |
| return(FALSE); |
| } |
| unitwidth = atoi(token); |
| if (debug) Bprint(Bstderr, "unitwidth %d\n", unitwidth); |
| break; |
| case 8: |
| /* I don't really care about this list of special characters */ |
| if (debug) Bprint(Bstderr, "ignoring special character <%s>\n", token); |
| break; |
| default: |
| if (*token == '#') |
| Brdline(Bfd, '\n'); |
| else |
| error(WARNING, "unknown token %s in DESC file.\n", token); |
| break; |
| } |
| } |
| Bterm(Bfd); |
| return 0; |
| } |