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

Diff for /mandoc/Attic/apropos_db.c between version 1.21 and 1.28

version 1.21, 2011/12/03 18:47:09 version 1.28, 2011/12/25 14:58:39
Line 117  static const struct type types[] = {
Line 117  static const struct type types[] = {
         { TYPE_Va, "Va" },          { TYPE_Va, "Va" },
         { TYPE_Va, "Vt" },          { TYPE_Va, "Vt" },
         { TYPE_Xr, "Xr" },          { TYPE_Xr, "Xr" },
         { INT_MAX, "any" },          { UINT64_MAX, "any" },
         { 0, NULL }          { 0, NULL }
 };  };
   
 static  DB      *btree_open(void);  static  DB      *btree_open(void);
 static  int      btree_read(const DBT *, const DBT *,  static  int      btree_read(const DBT *, const DBT *,
                         const struct mchars *,                          const struct mchars *,
                         struct db_val *, char **);                          uint64_t *, recno_t *, char **);
 static  int      expreval(const struct expr *, int *);  static  int      expreval(const struct expr *, int *);
 static  void     exprexec(const struct expr *,  static  void     exprexec(const struct expr *,
                         const char *, uint64_t, struct rec *);                          const char *, uint64_t, struct rec *);
Line 167  btree_open(void)
Line 167  btree_open(void)
  * Return 0 if the database is insane, else 1.   * Return 0 if the database is insane, else 1.
  */   */
 static int  static int
 btree_read(const DBT *k, const DBT *v,  btree_read(const DBT *k, const DBT *v, const struct mchars *mc,
                 const struct mchars *mc,                  uint64_t *mask, recno_t *rec, char **buf)
                 struct db_val *dbv, char **buf)  
 {  {
         const struct db_val *vp;          uint64_t         vbuf[2];
   
         /* Are our sizes sane? */          /* Are our sizes sane? */
         if (k->size < 2 || sizeof(struct db_val) != v->size)          if (k->size < 2 || sizeof(vbuf) != v->size)
                 return(0);                  return(0);
   
         /* Is our string nil-terminated? */          /* Is our string nil-terminated? */
         if ('\0' != ((const char *)k->data)[(int)k->size - 1])          if ('\0' != ((const char *)k->data)[(int)k->size - 1])
                 return(0);                  return(0);
   
         vp = v->data;  
         norm_string((const char *)k->data, mc, buf);          norm_string((const char *)k->data, mc, buf);
         dbv->rec = betoh32(vp->rec);          memcpy(vbuf, v->data, v->size);
         dbv->mask = betoh64(vp->mask);          *mask = betoh64(vbuf[0]);
           *rec  = betoh64(vbuf[1]);
         return(1);          return(1);
 }  }
   
Line 197  btree_read(const DBT *k, const DBT *v, 
Line 196  btree_read(const DBT *k, const DBT *v, 
 static size_t  static size_t
 norm_utf8(unsigned int cp, char out[7])  norm_utf8(unsigned int cp, char out[7])
 {  {
         size_t           rc;          int              rc;
   
         rc = 0;          rc = 0;
   
Line 238  norm_utf8(unsigned int cp, char out[7])
Line 237  norm_utf8(unsigned int cp, char out[7])
                 return(0);                  return(0);
   
         out[rc] = '\0';          out[rc] = '\0';
         return(rc);          return((size_t)rc);
 }  }
   
 /*  /*
Line 365  index_read(const DBT *key, const DBT *val, int index,
Line 364  index_read(const DBT *key, const DBT *val, int index,
 {  {
         size_t           left;          size_t           left;
         char            *np, *cp;          char            *np, *cp;
           char             type;
   
 #define INDEX_BREAD(_dst) \  #define INDEX_BREAD(_dst) \
         do { \          do { \
Line 375  index_read(const DBT *key, const DBT *val, int index,
Line 375  index_read(const DBT *key, const DBT *val, int index,
                 cp = np + 1; \                  cp = np + 1; \
         } while (/* CONSTCOND */ 0)          } while (/* CONSTCOND */ 0)
   
         left = val->size;          if (0 == (left = val->size))
         cp = (char *)val->data;                  return(0);
   
         rec->res.rec = *(recno_t *)key->data;          cp = val->data;
           assert(sizeof(recno_t) == key->size);
           memcpy(&rec->res.rec, key->data, key->size);
         rec->res.volume = index;          rec->res.volume = index;
   
         INDEX_BREAD(rec->res.type);          if ('d' == (type = *cp++))
                   rec->res.type = RESTYPE_MDOC;
           else if ('a' == type)
                   rec->res.type = RESTYPE_MAN;
           else if ('c' == type)
                   rec->res.type = RESTYPE_CAT;
           else
                   return(0);
   
           left--;
         INDEX_BREAD(rec->res.file);          INDEX_BREAD(rec->res.file);
         INDEX_BREAD(rec->res.cat);          INDEX_BREAD(rec->res.cat);
         INDEX_BREAD(rec->res.title);          INDEX_BREAD(rec->res.title);
Line 463  single_search(struct rectree *tree, const struct opts 
Line 474  single_search(struct rectree *tree, const struct opts 
         char            *buf;          char            *buf;
         struct rec      *rs;          struct rec      *rs;
         struct rec       r;          struct rec       r;
         struct db_val    vb;          uint64_t         mask;
           recno_t          rec;
   
         root    = -1;          root    = -1;
         leaf    = -1;          leaf    = -1;
Line 483  single_search(struct rectree *tree, const struct opts 
Line 495  single_search(struct rectree *tree, const struct opts 
         }          }
   
         while (0 == (ch = (*btree->seq)(btree, &key, &val, R_NEXT))) {          while (0 == (ch = (*btree->seq)(btree, &key, &val, R_NEXT))) {
                 if ( ! btree_read(&key, &val, mc, &vb, &buf))                  if ( ! btree_read(&key, &val, mc, &mask, &rec, &buf))
                         break;                          break;
   
                 /*                  /*
                  * See if this keyword record matches any of the                   * See if this keyword record matches any of the
                  * expressions we have stored.                   * expressions we have stored.
                  */                   */
                 if ( ! exprmark(expr, buf, vb.mask, NULL))                  if ( ! exprmark(expr, buf, mask, NULL))
                         continue;                          continue;
   
                 /*                  /*
Line 500  single_search(struct rectree *tree, const struct opts 
Line 512  single_search(struct rectree *tree, const struct opts 
                  */                   */
   
                 for (leaf = root; leaf >= 0; )                  for (leaf = root; leaf >= 0; )
                         if (vb.rec > rs[leaf].res.rec &&                          if (rec > rs[leaf].res.rec &&
                                         rs[leaf].rhs >= 0)                                          rs[leaf].rhs >= 0)
                                 leaf = rs[leaf].rhs;                                  leaf = rs[leaf].rhs;
                         else if (vb.rec < rs[leaf].res.rec &&                          else if (rec < rs[leaf].res.rec &&
                                         rs[leaf].lhs >= 0)                                          rs[leaf].lhs >= 0)
                                 leaf = rs[leaf].lhs;                                  leaf = rs[leaf].lhs;
                         else                          else
Line 515  single_search(struct rectree *tree, const struct opts 
Line 527  single_search(struct rectree *tree, const struct opts 
                  * try to evaluate it now and continue anyway.                   * try to evaluate it now and continue anyway.
                  */                   */
   
                 if (leaf >= 0 && rs[leaf].res.rec == vb.rec) {                  if (leaf >= 0 && rs[leaf].res.rec == rec) {
                         if (0 == rs[leaf].matched)                          if (0 == rs[leaf].matched)
                                 exprexec(expr, buf, vb.mask, &rs[leaf]);                                  exprexec(expr, buf, mask, &rs[leaf]);
                         continue;                          continue;
                 }                  }
   
Line 527  single_search(struct rectree *tree, const struct opts 
Line 539  single_search(struct rectree *tree, const struct opts 
                  * database, then begin partial evaluation.                   * database, then begin partial evaluation.
                  */                   */
   
                 key.data = &vb.rec;                  key.data = &rec;
                 key.size = sizeof(recno_t);                  key.size = sizeof(recno_t);
   
                 if (0 != (*idx->get)(idx, &key, &val, 0))                  if (0 != (*idx->get)(idx, &key, &val, 0))
Line 541  single_search(struct rectree *tree, const struct opts 
Line 553  single_search(struct rectree *tree, const struct opts 
   
                 if (opts->cat && strcasecmp(opts->cat, r.res.cat))                  if (opts->cat && strcasecmp(opts->cat, r.res.cat))
                         continue;                          continue;
                 if (opts->arch && strcasecmp(opts->arch, r.res.arch))  
                         continue;  
   
                   if (opts->arch && *r.res.arch)
                           if (strcasecmp(opts->arch, r.res.arch))
                                   continue;
   
                 tree->node = rs = mandoc_realloc                  tree->node = rs = mandoc_realloc
                         (rs, (tree->len + 1) * sizeof(struct rec));                          (rs, (tree->len + 1) * sizeof(struct rec));
   
                 memcpy(&rs[tree->len], &r, sizeof(struct rec));                  memcpy(&rs[tree->len], &r, sizeof(struct rec));
                   memset(&r, 0, sizeof(struct rec));
                 rs[tree->len].matches =                  rs[tree->len].matches =
                         mandoc_calloc(terms, sizeof(int));                          mandoc_calloc(terms, sizeof(int));
   
                 exprexec(expr, buf, vb.mask, &rs[tree->len]);                  exprexec(expr, buf, mask, &rs[tree->len]);
   
                 /* Append to our tree. */                  /* Append to our tree. */
   
                 if (leaf >= 0) {                  if (leaf >= 0) {
                         if (vb.rec > rs[leaf].res.rec)                          if (rec > rs[leaf].res.rec)
                                 rs[leaf].rhs = tree->len;                                  rs[leaf].rhs = tree->len;
                         else                          else
                                 rs[leaf].lhs = tree->len;                                  rs[leaf].lhs = tree->len;
                 } else                  } else
                         root = tree->len;                          root = tree->len;
   
                 memset(&r, 0, sizeof(struct rec));  
                 tree->len++;                  tree->len++;
         }          }
   
Line 571  single_search(struct rectree *tree, const struct opts 
Line 585  single_search(struct rectree *tree, const struct opts 
         (*idx->close)(idx);          (*idx->close)(idx);
   
         free(buf);          free(buf);
           recfree(&r);
         return(1 == ch);          return(1 == ch);
 }  }
   
Line 578  static void
Line 593  static void
 recfree(struct rec *rec)  recfree(struct rec *rec)
 {  {
   
         free(rec->res.type);  
         free(rec->res.file);          free(rec->res.file);
         free(rec->res.cat);          free(rec->res.cat);
         free(rec->res.title);          free(rec->res.title);

Legend:
Removed from v.1.21  
changed lines
  Added in v.1.28

CVSweb