diff options
-rw-r--r-- | apropos.c | 29 | ||||
-rw-r--r-- | apropos_db.c | 14 | ||||
-rw-r--r-- | apropos_db.h | 2 |
3 files changed, 36 insertions, 9 deletions
@@ -14,6 +14,10 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include <assert.h> #include <getopt.h> #include <limits.h> @@ -34,6 +38,8 @@ int main(int argc, char *argv[]) { int ch; + size_t sz; + char *buf; struct opts opts; struct expr *e; extern int optind; @@ -66,11 +72,32 @@ main(int argc, char *argv[]) if (0 == argc) return(EXIT_SUCCESS); - if (NULL == (e = exprcomp(argc, argv))) { + /* + * Collapse expressions into a single string. + * First count up the contained strings, adding a space at the + * end of each (plus nil-terminator). Then merge. + */ + + for (sz = 0, ch = 0; ch < argc; ch++) + sz += strlen(argv[ch]) + 1; + + buf = mandoc_malloc(++sz); + + for (*buf = '\0', ch = 0; ch < argc; ch++) { + strlcat(buf, argv[ch], sz); + strlcat(buf, " ", sz); + } + + buf[sz - 2] = '\0'; + + if (NULL == (e = exprcomp(buf))) { fprintf(stderr, "Bad expression\n"); + free(buf); return(EXIT_FAILURE); } + free(buf); + /* * Configure databases. * The keyword database is a btree that allows for duplicate diff --git a/apropos_db.c b/apropos_db.c index aa4d54c4..94985c9b 100644 --- a/apropos_db.c +++ b/apropos_db.c @@ -454,23 +454,23 @@ out: } struct expr * -exprcomp(int argc, char *argv[]) +exprcomp(char *buf) { struct expr *p; struct expr e; char *key; int i, icase; - if (0 >= argc) + if ('\0' == *buf) return(NULL); /* * Choose regex or substring match. */ - if (NULL == (e.v = strpbrk(*argv, "=~"))) { + if (NULL == (e.v = strpbrk(buf, "=~"))) { e.regex = 0; - e.v = *argv; + e.v = buf; } else { e.regex = '~' == *e.v; *e.v++ = '\0'; @@ -482,15 +482,15 @@ exprcomp(int argc, char *argv[]) icase = 0; e.mask = 0; - if (*argv < e.v) { - while (NULL != (key = strsep(argv, ","))) { + if (buf < e.v) { + while (NULL != (key = strsep(&buf, ","))) { if ('i' == key[0] && '\0' == key[1]) { icase = REG_ICASE; continue; } i = 0; while (types[i].mask && - strcmp(types[i].name, key)) + strcmp(types[i].name, key)) i++; e.mask |= types[i].mask; } diff --git a/apropos_db.h b/apropos_db.h index 6cc14d57..cc6e41d9 100644 --- a/apropos_db.h +++ b/apropos_db.h @@ -49,7 +49,7 @@ void apropos_search(const struct opts *, const struct expr *, void *, void (*)(struct rec *, size_t, void *)); -struct expr *exprcomp(int, char *[]); +struct expr *exprcomp(char *); void exprfree(struct expr *); __END_DECLS |