summaryrefslogtreecommitdiffstats
path: root/mansearch.c
diff options
context:
space:
mode:
Diffstat (limited to 'mansearch.c')
-rw-r--r--mansearch.c70
1 files changed, 40 insertions, 30 deletions
diff --git a/mansearch.c b/mansearch.c
index 220eefd4..7d3ac65b 100644
--- a/mansearch.c
+++ b/mansearch.c
@@ -121,6 +121,7 @@ static const struct type types[] = {
{ 0ULL, NULL }
};
+static char *buildnames(sqlite3 *, sqlite3_stmt *, uint64_t);
static void *hash_alloc(size_t, void *);
static void hash_free(void *, size_t, void *);
static void *hash_halloc(size_t, void *);
@@ -144,8 +145,7 @@ mansearch(const struct mansearch *search,
int fd, rc, c;
int64_t id;
char buf[PATH_MAX];
- char *sql, *newnames;
- const char *oldnames, *sep1, *name, *sec, *sep2, *arch;
+ char *sql;
struct manpage *mpage;
struct expr *e, *ep;
sqlite3 *db;
@@ -305,36 +305,9 @@ mansearch(const struct mansearch *search,
perror(0);
exit((int)MANDOCLEVEL_SYSERR);
}
- mpage->names = NULL;
mpage->desc = mp->desc;
mpage->form = mp->form;
-
- j = 1;
- SQL_BIND_INT64(db, s, j, mp->id);
- while (SQLITE_ROW == (c = sqlite3_step(s))) {
- if (NULL == mpage->names) {
- oldnames = "";
- sep1 = "";
- } else {
- oldnames = mpage->names;
- sep1 = ", ";
- }
- sec = sqlite3_column_text(s, 1);
- arch = sqlite3_column_text(s, 2);
- name = sqlite3_column_text(s, 3);
- sep2 = '\0' == *arch ? "" : "/";
- if (-1 == asprintf(&newnames,
- "%s%s%s(%s%s%s)", oldnames, sep1,
- name, sec, sep2, arch)) {
- perror(0);
- exit((int)MANDOCLEVEL_SYSERR);
- }
- free(mpage->names);
- mpage->names = newnames;
- }
- if (SQLITE_DONE != c)
- fprintf(stderr, "%s\n", sqlite3_errmsg(db));
- sqlite3_reset(s);
+ mpage->names = buildnames(db, s, mp->id);
free(mp->file);
free(mp);
@@ -355,6 +328,43 @@ out:
return(rc);
}
+static char *
+buildnames(sqlite3 *db, sqlite3_stmt *s, uint64_t id)
+{
+ char *names, *newnames;
+ const char *oldnames, *sep1, *name, *sec, *sep2, *arch;
+ size_t i;
+ int c;
+
+ names = NULL;
+ i = 1;
+ SQL_BIND_INT64(db, s, i, id);
+ while (SQLITE_ROW == (c = sqlite3_step(s))) {
+ if (NULL == names) {
+ oldnames = "";
+ sep1 = "";
+ } else {
+ oldnames = names;
+ sep1 = ", ";
+ }
+ sec = sqlite3_column_text(s, 1);
+ arch = sqlite3_column_text(s, 2);
+ name = sqlite3_column_text(s, 3);
+ sep2 = '\0' == *arch ? "" : "/";
+ if (-1 == asprintf(&newnames, "%s%s%s(%s%s%s)",
+ oldnames, sep1, name, sec, sep2, arch)) {
+ perror(0);
+ exit((int)MANDOCLEVEL_SYSERR);
+ }
+ free(names);
+ names = newnames;
+ }
+ if (SQLITE_DONE != c)
+ fprintf(stderr, "%s\n", sqlite3_errmsg(db));
+ sqlite3_reset(s);
+ return(names);
+}
+
/*
* Implement substring match as an application-defined SQL function.
* Using the SQL LIKE or GLOB operators instead would be a bad idea