]> git.cameronkatri.com Git - mandoc.git/blobdiff - dbm.c
simplify a few accesses to fields of structs, using auxiliary pointer
[mandoc.git] / dbm.c
diff --git a/dbm.c b/dbm.c
index d4e69bc35337c19738428af2a9f8a61770bf35c6..7dc07d0674adbed8af4e3ecb6376ca44c5a2ec52 100644 (file)
--- a/dbm.c
+++ b/dbm.c
@@ -1,4 +1,4 @@
-/*     $Id: dbm.c,v 1.1 2016/07/19 21:31:55 schwarze Exp $ */
+/*     $Id: dbm.c,v 1.7 2019/07/01 22:56:24 schwarze Exp $ */
 /*
  * Copyright (c) 2016 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Map-based version of the mandoc database, for read-only access.
  * The interface is defined in "dbm.h".
  */
+#include "config.h"
+
 #include <assert.h>
+#if HAVE_ENDIAN
 #include <endian.h>
+#elif HAVE_SYS_ENDIAN
+#include <sys/endian.h>
+#elif HAVE_NTOHL
+#include <arpa/inet.h>
+#endif
+#if HAVE_ERR
 #include <err.h>
+#endif
 #include <errno.h>
 #include <regex.h>
 #include <stdint.h>
@@ -140,10 +150,18 @@ dbm_page_get(int32_t ip)
        assert(ip >= 0);
        assert(ip < npages);
        res.name = dbm_get(pages[ip].name);
+       if (res.name == NULL)
+               res.name = "(NULL)\0";
        res.sect = dbm_get(pages[ip].sect);
+       if (res.sect == NULL)
+               res.sect = "(NULL)\0";
        res.arch = pages[ip].arch ? dbm_get(pages[ip].arch) : NULL;
        res.desc = dbm_get(pages[ip].desc);
+       if (res.desc == NULL)
+               res.desc = "(NULL)";
        res.file = dbm_get(pages[ip].file);
+       if (res.file == NULL)
+               res.file = " (NULL)\0";
        res.addr = dbm_addr(pages + ip);
        return &res;
 }
@@ -215,7 +233,7 @@ static struct dbm_res
 page_bytitle(enum iter arg_iter, const struct dbm_match *arg_match)
 {
        static const struct dbm_match   *match;
-       static const char               *cp;    
+       static const char               *cp;
        static int32_t                   ip;
        struct dbm_res                   res = {-1, 0};
 
@@ -240,7 +258,13 @@ page_bytitle(enum iter arg_iter, const struct dbm_match *arg_match)
                default:
                        abort();
                }
-               ip = 0;
+               if (cp == NULL) {
+                       iteration = ITER_NONE;
+                       match = NULL;
+                       cp = NULL;
+                       ip = npages;
+               } else
+                       ip = 0;
                return res;
        }
 
@@ -291,7 +315,7 @@ page_byarch(const struct dbm_match *arg_match)
        static const struct dbm_match   *match;
        struct dbm_res                   res = {-1, 0};
        static int32_t                   ip;
-       const char                      *cp;    
+       const char                      *cp;
 
        /* Initialize for a new iteration. */
 
@@ -322,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;