=================================================================== RCS file: /cvs/mandoc/mansearch.c,v retrieving revision 1.27 retrieving revision 1.31 diff -u -p -r1.27 -r1.31 --- mandoc/mansearch.c 2014/04/10 02:46:21 1.27 +++ mandoc/mansearch.c 2014/04/16 00:33:47 1.31 @@ -1,4 +1,4 @@ -/* $Id: mansearch.c,v 1.27 2014/04/10 02:46:21 schwarze Exp $ */ +/* $Id: mansearch.c,v 1.31 2014/04/16 00:33:47 schwarze Exp $ */ /* * Copyright (c) 2012 Kristaps Dzonsons * Copyright (c) 2013, 2014 Ingo Schwarze @@ -19,6 +19,7 @@ #include "config.h" #endif +#include #include #include #include @@ -101,6 +102,53 @@ static void sql_regexp(sqlite3_context *context, static char *sql_statement(const struct expr *); int +mansearch_setup(int start) +{ + static void *pagecache; + int c; + +#define PC_PAGESIZE 1280 +#define PC_NUMPAGES 256 + + if (start) { + if (NULL != pagecache) { + fprintf(stderr, "pagecache already enabled\n"); + return((int)MANDOCLEVEL_BADARG); + } + + pagecache = mmap(NULL, PC_PAGESIZE * PC_NUMPAGES, + PROT_READ | PROT_WRITE, MAP_ANON, -1, 0); + + if (MAP_FAILED == pagecache) { + perror("mmap"); + pagecache = NULL; + return((int)MANDOCLEVEL_SYSERR); + } + + c = sqlite3_config(SQLITE_CONFIG_PAGECACHE, + pagecache, PC_PAGESIZE, PC_NUMPAGES); + + if (SQLITE_OK == c) + return((int)MANDOCLEVEL_OK); + + fprintf(stderr, "pagecache: %s\n", sqlite3_errstr(c)); + + } else if (NULL == pagecache) { + fprintf(stderr, "pagecache missing\n"); + return((int)MANDOCLEVEL_BADARG); + } + + if (-1 == munmap(pagecache, PC_PAGESIZE * PC_NUMPAGES)) { + perror("munmap"); + pagecache = NULL; + return((int)MANDOCLEVEL_SYSERR); + } + + pagecache = NULL; + return((int)MANDOCLEVEL_OK); +} + +int mansearch(const struct mansearch *search, const struct manpaths *paths, int argc, char *argv[], @@ -162,7 +210,7 @@ mansearch(const struct mansearch *search, */ if (NULL == getcwd(buf, PATH_MAX)) { - perror(NULL); + perror("getcwd"); goto out; } else if (-1 == (fd = open(buf, O_RDONLY, 0))) { perror(buf); @@ -205,10 +253,12 @@ mansearch(const struct mansearch *search, */ c = sqlite3_create_function(db, "match", 2, - SQLITE_ANY, NULL, sql_match, NULL, NULL); + SQLITE_UTF8 | SQLITE_DETERMINISTIC, + NULL, sql_match, NULL, NULL); assert(SQLITE_OK == c); c = sqlite3_create_function(db, "regexp", 2, - SQLITE_ANY, NULL, sql_regexp, NULL, NULL); + SQLITE_UTF8 | SQLITE_DETERMINISTIC, + NULL, sql_regexp, NULL, NULL); assert(SQLITE_OK == c); j = 1; @@ -299,9 +349,12 @@ mansearch(const struct mansearch *search, } rc = 1; out: - exprfree(e); - if (-1 != fd) + if (-1 != fd) { + if (-1 == fchdir(fd)) + perror(buf); close(fd); + } + exprfree(e); free(sql); *sz = cur; return(rc);