1 c42a1d3d 2006-02-21 devnull #include "a.h"
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.
8 c42a1d3d 2006-02-21 devnull rune2html(Rune r)
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];
16 c42a1d3d 2006-02-21 devnull if(r == '\n')
17 c42a1d3d 2006-02-21 devnull return L("\n");
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];
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()){
27 c42a1d3d 2006-02-21 devnull sysfatal("fork: %r");
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);
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);
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];
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.
56 c42a1d3d 2006-02-21 devnull typedef struct Trtab Trtab;
57 c42a1d3d 2006-02-21 devnull struct Trtab
59 c42a1d3d 2006-02-21 devnull char t[3];
63 c42a1d3d 2006-02-21 devnull static Trtab trtab[200];
64 c42a1d3d 2006-02-21 devnull int ntrtab;
66 c42a1d3d 2006-02-21 devnull static Trtab trinit[] =
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
77 c42a1d3d 2006-02-21 devnull troff2rune(Rune *rs)
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;
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++;
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++;
105 c42a1d3d 2006-02-21 devnull Bterm(b);
107 c42a1d3d 2006-02-21 devnull if(ntrtab >= nelem(trtab))
108 c42a1d3d 2006-02-21 devnull fprint(2, "%s: trtab too small\n", argv0);
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;