#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(FALSE);
	}
	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(TRUE);
}
