summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@cvs.openbsd.org>2011-11-17 15:38:28 +0000
committerIngo Schwarze <schwarze@cvs.openbsd.org>2011-11-17 15:38:28 +0000
commit1dbe93241471a57c0b34d15e5ba4aafff750c2da (patch)
tree365b3668b3e26309163c49a526ef5ad9961a12ed /usr.bin
parent918e9b4951380042778d29d5e40e9a58db19e006 (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.c57
-rw-r--r--usr.bin/mandoc/mandocdb.c28
-rw-r--r--usr.bin/mandoc/mandocdb.h57
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