diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2014-07-24 20:30:45 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2014-07-24 20:30:45 +0000 |
commit | 5ca2f2ec3d00b0df8785d12283e1eff4e6a414f1 (patch) | |
tree | 01bff8de4048e5c059818ab7eb545f5ce4a80811 /mansearch.c | |
parent | 4d3e662fd848a0d5fbda1bc38e39aeb05d9b34dc (diff) | |
download | mandoc-5ca2f2ec3d00b0df8785d12283e1eff4e6a414f1.tar.gz |
Sort result pages first by section number, then by name.
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@.
Diffstat (limited to 'mansearch.c')
-rw-r--r-- | mansearch.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/mansearch.c b/mansearch.c index eaae414f..96e07388 100644 --- a/mansearch.c +++ b/mansearch.c @@ -94,6 +94,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, @@ -331,6 +332,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); @@ -347,6 +349,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) { @@ -360,6 +363,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) @@ -392,6 +407,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 && |