summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2011-11-14 10:07:06 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2011-11-14 10:07:06 +0000
commite9953015c778f622a13fba9e080726213b842410 (patch)
tree75829e98ca3c206a02f366e8b8adc6d8c985c6d9
parent5ef01561d45c2fa2522c7bb1151fd40ac6e6de19 (diff)
downloadmandoc-e9953015c778f622a13fba9e080726213b842410.tar.gz
Have exprcomp() accept a string instead of an array-pointer. Also, collapse
the arguments in apropos(1) into a single string passed to exprcomp(). Ok schwarze@.
-rw-r--r--apropos.c29
-rw-r--r--apropos_db.c14
-rw-r--r--apropos_db.h2
3 files changed, 36 insertions, 9 deletions
diff --git a/apropos.c b/apropos.c
index 0e3ac42f..0af32992 100644
--- a/apropos.c
+++ b/apropos.c
@@ -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