mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-12 11:10:07 +00:00
99 lines
1.9 KiB
C
99 lines
1.9 KiB
C
#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;
|
|
Fmt fmt;
|
|
|
|
fmtstrinit(&fmt);
|
|
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(nf >= 7 && strcmp(f[5], "N") == 0 && strcmp(f[6], "space") == 0)
|
|
code = ' ';
|
|
if(code == ' ')
|
|
Bprint(&bout, "spacewidth %d\ncharset\n", wid);
|
|
else
|
|
fmtprint(&fmt, "%C\t%d\t%d\t%d %04x\n",
|
|
code, wid, ad, code, code);
|
|
}
|
|
}
|
|
Bprint(&bout, "%s", fmtstrflush(&fmt));
|
|
}
|