version 1.16, 2014/01/05 03:25:51 |
version 1.17, 2014/01/05 04:13:52 |
|
|
|
|
struct match { |
struct match { |
uint64_t id; /* identifier in database */ |
uint64_t id; /* identifier in database */ |
char *file; /* relative filepath of manpage */ |
|
char *desc; /* description of manpage */ |
char *desc; /* description of manpage */ |
int form; /* 0 == catpage */ |
int form; /* 0 == catpage */ |
}; |
}; |
Line 126 static const struct type types[] = { |
|
Line 125 static const struct type types[] = { |
|
{ 0ULL, NULL } |
{ 0ULL, NULL } |
}; |
}; |
|
|
static char *buildnames(sqlite3 *, sqlite3_stmt *, uint64_t); |
static void buildnames(struct manpage *, sqlite3 *, |
|
sqlite3_stmt *, uint64_t, const char *); |
static char *buildoutput(sqlite3 *, sqlite3_stmt *, |
static char *buildoutput(sqlite3 *, sqlite3_stmt *, |
uint64_t, uint64_t); |
uint64_t, uint64_t); |
static void *hash_alloc(size_t, void *); |
static void *hash_alloc(size_t, void *); |
Line 279 mansearch(const struct mansearch *search, |
|
Line 279 mansearch(const struct mansearch *search, |
|
* distribution of buckets in the table. |
* distribution of buckets in the table. |
*/ |
*/ |
while (SQLITE_ROW == (c = sqlite3_step(s))) { |
while (SQLITE_ROW == (c = sqlite3_step(s))) { |
id = sqlite3_column_int64(s, 3); |
id = sqlite3_column_int64(s, 2); |
idx = ohash_lookup_memory |
idx = ohash_lookup_memory |
(&htab, (char *)&id, |
(&htab, (char *)&id, |
sizeof(uint64_t), (uint32_t)id); |
sizeof(uint64_t), (uint32_t)id); |
Line 289 mansearch(const struct mansearch *search, |
|
Line 289 mansearch(const struct mansearch *search, |
|
|
|
mp = mandoc_calloc(1, sizeof(struct match)); |
mp = mandoc_calloc(1, sizeof(struct match)); |
mp->id = id; |
mp->id = id; |
mp->file = mandoc_strdup |
|
((char *)sqlite3_column_text(s, 0)); |
|
mp->desc = mandoc_strdup |
mp->desc = mandoc_strdup |
((char *)sqlite3_column_text(s, 1)); |
((char *)sqlite3_column_text(s, 0)); |
mp->form = sqlite3_column_int(s, 2); |
mp->form = sqlite3_column_int(s, 1); |
ohash_insert(&htab, idx, mp); |
ohash_insert(&htab, idx, mp); |
} |
} |
|
|
Line 323 mansearch(const struct mansearch *search, |
|
Line 321 mansearch(const struct mansearch *search, |
|
(*res, maxres * sizeof(struct manpage)); |
(*res, maxres * sizeof(struct manpage)); |
} |
} |
mpage = *res + cur; |
mpage = *res + cur; |
if (-1 == asprintf(&mpage->file, "%s/%s", |
|
paths->paths[i], mp->file)) { |
|
perror(0); |
|
exit((int)MANDOCLEVEL_SYSERR); |
|
} |
|
mpage->desc = mp->desc; |
mpage->desc = mp->desc; |
mpage->form = mp->form; |
mpage->form = mp->form; |
mpage->names = buildnames(db, s, mp->id); |
buildnames(mpage, db, s, mp->id, paths->paths[i]); |
mpage->output = outbit ? |
mpage->output = outbit ? |
buildoutput(db, s2, mp->id, outbit) : NULL; |
buildoutput(db, s2, mp->id, outbit) : NULL; |
|
|
free(mp->file); |
|
free(mp); |
free(mp); |
cur++; |
cur++; |
} |
} |
|
|
return(rc); |
return(rc); |
} |
} |
|
|
static char * |
static void |
buildnames(sqlite3 *db, sqlite3_stmt *s, uint64_t id) |
buildnames(struct manpage *mpage, sqlite3 *db, sqlite3_stmt *s, |
|
uint64_t id, const char *path) |
{ |
{ |
char *names, *newnames; |
char *newnames; |
const char *oldnames, *sep1, *name, *sec, *sep2, *arch; |
const char *oldnames, *sep1, *name, *sec, *sep2, *arch; |
size_t i; |
size_t i; |
int c; |
int c; |
|
|
names = NULL; |
mpage->names = NULL; |
i = 1; |
i = 1; |
SQL_BIND_INT64(db, s, i, id); |
SQL_BIND_INT64(db, s, i, id); |
while (SQLITE_ROW == (c = sqlite3_step(s))) { |
while (SQLITE_ROW == (c = sqlite3_step(s))) { |
if (NULL == names) { |
|
|
/* Assemble the list of names. */ |
|
|
|
if (NULL == mpage->names) { |
oldnames = ""; |
oldnames = ""; |
sep1 = ""; |
sep1 = ""; |
} else { |
} else { |
oldnames = names; |
oldnames = mpage->names; |
sep1 = ", "; |
sep1 = ", "; |
} |
} |
sec = sqlite3_column_text(s, 1); |
sec = sqlite3_column_text(s, 1); |
Line 382 buildnames(sqlite3 *db, sqlite3_stmt *s, uint64_t id) |
|
Line 378 buildnames(sqlite3 *db, sqlite3_stmt *s, uint64_t id) |
|
perror(0); |
perror(0); |
exit((int)MANDOCLEVEL_SYSERR); |
exit((int)MANDOCLEVEL_SYSERR); |
} |
} |
free(names); |
free(mpage->names); |
names = newnames; |
mpage->names = newnames; |
|
|
|
/* Also save the first file name encountered. */ |
|
|
|
if (NULL != mpage->file) |
|
continue; |
|
|
|
name = sqlite3_column_text(s, 0); |
|
if (-1 == asprintf(&mpage->file, "%s/%s", path, name)) { |
|
perror(0); |
|
exit((int)MANDOCLEVEL_SYSERR); |
|
} |
} |
} |
if (SQLITE_DONE != c) |
if (SQLITE_DONE != c) |
fprintf(stderr, "%s\n", sqlite3_errmsg(db)); |
fprintf(stderr, "%s\n", sqlite3_errmsg(db)); |
sqlite3_reset(s); |
sqlite3_reset(s); |
return(names); |
|
} |
} |
|
|
static char * |
static char * |