Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#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;
        Biobufhdr *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(descfilename, OREAD)) == 0) {
                error(WARNING, "cannot open file %s\n", descfilename);
                return 0;
        }
        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(*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(*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(*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;
}