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

Diff for /mandoc/mansearch.c between version 1.14 and 1.15

version 1.14, 2014/01/05 00:29:54 version 1.15, 2014/01/05 03:06:43
Line 135  static void  *hash_halloc(size_t, void *);
Line 135  static void  *hash_halloc(size_t, void *);
 static  struct expr     *exprcomp(const struct mansearch *,  static  struct expr     *exprcomp(const struct mansearch *,
                                 int, char *[]);                                  int, char *[]);
 static  void             exprfree(struct expr *);  static  void             exprfree(struct expr *);
   static  struct expr     *exprspec(struct expr *, uint64_t,
                                    const char *, const char *);
 static  struct expr     *exprterm(const struct mansearch *, char *, int);  static  struct expr     *exprterm(const struct mansearch *, char *, int);
 static  void             sql_append(char **sql, size_t *sz,  static  void             sql_append(char **sql, size_t *sz,
                                 const char *newstr, int count);                                  const char *newstr, int count);
Line 142  static void   sql_match(sqlite3_context *context,
Line 144  static void   sql_match(sqlite3_context *context,
                                 int argc, sqlite3_value **argv);                                  int argc, sqlite3_value **argv);
 static  void             sql_regexp(sqlite3_context *context,  static  void             sql_regexp(sqlite3_context *context,
                                 int argc, sqlite3_value **argv);                                  int argc, sqlite3_value **argv);
 static  char            *sql_statement(const struct expr *,  static  char            *sql_statement(const struct expr *);
                                 const char *, const char *);  
   
 int  int
 mansearch(const struct mansearch *search,  mansearch(const struct mansearch *search,
Line 211  mansearch(const struct mansearch *search,
Line 212  mansearch(const struct mansearch *search,
                 goto out;                  goto out;
         }          }
   
         sql = sql_statement(e, search->arch, search->sec);          sql = sql_statement(e);
   
         /*          /*
          * Loop over the directories (containing databases) for us to           * Loop over the directories (containing databases) for us to
Line 258  mansearch(const struct mansearch *search,
Line 259  mansearch(const struct mansearch *search,
                 if (SQLITE_OK != c)                  if (SQLITE_OK != c)
                         fprintf(stderr, "%s\n", sqlite3_errmsg(db));                          fprintf(stderr, "%s\n", sqlite3_errmsg(db));
   
                 if (NULL != search->arch)  
                         SQL_BIND_TEXT(db, s, j, search->arch);  
                 if (NULL != search->sec)  
                         SQL_BIND_TEXT(db, s, j, search->sec);  
   
                 for (ep = e; NULL != ep; ep = ep->next) {                  for (ep = e; NULL != ep; ep = ep->next) {
                         if (NULL == ep->substr) {                          if (NULL == ep->substr) {
                                 SQL_BIND_BLOB(db, s, j, ep->regexp);                                  SQL_BIND_BLOB(db, s, j, ep->regexp);
Line 480  sql_append(char **sql, size_t *sz, const char *newstr,
Line 476  sql_append(char **sql, size_t *sz, const char *newstr,
  * Prepare the search SQL statement.   * Prepare the search SQL statement.
  */   */
 static char *  static char *
 sql_statement(const struct expr *e, const char *arch, const char *sec)  sql_statement(const struct expr *e)
 {  {
         char            *sql;          char            *sql;
         size_t           sz;          size_t           sz;
Line 489  sql_statement(const struct expr *e, const char *arch, 
Line 485  sql_statement(const struct expr *e, const char *arch, 
         sql = mandoc_strdup("SELECT * FROM mpages WHERE ");          sql = mandoc_strdup("SELECT * FROM mpages WHERE ");
         sz = strlen(sql);          sz = strlen(sql);
   
         if (NULL != arch)  
                 sql_append(&sql, &sz, "arch = ? AND ", 1);  
         if (NULL != sec)  
                 sql_append(&sql, &sz, "sec = ? AND ", 1);  
         sql_append(&sql, &sz, "(", 1);  
   
         for (needop = 0; NULL != e; e = e->next) {          for (needop = 0; NULL != e; e = e->next) {
                 if (e->and)                  if (e->and)
                         sql_append(&sql, &sz, " AND ", 1);                          sql_append(&sql, &sz, " AND ", 1);
Line 511  sql_statement(const struct expr *e, const char *arch, 
Line 501  sql_statement(const struct expr *e, const char *arch, 
                         sql_append(&sql, &sz, ")", e->close);                          sql_append(&sql, &sz, ")", e->close);
                 needop = 1;                  needop = 1;
         }          }
         sql_append(&sql, &sz, ")", 1);  
   
         return(sql);          return(sql);
 }  }
Line 528  exprcomp(const struct mansearch *search, int argc, cha
Line 517  exprcomp(const struct mansearch *search, int argc, cha
         struct expr     *first, *next, *cur;          struct expr     *first, *next, *cur;
   
         first = cur = NULL;          first = cur = NULL;
         toopen = logic = igncase = toclose = 0;          logic = igncase = toclose = 0;
           toopen = 1;
   
         for (i = 0; i < argc; i++) {          for (i = 0; i < argc; i++) {
                 if (0 == strcmp("(", argv[i])) {                  if (0 == strcmp("(", argv[i])) {
Line 572  exprcomp(const struct mansearch *search, int argc, cha
Line 562  exprcomp(const struct mansearch *search, int argc, cha
                         cur = first = next;                          cur = first = next;
                 toopen = logic = igncase = 0;                  toopen = logic = igncase = 0;
         }          }
         if ( ! (toopen || logic || igncase || toclose))          if (toopen || logic || igncase || toclose)
                 return(first);                  goto fail;
   
           cur->close++;
           cur = exprspec(cur, TYPE_arch, search->arch, "^(%s|any)$");
           exprspec(cur, TYPE_sec, search->sec, "^%s$");
   
           return(first);
   
 fail:  fail:
         if (NULL != first)          if (NULL != first)
                 exprfree(first);                  exprfree(first);
Line 581  fail:
Line 578  fail:
 }  }
   
 static struct expr *  static struct expr *
   exprspec(struct expr *cur, uint64_t key, const char *value,
                   const char *format)
   {
           char     errbuf[BUFSIZ];
           char    *cp;
           int      irc;
   
           if (NULL == value)
                   return(cur);
   
           if (-1 == asprintf(&cp, format, value)) {
                   perror(0);
                   exit((int)MANDOCLEVEL_SYSERR);
           }
           cur->next = mandoc_calloc(1, sizeof(struct expr));
           cur = cur->next;
           cur->and = 1;
           cur->bits = key;
           if (0 != (irc = regcomp(&cur->regexp, cp,
               REG_EXTENDED | REG_NOSUB | REG_ICASE))) {
                   regerror(irc, &cur->regexp, errbuf, sizeof(errbuf));
                   fprintf(stderr, "regcomp: %s\n", errbuf);
                   cur->substr = value;
           }
           free(cp);
           return(cur);
   }
   
   static struct expr *
 exprterm(const struct mansearch *search, char *buf, int cs)  exprterm(const struct mansearch *search, char *buf, int cs)
 {  {
           char             errbuf[BUFSIZ];
         struct expr     *e;          struct expr     *e;
         char            *key, *v;          char            *key, *v;
         size_t           i;          size_t           i;
           int              irc;
   
         if ('\0' == *buf)          if ('\0' == *buf)
                 return(NULL);                  return(NULL);
Line 614  exprterm(const struct mansearch *search, char *buf, in
Line 642  exprterm(const struct mansearch *search, char *buf, in
                 e->bits = search->deftype;                  e->bits = search->deftype;
   
         if ('~' == *v++) {          if ('~' == *v++) {
                 if (regcomp(&e->regexp, v,                  if (0 != (irc = regcomp(&e->regexp, v,
                     REG_EXTENDED | REG_NOSUB | (cs ? 0 : REG_ICASE))) {                      REG_EXTENDED | REG_NOSUB | (cs ? 0 : REG_ICASE)))) {
                           regerror(irc, &e->regexp, errbuf, sizeof(errbuf));
                           fprintf(stderr, "regcomp: %s\n", errbuf);
                         free(e);                          free(e);
                         return(NULL);                          return(NULL);
                 }                  }

Legend:
Removed from v.1.14  
changed lines
  Added in v.1.15

CVSweb