source@mandoc.bsd.lv
 help / color / mirror / Atom feed
From: schwarze@mdocml.bsd.lv
To: source@mdocml.bsd.lv
Subject: mdocml: For binary compatability of the databases across architectures,
Date: Sun, 25 Dec 2011 09:58:39 -0500 (EST)	[thread overview]
Message-ID: <201112251458.pBPEwdvN031171@krisdoz.my.domain> (raw)

Log Message:
-----------
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.

Modified Files:
--------------
    mdocml:
        apropos_db.c
        mandocdb.c
        mandocdb.h

Revision Data
-------------
Index: apropos_db.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/apropos_db.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -Lapropos_db.c -Lapropos_db.c -u -p -r1.27 -r1.28
--- apropos_db.c
+++ apropos_db.c
@@ -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, cons
 	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, cons
 	}
 
 	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, cons
 		 */
 
 		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, cons
 		 * 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, cons
 		 * 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, cons
 		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;
Index: mandocdb.h
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mandocdb.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -Lmandocdb.h -Lmandocdb.h -u -p -r1.3 -r1.4
--- mandocdb.h
+++ mandocdb.h
@@ -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"
 
Index: mandocdb.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mandocdb.c,v
retrieving revision 1.38
retrieving revision 1.39
diff -Lmandocdb.c -Lmandocdb.c -u -p -r1.38 -r1.39
--- mandocdb.c
+++ mandocdb.c
@@ -575,7 +575,7 @@ index_merge(const struct of *of, struct 
 	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 
 			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 
 			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, stru
 {
 	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, stru
 		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,
--
 To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv

                 reply	other threads:[~2011-12-25 14:58 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=201112251458.pBPEwdvN031171@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).