version 1.20, 2011/12/03 12:09:07 |
version 1.27, 2011/12/20 21:41:11 |
Line 117 static const struct type types[] = { |
|
Line 117 static const struct type types[] = { |
|
{ TYPE_Va, "Va" }, |
{ TYPE_Va, "Va" }, |
{ TYPE_Va, "Vt" }, |
{ TYPE_Va, "Vt" }, |
{ TYPE_Xr, "Xr" }, |
{ TYPE_Xr, "Xr" }, |
{ INT_MAX, "any" }, |
{ UINT64_MAX, "any" }, |
{ 0, NULL } |
{ 0, NULL } |
}; |
}; |
|
|
Line 153 btree_open(void) |
|
Line 153 btree_open(void) |
|
DB *db; |
DB *db; |
|
|
memset(&info, 0, sizeof(BTREEINFO)); |
memset(&info, 0, sizeof(BTREEINFO)); |
info.lorder = 4321; |
|
info.flags = R_DUP; |
info.flags = R_DUP; |
|
|
db = dbopen(MANDOC_DB, O_RDONLY, 0, DB_BTREE, &info); |
db = dbopen(MANDOC_DB, O_RDONLY, 0, DB_BTREE, &info); |
Line 172 btree_read(const DBT *k, const DBT *v, |
|
Line 171 btree_read(const DBT *k, const DBT *v, |
|
const struct mchars *mc, |
const struct mchars *mc, |
struct db_val *dbv, char **buf) |
struct db_val *dbv, char **buf) |
{ |
{ |
const struct db_val *vp; |
struct db_val raw_dbv; |
|
|
/* Are our sizes sane? */ |
/* Are our sizes sane? */ |
if (k->size < 2 || sizeof(struct db_val) != v->size) |
if (k->size < 2 || sizeof(struct db_val) != v->size) |
Line 182 btree_read(const DBT *k, const DBT *v, |
|
Line 181 btree_read(const DBT *k, const DBT *v, |
|
if ('\0' != ((const char *)k->data)[(int)k->size - 1]) |
if ('\0' != ((const char *)k->data)[(int)k->size - 1]) |
return(0); |
return(0); |
|
|
vp = v->data; |
|
norm_string((const char *)k->data, mc, buf); |
norm_string((const char *)k->data, mc, buf); |
dbv->rec = betoh32(vp->rec); |
memcpy(&raw_dbv, v->data, v->size); |
dbv->mask = betoh64(vp->mask); |
dbv->rec = betoh32(raw_dbv.rec); |
|
dbv->mask = betoh64(raw_dbv.mask); |
return(1); |
return(1); |
} |
} |
|
|
Line 198 btree_read(const DBT *k, const DBT *v, |
|
Line 197 btree_read(const DBT *k, const DBT *v, |
|
static size_t |
static size_t |
norm_utf8(unsigned int cp, char out[7]) |
norm_utf8(unsigned int cp, char out[7]) |
{ |
{ |
size_t rc; |
int rc; |
|
|
rc = 0; |
rc = 0; |
|
|
Line 239 norm_utf8(unsigned int cp, char out[7]) |
|
Line 238 norm_utf8(unsigned int cp, char out[7]) |
|
return(0); |
return(0); |
|
|
out[rc] = '\0'; |
out[rc] = '\0'; |
return(rc); |
return((size_t)rc); |
} |
} |
|
|
/* |
/* |
Line 366 index_read(const DBT *key, const DBT *val, int index, |
|
Line 365 index_read(const DBT *key, const DBT *val, int index, |
|
{ |
{ |
size_t left; |
size_t left; |
char *np, *cp; |
char *np, *cp; |
|
char type; |
|
|
#define INDEX_BREAD(_dst) \ |
#define INDEX_BREAD(_dst) \ |
do { \ |
do { \ |
Line 376 index_read(const DBT *key, const DBT *val, int index, |
|
Line 376 index_read(const DBT *key, const DBT *val, int index, |
|
cp = np + 1; \ |
cp = np + 1; \ |
} while (/* CONSTCOND */ 0) |
} while (/* CONSTCOND */ 0) |
|
|
left = val->size; |
if (0 == (left = val->size)) |
cp = (char *)val->data; |
return(0); |
|
|
rec->res.rec = *(recno_t *)key->data; |
cp = val->data; |
|
assert(sizeof(recno_t) == key->size); |
|
memcpy(&rec->res.rec, key->data, key->size); |
rec->res.volume = index; |
rec->res.volume = index; |
|
|
INDEX_BREAD(rec->res.type); |
if ('d' == (type = *cp++)) |
|
rec->res.type = RESTYPE_MDOC; |
|
else if ('a' == type) |
|
rec->res.type = RESTYPE_MAN; |
|
else if ('c' == type) |
|
rec->res.type = RESTYPE_CAT; |
|
else |
|
return(0); |
|
|
|
left--; |
INDEX_BREAD(rec->res.file); |
INDEX_BREAD(rec->res.file); |
INDEX_BREAD(rec->res.cat); |
INDEX_BREAD(rec->res.cat); |
INDEX_BREAD(rec->res.title); |
INDEX_BREAD(rec->res.title); |
Line 542 single_search(struct rectree *tree, const struct opts |
|
Line 553 single_search(struct rectree *tree, const struct opts |
|
|
|
if (opts->cat && strcasecmp(opts->cat, r.res.cat)) |
if (opts->cat && strcasecmp(opts->cat, r.res.cat)) |
continue; |
continue; |
if (opts->arch && strcasecmp(opts->arch, r.res.arch)) |
|
continue; |
|
|
|
|
if (opts->arch && *r.res.arch) |
|
if (strcasecmp(opts->arch, r.res.arch)) |
|
continue; |
|
|
tree->node = rs = mandoc_realloc |
tree->node = rs = mandoc_realloc |
(rs, (tree->len + 1) * sizeof(struct rec)); |
(rs, (tree->len + 1) * sizeof(struct rec)); |
|
|
memcpy(&rs[tree->len], &r, sizeof(struct rec)); |
memcpy(&rs[tree->len], &r, sizeof(struct rec)); |
|
memset(&r, 0, sizeof(struct rec)); |
rs[tree->len].matches = |
rs[tree->len].matches = |
mandoc_calloc(terms, sizeof(int)); |
mandoc_calloc(terms, sizeof(int)); |
|
|
Line 564 single_search(struct rectree *tree, const struct opts |
|
Line 578 single_search(struct rectree *tree, const struct opts |
|
} else |
} else |
root = tree->len; |
root = tree->len; |
|
|
memset(&r, 0, sizeof(struct rec)); |
|
tree->len++; |
tree->len++; |
} |
} |
|
|
Line 572 single_search(struct rectree *tree, const struct opts |
|
Line 585 single_search(struct rectree *tree, const struct opts |
|
(*idx->close)(idx); |
(*idx->close)(idx); |
|
|
free(buf); |
free(buf); |
|
recfree(&r); |
return(1 == ch); |
return(1 == ch); |
} |
} |
|
|
|
|
recfree(struct rec *rec) |
recfree(struct rec *rec) |
{ |
{ |
|
|
free(rec->res.type); |
|
free(rec->res.file); |
free(rec->res.file); |
free(rec->res.cat); |
free(rec->res.cat); |
free(rec->res.title); |
free(rec->res.title); |