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