From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from krisdoz.my.domain (schwarze@localhost [127.0.0.1]) by krisdoz.my.domain (8.14.5/8.14.5) with ESMTP id rBRIpPu2028286 for ; Fri, 27 Dec 2013 13:51:25 -0500 (EST) Received: (from schwarze@localhost) by krisdoz.my.domain (8.14.5/8.14.3/Submit) id rBRIpP43018583; Fri, 27 Dec 2013 13:51:25 -0500 (EST) Date: Fri, 27 Dec 2013 13:51:25 -0500 (EST) Message-Id: <201312271851.rBRIpP43018583@krisdoz.my.domain> X-Mailinglist: mdocml-source Reply-To: source@mdocml.bsd.lv MIME-Version: 1.0 From: schwarze@mdocml.bsd.lv To: source@mdocml.bsd.lv Subject: mdocml: Change the mansearch() interface to use the mlinks table in the X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/ Content-Type: text/plain; charset=utf-8 Log Message: ----------- Change the mansearch() interface to use the mlinks table in the database and return a list of names with sections, used by apropos(1) for display. While here, improve uniformity of the interface by allocating the file name dynamically, just like the names list and the description. Modified Files: -------------- mdocml: mansearch.h mansearch.c apropos.c manpage.c Revision Data ------------- Index: manpage.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/manpage.c,v retrieving revision 1.4 retrieving revision 1.5 diff -Lmanpage.c -Lmanpage.c -u -p -r1.4 -r1.5 --- manpage.c +++ manpage.c @@ -106,11 +106,14 @@ main(int argc, char *argv[]) for (i = 0; i < sz; i++) { printf("%6zu %s: %s\n", - i + 1, res[i].file, res[i].desc); + i + 1, res[i].names, res[i].desc); + free(res[i].names); free(res[i].desc); } if (0 == term) { + for (i = 0; i < sz; i++) + free(res[i].file); free(res); return(EXIT_SUCCESS); } @@ -127,12 +130,16 @@ main(int argc, char *argv[]) } if (0 == i) { + for (i = 0; i < sz; i++) + free(res[i].file); free(res); return(EXIT_SUCCESS); } show: cmd = res[i - 1].form ? "mandoc" : "cat"; strlcpy(buf, res[i - 1].file, PATH_MAX); + for (i = 0; i < sz; i++) + free(res[i].file); free(res); show(cmd, buf); Index: mansearch.h =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mansearch.h,v retrieving revision 1.4 retrieving revision 1.5 diff -Lmansearch.h -Lmansearch.h -u -p -r1.4 -r1.5 --- mansearch.h +++ mansearch.h @@ -61,7 +61,8 @@ __BEGIN_DECLS struct manpage { - char file[PATH_MAX]; /* prefixed by manpath */ + char *file; /* to be prefixed by manpath */ + char *names; /* a list of names with sections */ char *desc; /* description of manpage */ int form; /* 0 == catpage */ }; Index: mansearch.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mansearch.c,v retrieving revision 1.9 retrieving revision 1.10 diff -Lmansearch.c -Lmansearch.c -u -p -r1.9 -r1.10 --- mansearch.c +++ mansearch.c @@ -144,7 +144,9 @@ mansearch(const struct mansearch *search int fd, rc, c; int64_t id; char buf[PATH_MAX]; - char *sql; + char *sql, *newnames; + const char *oldnames, *sep1, *name, *sec, *sep2, *arch; + struct manpage *mpage; struct expr *e, *ep; sqlite3 *db; sqlite3_stmt *s; @@ -282,7 +284,12 @@ mansearch(const struct mansearch *search fprintf(stderr, "%s\n", sqlite3_errmsg(db)); sqlite3_finalize(s); - sqlite3_close(db); + + c = sqlite3_prepare_v2(db, + "SELECT * FROM mlinks WHERE pageid=?", + -1, &s, NULL); + if (SQLITE_OK != c) + fprintf(stderr, "%s\n", sqlite3_errmsg(db)); for (mp = ohash_first(&htab, &idx); NULL != mp; @@ -292,16 +299,50 @@ mansearch(const struct mansearch *search *res = mandoc_realloc (*res, maxres * sizeof(struct manpage)); } - strlcpy((*res)[cur].file, - paths->paths[i], PATH_MAX); - strlcat((*res)[cur].file, "/", PATH_MAX); - strlcat((*res)[cur].file, mp->file, PATH_MAX); - (*res)[cur].desc = mp->desc; - (*res)[cur].form = mp->form; + mpage = *res + cur; + if (-1 == asprintf(&mpage->file, "%s/%s", + paths->paths[i], mp->file)) { + 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); + free(mp->file); free(mp); cur++; } + + sqlite3_finalize(s); + sqlite3_close(db); ohash_delete(&htab); } rc = 1; Index: apropos.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/apropos.c,v retrieving revision 1.34 retrieving revision 1.35 diff -Lapropos.c -Lapropos.c -u -p -r1.34 -r1.35 --- apropos.c +++ apropos.c @@ -96,7 +96,9 @@ main(int argc, char *argv[]) goto usage; for (i = 0; i < sz; i++) { - printf("%s - %s\n", res[i].file, res[i].desc); + printf("%s - %s\n", res[i].names, res[i].desc); + free(res[i].file); + free(res[i].names); free(res[i].desc); } -- To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv