=================================================================== RCS file: /cvs/mandoc/mansearch.c,v retrieving revision 1.59 retrieving revision 1.65 diff -u -p -r1.59 -r1.65 --- mandoc/mansearch.c 2015/10/11 21:12:55 1.59 +++ mandoc/mansearch.c 2016/07/09 15:24:19 1.65 @@ -1,4 +1,4 @@ -/* $Id: mansearch.c,v 1.59 2015/10/11 21:12:55 schwarze Exp $ */ +/* $Id: mansearch.c,v 1.65 2016/07/09 15:24:19 schwarze Exp $ */ /* * Copyright (c) 2012 Kristaps Dzonsons * Copyright (c) 2013, 2014, 2015 Ingo Schwarze @@ -21,10 +21,11 @@ #include #include +#if HAVE_ERR #include +#endif #include #include -#include #include #include #include @@ -35,11 +36,6 @@ #include #include -#if HAVE_OHASH -#include -#else -#include "compat_ohash.h" -#endif #include #ifndef SQLITE_DETERMINISTIC #define SQLITE_DETERMINISTIC 0 @@ -47,6 +43,7 @@ #include "mandoc.h" #include "mandoc_aux.h" +#include "mandoc_ohash.h" #include "manconf.h" #include "mansearch.h" @@ -56,17 +53,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 +90,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 +124,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 +143,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 +167,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 +177,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 +225,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 +261,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 +273,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 +312,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 +363,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 +770,14 @@ exprterm(const struct mansearch *search, char *buf, in 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; @@ -852,25 +849,4 @@ exprfree(struct expr *p) free(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); }