| \n", /* indent3 */
+ 0,
+ 0,
+ 0,
+ " ", /* heading 25 */
+ "", /* anchor 26 */
+};
+
+char*
+offattr[8*sizeof(ulong)] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ "", /* italic */
+ "", /* bold */
+ "", /* cw */
+ "<-/table>", /* indent1 */
+ "<-/table>", /* indent2 */
+ "<-/table>", /* indent3 */
+ 0,
+ 0,
+ 0,
+ "", /* heading 25 */
+ "", /* anchor 26 */
+};
+
+Font *font[Nfont];
+
+Biobuf bout;
+int debug = 0;
+
+/* troff state */
+int page = 1;
+int ft = 1;
+int vp = 0;
+int hp = 0;
+int ps = 1;
+int res = 720;
+
+int didP = 0;
+int atnewline = 1;
+int prevlineH = 0;
+ulong attr = 0; /* or'ed into each Char */
+
+Char *chars;
+int nchars;
+int nalloc;
+char** anchors; /* allocated in order */
+int nanchors;
+
+char *pagename;
+char *section;
+
+char *filename;
+int cno;
+char buf[8192];
+char *title = "Plan 9 man page";
+
+void process(Biobuf*, char*);
+void mountfont(int, char*);
+void switchfont(int);
+void header(char*);
+void flush(void);
+void trailer(void);
+
+void*
+emalloc(ulong n)
+{
+ void *p;
+
+ p = malloc(n);
+ if(p == nil)
+ sysfatal("malloc failed: %r");
+ return p;
+}
+
+void*
+erealloc(void *p, ulong n)
+{
+
+ p = realloc(p, n);
+ if(p == nil)
+ sysfatal("realloc failed: %r");
+ return p;
+}
+
+char*
+estrdup(char *s)
+{
+ char *t;
+
+ t = strdup(s);
+ if(t == nil)
+ sysfatal("strdup failed: %r");
+ return t;
+}
+
+void
+usage(void)
+{
+ fprint(2, "usage: troff2html [-d] [-t title] [file ...]\n");
+ exits("usage");
+}
+
+int
+hccmp(const void *va, const void *vb)
+{
+ Htmlchar *a, *b;
+
+ a = (Htmlchar*)va;
+ b = (Htmlchar*)vb;
+ return a->value - b->value;
+}
+
+void
+main(int argc, char *argv[])
+{
+ int i;
+ Biobuf in, *inp;
+ Rune r;
+
+ for(i=0; i");
+ }else{
+ for(i=0; i 0){
+ if(c == 0x2018 && (chars[nchars-1]&0xFFFF) == 0x2018
+ && a==(chars[nchars-1]&~0xFFFF)){
+ chars[nchars-1] = (ul&~0xFFFF) | 0x201C;
+ return;
+ }
+ if(c == 0x2019 && (chars[nchars-1]&0xFFFF) == 0x2019
+ && a==(chars[nchars-1]&~0xFFFF)){
+ chars[nchars-1] = (ul&~0xFFFF) | 0x201D;
+ return;
+ }
+ }
+ }
+ chars[nchars++] = ul;
+}
+
+void
+emit(Rune r)
+{
+ emitul(r | attr, 0);
+ /*
+ * Close man page references early, so that
+ * .IR proof (1),
+ * doesn't make the comma part of the link.
+ */
+ if(r == ')')
+ attr &= ~(1< 60 && r == ' ')
+ r = '\n';
+ if(r >= 0x80)
+ Bprint(b, "%d;", r);
+ else
+ Bputrune(b, r);
+ if(r == '\n'){
+ for(i=0; i=i; j--)
+ iputs(&bout, offattr[nest[j]]);
+
+ /* turn on everything we just turned off but didn't want to */
+ for(j=i; j | |