]> git.cameronkatri.com Git - mandoc.git/commitdiff
The termination condition of the iteration logic in page_bymacro()
authorIngo Schwarze <schwarze@openbsd.org>
Tue, 18 Oct 2016 22:27:25 +0000 (22:27 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Tue, 18 Oct 2016 22:27:25 +0000 (22:27 +0000)
was overzealous.  Consequently, macro=substr and macro~regexp searches
only returned all pages containing the first matching macro value,
rather than all pages containing any of the matching macro values.
Bug reported by tb@ - thanks!

dbm.c

diff --git a/dbm.c b/dbm.c
index 0800f7658f06120429fca69ac41da040ed9bbb96..4aedf66d136fce1dcc1335f828593aa03e8012cd 100644 (file)
--- a/dbm.c
+++ b/dbm.c
@@ -1,4 +1,4 @@
-/*     $Id: dbm.c,v 1.4 2016/08/30 22:01:07 schwarze Exp $ */
+/*     $Id: dbm.c,v 1.5 2016/10/18 22:27:25 schwarze Exp $ */
 /*
  * Copyright (c) 2016 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -346,41 +346,45 @@ page_byarch(const struct dbm_match *arg_match)
 }
 
 static struct dbm_res
-page_bymacro(int32_t im, const struct dbm_match *match)
+page_bymacro(int32_t arg_im, const struct dbm_match *arg_match)
 {
-       static const int32_t    *pp;
-       struct dbm_res           res = {-1, 0};
-       const char              *cp;
-       int32_t                  iv;
+       static const struct dbm_match   *match;
+       static const int32_t            *pp;
+       static const char               *cp;
+       static int32_t                   im, iv;
+       struct dbm_res                   res = {-1, 0};
 
        assert(im >= 0);
        assert(im < MACRO_MAX);
 
        /* Initialize for a new iteration. */
 
-       if (match != NULL) {
+       if (arg_match != NULL) {
                iteration = ITER_MACRO;
+               match = arg_match;
+               im = arg_im;
                cp = nvals[im] ? dbm_get(macros[im]->value) : NULL;
-               for (iv = 0; iv < nvals[im]; iv++) {
-                       if (dbm_match(match, cp))
-                               break;
-                       cp = strchr(cp, '\0') + 1;
-               }
-               pp = iv == nvals[im] ? NULL : dbm_get(macros[im][iv].pages);
+               pp = NULL;
+               iv = -1;
                return res;
        }
        if (iteration != ITER_MACRO)
                return res;
 
-       /* No more matches. */
+       /* Find the next matching macro value. */
 
-       if (pp == NULL || *pp == 0) {
-               iteration = ITER_NONE;
-               pp = NULL;
-               return res;
+       while (pp == NULL || *pp == 0) {
+               if (++iv == nvals[im]) {
+                       iteration = ITER_NONE;
+                       return res;
+               }
+               if (iv)
+                       cp = strchr(cp, '\0') + 1;
+               if (dbm_match(match, cp))
+                       pp = dbm_get(macros[im][iv].pages);
        }
 
-       /* Found a match. */
+       /* Found a matching page. */
 
        res.page = (struct page *)dbm_get(*pp++) - pages;
        return res;