aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/mansearch.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2014-03-17 16:31:44 +0000
committerIngo Schwarze <schwarze@openbsd.org>2014-03-17 16:31:44 +0000
commitc853f6f8a2120da05fefa917fd81392092403bf0 (patch)
treedf186fcc3c6e90cb521fb63cb584f5491715cd0a /mansearch.c
parent435b3ab2840658c6c29f0a7803ac132f46ed1d1d (diff)
downloadmandoc-c853f6f8a2120da05fefa917fd81392092403bf0.tar.gz
mandoc-c853f6f8a2120da05fefa917fd81392092403bf0.tar.zst
mandoc-c853f6f8a2120da05fefa917fd81392092403bf0.zip
in apropos(1) output, sort names and avoid multiple section numbers
Diffstat (limited to 'mansearch.c')
-rw-r--r--mansearch.c62
1 files changed, 55 insertions, 7 deletions
diff --git a/mansearch.c b/mansearch.c
index 24828c08..dd7ab9cd 100644
--- a/mansearch.c
+++ b/mansearch.c
@@ -1,4 +1,4 @@
-/* $Id: mansearch.c,v 1.21 2014/01/19 23:09:30 schwarze Exp $ */
+/* $Id: mansearch.c,v 1.22 2014/03/17 16:31:44 schwarze Exp $ */
/*
* Copyright (c) 2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -254,7 +254,8 @@ mansearch(const struct mansearch *search,
sqlite3_finalize(s);
c = sqlite3_prepare_v2(db,
- "SELECT * FROM mlinks WHERE pageid=?",
+ "SELECT * FROM mlinks WHERE pageid=?"
+ " ORDER BY sec, arch, name",
-1, &s, NULL);
if (SQLITE_OK != c)
fprintf(stderr, "%s\n", sqlite3_errmsg(db));
@@ -303,17 +304,18 @@ static void
buildnames(struct manpage *mpage, sqlite3 *db, sqlite3_stmt *s,
uint64_t id, const char *path, int form)
{
- char *newnames;
+ char *newnames, *prevsec, *prevarch;
const char *oldnames, *sep1, *name, *sec, *sep2, *arch, *fsec;
size_t i;
int c;
mpage->names = NULL;
+ prevsec = prevarch = NULL;
i = 1;
SQL_BIND_INT64(db, s, i, id);
while (SQLITE_ROW == (c = sqlite3_step(s))) {
- /* Assemble the list of names. */
+ /* Decide whether we already have some names. */
if (NULL == mpage->names) {
oldnames = "";
@@ -322,12 +324,42 @@ buildnames(struct manpage *mpage, sqlite3 *db, sqlite3_stmt *s,
oldnames = mpage->names;
sep1 = ", ";
}
+
+ /* Fetch the next name. */
+
sec = sqlite3_column_text(s, 0);
arch = sqlite3_column_text(s, 1);
name = sqlite3_column_text(s, 2);
- sep2 = '\0' == *arch ? "" : "/";
- if (-1 == asprintf(&newnames, "%s%s%s(%s%s%s)",
- oldnames, sep1, name, sec, sep2, arch)) {
+
+ /* If the section changed, append the old one. */
+
+ if (NULL != prevsec &&
+ (strcmp(sec, prevsec) ||
+ strcmp(arch, prevarch))) {
+ sep2 = '\0' == *prevarch ? "" : "/";
+ if (-1 == asprintf(&newnames, "%s(%s%s%s)",
+ oldnames, prevsec, sep2, prevarch)) {
+ perror(0);
+ exit((int)MANDOCLEVEL_SYSERR);
+ }
+ free(mpage->names);
+ oldnames = mpage->names = newnames;
+ free(prevsec);
+ free(prevarch);
+ prevsec = prevarch = NULL;
+ }
+
+ /* Save the new section, to append it later. */
+
+ if (NULL == prevsec) {
+ prevsec = mandoc_strdup(sec);
+ prevarch = mandoc_strdup(arch);
+ }
+
+ /* Append the new name. */
+
+ if (-1 == asprintf(&newnames, "%s%s%s",
+ oldnames, sep1, name)) {
perror(0);
exit((int)MANDOCLEVEL_SYSERR);
}
@@ -346,6 +378,7 @@ buildnames(struct manpage *mpage, sqlite3 *db, sqlite3_stmt *s,
sep1 = "cat";
fsec = "0";
}
+ sep2 = '\0' == *arch ? "" : "/";
if (-1 == asprintf(&mpage->file, "%s/%s%s%s%s/%s.%s",
path, sep1, sec, sep2, arch, name, fsec)) {
perror(0);
@@ -355,6 +388,21 @@ buildnames(struct manpage *mpage, sqlite3 *db, sqlite3_stmt *s,
if (SQLITE_DONE != c)
fprintf(stderr, "%s\n", sqlite3_errmsg(db));
sqlite3_reset(s);
+
+ /* Append one final section to the names. */
+
+ if (NULL != prevsec) {
+ sep2 = '\0' == *prevarch ? "" : "/";
+ if (-1 == asprintf(&newnames, "%s(%s%s%s)",
+ mpage->names, prevsec, sep2, prevarch)) {
+ perror(0);
+ exit((int)MANDOCLEVEL_SYSERR);
+ }
+ free(mpage->names);
+ mpage->names = newnames;
+ free(prevsec);
+ free(prevarch);
+ }
}
static char *