diff options
Diffstat (limited to 'dist/troff/afm2troff.c')
-rw-r--r-- | dist/troff/afm2troff.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/dist/troff/afm2troff.c b/dist/troff/afm2troff.c new file mode 100644 index 00000000..da185230 --- /dev/null +++ b/dist/troff/afm2troff.c @@ -0,0 +1,93 @@ +#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); + } + } +} |