===================================================================
RCS file: /cvs/mandoc/cgi.c,v
retrieving revision 1.9
retrieving revision 1.11
diff -u -p -r1.9 -r1.11
--- mandoc/cgi.c 2011/12/04 22:52:50 1.9
+++ mandoc/cgi.c 2011/12/07 11:52:36 1.11
@@ -1,4 +1,4 @@
-/* $Id: cgi.c,v 1.9 2011/12/04 22:52:50 kristaps Exp $ */
+/* $Id: cgi.c,v 1.11 2011/12/07 11:52:36 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"); @@ -412,7 +423,21 @@ resp_search(struct res *r, size_t sz, void *arg) return; } - resp_begin_html(200, NULL); + resp_begin_http(200, NULL); + puts("" "\n" + "" "\n" + " " "\n" + " " "\n" + " " "\n" + ""); + 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 +612,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 +628,13 @@ format(const char *file) return; } + snprintf(opts, sizeof(opts), "style=/man.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 +661,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 +692,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 +780,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 +870,7 @@ main(void) pg_show(&paths, &req, subpath); break; default: - resp_badpage(); + resp_error404(path); break; }