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

Diff for /mandoc/mansearch.c between version 1.38 and 1.44

version 1.38, 2014/07/12 14:00:25 version 1.44, 2014/08/16 19:00:01
Line 15 
Line 15 
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */   */
 #ifdef HAVE_CONFIG_H  
 #include "config.h"  #include "config.h"
 #endif  
   
 #include <sys/mman.h>  #include <sys/mman.h>
   #include <sys/types.h>
   
 #include <assert.h>  #include <assert.h>
 #include <fcntl.h>  #include <fcntl.h>
 #include <getopt.h>  #include <getopt.h>
Line 32 
Line 32 
 #include <string.h>  #include <string.h>
 #include <unistd.h>  #include <unistd.h>
   
 #ifdef HAVE_OHASH  #if HAVE_OHASH
 #include <ohash.h>  #include <ohash.h>
 #else  #else
 #include "compat_ohash.h"  #include "compat_ohash.h"
 #endif  #endif
 #include <sqlite3.h>  #include <sqlite3.h>
   #ifndef SQLITE_DETERMINISTIC
   #define SQLITE_DETERMINISTIC 0
   #endif
   
 #include "mandoc.h"  #include "mandoc.h"
 #include "mandoc_aux.h"  #include "mandoc_aux.h"
Line 94  static void   exprfree(struct expr *);
Line 97  static void   exprfree(struct expr *);
 static  struct expr     *exprspec(struct expr *, uint64_t,  static  struct expr     *exprspec(struct expr *, uint64_t,
                                  const char *, const char *);                                   const char *, const char *);
 static  struct expr     *exprterm(const struct mansearch *, char *, int);  static  struct expr     *exprterm(const struct mansearch *, char *, int);
   static  int              manpage_compare(const void *, const void *);
 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);
 static  void             sql_match(sqlite3_context *context,  static  void             sql_match(sqlite3_context *context,
Line 119  mansearch_setup(int start)
Line 123  mansearch_setup(int start)
                 }                  }
   
                 pagecache = mmap(NULL, PC_PAGESIZE * PC_NUMPAGES,                  pagecache = mmap(NULL, PC_PAGESIZE * PC_NUMPAGES,
                     PROT_READ | PROT_WRITE, MAP_ANON, -1, 0);                      PROT_READ | PROT_WRITE,
                       MAP_SHARED | MAP_ANON, -1, 0);
   
                 if (MAP_FAILED == pagecache) {                  if (MAP_FAILED == pagecache) {
                         perror("mmap");                          perror("mmap");
Line 298  mansearch(const struct mansearch *search,
Line 303  mansearch(const struct mansearch *search,
                         mp->pageid = pageid;                          mp->pageid = pageid;
                         mp->form = sqlite3_column_int(s, 1);                          mp->form = sqlite3_column_int(s, 1);
                         if (TYPE_Nd == outbit)                          if (TYPE_Nd == outbit)
                                 mp->desc = mandoc_strdup(                                  mp->desc = mandoc_strdup((const char *)
                                     sqlite3_column_text(s, 0));                                      sqlite3_column_text(s, 0));
                         ohash_insert(&htab, idx, mp);                          ohash_insert(&htab, idx, mp);
                 }                  }
Line 331  mansearch(const struct mansearch *search,
Line 336  mansearch(const struct mansearch *search,
                                     maxres, sizeof(struct manpage));                                      maxres, sizeof(struct manpage));
                         }                          }
                         mpage = *res + cur;                          mpage = *res + cur;
                           mpage->sec = 10;
                         mpage->form = mp->form;                          mpage->form = mp->form;
                         buildnames(mpage, db, s, mp->pageid,                          buildnames(mpage, db, s, mp->pageid,
                             paths->paths[i], mp->form);                              paths->paths[i], mp->form);
Line 347  mansearch(const struct mansearch *search,
Line 353  mansearch(const struct mansearch *search,
                 sqlite3_close(db);                  sqlite3_close(db);
                 ohash_delete(&htab);                  ohash_delete(&htab);
         }          }
           qsort(*res, cur, sizeof(struct manpage), manpage_compare);
         rc = 1;          rc = 1;
 out:  out:
         if (-1 != fd) {          if (-1 != fd) {
Line 360  out:
Line 367  out:
         return(rc);          return(rc);
 }  }
   
   static int
   manpage_compare(const void *vp1, const void *vp2)
   {
           const struct manpage    *mp1, *mp2;
           int                      diff;
   
           mp1 = vp1;
           mp2 = vp2;
           diff = mp1->sec - mp2->sec;
           return(diff ? diff : strcasecmp(mp1->names, mp2->names));
   }
   
 static void  static void
 buildnames(struct manpage *mpage, sqlite3 *db, sqlite3_stmt *s,  buildnames(struct manpage *mpage, sqlite3 *db, sqlite3_stmt *s,
                 uint64_t pageid, const char *path, int form)                  uint64_t pageid, const char *path, int form)
Line 388  buildnames(struct manpage *mpage, sqlite3 *db, sqlite3
Line 407  buildnames(struct manpage *mpage, sqlite3 *db, sqlite3
   
                 /* Fetch the next name. */                  /* Fetch the next name. */
   
                 sec = sqlite3_column_text(s, 0);                  sec = (const char *)sqlite3_column_text(s, 0);
                 arch = sqlite3_column_text(s, 1);                  arch = (const char *)sqlite3_column_text(s, 1);
                 name = sqlite3_column_text(s, 2);                  name = (const char *)sqlite3_column_text(s, 2);
   
                   /* Remember the first section found. */
   
                   if (9 < mpage->sec && '1' <= *sec && '9' >= *sec)
                           mpage->sec = (*sec - '1') + 1;
   
                 /* If the section changed, append the old one. */                  /* If the section changed, append the old one. */
   
                 if (NULL != prevsec &&                  if (NULL != prevsec &&
Line 474  buildoutput(sqlite3 *db, sqlite3_stmt *s, uint64_t pag
Line 498  buildoutput(sqlite3 *db, sqlite3_stmt *s, uint64_t pag
                         oldoutput = output;                          oldoutput = output;
                         sep1 = " # ";                          sep1 = " # ";
                 }                  }
                 data = sqlite3_column_text(s, 1);                  data = (const char *)sqlite3_column_text(s, 1);
                 mandoc_asprintf(&newoutput, "%s%s%s",                  mandoc_asprintf(&newoutput, "%s%s%s",
                     oldoutput, sep1, data);                      oldoutput, sep1, data);
                 free(output);                  free(output);

Legend:
Removed from v.1.38  
changed lines
  Added in v.1.44

CVSweb