Blame


1 c42a1d3d 2006-02-21 devnull #include "a.h"
2 c42a1d3d 2006-02-21 devnull
3 c42a1d3d 2006-02-21 devnull /*
4 c42a1d3d 2006-02-21 devnull * Translate Unicode to HTML by asking tcs(1).
5 c42a1d3d 2006-02-21 devnull * This way we don't have yet another table.
6 c42a1d3d 2006-02-21 devnull */
7 c42a1d3d 2006-02-21 devnull Rune*
8 c42a1d3d 2006-02-21 devnull rune2html(Rune r)
9 c42a1d3d 2006-02-21 devnull {
10 c42a1d3d 2006-02-21 devnull static Biobuf b;
11 c42a1d3d 2006-02-21 devnull static int fd = -1;
12 c42a1d3d 2006-02-21 devnull static Rune **tcscache[256];
13 c42a1d3d 2006-02-21 devnull int p[2];
14 c42a1d3d 2006-02-21 devnull char *q;
15 c42a1d3d 2006-02-21 devnull
16 c42a1d3d 2006-02-21 devnull if(r == '\n')
17 c42a1d3d 2006-02-21 devnull return L("\n");
18 c42a1d3d 2006-02-21 devnull
19 c42a1d3d 2006-02-21 devnull if(tcscache[r>>8] && tcscache[r>>8][r&0xFF])
20 c42a1d3d 2006-02-21 devnull return tcscache[r>>8][r&0xFF];
21 c42a1d3d 2006-02-21 devnull
22 c42a1d3d 2006-02-21 devnull if(fd < 0){
23 c42a1d3d 2006-02-21 devnull if(pipe(p) < 0)
24 c42a1d3d 2006-02-21 devnull sysfatal("pipe: %r");
25 c42a1d3d 2006-02-21 devnull switch(fork()){
26 c42a1d3d 2006-02-21 devnull case -1:
27 c42a1d3d 2006-02-21 devnull sysfatal("fork: %r");
28 c42a1d3d 2006-02-21 devnull case 0:
29 c42a1d3d 2006-02-21 devnull dup(p[0], 0);
30 c42a1d3d 2006-02-21 devnull dup(p[0], 1);
31 c42a1d3d 2006-02-21 devnull close(p[1]);
32 c42a1d3d 2006-02-21 devnull execl("tcs", "tcs", "-t", "html", nil);
33 c42a1d3d 2006-02-21 devnull _exits(0);
34 c42a1d3d 2006-02-21 devnull default:
35 c42a1d3d 2006-02-21 devnull close(p[0]);
36 c42a1d3d 2006-02-21 devnull fd = p[1];
37 c42a1d3d 2006-02-21 devnull Binit(&b, fd, OREAD);
38 c42a1d3d 2006-02-21 devnull break;
39 c42a1d3d 2006-02-21 devnull }
40 c42a1d3d 2006-02-21 devnull }
41 c42a1d3d 2006-02-21 devnull fprint(fd, "%C\n", r);
42 c42a1d3d 2006-02-21 devnull q = Brdline(&b, '\n');
43 c42a1d3d 2006-02-21 devnull if(q == nil)
44 c42a1d3d 2006-02-21 devnull sysfatal("tcs: early eof");
45 c42a1d3d 2006-02-21 devnull q[Blinelen(&b)-1] = 0;
46 c42a1d3d 2006-02-21 devnull if(tcscache[r>>8] == nil)
47 c42a1d3d 2006-02-21 devnull tcscache[r>>8] = emalloc(256*sizeof tcscache[0][0]);
48 c42a1d3d 2006-02-21 devnull tcscache[r>>8][r&0xFF] = erunesmprint("%s", q);
49 c42a1d3d 2006-02-21 devnull return tcscache[r>>8][r&0xFF];
50 c42a1d3d 2006-02-21 devnull }
51 c42a1d3d 2006-02-21 devnull
52 c42a1d3d 2006-02-21 devnull /*
53 c42a1d3d 2006-02-21 devnull * Translate troff to Unicode by looking in troff's utfmap.
54 c42a1d3d 2006-02-21 devnull * This way we don't have yet another hard-coded table.
55 c42a1d3d 2006-02-21 devnull */
56 c42a1d3d 2006-02-21 devnull typedef struct Trtab Trtab;
57 c42a1d3d 2006-02-21 devnull struct Trtab
58 c42a1d3d 2006-02-21 devnull {
59 c42a1d3d 2006-02-21 devnull char t[3];
60 c42a1d3d 2006-02-21 devnull Rune r;
61 c42a1d3d 2006-02-21 devnull };
62 c42a1d3d 2006-02-21 devnull
63 c42a1d3d 2006-02-21 devnull static Trtab trtab[200];
64 c42a1d3d 2006-02-21 devnull int ntrtab;
65 c42a1d3d 2006-02-21 devnull
66 c42a1d3d 2006-02-21 devnull static Trtab trinit[] =
67 c42a1d3d 2006-02-21 devnull {
68 c42a1d3d 2006-02-21 devnull "pl", Upl,
69 c42a1d3d 2006-02-21 devnull "eq", Ueq,
70 c42a1d3d 2006-02-21 devnull "em", 0x2014,
71 c42a1d3d 2006-02-21 devnull "en", 0x2013,
72 c42a1d3d 2006-02-21 devnull "mi", Umi,
73 cbeb0b26 2006-04-01 devnull "fm", 0x2032
74 c42a1d3d 2006-02-21 devnull };
75 c42a1d3d 2006-02-21 devnull
76 c42a1d3d 2006-02-21 devnull Rune
77 c42a1d3d 2006-02-21 devnull troff2rune(Rune *rs)
78 c42a1d3d 2006-02-21 devnull {
79 c42a1d3d 2006-02-21 devnull char *file, *f[10], *p, s[3];
80 c42a1d3d 2006-02-21 devnull int i, nf;
81 c42a1d3d 2006-02-21 devnull Biobuf *b;
82 c42a1d3d 2006-02-21 devnull
83 c42a1d3d 2006-02-21 devnull if(rs[0] >= Runeself || rs[1] >= Runeself)
84 c42a1d3d 2006-02-21 devnull return Runeerror;
85 c42a1d3d 2006-02-21 devnull s[0] = rs[0];
86 c42a1d3d 2006-02-21 devnull s[1] = rs[1];
87 c42a1d3d 2006-02-21 devnull s[2] = 0;
88 c42a1d3d 2006-02-21 devnull if(ntrtab == 0){
89 c42a1d3d 2006-02-21 devnull for(i=0; i<nelem(trinit) && ntrtab < nelem(trtab); i++){
90 c42a1d3d 2006-02-21 devnull trtab[ntrtab] = trinit[i];
91 c42a1d3d 2006-02-21 devnull ntrtab++;
92 c42a1d3d 2006-02-21 devnull }
93 95d412d4 2006-05-06 devnull file = unsharp("#9/troff/font/devutf/utfmap");
94 c42a1d3d 2006-02-21 devnull if((b = Bopen(file, OREAD)) == nil)
95 c42a1d3d 2006-02-21 devnull sysfatal("open %s: %r", file);
96 c42a1d3d 2006-02-21 devnull while((p = Brdline(b, '\n')) != nil){
97 c42a1d3d 2006-02-21 devnull p[Blinelen(b)-1] = 0;
98 c42a1d3d 2006-02-21 devnull nf = getfields(p, f, nelem(f), 0, "\t");
99 c42a1d3d 2006-02-21 devnull for(i=0; i+2<=nf && ntrtab<nelem(trtab); i+=2){
100 c42a1d3d 2006-02-21 devnull chartorune(&trtab[ntrtab].r, f[i]);
101 c42a1d3d 2006-02-21 devnull memmove(trtab[ntrtab].t, f[i+1], 2);
102 c42a1d3d 2006-02-21 devnull ntrtab++;
103 c42a1d3d 2006-02-21 devnull }
104 c42a1d3d 2006-02-21 devnull }
105 c42a1d3d 2006-02-21 devnull Bterm(b);
106 c42a1d3d 2006-02-21 devnull
107 c42a1d3d 2006-02-21 devnull if(ntrtab >= nelem(trtab))
108 c42a1d3d 2006-02-21 devnull fprint(2, "%s: trtab too small\n", argv0);
109 c42a1d3d 2006-02-21 devnull }
110 c42a1d3d 2006-02-21 devnull
111 c42a1d3d 2006-02-21 devnull for(i=0; i<ntrtab; i++)
112 c42a1d3d 2006-02-21 devnull if(strcmp(s, trtab[i].t) == 0)
113 c42a1d3d 2006-02-21 devnull return trtab[i].r;
114 c42a1d3d 2006-02-21 devnull return Runeerror;
115 c42a1d3d 2006-02-21 devnull }
116 c42a1d3d 2006-02-21 devnull