Sort result pages first by section number, then by name.
authorschwarze <schwarze@openbsd.org>
Thu, 24 Jul 2014 20:30:38 +0000 (20:30 +0000)
committerschwarze <schwarze@openbsd.org>
Thu, 24 Jul 2014 20:30:38 +0000 (20:30 +0000)
By moving the sort from cgi.c to mansearch.c, we get two advantages:
Easier access to the data needed for sorting, in particular the section
number, and the apropos(1) command line utility profits as well.

Feature requested by deraadt@.

usr.bin/mandoc/cgi.c
usr.bin/mandoc/mansearch.c
usr.bin/mandoc/mansearch.h

index bc474a6..f0168e8 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: cgi.c,v 1.21 2014/07/24 08:25:45 schwarze Exp $ */
+/*     $Id: cgi.c,v 1.22 2014/07/24 20:30:38 schwarze Exp $ */
 /*
  * Copyright (c) 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2014 Ingo Schwarze <schwarze@usta.de>
@@ -49,7 +49,6 @@ struct        req {
 };
 
 static void             catman(const struct req *, const char *);
-static int              cmp(const void *, const void *);
 static void             format(const struct req *, const char *);
 static void             html_print(const char *);
 static void             html_printquery(const struct req *);
@@ -589,8 +588,6 @@ pg_searchres(const struct req *req, struct manpage *r, size_t sz)
                return;
        }
 
-       qsort(r, sz, sizeof(struct manpage), cmp);
-
        resp_begin_html(200, NULL);
        resp_searchform(req);
        puts("<DIV CLASS=\"results\">");
@@ -1055,14 +1052,6 @@ main(void)
        return(EXIT_SUCCESS);
 }
 
-static int
-cmp(const void *p1, const void *p2)
-{
-
-       return(strcasecmp(((const struct manpage *)p1)->names,
-           ((const struct manpage *)p2)->names));
-}
-
 /*
  * Scan for indexable paths.
  */
index 443c3a8..d588135 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mansearch.c,v 1.28 2014/07/12 13:59:54 schwarze Exp $ */
+/*     $Id: mansearch.c,v 1.29 2014/07/24 20:30:38 schwarze Exp $ */
 /*
  * Copyright (c) 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -86,6 +86,7 @@ static        void             exprfree(struct expr *);
 static struct expr     *exprspec(struct expr *, uint64_t,
                                 const char *, const char *);
 static struct expr     *exprterm(const struct mansearch *, char *, int);
+static int              manpage_compare(const void *, const void *);
 static void             sql_append(char **sql, size_t *sz,
                                const char *newstr, int count);
 static void             sql_match(sqlite3_context *context,
@@ -323,6 +324,7 @@ mansearch(const struct mansearch *search,
                                    maxres, sizeof(struct manpage));
                        }
                        mpage = *res + cur;
+                       mpage->sec = 10;
                        mpage->form = mp->form;
                        buildnames(mpage, db, s, mp->pageid,
                            paths->paths[i], mp->form);
@@ -339,6 +341,7 @@ mansearch(const struct mansearch *search,
                sqlite3_close(db);
                ohash_delete(&htab);
        }
+       qsort(*res, cur, sizeof(struct manpage), manpage_compare);
        rc = 1;
 out:
        if (-1 != fd) {
@@ -352,6 +355,18 @@ out:
        return(rc);
 }
 
+static int
+manpage_compare(const void *vp1, const void *vp2)
+{
+       const struct manpage    *mp1, *mp2;
+       int                      diff;
+
+       mp1 = vp1;
+       mp2 = vp2;
+       diff = mp1->sec - mp2->sec;
+       return(diff ? diff : strcasecmp(mp1->names, mp2->names));
+}
+
 static void
 buildnames(struct manpage *mpage, sqlite3 *db, sqlite3_stmt *s,
                uint64_t pageid, const char *path, int form)
@@ -384,6 +399,11 @@ buildnames(struct manpage *mpage, sqlite3 *db, sqlite3_stmt *s,
                arch = sqlite3_column_text(s, 1);
                name = sqlite3_column_text(s, 2);
 
+               /* Remember the first section found. */
+
+               if (9 < mpage->sec && '1' <= *sec && '9' >= *sec)
+                       mpage->sec = (*sec - '1') + 1;
+
                /* If the section changed, append the old one. */
 
                if (NULL != prevsec &&
index 4eee09c..18d7636 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mansearch.h,v 1.10 2014/07/12 13:59:54 schwarze Exp $ */
+/*     $Id: mansearch.h,v 1.11 2014/07/24 20:30:38 schwarze Exp $ */
 /*
  * Copyright (c) 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -74,6 +74,7 @@ struct        manpage {
        char            *file; /* to be prefixed by manpath */
        char            *names; /* a list of names with sections */
        char            *output; /* user-defined additional output */
+       int              sec; /* section number, 10 means invalid */
        int              form; /* 0 == catpage */
 };