]> git.cameronkatri.com Git - mandoc.git/blobdiff - mansearch.c
Clarify that .Ta as a line macro is a portability problem,
[mandoc.git] / mansearch.c
index 30e7768b48bcdc4f12e445adad2e76c492e6887c..26a7c23f589c9bc0a0ce5e5793302086c0faa0fb 100644 (file)
@@ -1,7 +1,7 @@
 /*     $OpenBSD: mansearch.c,v 1.50 2016/07/09 15:23:36 schwarze Exp $ */
 /*
  * Copyright (c) 2012 Kristaps Dzonsons <kristaps@bsd.lv>
 /*     $OpenBSD: mansearch.c,v 1.50 2016/07/09 15:23:36 schwarze Exp $ */
 /*
  * 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
  * purpose with or without fee is hereby granted, provided that the above
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -21,7 +21,9 @@
 #include <sys/types.h>
 
 #include <assert.h>
 #include <sys/types.h>
 
 #include <assert.h>
+#if HAVE_ERR
 #include <err.h>
 #include <err.h>
+#endif
 #include <errno.h>
 #include <fcntl.h>
 #include <glob.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <glob.h>
@@ -65,9 +67,9 @@ static        struct ohash    *manmerge_term(struct expr *, struct ohash *);
 static struct ohash    *manmerge_or(struct expr *, struct ohash *);
 static struct ohash    *manmerge_and(struct expr *, struct ohash *);
 static char            *buildnames(const struct dbm_page *);
 static struct ohash    *manmerge_or(struct expr *, struct ohash *);
 static struct ohash    *manmerge_and(struct expr *, struct ohash *);
 static char            *buildnames(const struct dbm_page *);
-static char            *buildoutput(size_t, int32_t);
-static size_t           lstlen(const char *);
-static void             lstcat(char *, size_t *, const char *);
+static char            *buildoutput(size_t, struct dbm_page *);
+static size_t           lstlen(const char *, size_t);
+static void             lstcat(char *, size_t *, const char *, const char *);
 static int              lstmatch(const char *, const char *);
 static struct expr     *exprcomp(const struct mansearch *,
                                int, char *[], int *);
 static int              lstmatch(const char *, const char *);
 static struct expr     *exprcomp(const struct mansearch *,
                                int, char *[], int *);
@@ -153,7 +155,8 @@ mansearch(const struct mansearch *search,
                chdir_status = 1;
 
                if (dbm_open(MANDOC_DB) == -1) {
                chdir_status = 1;
 
                if (dbm_open(MANDOC_DB) == -1) {
-                       warn("%s/%s", paths->paths[i], MANDOC_DB);
+                       if (errno != ENOENT)
+                               warn("%s/%s", paths->paths[i], MANDOC_DB);
                        continue;
                }
 
                        continue;
                }
 
@@ -179,9 +182,7 @@ mansearch(const struct mansearch *search,
                        mandoc_asprintf(&mpage->file, "%s/%s",
                            paths->paths[i], page->file + 1);
                        mpage->names = buildnames(page);
                        mandoc_asprintf(&mpage->file, "%s/%s",
                            paths->paths[i], page->file + 1);
                        mpage->names = buildnames(page);
-                       mpage->output = (int)outkey == KEY_Nd ?
-                           mandoc_strdup(page->desc) :
-                           buildoutput(outkey, page->addr);
+                       mpage->output = buildoutput(outkey, page);
                        mpage->ipath = i;
                        mpage->bits = rp->bits;
                        mpage->sec = *page->sect - '0';
                        mpage->ipath = i;
                        mpage->bits = rp->bits;
                        mpage->sec = *page->sect - '0';
@@ -402,16 +403,16 @@ buildnames(const struct dbm_page *page)
        char    *buf;
        size_t   i, sz;
 
        char    *buf;
        size_t   i, sz;
 
-       sz = lstlen(page->name) + 1 + lstlen(page->sect) +
-           (page->arch == NULL ? 0 : 1 + lstlen(page->arch)) + 2;
+       sz = lstlen(page->name, 2) + 1 + lstlen(page->sect, 2) +
+           (page->arch == NULL ? 0 : 1 + lstlen(page->arch, 2)) + 2;
        buf = mandoc_malloc(sz);
        i = 0;
        buf = mandoc_malloc(sz);
        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) {
                buf[i++] = '/';
        if (page->arch != NULL) {
                buf[i++] = '/';
-               lstcat(buf, &i, page->arch);
+               lstcat(buf, &i, page->arch, ", ");
        }
        buf[i++] = ')';
        buf[i++] = '\0';
        }
        buf[i++] = ')';
        buf[i++] = '\0';
@@ -421,11 +422,11 @@ 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.
  */
 static size_t
  * characters between strings.
  */
 static size_t
-lstlen(const char *cp)
+lstlen(const char *cp, size_t sep)
 {
        size_t   sz;
 
 {
        size_t   sz;
 
@@ -433,7 +434,7 @@ lstlen(const char *cp)
                if (cp[0] == '\0') {
                        if (cp[1] == '\0')
                                break;
                if (cp[0] == '\0') {
                        if (cp[1] == '\0')
                                break;
-                       sz++;
+                       sz += sep - 1;
                } else if (cp[0] < ' ')
                        sz--;
                cp++;
                } else if (cp[0] < ' ')
                        sz--;
                cp++;
@@ -443,17 +444,20 @@ 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 (;;) {
                if (cp[0] == '\0') {
                        if (cp[1] == '\0')
                                break;
        for (;;) {
                if (cp[0] == '\0') {
                        if (cp[1] == '\0')
                                break;
-                       buf[(*i)++] = ',';
-                       buf[(*i)++] = ' ';
+                       s = sep;
+                       while (*s != '\0')
+                               buf[(*i)++] = *s++;
                } else if (cp[0] >= ' ')
                        buf[(*i)++] = cp[0];
                cp++;
                } else if (cp[0] >= ' ')
                        buf[(*i)++] = cp[0];
                cp++;
@@ -480,17 +484,46 @@ lstmatch(const char *want, const char *have)
 }
 
 /*
 }
 
 /*
- * Build a list of values taken by the macro im
- * in the manual page with big-endian address addr.
+ * Build a list of values taken by the macro im in the manual page.
  */
 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, " # ");
+               output[i++] = '\0';
+               assert(i == sz);
+               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) {
                if (output == NULL) {
                        oldoutput = "";
        while ((value = dbm_macro_next()) != NULL) {
                if (output == NULL) {
                        oldoutput = "";
@@ -640,6 +673,12 @@ exprterm(const struct mansearch *search, int argc, char *argv[], int *argi)
                return e;
        }
 
                return e;
        }
 
+       if (strcmp("-i", argv[*argi]) == 0 && *argi + 1 < argc) {
+               cs = 0;
+               ++*argi;
+       } else
+               cs = 1;
+
        e = mandoc_calloc(1, sizeof(*e));
        e->type = EXPR_TERM;
        e->bits = 0;
        e = mandoc_calloc(1, sizeof(*e));
        e->type = EXPR_TERM;
        e->bits = 0;