=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/Attic/apropos_db.c,v retrieving revision 1.17 retrieving revision 1.18 diff -c -r1.17 -r1.18 *** src/usr.bin/mandoc/Attic/apropos_db.c 2011/12/25 14:51:33 1.17 --- src/usr.bin/mandoc/Attic/apropos_db.c 2012/04/15 11:54:47 1.18 *************** *** 1,6 **** ! /* $Id: apropos_db.c,v 1.17 2011/12/25 14:51:33 schwarze Exp $ */ /* ! * Copyright (c) 2011 Kristaps Dzonsons * Copyright (c) 2011 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any --- 1,6 ---- ! /* $Id: apropos_db.c,v 1.18 2012/04/15 11:54:47 schwarze Exp $ */ /* ! * Copyright (c) 2011, 2012 Kristaps Dzonsons * Copyright (c) 2011 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any *************** *** 15,21 **** --- 15,23 ---- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + #include #include + #include #include #include *************** *** 30,48 **** #include "apropos_db.h" #include "mandoc.h" ! struct rec { ! struct res res; /* resulting record info */ ! /* ! * Maintain a binary tree for checking the uniqueness of `rec' ! * when adding elements to the results array. ! * Since the results array is dynamic, use offset in the array ! * instead of a pointer to the structure. ! */ ! int lhs; ! int rhs; ! int matched; /* expression is true */ ! int *matches; /* partial truth evaluations */ ! }; struct expr { int regex; /* is regex? */ --- 32,46 ---- #include "apropos_db.h" #include "mandoc.h" ! #define RESFREE(_x) \ ! do { \ ! free((_x)->file); \ ! free((_x)->cat); \ ! free((_x)->title); \ ! free((_x)->arch); \ ! free((_x)->desc); \ ! free((_x)->matches); \ ! } while (/*CONSTCOND*/0) struct expr { int regex; /* is regex? */ *************** *** 61,67 **** }; struct rectree { ! struct rec *node; /* record array for dir tree */ int len; /* length of record array */ }; --- 59,65 ---- }; struct rectree { ! struct res *node; /* record array for dir tree */ int len; /* length of record array */ }; *************** *** 115,132 **** uint64_t *, recno_t *, char **); static int expreval(const struct expr *, int *); static void exprexec(const struct expr *, ! const char *, uint64_t, struct rec *); static int exprmark(const struct expr *, const char *, uint64_t, int *); static struct expr *exprexpr(int, char *[], int *, int *, size_t *); static struct expr *exprterm(char *, int); static DB *index_open(void); static int index_read(const DBT *, const DBT *, int, ! const struct mchars *, struct rec *); static void norm_string(const char *, const struct mchars *, char **); static size_t norm_utf8(unsigned int, char[7]); - static void recfree(struct rec *); static int single_search(struct rectree *, const struct opts *, const struct expr *, size_t terms, struct mchars *, int); --- 113,129 ---- uint64_t *, recno_t *, char **); static int expreval(const struct expr *, int *); static void exprexec(const struct expr *, ! const char *, uint64_t, struct res *); static int exprmark(const struct expr *, const char *, uint64_t, int *); static struct expr *exprexpr(int, char *[], int *, int *, size_t *); static struct expr *exprterm(char *, int); static DB *index_open(void); static int index_read(const DBT *, const DBT *, int, ! const struct mchars *, struct res *); static void norm_string(const char *, const struct mchars *, char **); static size_t norm_utf8(unsigned int, char[7]); static int single_search(struct rectree *, const struct opts *, const struct expr *, size_t terms, struct mchars *, int); *************** *** 349,355 **** */ static int index_read(const DBT *key, const DBT *val, int index, ! const struct mchars *mc, struct rec *rec) { size_t left; char *np, *cp; --- 346,352 ---- */ static int index_read(const DBT *key, const DBT *val, int index, ! const struct mchars *mc, struct res *rec) { size_t left; char *np, *cp; *************** *** 369,392 **** cp = val->data; assert(sizeof(recno_t) == key->size); ! memcpy(&rec->res.rec, key->data, key->size); ! rec->res.volume = index; 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.cat); ! INDEX_BREAD(rec->res.title); ! INDEX_BREAD(rec->res.arch); ! INDEX_BREAD(rec->res.desc); return(1); } --- 366,389 ---- cp = val->data; assert(sizeof(recno_t) == key->size); ! memcpy(&rec->rec, key->data, key->size); ! rec->volume = index; if ('d' == (type = *cp++)) ! rec->type = RESTYPE_MDOC; else if ('a' == type) ! rec->type = RESTYPE_MAN; else if ('c' == type) ! rec->type = RESTYPE_CAT; else return(0); left--; ! INDEX_BREAD(rec->file); ! INDEX_BREAD(rec->cat); ! INDEX_BREAD(rec->title); ! INDEX_BREAD(rec->arch); ! INDEX_BREAD(rec->desc); return(1); } *************** *** 399,415 **** int apropos_search(int pathsz, char **paths, const struct opts *opts, const struct expr *expr, size_t terms, void *arg, void (*res)(struct res *, size_t, void *)) { struct rectree tree; struct mchars *mc; ! struct res *ress; ! int i, mlen, rc; memset(&tree, 0, sizeof(struct rectree)); rc = 0; mc = mchars_alloc(); /* * Main loop. Change into the directory containing manpage --- 396,414 ---- int apropos_search(int pathsz, char **paths, const struct opts *opts, const struct expr *expr, size_t terms, void *arg, + size_t *sz, struct res **resp, void (*res)(struct res *, size_t, void *)) { struct rectree tree; struct mchars *mc; ! int i, rc; memset(&tree, 0, sizeof(struct rectree)); rc = 0; mc = mchars_alloc(); + *sz = 0; + *resp = NULL; /* * Main loop. Change into the directory containing manpage *************** *** 417,455 **** */ for (i = 0; i < pathsz; i++) { if (chdir(paths[i])) continue; ! if ( ! single_search(&tree, opts, expr, terms, mc, i)) ! goto out; } ! /* ! * Count matching files, transfer to a "clean" array, then feed ! * them to the output handler. ! */ ! ! for (mlen = i = 0; i < tree.len; i++) ! if (tree.node[i].matched) ! mlen++; ! ! ress = mandoc_malloc(mlen * sizeof(struct res)); ! ! for (mlen = i = 0; i < tree.len; i++) ! if (tree.node[i].matched) ! memcpy(&ress[mlen++], &tree.node[i].res, ! sizeof(struct res)); ! ! (*res)(ress, mlen, arg); ! free(ress); ! ! rc = 1; ! out: ! for (i = 0; i < tree.len; i++) ! recfree(&tree.node[i]); ! ! free(tree.node); mchars_free(mc); ! return(rc); } static int --- 416,437 ---- */ for (i = 0; i < pathsz; i++) { + assert('/' == paths[i][0]); if (chdir(paths[i])) continue; ! if (single_search(&tree, opts, expr, terms, mc, i)) ! continue; ! ! resfree(tree.node, tree.len); ! mchars_free(mc); ! return(0); } ! (*res)(tree.node, tree.len, arg); ! *sz = tree.len; ! *resp = tree.node; mchars_free(mc); ! return(1); } static int *************** *** 461,468 **** DBT key, val; DB *btree, *idx; char *buf; ! struct rec *rs; ! struct rec r; uint64_t mask; recno_t rec; --- 443,450 ---- DBT key, val; DB *btree, *idx; char *buf; ! struct res *rs; ! struct res r; uint64_t mask; recno_t rec; *************** *** 473,479 **** buf = NULL; rs = tree->node; ! memset(&r, 0, sizeof(struct rec)); if (NULL == (btree = btree_open())) return(1); --- 455,461 ---- buf = NULL; rs = tree->node; ! memset(&r, 0, sizeof(struct res)); if (NULL == (btree = btree_open())) return(1); *************** *** 501,510 **** */ for (leaf = root; leaf >= 0; ) ! if (rec > rs[leaf].res.rec && rs[leaf].rhs >= 0) leaf = rs[leaf].rhs; ! else if (rec < rs[leaf].res.rec && rs[leaf].lhs >= 0) leaf = rs[leaf].lhs; else --- 483,492 ---- */ for (leaf = root; leaf >= 0; ) ! if (rec > rs[leaf].rec && rs[leaf].rhs >= 0) leaf = rs[leaf].rhs; ! else if (rec < rs[leaf].rec && rs[leaf].lhs >= 0) leaf = rs[leaf].lhs; else *************** *** 516,522 **** * try to evaluate it now and continue anyway. */ ! if (leaf >= 0 && rs[leaf].res.rec == rec) { if (0 == rs[leaf].matched) exprexec(expr, buf, mask, &rs[leaf]); continue; --- 498,504 ---- * try to evaluate it now and continue anyway. */ ! if (leaf >= 0 && rs[leaf].rec == rec) { if (0 == rs[leaf].matched) exprexec(expr, buf, mask, &rs[leaf]); continue; *************** *** 540,557 **** /* XXX: this should be elsewhere, I guess? */ ! if (opts->cat && strcasecmp(opts->cat, r.res.cat)) continue; ! if (opts->arch && *r.res.arch) ! if (strcasecmp(opts->arch, r.res.arch)) continue; tree->node = rs = mandoc_realloc ! (rs, (tree->len + 1) * sizeof(struct rec)); ! memcpy(&rs[tree->len], &r, sizeof(struct rec)); ! memset(&r, 0, sizeof(struct rec)); rs[tree->len].matches = mandoc_calloc(terms, sizeof(int)); --- 522,539 ---- /* XXX: this should be elsewhere, I guess? */ ! if (opts->cat && strcasecmp(opts->cat, r.cat)) continue; ! if (opts->arch && *r.arch) ! if (strcasecmp(opts->arch, r.arch)) continue; tree->node = rs = mandoc_realloc ! (rs, (tree->len + 1) * sizeof(struct res)); ! memcpy(&rs[tree->len], &r, sizeof(struct res)); ! memset(&r, 0, sizeof(struct res)); rs[tree->len].matches = mandoc_calloc(terms, sizeof(int)); *************** *** 560,566 **** /* Append to our tree. */ if (leaf >= 0) { ! if (rec > rs[leaf].res.rec) rs[leaf].rhs = tree->len; else rs[leaf].lhs = tree->len; --- 542,548 ---- /* Append to our tree. */ if (leaf >= 0) { ! if (rec > rs[leaf].rec) rs[leaf].rhs = tree->len; else rs[leaf].lhs = tree->len; *************** *** 574,594 **** (*idx->close)(idx); free(buf); ! recfree(&r); return(1 == ch); } ! static void ! recfree(struct rec *rec) { ! free(rec->res.file); ! free(rec->res.cat); ! free(rec->res.title); ! free(rec->res.arch); ! free(rec->res.desc); ! ! free(rec->matches); } /* --- 556,573 ---- (*idx->close)(idx); free(buf); ! RESFREE(&r); return(1 == ch); } ! void ! resfree(struct res *rec, size_t sz) { + size_t i; ! for (i = 0; i < sz; i++) ! RESFREE(&rec[i]); ! free(rec); } /* *************** *** 879,885 **** */ static void exprexec(const struct expr *e, const char *cp, ! uint64_t mask, struct rec *r) { assert(0 == r->matched); --- 858,864 ---- */ static void exprexec(const struct expr *e, const char *cp, ! uint64_t mask, struct res *r) { assert(0 == r->matched);