=================================================================== RCS file: /cvs/mandoc/mandocdb.c,v retrieving revision 1.38 retrieving revision 1.42 diff -u -p -r1.38 -r1.42 --- mandoc/mandocdb.c 2011/12/25 13:08:12 1.38 +++ mandoc/mandocdb.c 2011/12/28 00:32:13 1.42 @@ -1,4 +1,4 @@ -/* $Id: mandocdb.c,v 1.38 2011/12/25 13:08:12 schwarze Exp $ */ +/* $Id: mandocdb.c,v 1.42 2011/12/28 00:32:13 schwarze Exp $ */ /* * Copyright (c) 2011 Kristaps Dzonsons * Copyright (c) 2011 Ingo Schwarze @@ -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; @@ -615,8 +615,8 @@ index_merge(const struct of *of, struct mparse *mp, /* * By default, skip a file if the manual section - * and architecture given in the file disagree - * with the directory where the file is located. + * given in the file disagrees with the directory + * where the file is located. */ skip = 0; @@ -631,6 +631,21 @@ index_merge(const struct of *of, struct mparse *mp, skip = 1; } + /* + * Manual page directories exist for each kernel + * architecture as returned by machine(1). + * However, many manuals only depend on the + * application architecture as returned by arch(1). + * For example, some (2/ARM) manuals are shared + * across the "armish" and "zaurus" kernel + * architectures. + * A few manuals are even shared across completely + * different architectures, for example fdformat(1) + * on amd64, i386, sparc, and sparc64. + * Thus, warn about architecture mismatches, + * but don't skip manuals for this reason. + */ + assert(of->arch); assert(march); if (strcasecmp(march, of->arch)) { @@ -639,7 +654,7 @@ index_merge(const struct of *of, struct mparse *mp, "architecture \"%s\" manual " "in \"%s\" directory\n", fn, march, of->arch); - skip = 1; + march = of->arch; } /* @@ -714,7 +729,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 +741,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 +783,7 @@ index_prune(const struct of *ofile, struct mdb *mdb, s { 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 +832,11 @@ index_prune(const struct of *ofile, struct mdb *mdb, s 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, @@ -1452,7 +1467,8 @@ static void ofile_argbuild(int argc, char *argv[], struct of **of) { char buf[MAXPATHLEN]; - char *sec, *arch, *title, *p; + const char *sec, *arch, *title; + char *p; int i, src_form; struct of *nof; @@ -1538,7 +1554,7 @@ ofile_argbuild(int argc, char *argv[], struct of **of) * Recursively build up a list of files to parse. * We use this instead of ftw() and so on because I don't want global * variables hanging around. - * This ignores the mandoc.db and mandoc.index files, but assumes that + * This ignores the whatis.db and whatis.index files, but assumes that * everything else is a manual. * Pass in a pointer to a NULL structure for the first invocation. */ @@ -1756,6 +1772,7 @@ ofile_dirbuild(const char *dir, const char* psec, cons if (verb > 1) printf("%s: scheduling\n", buf); + if (NULL == *of) { *of = nof; (*of)->first = nof; @@ -1774,7 +1791,10 @@ ofile_free(struct of *of) { struct of *nof; - while (of) { + if (NULL != of) + of = of->first; + + while (NULL != of) { nof = of->next; free(of->fname); free(of->sec);