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

Diff for /mandoc/mansearch.c between version 1.69 and 1.70

version 1.69, 2017/03/03 13:11:21 version 1.70, 2017/04/17 20:05:08
Line 1 
Line 1 
 /*      $OpenBSD$ */  /*      $OpenBSD$ */
 /*  /*
  * Copyright (c) 2012 Kristaps Dzonsons <kristaps@bsd.lv>   * Copyright (c) 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2013, 2014, 2015, 2016 Ingo Schwarze <schwarze@openbsd.org>   * Copyright (c) 2013-2017 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 67  static struct ohash *manmerge_term(struct expr *, stru
Line 67  static struct ohash *manmerge_term(struct expr *, stru
 static  struct ohash    *manmerge_or(struct expr *, struct ohash *);  static  struct ohash    *manmerge_or(struct expr *, struct ohash *);
 static  struct ohash    *manmerge_and(struct expr *, struct ohash *);  static  struct ohash    *manmerge_and(struct expr *, struct ohash *);
 static  char            *buildnames(const struct dbm_page *);  static  char            *buildnames(const struct dbm_page *);
 static  char            *buildoutput(size_t, int32_t);  static  char            *buildoutput(size_t, struct dbm_page *);
 static  size_t           lstlen(const char *);  static  size_t           lstlen(const char *, size_t);
 static  void             lstcat(char *, size_t *, const char *);  static  void             lstcat(char *, size_t *, const char *, const char *);
 static  int              lstmatch(const char *, const char *);  static  int              lstmatch(const char *, const char *);
 static  struct expr     *exprcomp(const struct mansearch *,  static  struct expr     *exprcomp(const struct mansearch *,
                                 int, char *[], int *);                                  int, char *[], int *);
Line 181  mansearch(const struct mansearch *search,
Line 181  mansearch(const struct mansearch *search,
                         mandoc_asprintf(&mpage->file, "%s/%s",                          mandoc_asprintf(&mpage->file, "%s/%s",
                             paths->paths[i], page->file + 1);                              paths->paths[i], page->file + 1);
                         mpage->names = buildnames(page);                          mpage->names = buildnames(page);
                         mpage->output = (int)outkey == KEY_Nd ?                          mpage->output = buildoutput(outkey, page);
                             mandoc_strdup(page->desc) :  
                             buildoutput(outkey, page->addr);  
                         mpage->ipath = i;                          mpage->ipath = i;
                         mpage->bits = rp->bits;                          mpage->bits = rp->bits;
                         mpage->sec = *page->sect - '0';                          mpage->sec = *page->sect - '0';
Line 404  buildnames(const struct dbm_page *page)
Line 402  buildnames(const struct dbm_page *page)
         char    *buf;          char    *buf;
         size_t   i, sz;          size_t   i, sz;
   
         sz = lstlen(page->name) + 1 + lstlen(page->sect) +          sz = lstlen(page->name, 2) + 1 + lstlen(page->sect, 2) +
             (page->arch == NULL ? 0 : 1 + lstlen(page->arch)) + 2;              (page->arch == NULL ? 0 : 1 + lstlen(page->arch, 2)) + 2;
         buf = mandoc_malloc(sz);          buf = mandoc_malloc(sz);
         i = 0;          i = 0;
         lstcat(buf, &i, page->name);          lstcat(buf, &i, page->name, ", ");
         buf[i++] = '(';          buf[i++] = '(';
         lstcat(buf, &i, page->sect);          lstcat(buf, &i, page->sect, ", ");
         if (page->arch != NULL) {          if (page->arch != NULL) {
                 buf[i++] = '/';                  buf[i++] = '/';
                 lstcat(buf, &i, page->arch);                  lstcat(buf, &i, page->arch, ", ");
         }          }
         buf[i++] = ')';          buf[i++] = ')';
         buf[i++] = '\0';          buf[i++] = '\0';
Line 423  buildnames(const struct dbm_page *page)
Line 421  buildnames(const struct dbm_page *page)
   
 /*  /*
  * Count the buffer space needed to print the NUL-terminated   * Count the buffer space needed to print the NUL-terminated
  * list of NUL-terminated strings, when printing two separator   * list of NUL-terminated strings, when printing sep separator
  * characters between strings.   * characters between strings.
  */   */
 static size_t  static size_t
 lstlen(const char *cp)  lstlen(const char *cp, size_t sep)
 {  {
         size_t   sz;          size_t   sz;
   
Line 435  lstlen(const char *cp)
Line 433  lstlen(const char *cp)
                 if (cp[0] == '\0') {                  if (cp[0] == '\0') {
                         if (cp[1] == '\0')                          if (cp[1] == '\0')
                                 break;                                  break;
                         sz++;                          sz += sep - 1;
                 } else if (cp[0] < ' ')                  } else if (cp[0] < ' ')
                         sz--;                          sz--;
                 cp++;                  cp++;
Line 445  lstlen(const char *cp)
Line 443  lstlen(const char *cp)
   
 /*  /*
  * Print the NUL-terminated list of NUL-terminated strings   * Print the NUL-terminated list of NUL-terminated strings
  * into the buffer, seperating strings with a comma and a blank.   * into the buffer, seperating strings with sep.
  */   */
 static void  static void
 lstcat(char *buf, size_t *i, const char *cp)  lstcat(char *buf, size_t *i, const char *cp, const char *sep)
 {  {
           const char *s;
   
         for (;;) {          for (;;) {
                 if (cp[0] == '\0') {                  if (cp[0] == '\0') {
                         if (cp[1] == '\0')                          if (cp[1] == '\0')
                                 break;                                  break;
                         buf[(*i)++] = ',';                          s = sep;
                         buf[(*i)++] = ' ';                          while (*s != '\0')
                                   buf[(*i)++] = *s++;
                 } else if (cp[0] >= ' ')                  } else if (cp[0] >= ' ')
                         buf[(*i)++] = cp[0];                          buf[(*i)++] = cp[0];
                 cp++;                  cp++;
Line 482  lstmatch(const char *want, const char *have)
Line 483  lstmatch(const char *want, const char *have)
 }  }
   
 /*  /*
  * Build a list of values taken by the macro im   * Build a list of values taken by the macro im in the manual page.
  * in the manual page with big-endian address addr.  
  */   */
 static char *  static char *
 buildoutput(size_t im, int32_t addr)  buildoutput(size_t im, struct dbm_page *page)
 {  {
         const char      *oldoutput, *sep;          const char      *oldoutput, *sep, *input;
         char            *output, *newoutput, *value;          char            *output, *newoutput, *value;
           size_t           sz, i;
   
           switch (im) {
           case KEY_Nd:
                   return mandoc_strdup(page->desc);
           case KEY_Nm:
                   input = page->name;
                   break;
           case KEY_sec:
                   input = page->sect;
                   break;
           case KEY_arch:
                   input = page->arch;
                   if (input == NULL)
                           input = "all\0";
                   break;
           default:
                   input = NULL;
                   break;
           }
   
           if (input != NULL) {
                   sz = lstlen(input, 3) + 1;
                   output = mandoc_malloc(sz);
                   i = 0;
                   lstcat(output, &i, input, " # ");
                   return output;
           }
   
         output = NULL;          output = NULL;
         dbm_macro_bypage(im - 2, addr);          dbm_macro_bypage(im - 2, page->addr);
         while ((value = dbm_macro_next()) != NULL) {          while ((value = dbm_macro_next()) != NULL) {
                 if (output == NULL) {                  if (output == NULL) {
                         oldoutput = "";                          oldoutput = "";

Legend:
Removed from v.1.69  
changed lines
  Added in v.1.70

CVSweb