[BACK]Return to mansearch.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Diff for /mandoc/mansearch.c between version 1.27 and 1.31

version 1.27, 2014/04/10 02:46:21 version 1.31, 2014/04/16 00:33:47
Line 19 
Line 19 
 #include "config.h"  #include "config.h"
 #endif  #endif
   
   #include <sys/mman.h>
 #include <assert.h>  #include <assert.h>
 #include <fcntl.h>  #include <fcntl.h>
 #include <getopt.h>  #include <getopt.h>
Line 101  static void   sql_regexp(sqlite3_context *context,
Line 102  static void   sql_regexp(sqlite3_context *context,
 static  char            *sql_statement(const struct expr *);  static  char            *sql_statement(const struct expr *);
   
 int  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,  mansearch(const struct mansearch *search,
                 const struct manpaths *paths,                  const struct manpaths *paths,
                 int argc, char *argv[],                  int argc, char *argv[],
Line 162  mansearch(const struct mansearch *search,
Line 210  mansearch(const struct mansearch *search,
          */           */
   
         if (NULL == getcwd(buf, PATH_MAX)) {          if (NULL == getcwd(buf, PATH_MAX)) {
                 perror(NULL);                  perror("getcwd");
                 goto out;                  goto out;
         } else if (-1 == (fd = open(buf, O_RDONLY, 0))) {          } else if (-1 == (fd = open(buf, O_RDONLY, 0))) {
                 perror(buf);                  perror(buf);
Line 205  mansearch(const struct mansearch *search,
Line 253  mansearch(const struct mansearch *search,
                  */                   */
   
                 c = sqlite3_create_function(db, "match", 2,                  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);                  assert(SQLITE_OK == c);
                 c = sqlite3_create_function(db, "regexp", 2,                  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);                  assert(SQLITE_OK == c);
   
                 j = 1;                  j = 1;
Line 299  mansearch(const struct mansearch *search,
Line 349  mansearch(const struct mansearch *search,
         }          }
         rc = 1;          rc = 1;
 out:  out:
         exprfree(e);          if (-1 != fd) {
         if (-1 != fd)                  if (-1 == fchdir(fd))
                           perror(buf);
                 close(fd);                  close(fd);
           }
           exprfree(e);
         free(sql);          free(sql);
         *sz = cur;          *sz = cur;
         return(rc);          return(rc);

Legend:
Removed from v.1.27  
changed lines
  Added in v.1.31

CVSweb