Blame


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