diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2014-08-17 03:24:47 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2014-08-17 03:24:47 +0000 |
commit | 7eba87a5fd2f971ba9c0cd6cb0db96ae643dc9e7 (patch) | |
tree | 32368e4ff54dbb527aa87b8a65b05397b77846e9 /mansearch.c | |
parent | 7d593fa69b20a5bf1d8d8b1280a0aacd5296026c (diff) | |
download | mandoc-7eba87a5fd2f971ba9c0cd6cb0db96ae643dc9e7.tar.gz mandoc-7eba87a5fd2f971ba9c0cd6cb0db96ae643dc9e7.tar.zst mandoc-7eba87a5fd2f971ba9c0cd6cb0db96ae643dc9e7.zip |
Fully integrate apropos(1) into mandoc(1).
Switch the argmode on the progname, including man(1).
Provide -f and -k options to switch the argmode.
Store the argmode inside struct search, generalizing the flags.
Derive the deftype from the argmode when needed instead of storing it.
Store the outkey inside struct search instead of passing it alone.
While here, get rid of the trailing blanks in Makefile.depend.
Diffstat (limited to 'mansearch.c')
-rw-r--r-- | mansearch.c | 57 |
1 files changed, 29 insertions, 28 deletions
diff --git a/mansearch.c b/mansearch.c index 0b15d3a3..8a38c657 100644 --- a/mansearch.c +++ b/mansearch.c @@ -1,4 +1,4 @@ -/* $Id: mansearch.c,v 1.44 2014/08/16 19:00:01 schwarze Exp $ */ +/* $Id: mansearch.c,v 1.45 2014/08/17 03:24:47 schwarze Exp $ */ /* * Copyright (c) 2012 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2013, 2014 Ingo Schwarze <schwarze@openbsd.org> @@ -159,7 +159,6 @@ int mansearch(const struct mansearch *search, const struct manpaths *paths, int argc, char *argv[], - const char *outkey, struct manpage **res, size_t *sz) { int fd, rc, c, indexbit; @@ -195,11 +194,11 @@ mansearch(const struct mansearch *search, goto out; outbit = 0; - if (NULL != outkey) { + if (NULL != search->outkey) { for (indexbit = 0, iterbit = 1; indexbit < mansearch_keymax; indexbit++, iterbit <<= 1) { - if (0 == strcasecmp(outkey, + if (0 == strcasecmp(search->outkey, mansearch_keynames[indexbit])) { outbit = iterbit; break; @@ -367,6 +366,19 @@ out: return(rc); } +void +mansearch_free(struct manpage *res, size_t sz) +{ + size_t i; + + for (i = 0; i < sz; i++) { + free(res[i].file); + free(res[i].names); + free(res[i].output); + } + free(res); +} + static int manpage_compare(const void *vp1, const void *vp2) { @@ -739,35 +751,29 @@ exprterm(const struct mansearch *search, char *buf, int cs) e = mandoc_calloc(1, sizeof(struct expr)); - if (MANSEARCH_MAN & search->flags) { - e->bits = search->deftype; + if (search->argmode == ARG_NAME) { + e->bits = TYPE_Nm; e->substr = buf; e->equal = 1; return(e); } /* - * Look for an '=' or '~' operator, - * unless forced to some fixed macro keys. + * Separate macro keys from search string. + * If needed, request regular expression handling + * by setting e->substr to NULL. */ - if (MANSEARCH_WHATIS & search->flags) - val = NULL; - else - val = strpbrk(buf, "=~"); - - if (NULL == val) { - e->bits = search->deftype; + if (search->argmode == ARG_WORD) { + e->bits = TYPE_Nm; + e->substr = NULL; + mandoc_asprintf(&val, "[[:<:]]%s[[:>:]]", buf); + } else if ((val = strpbrk(buf, "=~")) == NULL) { + e->bits = TYPE_Nm | TYPE_Nd; e->substr = buf; - - /* - * Found an operator. - * Regexp search is requested by !e->substr. - */ - } else { if (val == buf) - e->bits = search->deftype; + e->bits = TYPE_Nm | TYPE_Nd; if ('=' == *val) e->substr = val + 1; *val++ = '\0'; @@ -777,15 +783,10 @@ exprterm(const struct mansearch *search, char *buf, int cs) /* Compile regular expressions. */ - if (MANSEARCH_WHATIS & search->flags) { - e->substr = NULL; - mandoc_asprintf(&val, "[[:<:]]%s[[:>:]]", buf); - } - if (NULL == e->substr) { irc = regcomp(&e->regexp, val, REG_EXTENDED | REG_NOSUB | (cs ? 0 : REG_ICASE)); - if (MANSEARCH_WHATIS & search->flags) + if (search->argmode == ARG_WORD) free(val); if (irc) { regerror(irc, &e->regexp, errbuf, sizeof(errbuf)); |