📄 ms2html.c
字号:
lower(char *p){ char *x; for(x = p; *x; x++) if(*x >= 'A' && *x <= 'Z') *x -= 'A' - 'a'; return p;}voidg_I(int argc, char **argv){ int anchor; char *p; anchor = 0; if(argc > 2){ p = argv[2]; if(p[0] == '(') if(p[1] >= '0' && p[1] <= '9') if(p[2] == ')'){ anchor = 1; Bprint(&bout, "<A href=\"/magic/man2html/%c/%s\">", p[1], lower(argv[1])); } } font(&ifont, argc, argv); if(anchor) Bprint(&bout, "</A>");}voidg_br(int, char**){ if(hangingdt){ Bprint(&bout, "<dd>"); hangingdt = 0; }else Bprint(&bout, "<br>\n");}voidg_P1(int, char**){ if(example == 0){ example = 1; Bprint(&bout, "<DL><DT><DD><TT><PRE>\n"); }}voidg_P2(int, char**){ if(example){ example = 0; Bprint(&bout, "</PRE></TT></DL>\n"); }}voidg_SM(int, char **argv){ Bprint(&bout, "%s", argv[1]);}voidg_ft(int argc, char **argv){ if(argc < 2){ pushfont(nil); return; } switch(argv[1][0]){ case '3': case 'B': pushfont(&bfont); break; case '2': case 'I': pushfont(&ifont); break; case '4': pushfont(&bifont); break; case '5': pushfont(&cwfont); break; case 'P': popfont(); break; case 'R': default: pushfont(nil); break; }}voidg_sp(int argc, char **argv){ int n; n = 1; if(argc > 1){ n = atoi(argv[1]); if(n < 1) n = 1; if(argv[1][strlen(argv[1])-1] == 'i') n *= 4; } if(n > 5){ Bprint(&bout, "<br> <br>\n"); Bprint(&bout, "<HR>\n"); Bprint(&bout, "<br> <br>\n"); } else for(; n > 0; n--) Bprint(&bout, "<br> <br>\n");} voidrm_loop(char *name, String **l){ String *s; for(s = *l; s != nil; s = *l){ if(strcmp(name, s->name) == 0){ *l = s->next; free(s->name); free(s->val); free(s); break; } l = &s->next; } }voidg_rm(int argc, char **argv){ Goobie *g; char *name; int i; for(i = 1; i < argc; i++) { name = argv[i]; rm_loop(name, &strings); rm_loop(name, ¯os); for(g = gtab; g->name; g++) if (strcmp(g->name, name) == 0) { g->f = g_ignore; break; } } }voidg_AB(int, char**){ closel(); dohangingcenter(); Bprint(&bout, "<center><H4>ABSTRACT</H4></center><DL><DD>\n");}voidg_AE(int, char**){ Bprint(&bout, "</DL>\n");}voidg_FS(int, char **){ char *argv[3]; argv[0] = "IP"; argv[1] = nil; argv[2] = nil; g_IP(1, argv); Bprint(&bout, "NOTE:<I> ");}voidg_FE(int, char **){ Bprint(&bout, "</I><DT> <DD>"); closel(); Bprint(&bout, "<br>\n");}voidg_de(int argc, char **argv){ int r; char *p, *cp; String *m; int len; if(argc < 2) return; m = nil; len = 0; if(strcmp(argv[0], "am") == 0){ for(m = macros; m != nil; m = m->next) if(strcmp(argv[1], m->name) == 0){ len = strlen(m->val); break; } if(m == nil){ /* nothing to append to */ for(;;){ p = Brdline(&ssp->in, '\n'); if(p == nil) break; p[Blinelen(&ssp->in)-1] = 0; if(strcmp(p, "..") == 0) break; } return; } } if(m == nil){ m = emalloc(sizeof(*m)); m->next = macros; macros = m; m->name = strdup(argv[1]); m->val = nil; len = 0; } /* read up to a .. removing double backslashes */ for(;;){ p = Brdline(&ssp->in, '\n'); if(p == nil) break; p[Blinelen(&ssp->in)-1] = 0; if(strcmp(p, "..") == 0) break; m->val = realloc(m->val, len + Blinelen(&ssp->in)+1); cp = m->val + len; while(*p){ r = *p++; if(r == '\\' && *p == '\\') p++; *cp++ = r; } *cp++ = '\n'; len = cp - m->val; *cp = 0; }}voidg_hrule(int, char**){ Bprint(&bout, "<HR>\n");}voidg_BX(int argc, char **argv){ Bprint(&bout, "<HR>\n"); printargs(argc, argv); Bprint(&bout, "<HR>\n");}voidg_IH(int, char**){ Bprint(&bout, "Bell Laboratories, Naperville, Illinois, 60540\n");}voidg_MH(int, char**){ Bprint(&bout, "Bell Laboratories, Murray Hill, NJ, 07974\n");}voidg_PY(int, char**){ Bprint(&bout, "Bell Laboratories, Piscataway, NJ, 08854\n");}voidg_HO(int, char**){ Bprint(&bout, "Bell Laboratories, Holmdel, NJ, 07733\n");}voidg_QS(int, char**){ Bprint(&bout, "<BLOCKQUOTE>\n");}voidg_QE(int, char**){ Bprint(&bout, "</BLOCKQUOTE>\n");}voidg_RS(int, char**){ Bprint(&bout, "<DL><DD>\n");}voidg_RE(int, char**){ Bprint(&bout, "</DL>\n");}int gif;voidg_startgif(int, char **argv){ int fd; int pfd[2]; char *e, *p; char name[32]; Dir *d; if(strcmp(argv[0], "EQ") == 0) e = ".EN"; else if(strcmp(argv[0], "TS") == 0) e = ".TE"; else if(strcmp(argv[0], "PS") == 0) e = ".PE"; else return; if(basename) p = basename; else{ p = strrchr(sstack[0].filename, '/'); if(p != nil) p++; else p = sstack[0].filename; } snprint(name, sizeof(name), "%s.%d.gif", p, gif++); fd = create(name, OWRITE, 0664); if(fd < 0){ fprint(2, "ms2html: can't create %s: %r\n", name); return; } if(pipe(pfd) < 0){ fprint(2, "ms2html: can't create pipe: %r\n"); close(fd); return; } switch(rfork(RFFDG|RFPROC)){ case -1: fprint(2, "ms2html: can't fork: %r\n"); close(fd); return; case 0: dup(fd, 1); close(fd); dup(pfd[0], 0); close(pfd[0]); close(pfd[1]); execl("/bin/troff2gif", "troff2gif", nil); fprint(2, "ms2html: couldn't exec troff2gif: %r\n"); _exits(nil); default: close(fd); close(pfd[0]); fprint(pfd[1], ".ll 7i\n"); /* fprint(pfd[1], ".EQ\ndelim %s\n.EN\n", delim); */ /* fprint(pfd[1], ".%s\n", argv[0]); */ for(;;){ p = Brdline(&ssp->in, '\n'); if(p == nil) break; ssp->lno++; ssp->rlno++; if(write(pfd[1], p, Blinelen(&ssp->in)) < 0) break; if(strncmp(p, e, 3) == 0) break; } close(pfd[1]); waitpid(); d = dirstat(name); if(d == nil) break; if(d->length == 0){ remove(name); free(d); break; } free(d); fprint(2, "ms2html: created auxiliary file %s\n", name); Bprint(&bout, "<br><img src=\"%s\"><br>\n", name); break; }}voidg_lf(int argc, char **argv){ if(argc > 2) snprint(ssp->filename, sizeof(ssp->filename), argv[2]); if(argc > 1) ssp->rlno = atoi(argv[1]);}voidg_so(int argc, char **argv){ ssp->lno++; ssp->rlno++; if(argc > 1) pushsrc(argv[1]);}voidg_BP(int argc, char **argv){ int fd; char *p, *ext; char name[32]; Dir *d; if(argc < 2) return; p = strrchr(argv[1], '/'); if(p != nil) p++; else p = argv[1]; ext = strrchr(p, '.'); if(ext){ if(strcmp(ext, ".jpeg") == 0 || strcmp(ext, ".gif") == 0){ Bprint(&bout, "<br><img src=\"%s\"><br>\n", argv[1]); return; } } snprint(name, sizeof(name), "%s.%d%d.gif", p, getpid(), gif++); fd = create(name, OWRITE, 0664); if(fd < 0){ fprint(2, "ms2html: can't create %s: %r\n", name); return; } switch(rfork(RFFDG|RFPROC)){ case -1: fprint(2, "ms2html: can't fork: %r\n"); close(fd); return; case 0: dup(fd, 1); close(fd); execl("/bin/ps2gif", "ps2gif", argv[1], nil); fprint(2, "ms2html: couldn't exec ps2gif: %r\n"); _exits(nil); default: close(fd); waitpid(); d = dirstat(name); if(d == nil) break; if(d->length == 0){ remove(name); free(d); break; } free(d); fprint(2, "ms2html: created auxiliary file %s\n", name); Bprint(&bout, "<br><img src=\"%s\"><br>\n", name); break; }}/* insert straight HTML into output */voidg__H(int argc, char **argv){ int i; for(i = 1; i < argc; i++) Bprint(&bout, "%s ", argv[i]); Bprint(&bout, "\n");}/* HTML page title */voidg__T(int argc, char **argv){ if(titleseen) return; Bprint(&bout, "<title>\n"); printargs(argc, argv); Bprint(&bout, "</title></head><body>\n"); titleseen = 1;}voidg_nr(int argc, char **argv){ char *val; if (argc > 1) { if (argc == 2) val = "0"; else val = argv[2]; dsnr(argv[1], val, &numregs); }}voidzerodivide(void){ fprint(2, "stdin %d(%s:%d): division by 0\n", ssp->lno, ssp->filename, ssp->rlno);}intnumval(char **pline, int recur){ char *p; int neg, x, y; x = neg = 0; p = *pline; while(*p == '-') { neg = 1 - neg; p++; } if (*p == '(') { p++; x = numval(&p, 1); if (*p != ')') goto done; p++; } else while(*p >= '0' && *p <= '9') x = 10*x + *p++ - '0'; if (neg) x = -x; if (recur) for(;;) { switch(*p++) { case '+': x += numval(&p, 0); continue; case '-': x -= numval(&p, 0); continue; case '*': x *= numval(&p, 0); continue; case '/': y = numval(&p, 0); if (y == 0) { zerodivide(); x = 0; goto done; } x /= y; continue; case '<': if (*p == '=') { p++; x = x <= numval(&p, 0); continue; } x = x < numval(&p, 0); continue; case '>': if (*p == '=') { p++; x = x >= numval(&p, 0); continue; } x = x > numval(&p, 0); continue; case '=': if (*p == '=') p++; x = x == numval(&p, 0); continue; case '&': x &= numval(&p, 0); continue; case ':': x |= numval(&p, 0); continue; case '%': y = numval(&p, 0); if (!y) { zerodivide(); goto done; } x %= y; continue; } --p; break; } done: *pline = p; return x;}intiftest(char *p, char **bp){ char *p1; int c, neg, rv; rv = neg = 0; if (*p == '!') { neg = 1; p++; } c = *p; if (c >= '0' && c <= '9' || c == '+' || c == '-' || c == '('/*)*/) { if (numval(&p,1) >= 1) rv = 1; goto done; } switch(c) { case 't': case 'o': rv = 1; case 'n': case 'e': p++; goto done; } for(p1 = ++p; *p != c; p++) if (!*p) goto done; for(p++;;) { if (*p != *p1++) { while(*p && *p++ != c); goto done; } if (*p++ == c) break; } rv = 1; done: if (neg) rv = 1 - rv; while(*p == ' ' || *p == '\t') p++; *bp = p; return rv;}voidscanline(char *p, char *e, int wantnl){ int c; Rune r; while((c = getrune()) == ' ' || c == '\t') ; while(p < e) { if (c < 0) break; if (c < Runeself) { if (c == '\n') { if (wantnl) *p++ = c; break; } *p++ = c; } else { r = c; p += runetochar(p, &r); } c = getrune(); } *p = 0;}voidpushbody(char *line){ char *b; if (line[0] == '\\' && line[1] == '{' /*}*/ ) line += 2; if (strsp < Maxmstack - 1) { pushstr(b = strdup(line)); mustfree[strsp] = b; }}voidskipbody(char *line){ int c, n; if (line[0] != '\\' || line[1] != '{' /*}*/ ) return; for(n = 1;;) { while((c = getrune()) != '\\') if (c < 0) return; c = getrune(); if (c == '{') n++; else if ((c == '}' && (c = getrune()) == '\n' && !--n) || c < 0) return; }}intifstart(char *line, char *e, char **bp){ int it; char *b; b = copyline(line, e, 1); ungetrune(); b[-1] = getrune(); scanline(b, e, 1); it = iftest(line, bp); return it;}voidg_ie(char *line, char *e){ char *b; if (elsetop >= Maxif-1) { fprint(2, "ms2html: .ie's too deep\n"); return; } if (ifwastrue[++elsetop] = ifstart(line, e, &b)) pushbody(b); else skipbody(b);}voidg_if(char *line, char *e){ char *b; if (ifstart(line, e, &b)) pushbody(b); else skipbody(b);}voidg_el(char *line, char *e){ if (elsetop < 0) return; scanline(line, e, 1); if (ifwastrue[elsetop--]) skipbody(line); else pushbody(line);}voidg_ig(int argc, char **argv){ char *p, *s; s = ".."; if (argc > 1) s = argv[1]; for(;;) { p = Brdline(&ssp->in, '\n'); if(p == nil) break; p[Blinelen(&ssp->in)-1] = 0; if(strcmp(p, s) == 0) break; }}voidg_ds(char *line, char *e){ char *b; b = copyline(line, e, 1); if (b > line) { copyline(b, e, 0); if (*b == '"') b++; ds(line, b); }}voidg_as(char *line, char *e){ String *s; char *b; b = copyline(line, e, 1); if (b == line) return; copyline(b, e, 0); if (*b == '"') b++; for(s = strings; s != nil; s = s->next) if(strcmp(line, s->name) == 0) break; if(s == nil){ ds(line, b); return; } s->val = realloc(s->val, strlen(s->val) + strlen(b) + 1); strcat(s->val, b);}voidg_BS(int argc, char **argv){ int i; if (argc > 1 && !weBref) { Bprint(&bout, "<a href=\"%s\"", argv[1]); for(i = 2; i < argc; i++) Bprint(&bout, " %s", argv[i]); Bprint(&bout, ">"); weBref = 1; }}voidg_BE(int, char**){ if (weBref) { Bprint(&bout, "</a>"); weBref = 0; }}voidg_LB(int argc, char **argv){ if (argc > 1) { if (weBref) g_BE(0,nil); Bprint(&bout, "<a name=\"%s\"></a>", argv[1]); }}voidg_RT(int, char**){ g_BE(0,nil); dohanginghead(); closel(); closefont();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -