diff options
author | Ingo Schwarze <schwarze@cvs.openbsd.org> | 2011-11-17 15:38:28 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@cvs.openbsd.org> | 2011-11-17 15:38:28 +0000 |
commit | 1dbe93241471a57c0b34d15e5ba4aafff750c2da (patch) | |
tree | 365b3668b3e26309163c49a526ef5ad9961a12ed /usr.bin | |
parent | 918e9b4951380042778d29d5e40e9a58db19e006 (diff) |
Change the search type mask from 32 to 64 bit such that a full set
of search types can be supported in the future. While here, replace
a couple of memcpy(3)s by proper, statically type-checked assignments,
and de-obfuscate some magical numbers using sizeof().
Diffstat (limited to 'usr.bin')
-rw-r--r-- | usr.bin/mandoc/apropos_db.c | 57 | ||||
-rw-r--r-- | usr.bin/mandoc/mandocdb.c | 28 | ||||
-rw-r--r-- | usr.bin/mandoc/mandocdb.h | 57 |
3 files changed, 99 insertions, 43 deletions
diff --git a/usr.bin/mandoc/apropos_db.c b/usr.bin/mandoc/apropos_db.c index 6759852abf4..3e722dbc4be 100644 --- a/usr.bin/mandoc/apropos_db.c +++ b/usr.bin/mandoc/apropos_db.c @@ -1,4 +1,4 @@ -/* $Id: apropos_db.c,v 1.5 2011/11/17 14:52:32 schwarze Exp $ */ +/* $Id: apropos_db.c,v 1.6 2011/11/17 15:38:27 schwarze Exp $ */ /* * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org> @@ -19,6 +19,7 @@ #include <fcntl.h> #include <regex.h> #include <stdarg.h> +#include <stdint.h> #include <stdlib.h> #include <string.h> #include <unistd.h> @@ -41,7 +42,7 @@ struct rectree { struct expr { int regex; int index; - int mask; + uint64_t mask; int and; char *v; regex_t re; @@ -49,22 +50,47 @@ struct expr { }; struct type { - int mask; + uint64_t mask; const char *name; }; static const struct type types[] = { { TYPE_An, "An" }, + { TYPE_Ar, "Ar" }, + { TYPE_At, "At" }, + { TYPE_Bsx, "Bsx" }, + { TYPE_Bx, "Bx" }, { TYPE_Cd, "Cd" }, + { TYPE_Cm, "Cm" }, + { TYPE_Dv, "Dv" }, + { TYPE_Dx, "Dx" }, + { TYPE_Em, "Em" }, { TYPE_Er, "Er" }, { TYPE_Ev, "Ev" }, + { TYPE_Fa, "Fa" }, + { TYPE_Fl, "Fl" }, { TYPE_Fn, "Fn" }, { TYPE_Fn, "Fo" }, + { TYPE_Ft, "Ft" }, + { TYPE_Fx, "Fx" }, + { TYPE_Ic, "Ic" }, { TYPE_In, "In" }, + { TYPE_Lb, "Lb" }, + { TYPE_Li, "Li" }, + { TYPE_Lk, "Lk" }, + { TYPE_Ms, "Ms" }, + { TYPE_Mt, "Mt" }, { TYPE_Nd, "Nd" }, { TYPE_Nm, "Nm" }, + { TYPE_Nx, "Nx" }, + { TYPE_Ox, "Ox" }, { TYPE_Pa, "Pa" }, + { TYPE_Rs, "Rs" }, + { TYPE_Sh, "Sh" }, + { TYPE_Ss, "Ss" }, { TYPE_St, "St" }, + { TYPE_Sy, "Sy" }, + { TYPE_Tn, "Tn" }, { TYPE_Va, "Va" }, { TYPE_Va, "Vt" }, { TYPE_Xr, "Xr" }, @@ -74,9 +100,9 @@ static const struct type types[] = { static DB *btree_open(void); static int btree_read(const DBT *, const struct mchars *, char **); -static int exprexecpre(const struct expr *, const char *, int); +static int exprexecpre(const struct expr *, const char *, uint64_t); static void exprexecpost(const struct expr *, - const char *, int, int *, size_t); + const char *, uint64_t, int *, size_t); static struct expr *exprterm(char *, int, int); static DB *index_open(void); static int index_read(const DBT *, const DBT *, @@ -381,7 +407,7 @@ single_search(struct rectree *tree, const struct opts *opts, const struct expr *expr, size_t terms, struct mchars *mc) { - int root, leaf, mask; + int root, leaf; DBT key, val; DB *btree, *idx; int ch; @@ -389,6 +415,7 @@ single_search(struct rectree *tree, const struct opts *opts, recno_t rec; struct rec *recs; struct rec srec; + struct db_val *vbuf; root = -1; leaf = -1; @@ -412,21 +439,19 @@ single_search(struct rectree *tree, const struct opts *opts, * The key must have something in it, and the value must * have the correct tags/recno mix. */ - if (key.size < 2 || 8 != val.size) + if (key.size < 2 || sizeof(struct db_val) != val.size) break; if ( ! btree_read(&key, mc, &buf)) break; - mask = *(int *)val.data; - /* * See if this keyword record matches any of the * expressions we have stored. */ - if ( ! exprexecpre(expr, buf, mask)) + vbuf = val.data; + if ( ! exprexecpre(expr, buf, vbuf->mask)) continue; - - memcpy(&rec, val.data + 4, sizeof(recno_t)); + rec = vbuf->rec; /* * O(log n) scan for prior records. Since a record @@ -445,7 +470,7 @@ single_search(struct rectree *tree, const struct opts *opts, if (leaf >= 0 && recs[leaf].rec == rec) { if (0 == recs[leaf].matches[0]) exprexecpost - (expr, buf, mask, + (expr, buf, vbuf->mask, recs[leaf].matches, terms); continue; } @@ -478,7 +503,7 @@ single_search(struct rectree *tree, const struct opts *opts, mandoc_calloc(terms + 1, sizeof(int)); exprexecpost - (expr, buf, mask, + (expr, buf, vbuf->mask, recs[tree->len].matches, terms); /* Append to our tree. */ @@ -642,7 +667,7 @@ exprfree(struct expr *p) * Return 1 if any expression evaluates to true, else 0. */ static int -exprexecpre(const struct expr *p, const char *cp, int mask) +exprexecpre(const struct expr *p, const char *cp, uint64_t mask) { for ( ; NULL != p; p = p->next) { @@ -666,7 +691,7 @@ exprexecpre(const struct expr *p, const char *cp, int mask) */ static void exprexecpost(const struct expr *e, const char *cp, - int mask, int *matches, size_t matchsz) + uint64_t mask, int *matches, size_t matchsz) { const struct expr *p; int match; diff --git a/usr.bin/mandoc/mandocdb.c b/usr.bin/mandoc/mandocdb.c index 2a3bf3748eb..15981d6f268 100644 --- a/usr.bin/mandoc/mandocdb.c +++ b/usr.bin/mandoc/mandocdb.c @@ -1,4 +1,4 @@ -/* $Id: mandocdb.c,v 1.8 2011/11/17 15:02:29 schwarze Exp $ */ +/* $Id: mandocdb.c,v 1.9 2011/11/17 15:38:27 schwarze Exp $ */ /* * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv> * @@ -79,7 +79,7 @@ static void buf_append(struct buf *, const char *); static void buf_appendb(struct buf *, const void *, size_t); static void dbt_put(DB *, const char *, DBT *, DBT *); -static void hash_put(DB *, const struct buf *, int); +static void hash_put(DB *, const struct buf *, uint64_t); static void hash_reset(DB **); static void index_merge(const struct of *, struct mparse *, struct buf *, struct buf *, @@ -473,7 +473,7 @@ index_merge(const struct of *of, struct mparse *mp, const char *fn, *msec, *mtitle, *arch; size_t sv; unsigned seq; - char vbuf[8]; + struct db_val vbuf; for (rec = 0; of; of = of->next) { fn = of->fname; @@ -572,17 +572,15 @@ index_merge(const struct of *of, struct mparse *mp, * Copy from the in-memory hashtable of pending keywords * into the database. */ - - memset(vbuf, 0, sizeof(uint32_t)); - memcpy(vbuf + 4, &rec, sizeof(uint32_t)); + vbuf.rec = rec; seq = R_FIRST; while (0 == (ch = (*hash->seq)(hash, &key, &val, seq))) { seq = R_NEXT; - memcpy(vbuf, val.data, sizeof(uint32_t)); - val.size = sizeof(vbuf); - val.data = vbuf; + vbuf.mask = *(uint64_t *)val.data; + val.size = sizeof(struct db_val); + val.data = &vbuf; if (verb > 1) printf("%s: Added keyword: %s\n", @@ -627,6 +625,7 @@ index_prune(const struct of *ofile, DB *db, const char *dbf, { const struct of *of; const char *fn; + struct db_val *vbuf; unsigned seq, sseq; DBT key, val; size_t reccur; @@ -659,8 +658,9 @@ index_prune(const struct of *ofile, DB *db, const char *dbf, sseq = R_FIRST; while (0 == (ch = (*db->seq)(db, &key, &val, sseq))) { sseq = R_NEXT; - assert(8 == val.size); - if (*maxrec != *(recno_t *)(val.data + 4)) + assert(sizeof(struct db_val) == val.size); + vbuf = val.data; + if (*maxrec != vbuf->rec) continue; if (verb) printf("%s: Deleted keyword: %s\n", @@ -1041,7 +1041,7 @@ pmdoc_Nm(MDOC_ARGS) } static void -hash_put(DB *db, const struct buf *buf, int mask) +hash_put(DB *db, const struct buf *buf, uint64_t mask) { DBT key, val; int rc; @@ -1056,10 +1056,10 @@ hash_put(DB *db, const struct buf *buf, int mask) perror("hash"); exit((int)MANDOCLEVEL_SYSERR); } else if (0 == rc) - mask |= *(int *)val.data; + mask |= *(uint64_t *)val.data; val.data = &mask; - val.size = sizeof(int); + val.size = sizeof(uint64_t); if ((rc = (*db->put)(db, &key, &val, 0)) < 0) { perror("hash"); diff --git a/usr.bin/mandoc/mandocdb.h b/usr.bin/mandoc/mandocdb.h index 4e67239eed2..8b5bd54df4c 100644 --- a/usr.bin/mandoc/mandocdb.h +++ b/usr.bin/mandoc/mandocdb.h @@ -1,4 +1,4 @@ -/* $Id: mandocdb.h,v 1.1 2011/11/13 10:40:52 schwarze Exp $ */ +/* $Id: mandocdb.h,v 1.2 2011/11/17 15:38:27 schwarze Exp $ */ /* * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv> * @@ -15,18 +15,49 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +struct db_val { + uint64_t mask; + uint32_t rec; +}; + #define MANDOC_DB "mandoc.db" #define MANDOC_IDX "mandoc.index" -#define TYPE_An 0x01 -#define TYPE_Cd 0x02 -#define TYPE_Er 0x04 -#define TYPE_Ev 0x08 -#define TYPE_Fn 0x10 -#define TYPE_In 0x20 -#define TYPE_Nd 0x40 -#define TYPE_Nm 0x100 -#define TYPE_Pa 0x200 -#define TYPE_St 0x400 -#define TYPE_Va 0x1000 -#define TYPE_Xr 0x2000 +#define TYPE_An 0x0000000000000001ULL +#define TYPE_Ar 0x0000000000000002ULL +#define TYPE_At 0x0000000000000004ULL +#define TYPE_Bsx 0x0000000000000008ULL +#define TYPE_Bx 0x0000000000000010ULL +#define TYPE_Cd 0x0000000000000020ULL +#define TYPE_Cm 0x0000000000000040ULL +#define TYPE_Dv 0x0000000000000080ULL +#define TYPE_Dx 0x0000000000000100ULL +#define TYPE_Em 0x0000000000000200ULL +#define TYPE_Er 0x0000000000000400ULL +#define TYPE_Ev 0x0000000000000800ULL +#define TYPE_Fa 0x0000000000001000ULL +#define TYPE_Fl 0x0000000000002000ULL +#define TYPE_Fn 0x0000000000004000ULL +#define TYPE_Ft 0x0000000000008000ULL +#define TYPE_Fx 0x0000000000010000ULL +#define TYPE_Ic 0x0000000000020000ULL +#define TYPE_In 0x0000000000040000ULL +#define TYPE_Lb 0x0000000000080000ULL +#define TYPE_Li 0x0000000000100000ULL +#define TYPE_Lk 0x0000000000200000ULL +#define TYPE_Ms 0x0000000000400000ULL +#define TYPE_Mt 0x0000000000800000ULL +#define TYPE_Nd 0x0000000001000000ULL +#define TYPE_Nm 0x0000000002000000ULL +#define TYPE_Nx 0x0000000004000000ULL +#define TYPE_Ox 0x0000000008000000ULL +#define TYPE_Pa 0x0000000010000000ULL +#define TYPE_Rs 0x0000000020000000ULL +#define TYPE_Sh 0x0000000040000000ULL +#define TYPE_Ss 0x0000000080000000ULL +#define TYPE_St 0x0000000100000000ULL +#define TYPE_Sy 0x0000000200000000ULL +#define TYPE_Tn 0x0000000400000000ULL +#define TYPE_Va 0x0000000800000000ULL +#define TYPE_Vt 0x0000001000000000ULL +#define TYPE_Xr 0x0000002000000000ULL |