===================================================================
RCS file: /cvs/mandoc/cgi.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -p -r1.9 -r1.10
--- mandoc/cgi.c 2011/12/04 22:52:50 1.9
+++ mandoc/cgi.c 2011/12/07 00:23:04 1.10
@@ -1,4 +1,4 @@
-/* $Id: cgi.c,v 1.9 2011/12/04 22:52:50 kristaps Exp $ */
+/* $Id: cgi.c,v 1.10 2011/12/07 00:23:04 kristaps Exp $ */
/*
* Copyright (c) 2011 Kristaps Dzonsons
\n" + " The query your entered was malformed.\n" + " Try again from the\n" + " main page\n" + "
"); resp_end_html(); } static void -resp_badmanual(void) +resp_error404(const char *page) { resp_begin_html(404, "Not Found"); - puts("Requested manual not found.
"); + puts("\n" + " The page you're looking for, "); + printf(" "); + html_print(page); + puts(",\n" + " could not be found.\n" + " Try searching from the\n" + " main page\n" + "
"); resp_end_html(); } static void -resp_badexpr(const struct req *req) -{ - - resp_begin_html(200, NULL); - resp_searchform(req); - puts("Your search didn't work.
"); - resp_end_html(); -} - -static void resp_bad(void) { resp_begin_html(500, "Internal Server Error"); @@ -448,24 +459,134 @@ pg_index(const struct manpaths *ps, const struct req * static void catman(const char *file) { - int fd; - char buf[BUFSIZ]; - ssize_t ssz; + FILE *f; + size_t len; + int i; + char *p; + int italic, bold; - if (-1 == (fd = open(file, O_RDONLY, 0))) { + if (NULL == (f = fopen(file, "r"))) { resp_baddb(); return; } - resp_begin_http(200, NULL); + resp_begin_html(200, NULL); - while ((ssz = read(fd, buf, BUFSIZ)) > 0) - write(STDOUT_FILENO, buf, (size_t)ssz); + puts(""); + 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 (ssz < 0) - perror(file); + if ('\b' == p[i] || '\n' == p[i]) + continue; - close(fd); + /* + * 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(""); + if (bold) + printf(""); + italic = bold = 0; + html_putchar(p[i]); + continue; + } else if (i + 2 >= (int)len) + continue; + + /* Italic mode. */ + + if ('_' == p[i]) { + if (bold) + printf(""); + if ( ! italic) + printf(""); + 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(""); + if (bold) + printf(""); + 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(""); + if (bold) + printf(""); + italic = bold = 0; + putchar('+'); + i += 2; + continue; + } + + /* Bold mode. */ + + if (italic) + printf(""); + if ( ! bold) + printf(""); + 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(""); + if (bold) + printf(""); + + if (i == (int)len - 1 && '\n' != p[i]) + html_putchar(p[i]); + + putchar('\n'); + } + + puts("\n" + "\n" + ""); + + fclose(f); } static void @@ -477,6 +598,7 @@ format(const char *file) struct man *man; void *vp; enum mandoclevel rc; + char opts[MAXPATHLEN + 128]; if (-1 == (fd = open(file, O_RDONLY, 0))) { resp_baddb(); @@ -492,8 +614,13 @@ format(const char *file) return; } + snprintf(opts, sizeof(opts), "style=/style.css," + "man=%s/search.html?sec=%%S&expr=%%N," + "includes=/cgi-bin/man.cgi/usr/include/%%I", + progname); + mparse_result(mp, &mdoc, &man); - vp = html_alloc(NULL); + vp = html_alloc(opts); if (NULL != mdoc) { resp_begin_http(200, NULL); @@ -520,19 +647,19 @@ pg_show(const struct manpaths *ps, const struct req *r DBT key, val; if (NULL == path) { - resp_badmanual(); + resp_error400(); return; } else if (NULL == (sub = strrchr(path, '/'))) { - resp_badmanual(); + resp_error400(); return; } else *sub++ = '\0'; if ( ! (atou(path, &vol) && atou(sub, &rec))) { - resp_badmanual(); + resp_error400(); return; } else if (vol >= (unsigned int)ps->sz) { - resp_badmanual(); + resp_error400(); return; } @@ -551,7 +678,7 @@ pg_show(const struct manpaths *ps, const struct req *r key.size = 4; if (0 != (rc = (*idx->get)(idx, &key, &val, 0))) { - rc < 0 ? resp_baddb() : resp_badmanual(); + rc < 0 ? resp_baddb() : resp_error400(); goto out; } @@ -639,7 +766,7 @@ pg_search(const struct manpaths *ps, const struct req if (0 == rc) resp_baddb(); else if (-1 == rc) - resp_badexpr(req); + resp_search(NULL, 0, (void *)req); for (i = 0; i < sz; i++) free(cp[i]); @@ -729,7 +856,7 @@ main(void) pg_show(&paths, &req, subpath); break; default: - resp_badpage(); + resp_error404(path); break; }