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

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

version 1.44, 2014/08/16 19:00:01 version 1.45, 2014/08/17 03:24:47
Line 159  int
Line 159  int
 mansearch(const struct mansearch *search,  mansearch(const struct mansearch *search,
                 const struct manpaths *paths,                  const struct manpaths *paths,
                 int argc, char *argv[],                  int argc, char *argv[],
                 const char *outkey,  
                 struct manpage **res, size_t *sz)                  struct manpage **res, size_t *sz)
 {  {
         int              fd, rc, c, indexbit;          int              fd, rc, c, indexbit;
Line 195  mansearch(const struct mansearch *search,
Line 194  mansearch(const struct mansearch *search,
                 goto out;                  goto out;
   
         outbit = 0;          outbit = 0;
         if (NULL != outkey) {          if (NULL != search->outkey) {
                 for (indexbit = 0, iterbit = 1;                  for (indexbit = 0, iterbit = 1;
                      indexbit < mansearch_keymax;                       indexbit < mansearch_keymax;
                      indexbit++, iterbit <<= 1) {                       indexbit++, iterbit <<= 1) {
                         if (0 == strcasecmp(outkey,                          if (0 == strcasecmp(search->outkey,
                             mansearch_keynames[indexbit])) {                              mansearch_keynames[indexbit])) {
                                 outbit = iterbit;                                  outbit = iterbit;
                                 break;                                  break;
Line 367  out:
Line 366  out:
         return(rc);          return(rc);
 }  }
   
   void
   mansearch_free(struct manpage *res, size_t sz)
   {
           size_t   i;
   
           for (i = 0; i < sz; i++) {
                   free(res[i].file);
                   free(res[i].names);
                   free(res[i].output);
           }
           free(res);
   }
   
 static int  static int
 manpage_compare(const void *vp1, const void *vp2)  manpage_compare(const void *vp1, const void *vp2)
 {  {
Line 739  exprterm(const struct mansearch *search, char *buf, in
Line 751  exprterm(const struct mansearch *search, char *buf, in
   
         e = mandoc_calloc(1, sizeof(struct expr));          e = mandoc_calloc(1, sizeof(struct expr));
   
         if (MANSEARCH_MAN & search->flags) {          if (search->argmode == ARG_NAME) {
                 e->bits = search->deftype;                  e->bits = TYPE_Nm;
                 e->substr = buf;                  e->substr = buf;
                 e->equal = 1;                  e->equal = 1;
                 return(e);                  return(e);
         }          }
   
         /*          /*
          * Look for an '=' or '~' operator,           * Separate macro keys from search string.
          * unless forced to some fixed macro keys.           * If needed, request regular expression handling
            * by setting e->substr to NULL.
          */           */
   
         if (MANSEARCH_WHATIS & search->flags)          if (search->argmode == ARG_WORD) {
                 val = NULL;                  e->bits = TYPE_Nm;
         else                  e->substr = NULL;
                 val = strpbrk(buf, "=~");                  mandoc_asprintf(&val, "[[:<:]]%s[[:>:]]", buf);
           } else if ((val = strpbrk(buf, "=~")) == NULL) {
         if (NULL == val) {                  e->bits = TYPE_Nm | TYPE_Nd;
                 e->bits = search->deftype;  
                 e->substr = buf;                  e->substr = buf;
   
         /*  
          * Found an operator.  
          * Regexp search is requested by !e->substr.  
          */  
   
         } else {          } else {
                 if (val == buf)                  if (val == buf)
                         e->bits = search->deftype;                          e->bits = TYPE_Nm | TYPE_Nd;
                 if ('=' == *val)                  if ('=' == *val)
                         e->substr = val + 1;                          e->substr = val + 1;
                 *val++ = '\0';                  *val++ = '\0';
Line 777  exprterm(const struct mansearch *search, char *buf, in
Line 783  exprterm(const struct mansearch *search, char *buf, in
   
         /* Compile regular expressions. */          /* Compile regular expressions. */
   
         if (MANSEARCH_WHATIS & search->flags) {  
                 e->substr = NULL;  
                 mandoc_asprintf(&val, "[[:<:]]%s[[:>:]]", buf);  
         }  
   
         if (NULL == e->substr) {          if (NULL == e->substr) {
                 irc = regcomp(&e->regexp, val,                  irc = regcomp(&e->regexp, val,
                     REG_EXTENDED | REG_NOSUB | (cs ? 0 : REG_ICASE));                      REG_EXTENDED | REG_NOSUB | (cs ? 0 : REG_ICASE));
                 if (MANSEARCH_WHATIS & search->flags)                  if (search->argmode == ARG_WORD)
                         free(val);                          free(val);
                 if (irc) {                  if (irc) {
                         regerror(irc, &e->regexp, errbuf, sizeof(errbuf));                          regerror(irc, &e->regexp, errbuf, sizeof(errbuf));

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

CVSweb