#include <u.h>
#include <libc.h>
#include <bio.h>

int didname;
int didfontname;
int offset;
void run(char*, int);
Biobuf bout;

void
usage(void)
{
	fprint(2, "usage: afm2troff [-h] [-o offset] [file...]\n");
	exits("usage");
}

void
main(int argc, char **argv)
{
	int i, fd;
	
	ARGBEGIN{
	case 'h':
		didname = 1;
		didfontname = 1;
		break;
	case 'o':
		offset = atoi(EARGF(usage()));
		break;
	default:
		usage();
	}ARGEND
	
	Binit(&bout, 1, OWRITE);
	if(argc == 0)
		run("<stdin>", 0);
	else{
		for(i=0; i<argc; i++){
			if((fd = open(argv[i], OREAD)) < 0)
				sysfatal("open %s: %r", argv[i]);
			run(argv[i], fd);
		}
	}
	Bflush(&bout);
}

void
run(char *name, int fd)
{
	char *p, *q, *f[100];
	int nf, code, wid, ad;
	Biobuf b;
	
	Binit(&b, fd, OREAD);
	while((p = Brdline(&b, '\n')) != nil){
		p[Blinelen(&b)-1] = 0;
		q = strchr(p, ' ');
		if(q == nil)
			continue;
		*q++ = 0;
		while(*q == ' ' || *q == '\t')
			q++;
		if(*q == 0)
			continue;
		if(strcmp(p, "FontName") == 0 && didname++ == 0)
			 Bprint(&bout, "name %s\n", q);
		if(strcmp(p, "FullName") == 0 && didfontname++ == 0)
			 Bprint(&bout, "fontname %s\n", q);
		if(strcmp(p, "C") == 0){
			nf = getfields(q, f, nelem(f), 1, "\t\r\n\v ");
			if(nf < 5 || strcmp(f[1], ";") != 0 || strcmp(f[2], "WX") != 0)
				continue;
			code = strtol(f[0], 0, 10);
			wid = strtol(f[3], 0, 10);
			wid = (wid+5)/10;
			if(code == 0)
				continue;
			code += offset;
			ad = 0;
			if(nf < 6 || strcmp(f[nf-6], "B") != 0)
				continue;
			if(atoi(f[nf-4]) < -50)
				ad |= 1;
			if(atoi(f[nf-2]) > 600)
				ad |= 2;
			if(code == ' ')
				Bprint(&bout, "spacewidth %d\ncharset\n", wid);
			else
				Bprint(&bout, "%C\t%d\t%d\t%d %04x\n", code, wid, ad, code, code);
		}
	}
}
