/* * Call through to html_putchar(). * Accepts NULL strings. */ static void html_print(const char *p) { if (NULL == p) return; while ('\0' != *p) html_putchar(*p++); }
static void catman(const struct req *req, const char *file) { FILE *f; size_t len; int i; char *p; int italic, bold; if (NULL == (f = fopen(file, "r"))) { puts("<P>You specified an invalid manual file.</P>"); return; } puts("<DIV CLASS=\"catman\">\n" "<PRE>"); while (NULL != (p = fgetln(f, &len))) { bold = italic = 0; for (i = 0; i < (int)len - 1; i++) { /* * This means that the catpage is out of state. * Ignore it and keep going (although the * catpage is bogus). */ if ('\b' == p[i] || '\n' == p[i]) continue; /* * Print a regular character. * Close out any bold/italic scopes. * If we're in back-space mode, make sure we'll * have something to enter when we backspace. */ if ('\b' != p[i + 1]) { if (italic) printf("</I>"); if (bold) printf("</B>"); italic = bold = 0; html_putchar(p[i]); continue; } else if (i + 2 >= (int)len) continue; /* Italic mode. */ if ('_' == p[i]) { if (bold) printf("</B>"); if ( ! italic) printf("<I>"); bold = 0; italic = 1; i += 2; html_putchar(p[i]); continue; } /* * Handle funny behaviour troff-isms. * These grok'd from the original man2html.c. */ if (('+' == p[i] && 'o' == p[i + 2]) || ('o' == p[i] && '+' == p[i + 2]) || ('|' == p[i] && '=' == p[i + 2]) || ('=' == p[i] && '|' == p[i + 2]) || ('*' == p[i] && '=' == p[i + 2]) || ('=' == p[i] && '*' == p[i + 2]) || ('*' == p[i] && '|' == p[i + 2]) || ('|' == p[i] && '*' == p[i + 2])) { if (italic) printf("</I>"); if (bold) printf("</B>"); italic = bold = 0; putchar('*'); i += 2; continue; } else if (('|' == p[i] && '-' == p[i + 2]) || ('-' == p[i] && '|' == p[i + 1]) || ('+' == p[i] && '-' == p[i + 1]) || ('-' == p[i] && '+' == p[i + 1]) || ('+' == p[i] && '|' == p[i + 1]) || ('|' == p[i] && '+' == p[i + 1])) { if (italic) printf("</I>"); if (bold) printf("</B>"); italic = bold = 0; putchar('+'); i += 2; continue; } /* Bold mode. */ if (italic) printf("</I>"); if ( ! bold) printf("<B>"); bold = 1; italic = 0; i += 2; html_putchar(p[i]); } /* * Clean up the last character. * We can get to a newline; don't print that. */ if (italic) printf("</I>"); if (bold) printf("</B>"); if (i == (int)len - 1 && '\n' != p[i]) html_putchar(p[i]); putchar('\n'); } puts("</PRE>\n" "</DIV>"); fclose(f); }
static void resp_catman(const struct req *req, const char *file) { FILE *f; char *p; size_t sz; ssize_t len; int i; int italic, bold; if ((f = fopen(file, "r")) == NULL) { puts("<p>You specified an invalid manual file.</p>"); return; } puts("<div class=\"catman\">\n" "<pre>"); p = NULL; sz = 0; while ((len = getline(&p, &sz, f)) != -1) { bold = italic = 0; for (i = 0; i < len - 1; i++) { /* * This means that the catpage is out of state. * Ignore it and keep going (although the * catpage is bogus). */ if ('\b' == p[i] || '\n' == p[i]) continue; /* * Print a regular character. * Close out any bold/italic scopes. * If we're in back-space mode, make sure we'll * have something to enter when we backspace. */ if ('\b' != p[i + 1]) { if (italic) printf("</i>"); if (bold) printf("</b>"); italic = bold = 0; html_putchar(p[i]); continue; } else if (i + 2 >= len) continue; /* Italic mode. */ if ('_' == p[i]) { if (bold) printf("</b>"); if ( ! italic) printf("<i>"); bold = 0; italic = 1; i += 2; html_putchar(p[i]); continue; } /* * Handle funny behaviour troff-isms. * These grok'd from the original man2html.c. */ if (('+' == p[i] && 'o' == p[i + 2]) || ('o' == p[i] && '+' == p[i + 2]) || ('|' == p[i] && '=' == p[i + 2]) || ('=' == p[i] && '|' == p[i + 2]) || ('*' == p[i] && '=' == p[i + 2]) || ('=' == p[i] && '*' == p[i + 2]) || ('*' == p[i] && '|' == p[i + 2]) || ('|' == p[i] && '*' == p[i + 2])) { if (italic) printf("</i>"); if (bold) printf("</b>"); italic = bold = 0; putchar('*'); i += 2; continue; } else if (('|' == p[i] && '-' == p[i + 2]) || ('-' == p[i] && '|' == p[i + 1]) || ('+' == p[i] && '-' == p[i + 1]) || ('-' == p[i] && '+' == p[i + 1]) || ('+' == p[i] && '|' == p[i + 1]) || ('|' == p[i] && '+' == p[i + 1])) { if (italic) printf("</i>"); if (bold) printf("</b>"); italic = bold = 0; putchar('+'); i += 2; continue; } /* Bold mode. */ if (italic) printf("</i>"); if ( ! bold) printf("<b>"); bold = 1; italic = 0; i += 2; html_putchar(p[i]); } /* * Clean up the last character. * We can get to a newline; don't print that. */ if (italic) printf("</i>"); if (bold) printf("</b>"); if (i == len - 1 && p[i] != '\n') html_putchar(p[i]); putchar('\n'); } free(p); puts("</pre>\n" "</div>"); fclose(f); }