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

Diff for /mandoc/mansearch.c between version 1.75 and 1.79

version 1.75, 2017/07/19 14:05:13 version 1.79, 2018/11/22 12:01:46
Line 1 
Line 1 
 /*      $OpenBSD$ */  /*      $Id$ */
 /*  /*
  * Copyright (c) 2012 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2013-2017 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2013-2018 Ingo Schwarze <schwarze@openbsd.org>
  *   *
  * Permission to use, copy, modify, and distribute this software for any   * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above   * purpose with or without fee is hereby granted, provided that the above
Line 171  mansearch(const struct mansearch *search,
Line 171  mansearch(const struct mansearch *search,
                         page = dbm_page_get(rp->page);                          page = dbm_page_get(rp->page);
   
                         if (lstmatch(search->sec, page->sect) == 0 ||                          if (lstmatch(search->sec, page->sect) == 0 ||
                             lstmatch(search->arch, page->arch) == 0)                              lstmatch(search->arch, page->arch) == 0 ||
                               (search->argmode == ARG_NAME &&
                                rp->bits <= (int32_t)(NAME_SYN & NAME_MASK)))
                                 continue;                                  continue;
   
                         if (res == NULL) {                          if (res == NULL) {
Line 186  mansearch(const struct mansearch *search,
Line 188  mansearch(const struct mansearch *search,
                         mpage = *res + cur;                          mpage = *res + cur;
                         mandoc_asprintf(&mpage->file, "%s/%s",                          mandoc_asprintf(&mpage->file, "%s/%s",
                             paths->paths[i], page->file + 1);                              paths->paths[i], page->file + 1);
                           if (access(chdir_status ? page->file + 1 :
                               mpage->file, R_OK) == -1) {
                                   warn("%s", mpage->file);
                                   warnx("outdated mandoc.db contains "
                                       "bogus %s entry, run makewhatis %s",
                                       page->file + 1, paths->paths[i]);
                                   free(mpage->file);
                                   free(rp);
                                   continue;
                           }
                         mpage->names = buildnames(page);                          mpage->names = buildnames(page);
                         mpage->output = buildoutput(outkey, page);                          mpage->output = buildoutput(outkey, page);
                         mpage->ipath = i;                          mpage->ipath = i;
                         mpage->bits = rp->bits;  
                         mpage->sec = *page->sect - '0';                          mpage->sec = *page->sect - '0';
                         if (mpage->sec < 0 || mpage->sec > 9)                          if (mpage->sec < 0 || mpage->sec > 9)
                                 mpage->sec = 10;                                  mpage->sec = 10;
Line 284  manmerge_term(struct expr *e, struct ohash *htab)
Line 295  manmerge_term(struct expr *e, struct ohash *htab)
                                 break;                                  break;
                         slot = ohash_lookup_memory(htab,                          slot = ohash_lookup_memory(htab,
                             (char *)&res, sizeof(res.page), res.page);                              (char *)&res, sizeof(res.page), res.page);
                         if ((rp = ohash_find(htab, slot)) != NULL) {                          if ((rp = ohash_find(htab, slot)) != NULL)
                                 rp->bits |= res.bits;  
                                 continue;                                  continue;
                         }  
                         rp = mandoc_malloc(sizeof(*rp));                          rp = mandoc_malloc(sizeof(*rp));
                         *rp = res;                          *rp = res;
                         ohash_insert(htab, slot, rp);                          ohash_insert(htab, slot, rp);
Line 400  manpage_compare(const void *vp1, const void *vp2)
Line 409  manpage_compare(const void *vp1, const void *vp2)
   
         mp1 = vp1;          mp1 = vp1;
         mp2 = vp2;          mp2 = vp2;
         if ((diff = mp2->bits - mp1->bits) ||          if ((diff = mp1->sec - mp2->sec))
             (diff = mp1->sec - mp2->sec))  
                 return diff;                  return diff;
   
         /* Fall back to alphabetic ordering of names. */          /* Fall back to alphabetic ordering of names. */
Line 452  lstlen(const char *cp, size_t sep)
Line 460  lstlen(const char *cp, size_t sep)
 {  {
         size_t   sz;          size_t   sz;
   
         for (sz = 0;; sz++) {          for (sz = 0; *cp != '\0'; cp++) {
                 if (cp[0] == '\0') {  
                         if (cp[1] == '\0')                  /* Skip names appearing only in the SYNOPSIS. */
                                 break;                  if (*cp <= (char)(NAME_SYN & NAME_MASK)) {
                         sz += sep - 1;                          while (*cp != '\0')
                 } else if (cp[0] < ' ')                                  cp++;
                         sz--;                          continue;
                 cp++;                  }
   
                   /* Skip name class markers. */
                   if (*cp < ' ')
                           cp++;
   
                   /* Print a separator before each but the first string. */
                   if (sz)
                           sz += sep;
   
                   /* Copy one string. */
                   while (*cp != '\0') {
                           sz++;
                           cp++;
                   }
         }          }
         return sz;          return sz;
 }  }
Line 471  lstlen(const char *cp, size_t sep)
Line 493  lstlen(const char *cp, size_t sep)
 static void  static void
 lstcat(char *buf, size_t *i, const char *cp, const char *sep)  lstcat(char *buf, size_t *i, const char *cp, const char *sep)
 {  {
         const char *s;          const char      *s;
           size_t           i_start;
   
         for (;;) {          for (i_start = *i; *cp != '\0'; cp++) {
                 if (cp[0] == '\0') {  
                         if (cp[1] == '\0')                  /* Skip names appearing only in the SYNOPSIS. */
                                 break;                  if (*cp <= (char)(NAME_SYN & NAME_MASK)) {
                           while (*cp != '\0')
                                   cp++;
                           continue;
                   }
   
                   /* Skip name class markers. */
                   if (*cp < ' ')
                           cp++;
   
                   /* Print a separator before each but the first string. */
                   if (*i > i_start) {
                         s = sep;                          s = sep;
                         while (*s != '\0')                          while (*s != '\0')
                                 buf[(*i)++] = *s++;                                  buf[(*i)++] = *s++;
                 } else if (cp[0] >= ' ')                  }
                         buf[(*i)++] = cp[0];  
                 cp++;                  /* Copy one string. */
                   while (*cp != '\0')
                           buf[(*i)++] = *cp++;
         }          }
   
 }  }
   
 /*  /*
Line 733  exprterm(const struct mansearch *search, int argc, cha
Line 770  exprterm(const struct mansearch *search, int argc, cha
                 cs = 0;                  cs = 0;
         } else if ((val = strpbrk(argv[*argi], "=~")) == NULL) {          } else if ((val = strpbrk(argv[*argi], "=~")) == NULL) {
                 e->bits = TYPE_Nm | TYPE_Nd;                  e->bits = TYPE_Nm | TYPE_Nd;
                 e->match.type = DBM_SUB;                  e->match.type = DBM_REGEX;
                 e->match.str = argv[*argi];                  val = argv[*argi];
                   cs = 0;
         } else {          } else {
                 if (val == argv[*argi])                  if (val == argv[*argi])
                         e->bits = TYPE_Nm | TYPE_Nd;                          e->bits = TYPE_Nm | TYPE_Nd;

Legend:
Removed from v.1.75  
changed lines
  Added in v.1.79

CVSweb