]> git.cameronkatri.com Git - mandoc.git/blobdiff - manpath.c
support more than one tag entry for the same search term;
[mandoc.git] / manpath.c
index 532bdb30a24b351364fb8efdc885d4e2d52718ea..008c593923793d454b2264209e4a181390431861 100644 (file)
--- a/manpath.c
+++ b/manpath.c
@@ -1,4 +1,4 @@
-/*     $Id: manpath.c,v 1.26 2015/06/10 19:26:13 schwarze Exp $        */
+/*     $Id: manpath.c,v 1.31 2016/07/19 22:40:33 schwarze Exp $        */
 /*
  * Copyright (c) 2011, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
  * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv>
@@ -21,6 +21,9 @@
 #include <sys/stat.h>
 
 #include <ctype.h>
+#if HAVE_ERR
+#include <err.h>
+#endif
 #include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -29,9 +32,7 @@
 #include "mandoc_aux.h"
 #include "manconf.h"
 
-#if !HAVE_MANPATH
 static void     manconf_file(struct manconf *, const char *);
-#endif
 static void     manpath_add(struct manpaths *, const char *, int);
 static void     manpath_parseline(struct manpaths *, char *, int);
 
@@ -40,52 +41,6 @@ void
 manconf_parse(struct manconf *conf, const char *file,
                char *defp, char *auxp)
 {
-#if HAVE_MANPATH
-       char             cmd[(PATH_MAX * 3) + 20];
-       FILE            *stream;
-       char            *buf;
-       size_t           sz, bsz;
-
-       strlcpy(cmd, "manpath", sizeof(cmd));
-       if (file) {
-               strlcat(cmd, " -C ", sizeof(cmd));
-               strlcat(cmd, file, sizeof(cmd));
-       }
-       if (auxp) {
-               strlcat(cmd, " -m ", sizeof(cmd));
-               strlcat(cmd, auxp, sizeof(cmd));
-       }
-       if (defp) {
-               strlcat(cmd, " -M ", sizeof(cmd));
-               strlcat(cmd, defp, sizeof(cmd));
-       }
-
-       /* Open manpath(1).  Ignore errors. */
-
-       stream = popen(cmd, "r");
-       if (NULL == stream)
-               return;
-
-       buf = NULL;
-       bsz = 0;
-
-       /* Read in as much output as we can. */
-
-       do {
-               buf = mandoc_realloc(buf, bsz + 1024);
-               sz = fread(buf + bsz, 1, 1024, stream);
-               bsz += sz;
-       } while (sz > 0);
-
-       if ( ! ferror(stream) && feof(stream) &&
-                       bsz && '\n' == buf[bsz - 1]) {
-               buf[bsz - 1] = '\0';
-               manpath_parseline(&conf->manpath, buf, 1);
-       }
-
-       free(buf);
-       pclose(stream);
-#else
        char            *insert;
 
        /* Always prepend -m. */
@@ -134,7 +89,6 @@ manconf_parse(struct manconf *conf, const char *file,
 
        /* MANPATH overrides man.conf(5) completely. */
        manpath_parseline(&conf->manpath, defp, 0);
-#endif
 }
 
 /*
@@ -165,10 +119,8 @@ manpath_add(struct manpaths *dirs, const char *dir, int complain)
        size_t           i;
 
        if (NULL == (cp = realpath(dir, buf))) {
-               if (complain) {
-                       fputs("manpath: ", stderr);
-                       perror(dir);
-               }
+               if (complain)
+                       warn("manpath: %s", dir);
                return;
        }
 
@@ -177,10 +129,8 @@ manpath_add(struct manpaths *dirs, const char *dir, int complain)
                        return;
 
        if (stat(cp, &sb) == -1) {
-               if (complain) {
-                       fputs("manpath: ", stderr);
-                       perror(dir);
-               }
+               if (complain)
+                       warn("manpath: %s", dir);
                return;
        }
 
@@ -205,7 +155,6 @@ manconf_free(struct manconf *conf)
        free(conf->output.style);
 }
 
-#if !HAVE_MANPATH
 static void
 manconf_file(struct manconf *conf, const char *file)
 {
@@ -213,28 +162,32 @@ manconf_file(struct manconf *conf, const char *file)
        char manpath_default[] = MANPATH_DEFAULT;
 
        FILE            *stream;
-       char            *cp, *ep;
-       size_t           len, tok;
+       char            *line, *cp, *ep;
+       size_t           linesz, tok, toklen;
+       ssize_t          linelen;
 
        if ((stream = fopen(file, "r")) == NULL)
                goto out;
 
-       while ((cp = fgetln(stream, &len)) != NULL) {
-               ep = cp + len;
-               if (ep[-1] != '\n')
-                       break;
-               *--ep = '\0';
+       line = NULL;
+       linesz = 0;
+
+       while ((linelen = getline(&line, &linesz, stream)) != -1) {
+               cp = line;
+               ep = cp + linelen - 1;
+               while (ep > cp && isspace((unsigned char)*ep))
+                       *ep-- = '\0';
                while (isspace((unsigned char)*cp))
                        cp++;
-               if (*cp == '#')
+               if (cp == ep || *cp == '#')
                        continue;
 
                for (tok = 0; tok < sizeof(toks)/sizeof(toks[0]); tok++) {
-                       len = strlen(toks[tok]);
-                       if (cp + len < ep &&
-                           isspace((unsigned char)cp[len]) &&
-                           !strncmp(cp, toks[tok], len)) {
-                               cp += len;
+                       toklen = strlen(toks[tok]);
+                       if (cp + toklen < ep &&
+                           isspace((unsigned char)cp[toklen]) &&
+                           strncmp(cp, toks[tok], toklen) == 0) {
+                               cp += toklen;
                                while (isspace((unsigned char)*cp))
                                        cp++;
                                break;
@@ -260,13 +213,13 @@ manconf_file(struct manconf *conf, const char *file)
                        break;
                }
        }
+       free(line);
        fclose(stream);
 
 out:
        if (*manpath_default != '\0')
                manpath_parseline(&conf->manpath, manpath_default, 0);
 }
-#endif
 
 void
 manconf_output(struct manoutput *conf, const char *cp)