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

Diff for /mandoc/mansearch.c between version 1.47 and 1.51

version 1.47, 2014/09/01 22:45:53 version 1.51, 2014/11/27 01:58:21
Line 79  struct expr {
Line 79  struct expr {
   
 struct  match {  struct  match {
         uint64_t         pageid; /* identifier in database */          uint64_t         pageid; /* identifier in database */
           uint64_t         bits; /* name type mask */
         char            *desc; /* manual page description */          char            *desc; /* manual page description */
         int              form; /* 0 == catpage */          int              form; /* bit field: formatted, zipped? */
 };  };
   
 static  void             buildnames(struct manpage *, sqlite3 *,  static  void             buildnames(struct manpage *, sqlite3 *,
Line 301  mansearch(const struct mansearch *search,
Line 302  mansearch(const struct mansearch *search,
                         mp = mandoc_calloc(1, sizeof(struct match));                          mp = mandoc_calloc(1, sizeof(struct match));
                         mp->pageid = pageid;                          mp->pageid = pageid;
                         mp->form = sqlite3_column_int(s, 1);                          mp->form = sqlite3_column_int(s, 1);
                           mp->bits = sqlite3_column_int64(s, 3);
                         if (TYPE_Nd == outbit)                          if (TYPE_Nd == outbit)
                                 mp->desc = mandoc_strdup((const char *)                                  mp->desc = mandoc_strdup((const char *)
                                     sqlite3_column_text(s, 0));                                      sqlite3_column_text(s, 0));
Line 336  mansearch(const struct mansearch *search,
Line 338  mansearch(const struct mansearch *search,
                         }                          }
                         mpage = *res + cur;                          mpage = *res + cur;
                         mpage->ipath = i;                          mpage->ipath = i;
                           mpage->bits = mp->bits;
                         mpage->sec = 10;                          mpage->sec = 10;
                         mpage->form = mp->form;                          mpage->form = mp->form;
                         buildnames(mpage, db, s, mp->pageid,                          buildnames(mpage, db, s, mp->pageid,
Line 352  mansearch(const struct mansearch *search,
Line 355  mansearch(const struct mansearch *search,
                 sqlite3_finalize(s2);                  sqlite3_finalize(s2);
                 sqlite3_close(db);                  sqlite3_close(db);
                 ohash_delete(&htab);                  ohash_delete(&htab);
   
                   /*
                    * In man(1) mode, prefer matches in earlier trees
                    * over matches in later trees.
                    */
   
                   if (cur && search->firstmatch)
                           break;
         }          }
         qsort(*res, cur, sizeof(struct manpage), manpage_compare);          qsort(*res, cur, sizeof(struct manpage), manpage_compare);
         rc = 1;          rc = 1;
Line 388  manpage_compare(const void *vp1, const void *vp2)
Line 399  manpage_compare(const void *vp1, const void *vp2)
   
         mp1 = vp1;          mp1 = vp1;
         mp2 = vp2;          mp2 = vp2;
         diff = mp1->sec - mp2->sec;          return( (diff = mp2->bits - mp1->bits) ? diff :
         return(diff ? diff : strcasecmp(mp1->names, mp2->names));                  (diff = mp1->sec - mp2->sec) ? diff :
                   strcasecmp(mp1->names, mp2->names));
 }  }
   
 static void  static void
Line 460  buildnames(struct manpage *mpage, sqlite3 *db, sqlite3
Line 472  buildnames(struct manpage *mpage, sqlite3 *db, sqlite3
   
                 /* Also save the first file name encountered. */                  /* Also save the first file name encountered. */
   
                 if (NULL != mpage->file)                  if (mpage->file != NULL)
                         continue;                          continue;
   
                 if (form) {                  if (form & FORM_SRC) {
                         sep1 = "man";                          sep1 = "man";
                         fsec = sec;                          fsec = sec;
                 } else {                  } else {
                         sep1 = "cat";                          sep1 = "cat";
                         fsec = "0";                          fsec = "0";
                 }                  }
                 sep2 = '\0' == *arch ? "" : "/";                  sep2 = *arch == '\0' ? "" : "/";
                 mandoc_asprintf(&mpage->file, "%s/%s%s%s%s/%s.%s",                  mandoc_asprintf(&mpage->file, "%s/%s%s%s%s/%s.%s",
                     path, sep1, sec, sep2, arch, name, fsec);                      path, sep1, sec, sep2, arch, name, fsec);
         }          }
         if (SQLITE_DONE != c)          if (c != SQLITE_DONE)
                 fprintf(stderr, "%s\n", sqlite3_errmsg(db));                  fprintf(stderr, "%s\n", sqlite3_errmsg(db));
         sqlite3_reset(s);          sqlite3_reset(s);
   
         /* Append one final section to the names. */          /* Append one final section to the names. */
   
         if (NULL != prevsec) {          if (prevsec != NULL) {
                 sep2 = '\0' == *prevarch ? "" : "/";                  sep2 = *prevarch == '\0' ? "" : "/";
                 mandoc_asprintf(&newnames, "%s(%s%s%s)",                  mandoc_asprintf(&newnames, "%s(%s%s%s)",
                     mpage->names, prevsec, sep2, prevarch);                      mpage->names, prevsec, sep2, prevarch);
                 free(mpage->names);                  free(mpage->names);
Line 579  sql_statement(const struct expr *e)
Line 591  sql_statement(const struct expr *e)
         size_t           sz;          size_t           sz;
         int              needop;          int              needop;
   
         sql = mandoc_strdup(          sql = mandoc_strdup(e->equal ?
             "SELECT desc, form, pageid FROM mpages WHERE ");              "SELECT desc, form, pageid, bits "
                   "FROM mpages NATURAL JOIN names WHERE " :
               "SELECT desc, form, pageid, 0 FROM mpages WHERE ");
         sz = strlen(sql);          sz = strlen(sql);
   
         for (needop = 0; NULL != e; e = e->next) {          for (needop = 0; NULL != e; e = e->next) {
Line 600  sql_statement(const struct expr *e)
Line 614  sql_statement(const struct expr *e)
                         ? "pageid IN (SELECT pageid FROM names "                          ? "pageid IN (SELECT pageid FROM names "
                           "WHERE name REGEXP ?)"                            "WHERE name REGEXP ?)"
                         : e->equal                          : e->equal
                         ? "pageid IN (SELECT pageid FROM names "                          ? "name = ? "
                           "WHERE name = ?)"  
                         : "pageid IN (SELECT pageid FROM names "                          : "pageid IN (SELECT pageid FROM names "
                           "WHERE name MATCH ?)")                            "WHERE name MATCH ?)")
                     : (NULL == e->substr                      : (NULL == e->substr

Legend:
Removed from v.1.47  
changed lines
  Added in v.1.51

CVSweb