From: schwarze@mdocml.bsd.lv
To: source@mdocml.bsd.lv
Subject: mdocml: Change the mansearch() interface to use the mlinks table in the
Date: Fri, 27 Dec 2013 13:51:25 -0500 (EST) [thread overview]
Message-ID: <201312271851.rBRIpP43018583@krisdoz.my.domain> (raw)
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
reply other threads:[~2013-12-27 18:51 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201312271851.rBRIpP43018583@krisdoz.my.domain \
--to=schwarze@mdocml.bsd.lv \
--cc=source@mdocml.bsd.lv \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).