diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2011-11-23 09:55:28 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2011-11-23 09:55:28 +0000 |
commit | 979ead80f9b5753aaff39dfc69262202f5d1235a (patch) | |
tree | 130acbb65999ae478a596530405d1066e017706c | |
parent | dd7a7a37962f5fd5a134a98280617bb07028d374 (diff) | |
download | mandoc-979ead80f9b5753aaff39dfc69262202f5d1235a.tar.gz |
Let apropos_db.h export the volume of manpages for a parsed record.
This is necessary since an array of records can have duplicate record
numbers in different mandoc.index files.
The volume [right now] is just the index of the parsed mandoc.index in
the manpaths. This is sensible because the order of the manpath is
significant (it's the order of duplicate-named manuals displayed by
man(1)) and is thus not likely to change.
-rw-r--r-- | apropos_db.c | 13 | ||||
-rw-r--r-- | apropos_db.h | 5 |
2 files changed, 12 insertions, 6 deletions
diff --git a/apropos_db.c b/apropos_db.c index dcf52453..c3affea4 100644 --- a/apropos_db.c +++ b/apropos_db.c @@ -125,7 +125,7 @@ static int exprmark(const struct expr *, static struct expr *exprexpr(int, char *[], int *, int *, size_t *); static struct expr *exprterm(char *, int); static DB *index_open(void); -static int index_read(const DBT *, const DBT *, +static int index_read(const DBT *, const DBT *, int, const struct mchars *, struct rec *); static void norm_string(const char *, const struct mchars *, char **); @@ -133,7 +133,7 @@ static size_t norm_utf8(unsigned int, char[7]); static void recfree(struct rec *); static int single_search(struct rectree *, const struct opts *, const struct expr *, size_t terms, - struct mchars *); + struct mchars *, int); /* * Open the keyword mandoc-db database. @@ -345,7 +345,7 @@ index_open(void) * Returns 1 if an entry was unpacked, 0 if the database is insane. */ static int -index_read(const DBT *key, const DBT *val, +index_read(const DBT *key, const DBT *val, int index, const struct mchars *mc, struct rec *rec) { size_t left; @@ -364,6 +364,7 @@ index_read(const DBT *key, const DBT *val, cp = (char *)val->data; rec->res.rec = *(recno_t *)key->data; + rec->res.volume = index; INDEX_BREAD(rec->res.file); INDEX_BREAD(rec->res.cat); @@ -402,7 +403,7 @@ apropos_search(int pathsz, char **paths, const struct opts *opts, for (i = 0; i < pathsz; i++) { if (chdir(paths[i])) continue; - if ( ! single_search(&tree, opts, expr, terms, mc)) + if ( ! single_search(&tree, opts, expr, terms, mc, i)) goto out; } @@ -438,7 +439,7 @@ out: static int single_search(struct rectree *tree, const struct opts *opts, const struct expr *expr, size_t terms, - struct mchars *mc) + struct mchars *mc, int vol) { int root, leaf, ch; uint64_t mask; @@ -525,7 +526,7 @@ single_search(struct rectree *tree, const struct opts *opts, break; r.lhs = r.rhs = -1; - if ( ! index_read(&key, &val, mc, &r)) + if ( ! index_read(&key, &val, vol, mc, &r)) break; /* XXX: this should be elsewhere, I guess? */ diff --git a/apropos_db.h b/apropos_db.h index 62a392f3..316d5669 100644 --- a/apropos_db.h +++ b/apropos_db.h @@ -24,6 +24,11 @@ struct res { char *arch; /* arch (or empty string) */ char *desc; /* description (from Nd) */ unsigned int rec; /* record in index */ + /* + * The index volume. This indexes into the array of directories + * searched for manual page databases. + */ + unsigned int volume; }; struct opts { |