version 1.12, 2011/11/26 22:38:11 |
version 1.15, 2011/11/28 09:44:05 |
Line 366 index_read(const DBT *key, const DBT *val, int index, |
|
Line 366 index_read(const DBT *key, const DBT *val, int index, |
|
rec->res.rec = *(recno_t *)key->data; |
rec->res.rec = *(recno_t *)key->data; |
rec->res.volume = index; |
rec->res.volume = index; |
|
|
|
INDEX_BREAD(rec->res.type); |
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 579 recfree(struct rec *rec) |
|
Line 580 recfree(struct rec *rec) |
|
free(rec->matches); |
free(rec->matches); |
} |
} |
|
|
|
/* |
|
* Compile a list of straight-up terms. |
|
* The arguments are re-written into ~[[:<:]]term[[:>:]], or "term" |
|
* surrounded by word boundaries, then pumped through exprterm(). |
|
* Terms are case-insensitive. |
|
* This emulates whatis(1) behaviour. |
|
*/ |
struct expr * |
struct expr * |
|
termcomp(int argc, char *argv[], size_t *tt) |
|
{ |
|
char *buf; |
|
int pos; |
|
struct expr *e, *next; |
|
size_t sz; |
|
|
|
buf = NULL; |
|
e = NULL; |
|
*tt = 0; |
|
|
|
for (pos = argc - 1; pos >= 0; pos--) { |
|
sz = strlen(argv[pos]) + 18; |
|
buf = mandoc_realloc(buf, sz); |
|
strlcpy(buf, "Nm~[[:<:]]", sz); |
|
strlcat(buf, argv[pos], sz); |
|
strlcat(buf, "[[:>:]]", sz); |
|
if (NULL == (next = exprterm(buf, 0))) { |
|
free(buf); |
|
exprfree(e); |
|
return(NULL); |
|
} |
|
next->next = e; |
|
e = next; |
|
(*tt)++; |
|
} |
|
|
|
free(buf); |
|
return(e); |
|
} |
|
|
|
/* |
|
* Compile a sequence of logical expressions. |
|
* See apropos.1 for a grammar of this sequence. |
|
*/ |
|
struct expr * |
exprcomp(int argc, char *argv[], size_t *tt) |
exprcomp(int argc, char *argv[], size_t *tt) |
{ |
{ |
int pos, lvl; |
int pos, lvl; |
Line 729 exprterm(char *buf, int cs) |
|
Line 773 exprterm(char *buf, int cs) |
|
e.mask = TYPE_Nm | TYPE_Nd; |
e.mask = TYPE_Nm | TYPE_Nd; |
|
|
if (e.regex) { |
if (e.regex) { |
i = REG_EXTENDED | REG_NOSUB | cs ? 0 : REG_ICASE; |
i = REG_EXTENDED | REG_NOSUB | (cs ? 0 : REG_ICASE); |
if (regcomp(&e.re, e.v, i)) |
if (regcomp(&e.re, e.v, i)) |
return(NULL); |
return(NULL); |
} |
} |