Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
5 int didname;
6 int didfontname;
7 int offset;
8 void run(char*, int);
9 Biobuf bout;
11 void
12 usage(void)
13 {
14 fprint(2, "usage: afm2troff [-h] [-o offset] [file...]\n");
15 exits("usage");
16 }
18 void
19 main(int argc, char **argv)
20 {
21 int i, fd;
23 ARGBEGIN{
24 case 'h':
25 didname = 1;
26 didfontname = 1;
27 break;
28 case 'o':
29 offset = atoi(EARGF(usage()));
30 break;
31 default:
32 usage();
33 }ARGEND
35 Binit(&bout, 1, OWRITE);
36 if(argc == 0)
37 run("<stdin>", 0);
38 else{
39 for(i=0; i<argc; i++){
40 if((fd = open(argv[i], OREAD)) < 0)
41 sysfatal("open %s: %r", argv[i]);
42 run(argv[i], fd);
43 }
44 }
45 Bflush(&bout);
46 }
48 void
49 run(char *name, int fd)
50 {
51 char *p, *q, *f[100];
52 int nf, code, wid, ad;
53 Biobuf b;
54 Fmt fmt;
56 fmtstrinit(&fmt);
57 Binit(&b, fd, OREAD);
58 while((p = Brdline(&b, '\n')) != nil){
59 p[Blinelen(&b)-1] = 0;
60 q = strchr(p, ' ');
61 if(q == nil)
62 continue;
63 *q++ = 0;
64 while(*q == ' ' || *q == '\t')
65 q++;
66 if(*q == 0)
67 continue;
68 if(strcmp(p, "FontName") == 0 && didname++ == 0)
69 Bprint(&bout, "name %s\n", q);
70 if(strcmp(p, "FullName") == 0 && didfontname++ == 0)
71 Bprint(&bout, "fontname %s\n", q);
72 if(strcmp(p, "C") == 0){
73 nf = getfields(q, f, nelem(f), 1, "\t\r\n\v ");
74 if(nf < 5 || strcmp(f[1], ";") != 0 || strcmp(f[2], "WX") != 0)
75 continue;
76 code = strtol(f[0], 0, 10);
77 wid = strtol(f[3], 0, 10);
78 wid = (wid+5)/10;
79 if(code == 0)
80 continue;
81 code += offset;
82 ad = 0;
83 if(nf < 6 || strcmp(f[nf-6], "B") != 0)
84 continue;
85 if(atoi(f[nf-4]) < -50)
86 ad |= 1;
87 if(atoi(f[nf-2]) > 600)
88 ad |= 2;
89 if(nf >= 7 && strcmp(f[5], "N") == 0 && strcmp(f[6], "space") == 0)
90 code = ' ';
91 if(code == ' ')
92 Bprint(&bout, "spacewidth %d\ncharset\n", wid);
93 else
94 fmtprint(&fmt, "%C\t%d\t%d\t%d %04x\n",
95 code, wid, ad, code, code);
96 }
97 }
98 Bprint(&bout, "%s", fmtstrflush(&fmt));
99 }