summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2011-12-08 22:47:09 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2011-12-08 22:47:09 +0000
commita1b7401425f44a0e342e72a2eb2c412fe430a434 (patch)
treec762b14d3dfe023b1d1a6a6022d95d6e0e78882d
parentd8209221012e9e8d255530f6ab1fb4751d595ccc (diff)
downloadmandoc-a1b7401425f44a0e342e72a2eb2c412fe430a434.tar.gz
If no man.cgi `whatis' results are found, offer a quick link to the apropos
query mode.
-rw-r--r--cgi.c44
1 files changed, 41 insertions, 3 deletions
diff --git a/cgi.c b/cgi.c
index 28a4b195..37f6f723 100644
--- a/cgi.c
+++ b/cgi.c
@@ -424,7 +424,12 @@ resp_baddb(void)
static void
resp_search(struct res *r, size_t sz, void *arg)
{
- int i;
+ int i, whatis;
+ const char *ep, *sec, *arch;
+ const struct req *req;
+
+ whatis = 1;
+ ep = sec = arch = NULL;
if (1 == sz) {
/*
@@ -439,13 +444,46 @@ resp_search(struct res *r, size_t sz, void *arg)
return;
}
+ req = (const struct req *)arg;
+
+ for (i = 0; i < (int)req->fieldsz; i++)
+ if (0 == strcmp(req->fields[i].key, "expr"))
+ ep = req->fields[i].val;
+ else if (0 == strcmp(req->fields[i].key, "query"))
+ ep = req->fields[i].val;
+ else if (0 == strcmp(req->fields[i].key, "sec"))
+ sec = req->fields[i].val;
+ else if (0 == strcmp(req->fields[i].key, "sektion"))
+ sec = req->fields[i].val;
+ else if (0 == strcmp(req->fields[i].key, "arch"))
+ arch = req->fields[i].val;
+ else if (0 == strcmp(req->fields[i].key, "apropos"))
+ whatis = 0 == strcmp
+ (req->fields[i].val, "0");
+ else if (0 == strcmp(req->fields[i].key, "op"))
+ whatis = 0 == strcasecmp
+ (req->fields[i].val, "whatis");
+
qsort(r, sz, sizeof(struct res), cmp);
resp_begin_html(200, NULL);
- resp_searchform((const struct req *)arg);
+ resp_searchform(req);
if (0 == sz) {
- puts("<P>No results found.</P>");
+ puts("<P>\n"
+ "No results found.");
+ if (whatis) {
+ printf("(Try <A HREF=\"");
+ html_print(progname);
+ printf("/search.html?op=apropos&amp;expr=");
+ html_print(ep ? ep : "");
+ printf("&amp;sec=");
+ html_print(sec ? sec : "");
+ printf("&amp;arch=");
+ html_print(arch ? arch : "");
+ puts("\">apropos</A>?)");
+ }
+ puts("</P>");
resp_end_html();
return;
}