#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;
}
