]> git.cameronkatri.com Git - mandoc.git/commitdiff
Have exprcomp() accept a string instead of an array-pointer. Also, collapse
authorKristaps Dzonsons <kristaps@bsd.lv>
Mon, 14 Nov 2011 10:07:06 +0000 (10:07 +0000)
committerKristaps Dzonsons <kristaps@bsd.lv>
Mon, 14 Nov 2011 10:07:06 +0000 (10:07 +0000)
the arguments in apropos(1) into a single string passed to exprcomp().  Ok
schwarze@.

apropos.c
apropos_db.c
apropos_db.h

index 6ed6f64c992eb544d8c820bcc3effd8db2911174..a50b1a5e8efdcd991c517d7aa710037d92a88cd0 100644 (file)
--- a/apropos.c
+++ b/apropos.c
@@ -1,4 +1,4 @@
-/*     $Id: apropos.c,v 1.12 2011/11/13 11:10:27 schwarze Exp $ */
+/*     $Id: apropos.c,v 1.13 2011/11/14 10:07:06 kristaps Exp $ */
 /*
  * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
  * 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
index 89b21fbb034fbd950349806aeba6952769589814..1c2cb4f4b3d352549c80c2db08d97ea830739e1f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: apropos_db.c,v 1.3 2011/11/13 11:10:27 schwarze Exp $ */
+/*     $Id: apropos_db.c,v 1.4 2011/11/14 10:07:06 kristaps Exp $ */
 /*
  * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org>
@@ -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;
                }
index a30cbedb8845c806dbd51e5e3d2324962a13ed3f..95d5001a2152356bedb01a14491d04e97d28e4b7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: apropos_db.h,v 1.3 2011/11/13 11:10:27 schwarze Exp $ */
+/*     $Id: apropos_db.h,v 1.4 2011/11/14 10:07:06 kristaps Exp $ */
 /*
  * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -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