=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/mansearch.c,v retrieving revision 1.7 retrieving revision 1.8 diff -c -r1.7 -r1.8 *** src/usr.bin/mandoc/mansearch.c 2014/01/05 03:25:51 1.7 --- src/usr.bin/mandoc/mansearch.c 2014/01/05 04:13:46 1.8 *************** *** 1,4 **** ! /* $Id: mansearch.c,v 1.7 2014/01/05 03:25:51 schwarze Exp $ */ /* * Copyright (c) 2012 Kristaps Dzonsons * Copyright (c) 2013, 2014 Ingo Schwarze --- 1,4 ---- ! /* $Id: mansearch.c,v 1.8 2014/01/05 04:13:46 schwarze Exp $ */ /* * Copyright (c) 2012 Kristaps Dzonsons * Copyright (c) 2013, 2014 Ingo Schwarze *************** *** 62,68 **** struct match { uint64_t id; /* identifier in database */ - char *file; /* relative filepath of manpage */ char *desc; /* description of manpage */ int form; /* 0 == catpage */ }; --- 62,67 ---- *************** *** 118,124 **** { 0ULL, NULL } }; ! static char *buildnames(sqlite3 *, sqlite3_stmt *, uint64_t); static char *buildoutput(sqlite3 *, sqlite3_stmt *, uint64_t, uint64_t); static void *hash_alloc(size_t, void *); --- 117,124 ---- { 0ULL, NULL } }; ! static void buildnames(struct manpage *, sqlite3 *, ! sqlite3_stmt *, uint64_t, const char *); static char *buildoutput(sqlite3 *, sqlite3_stmt *, uint64_t, uint64_t); static void *hash_alloc(size_t, void *); *************** *** 271,277 **** * distribution of buckets in the table. */ while (SQLITE_ROW == (c = sqlite3_step(s))) { ! id = sqlite3_column_int64(s, 3); idx = ohash_lookup_memory (&htab, (char *)&id, sizeof(uint64_t), (uint32_t)id); --- 271,277 ---- * distribution of buckets in the table. */ while (SQLITE_ROW == (c = sqlite3_step(s))) { ! id = sqlite3_column_int64(s, 2); idx = ohash_lookup_memory (&htab, (char *)&id, sizeof(uint64_t), (uint32_t)id); *************** *** 281,291 **** mp = mandoc_calloc(1, sizeof(struct match)); mp->id = id; - mp->file = mandoc_strdup - ((char *)sqlite3_column_text(s, 0)); mp->desc = mandoc_strdup ! ((char *)sqlite3_column_text(s, 1)); ! mp->form = sqlite3_column_int(s, 2); ohash_insert(&htab, idx, mp); } --- 281,289 ---- mp = mandoc_calloc(1, sizeof(struct match)); mp->id = id; mp->desc = mandoc_strdup ! ((char *)sqlite3_column_text(s, 0)); ! mp->form = sqlite3_column_int(s, 1); ohash_insert(&htab, idx, mp); } *************** *** 315,332 **** (*res, maxres * sizeof(struct manpage)); } 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->form = mp->form; ! mpage->names = buildnames(db, s, mp->id); mpage->output = outbit ? buildoutput(db, s2, mp->id, outbit) : NULL; - free(mp->file); free(mp); cur++; } --- 313,324 ---- (*res, maxres * sizeof(struct manpage)); } mpage = *res + cur; mpage->desc = mp->desc; mpage->form = mp->form; ! buildnames(mpage, db, s, mp->id, paths->paths[i]); mpage->output = outbit ? buildoutput(db, s2, mp->id, outbit) : NULL; free(mp); cur++; } *************** *** 346,368 **** 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); --- 338,364 ---- return(rc); } ! static void ! buildnames(struct manpage *mpage, sqlite3 *db, sqlite3_stmt *s, ! uint64_t id, const char *path) { ! char *newnames; const char *oldnames, *sep1, *name, *sec, *sep2, *arch; size_t i; int c; ! mpage->names = NULL; i = 1; SQL_BIND_INT64(db, s, i, id); while (SQLITE_ROW == (c = sqlite3_step(s))) { ! ! /* Assemble the list of names. */ ! ! if (NULL == mpage->names) { oldnames = ""; sep1 = ""; } else { ! oldnames = mpage->names; sep1 = ", "; } sec = sqlite3_column_text(s, 1); *************** *** 374,386 **** 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); } static char * --- 370,392 ---- perror(0); exit((int)MANDOCLEVEL_SYSERR); } ! free(mpage->names); ! 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) fprintf(stderr, "%s\n", sqlite3_errmsg(db)); sqlite3_reset(s); } static char *