summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2014-07-24 08:26:57 +0000
committerIngo Schwarze <schwarze@openbsd.org>2014-07-24 08:26:57 +0000
commit4d3e662fd848a0d5fbda1bc38e39aeb05d9b34dc (patch)
tree814238f4a6af9688a0a1dce810fab05ded90ce42
parentafedb16f6744e0c2bd4d1c5beb39a4f626f6a5d8 (diff)
downloadmandoc-4d3e662fd848a0d5fbda1bc38e39aeb05d9b34dc.tar.gz
Provide a dropdown entry "All Architectures" and make it the default.
Still, amd64 remains the default in the following sense: If a man(1) mode search returns more than one page of the same name, prefer amd64 over other architectures for immediate display. ok deraadt@ daniel@
-rw-r--r--cgi.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/cgi.c b/cgi.c
index 28efb73f..5a20f9ce 100644
--- a/cgi.c
+++ b/cgi.c
@@ -422,7 +422,11 @@ resp_searchform(const struct req *req)
/* Write architecture selector. */
- puts("<SELECT NAME=\"arch\">");
+ printf( "<SELECT NAME=\"arch\">\n"
+ "<OPTION VALUE=\"default\"");
+ if (NULL == req->q.arch)
+ printf(" SELECTED");
+ puts(">All Architectures</OPTION>");
for (i = 0; i < arch_MAX; i++) {
printf("<OPTION VALUE=\"%s\"", arch_names[i]);
if (NULL != req->q.arch &&
@@ -559,7 +563,9 @@ pg_error_internal(void)
static void
pg_searchres(const struct req *req, struct manpage *r, size_t sz)
{
+ char *arch, *archend;
size_t i, iuse, isec;
+ int archprio, archpriouse;
int prio, priouse;
char sec;
@@ -622,12 +628,30 @@ pg_searchres(const struct req *req, struct manpage *r, size_t sz)
puts("<HR>");
iuse = 0;
priouse = 10;
+ archpriouse = 3;
for (i = 0; i < sz; i++) {
isec = strcspn(r[i].file, "123456789");
sec = r[i].file[isec];
if ('\0' == sec)
continue;
prio = sec_prios[sec - '1'];
+ if (NULL == req->q.arch) {
+ archprio =
+ (NULL == (arch = strchr(
+ r[i].file + isec, '/'))) ? 3 :
+ (NULL == (archend = strchr(
+ arch + 1, '/'))) ? 0 :
+ strncmp(arch, "amd64/",
+ archend - arch) ? 2 : 1;
+ if (archprio < archpriouse) {
+ archpriouse = archprio;
+ priouse = prio;
+ iuse = i;
+ continue;
+ }
+ if (archprio > archpriouse)
+ continue;
+ }
if (prio >= priouse)
continue;
priouse = prio;