aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2011-12-25 14:58:39 +0000
committerIngo Schwarze <schwarze@openbsd.org>2011-12-25 14:58:39 +0000
commit0c0e6315b693c775634281199f1983184acff5e5 (patch)
treed84de2f1f28d10439bc42fea70a642be4b63afe0
parent1282796854ba0d64d77baf61f72081d5c1e45a8c (diff)
downloadmandoc-0c0e6315b693c775634281199f1983184acff5e5.tar.gz
mandoc-0c0e6315b693c775634281199f1983184acff5e5.tar.zst
mandoc-0c0e6315b693c775634281199f1983184acff5e5.zip
For binary compatability of the databases across architectures,
use pointers to arrays, not pointers to structs. It is now possible to create databases on sparc64 and use them on i386 and vice versa. Kristaps@ can't think of anything else that might be required, either. Put this in now such that we can move on.
-rw-r--r--apropos_db.c42
-rw-r--r--mandocdb.c18
-rw-r--r--mandocdb.h7
3 files changed, 31 insertions, 36 deletions
diff --git a/apropos_db.c b/apropos_db.c
index 41d78742..477b36dd 100644
--- a/apropos_db.c
+++ b/apropos_db.c
@@ -1,4 +1,4 @@
-/* $Id: apropos_db.c,v 1.27 2011/12/20 21:41:11 schwarze Exp $ */
+/* $Id: apropos_db.c,v 1.28 2011/12/25 14:58:39 schwarze Exp $ */
/*
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org>
@@ -123,8 +123,8 @@ static const struct type types[] = {
static DB *btree_open(void);
static int btree_read(const DBT *, const DBT *,
- const struct mchars *,
- struct db_val *, char **);
+ const struct mchars *,
+ uint64_t *, recno_t *, char **);
static int expreval(const struct expr *, int *);
static void exprexec(const struct expr *,
const char *, uint64_t, struct rec *);
@@ -167,14 +167,13 @@ btree_open(void)
* Return 0 if the database is insane, else 1.
*/
static int
-btree_read(const DBT *k, const DBT *v,
- const struct mchars *mc,
- struct db_val *dbv, char **buf)
+btree_read(const DBT *k, const DBT *v, const struct mchars *mc,
+ uint64_t *mask, recno_t *rec, char **buf)
{
- struct db_val raw_dbv;
+ uint64_t vbuf[2];
/* Are our sizes sane? */
- if (k->size < 2 || sizeof(struct db_val) != v->size)
+ if (k->size < 2 || sizeof(vbuf) != v->size)
return(0);
/* Is our string nil-terminated? */
@@ -182,9 +181,9 @@ btree_read(const DBT *k, const DBT *v,
return(0);
norm_string((const char *)k->data, mc, buf);
- memcpy(&raw_dbv, v->data, v->size);
- dbv->rec = betoh32(raw_dbv.rec);
- dbv->mask = betoh64(raw_dbv.mask);
+ memcpy(vbuf, v->data, v->size);
+ *mask = betoh64(vbuf[0]);
+ *rec = betoh64(vbuf[1]);
return(1);
}
@@ -475,7 +474,8 @@ single_search(struct rectree *tree, const struct opts *opts,
char *buf;
struct rec *rs;
struct rec r;
- struct db_val vb;
+ uint64_t mask;
+ recno_t rec;
root = -1;
leaf = -1;
@@ -495,14 +495,14 @@ single_search(struct rectree *tree, const struct opts *opts,
}
while (0 == (ch = (*btree->seq)(btree, &key, &val, R_NEXT))) {
- if ( ! btree_read(&key, &val, mc, &vb, &buf))
+ if ( ! btree_read(&key, &val, mc, &mask, &rec, &buf))
break;
/*
* See if this keyword record matches any of the
* expressions we have stored.
*/
- if ( ! exprmark(expr, buf, vb.mask, NULL))
+ if ( ! exprmark(expr, buf, mask, NULL))
continue;
/*
@@ -512,10 +512,10 @@ single_search(struct rectree *tree, const struct opts *opts,
*/
for (leaf = root; leaf >= 0; )
- if (vb.rec > rs[leaf].res.rec &&
+ if (rec > rs[leaf].res.rec &&
rs[leaf].rhs >= 0)
leaf = rs[leaf].rhs;
- else if (vb.rec < rs[leaf].res.rec &&
+ else if (rec < rs[leaf].res.rec &&
rs[leaf].lhs >= 0)
leaf = rs[leaf].lhs;
else
@@ -527,9 +527,9 @@ single_search(struct rectree *tree, const struct opts *opts,
* try to evaluate it now and continue anyway.
*/
- if (leaf >= 0 && rs[leaf].res.rec == vb.rec) {
+ if (leaf >= 0 && rs[leaf].res.rec == rec) {
if (0 == rs[leaf].matched)
- exprexec(expr, buf, vb.mask, &rs[leaf]);
+ exprexec(expr, buf, mask, &rs[leaf]);
continue;
}
@@ -539,7 +539,7 @@ single_search(struct rectree *tree, const struct opts *opts,
* database, then begin partial evaluation.
*/
- key.data = &vb.rec;
+ key.data = &rec;
key.size = sizeof(recno_t);
if (0 != (*idx->get)(idx, &key, &val, 0))
@@ -566,12 +566,12 @@ single_search(struct rectree *tree, const struct opts *opts,
rs[tree->len].matches =
mandoc_calloc(terms, sizeof(int));
- exprexec(expr, buf, vb.mask, &rs[tree->len]);
+ exprexec(expr, buf, mask, &rs[tree->len]);
/* Append to our tree. */
if (leaf >= 0) {
- if (vb.rec > rs[leaf].res.rec)
+ if (rec > rs[leaf].res.rec)
rs[leaf].rhs = tree->len;
else
rs[leaf].lhs = tree->len;
diff --git a/mandocdb.c b/mandocdb.c
index 29c2d613..2c38339b 100644
--- a/mandocdb.c
+++ b/mandocdb.c
@@ -1,4 +1,4 @@
-/* $Id: mandocdb.c,v 1.38 2011/12/25 13:08:12 schwarze Exp $ */
+/* $Id: mandocdb.c,v 1.39 2011/12/25 14:58:39 schwarze Exp $ */
/*
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org>
@@ -575,7 +575,7 @@ index_merge(const struct of *of, struct mparse *mp,
uint64_t mask;
size_t sv;
unsigned seq;
- struct db_val vbuf;
+ uint64_t vbuf[2];
char type;
rec = 0;
@@ -714,7 +714,7 @@ index_merge(const struct of *of, struct mparse *mp,
recs->last = 0;
} else
rec++;
- vbuf.rec = htobe32(rec);
+ vbuf[1] = htobe64(rec);
/*
* Copy from the in-memory hashtable of pending
@@ -726,8 +726,8 @@ index_merge(const struct of *of, struct mparse *mp,
seq = R_NEXT;
assert(sizeof(uint64_t) == val.size);
memcpy(&mask, val.data, val.size);
- vbuf.mask = htobe64(mask);
- val.size = sizeof(struct db_val);
+ vbuf[0] = htobe64(mask);
+ val.size = sizeof(vbuf);
val.data = &vbuf;
dbt_put(mdb->db, mdb->dbn, &key, &val);
}
@@ -768,7 +768,7 @@ index_prune(const struct of *ofile, struct mdb *mdb, struct recs *recs)
{
const struct of *of;
const char *fn;
- struct db_val *vbuf;
+ uint64_t vbuf[2];
unsigned seq, sseq;
DBT key, val;
int ch;
@@ -817,11 +817,11 @@ index_prune(const struct of *ofile, struct mdb *mdb, struct recs *recs)
while (0 == (ch = (*mdb->db->seq)(mdb->db,
&key, &val, sseq))) {
sseq = R_NEXT;
- if (sizeof(struct db_val) != val.size)
+ if (sizeof(vbuf) != val.size)
break;
- vbuf = val.data;
- if (recs->last != betoh32(vbuf->rec))
+ memcpy(vbuf, val.data, val.size);
+ if (recs->last != betoh64(vbuf[1]))
continue;
if ((ch = (*mdb->db->del)(mdb->db,
diff --git a/mandocdb.h b/mandocdb.h
index 8ad13a30..7c7e3c5b 100644
--- a/mandocdb.h
+++ b/mandocdb.h
@@ -1,4 +1,4 @@
-/* $Id: mandocdb.h,v 1.3 2011/11/20 12:39:08 kristaps Exp $ */
+/* $Id: mandocdb.h,v 1.4 2011/12/25 14:58:39 schwarze Exp $ */
/*
* Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -17,11 +17,6 @@
#ifndef MANDOCDB_H
#define MANDOCDB_H
-struct db_val {
- uint64_t mask;
- uint32_t rec;
-};
-
#define MANDOC_DB "mandoc.db"
#define MANDOC_IDX "mandoc.index"