]> git.cameronkatri.com Git - mandoc.git/blobdiff - mansearch.c
Make HTML tags lower case for better stylistic agreement with what
[mandoc.git] / mansearch.c
index def52984efc832ec235587c93d876944cb8c1309..843326baf10329c7bd378b1cfc44f37964220818 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mansearch.c,v 1.59 2015/10/11 21:12:55 schwarze Exp $ */
+/*     $Id: mansearch.c,v 1.64 2016/01/08 15:02:54 schwarze Exp $ */
 /*
  * Copyright (c) 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2013, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -21,7 +21,9 @@
 #include <sys/types.h>
 
 #include <assert.h>
+#if HAVE_ERR
 #include <err.h>
+#endif
 #include <errno.h>
 #include <fcntl.h>
 #include <getopt.h>
 #include <string.h>
 #include <unistd.h>
 
-#if HAVE_OHASH
-#include <ohash.h>
-#else
-#include "compat_ohash.h"
-#endif
 #include <sqlite3.h>
 #ifndef SQLITE_DETERMINISTIC
 #define SQLITE_DETERMINISTIC 0
@@ -47,6 +44,7 @@
 
 #include "mandoc.h"
 #include "mandoc_aux.h"
+#include "mandoc_ohash.h"
 #include "manconf.h"
 #include "mansearch.h"
 
@@ -56,17 +54,17 @@ extern const char *const mansearch_keynames[];
 #define        SQL_BIND_TEXT(_db, _s, _i, _v) \
        do { if (SQLITE_OK != sqlite3_bind_text \
                ((_s), (_i)++, (_v), -1, SQLITE_STATIC)) \
-               warnx("%s", sqlite3_errmsg((_db))); \
+               errx((int)MANDOCLEVEL_SYSERR, "%s", sqlite3_errmsg((_db))); \
        } while (0)
 #define        SQL_BIND_INT64(_db, _s, _i, _v) \
        do { if (SQLITE_OK != sqlite3_bind_int64 \
                ((_s), (_i)++, (_v))) \
-               warnx("%s", sqlite3_errmsg((_db))); \
+               errx((int)MANDOCLEVEL_SYSERR, "%s", sqlite3_errmsg((_db))); \
        } while (0)
 #define        SQL_BIND_BLOB(_db, _s, _i, _v) \
        do { if (SQLITE_OK != sqlite3_bind_blob \
                ((_s), (_i)++, (&_v), sizeof(_v), SQLITE_STATIC)) \
-               warnx("%s", sqlite3_errmsg((_db))); \
+               errx((int)MANDOCLEVEL_SYSERR, "%s", sqlite3_errmsg((_db))); \
        } while (0)
 
 struct expr {
@@ -93,9 +91,6 @@ static        void             buildnames(const struct mansearch *,
                                const char *, int form);
 static char            *buildoutput(sqlite3 *, sqlite3_stmt *,
                                 uint64_t, uint64_t);
-static void            *hash_alloc(size_t, void *);
-static void             hash_free(void *, void *);
-static void            *hash_calloc(size_t, size_t, void *);
 static struct expr     *exprcomp(const struct mansearch *,
                                int, char *[]);
 static void             exprfree(struct expr *);
@@ -130,7 +125,7 @@ mansearch_setup(int start)
                    MAP_SHARED | MAP_ANON, -1, 0);
 
                if (MAP_FAILED == pagecache) {
-                       perror("mmap");
+                       warn("mmap");
                        pagecache = NULL;
                        return (int)MANDOCLEVEL_SYSERR;
                }
@@ -149,7 +144,7 @@ mansearch_setup(int start)
        }
 
        if (-1 == munmap(pagecache, PC_PAGESIZE * PC_NUMPAGES)) {
-               perror("munmap");
+               warn("munmap");
                pagecache = NULL;
                return (int)MANDOCLEVEL_SYSERR;
        }
@@ -173,7 +168,6 @@ mansearch(const struct mansearch *search,
        sqlite3         *db;
        sqlite3_stmt    *s, *s2;
        struct match    *mp;
-       struct ohash_info info;
        struct ohash     htab;
        unsigned int     idx;
        size_t           i, j, cur, maxres;
@@ -184,11 +178,6 @@ mansearch(const struct mansearch *search,
                return 0;
        }
 
-       info.calloc = hash_calloc;
-       info.alloc = hash_alloc;
-       info.free = hash_free;
-       info.key_offset = offsetof(struct match, pageid);
-
        cur = maxres = 0;
        *res = NULL;
 
@@ -237,12 +226,12 @@ mansearch(const struct mansearch *search,
                                warnx("%s: getcwd: %s", paths->paths[i], buf);
                                continue;
                        } else if (chdir(buf) == -1) {
-                               perror(buf);
+                               warn("%s", buf);
                                continue;
                        }
                }
                if (chdir(paths->paths[i]) == -1) {
-                       perror(paths->paths[i]);
+                       warn("%s", paths->paths[i]);
                        continue;
                }
                chdir_status = 1;
@@ -273,7 +262,8 @@ mansearch(const struct mansearch *search,
                j = 1;
                c = sqlite3_prepare_v2(db, sql, -1, &s, NULL);
                if (SQLITE_OK != c)
-                       warnx("%s", sqlite3_errmsg(db));
+                       errx((int)MANDOCLEVEL_SYSERR,
+                           "%s", sqlite3_errmsg(db));
 
                for (ep = e; NULL != ep; ep = ep->next) {
                        if (NULL == ep->substr) {
@@ -284,8 +274,7 @@ mansearch(const struct mansearch *search,
                                SQL_BIND_INT64(db, s, j, ep->bits);
                }
 
-               memset(&htab, 0, sizeof(struct ohash));
-               ohash_init(&htab, 4, &info);
+               mandoc_ohash_init(&htab, 4, offsetof(struct match, pageid));
 
                /*
                 * Hash each entry on its [unique] document identifier.
@@ -324,14 +313,16 @@ mansearch(const struct mansearch *search,
                    "WHERE pageid=? ORDER BY sec, arch, name",
                    -1, &s, NULL);
                if (SQLITE_OK != c)
-                       warnx("%s", sqlite3_errmsg(db));
+                       errx((int)MANDOCLEVEL_SYSERR,
+                           "%s", sqlite3_errmsg(db));
 
                c = sqlite3_prepare_v2(db,
                    "SELECT bits, key, pageid FROM keys "
                    "WHERE pageid=? AND bits & ?",
                    -1, &s2, NULL);
                if (SQLITE_OK != c)
-                       warnx("%s", sqlite3_errmsg(db));
+                       errx((int)MANDOCLEVEL_SYSERR,
+                           "%s", sqlite3_errmsg(db));
 
                for (mp = ohash_first(&htab, &idx);
                                NULL != mp;
@@ -373,7 +364,7 @@ mansearch(const struct mansearch *search,
        }
        qsort(*res, cur, sizeof(struct manpage), manpage_compare);
        if (chdir_status && getcwd_status && chdir(buf) == -1)
-               perror(buf);
+               warn("%s", buf);
        exprfree(e);
        free(sql);
        *sz = cur;
@@ -780,7 +771,14 @@ exprterm(const struct mansearch *search, char *buf, int cs)
        if (search->argmode == ARG_WORD) {
                e->bits = TYPE_Nm;
                e->substr = NULL;
+#if HAVE_REWB_BSD
                mandoc_asprintf(&val, "[[:<:]]%s[[:>:]]", buf);
+#elif HAVE_REWB_SYSV
+               mandoc_asprintf(&val, "\\<%s\\>", buf);
+#else
+               mandoc_asprintf(&val,
+                   "(^|[^a-zA-Z01-9_])%s([^a-zA-Z01-9_]|$)", buf);
+#endif
                cs = 0;
        } else if ((val = strpbrk(buf, "=~")) == NULL) {
                e->bits = TYPE_Nm | TYPE_Nd;
@@ -853,24 +851,3 @@ exprfree(struct expr *p)
                p = pp;
        }
 }
-
-static void *
-hash_calloc(size_t nmemb, size_t sz, void *arg)
-{
-
-       return mandoc_calloc(nmemb, sz);
-}
-
-static void *
-hash_alloc(size_t sz, void *arg)
-{
-
-       return mandoc_malloc(sz);
-}
-
-static void
-hash_free(void *p, void *arg)
-{
-
-       free(p);
-}