summaryrefslogtreecommitdiffstats
path: root/manpath.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2011-12-24 22:37:16 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2011-12-24 22:37:16 +0000
commita9b480b159576bf3235468875295d97ac101703c (patch)
treea187db4de4b63010295115c67a9183cb51023545 /manpath.c
parent870872aa8fa9489f2f3b7be0026776ee2a54dad0 (diff)
downloadmandoc-a9b480b159576bf3235468875295d97ac101703c.tar.gz
Support leading, trailing and double colons in MANPATH to prepend,
append or insert the man.conf(5) default path; compatible with GNU manpath(1), implementation by kristaps@, heavily tweaked by schwarze@. Updates to MANPATH documentation applied to whatis.1, apropos.1, and catman.8 also.
Diffstat (limited to 'manpath.c')
-rw-r--r--manpath.c51
1 files changed, 45 insertions, 6 deletions
diff --git a/manpath.c b/manpath.c
index 9c4d254c..561911cb 100644
--- a/manpath.c
+++ b/manpath.c
@@ -87,15 +87,54 @@ manpath_parse(struct manpaths *dirs, const char *file,
free(buf);
pclose(stream);
#else
- manpath_parseline(dirs, auxp);
+ char *insert;
- if (NULL == defp)
- defp = getenv("MANPATH");
+ /* Always prepend -m. */
+ manpath_parseline(dirs, auxp);
+
+ /* If -M is given, it overrides everything else. */
+ if (NULL != defp) {
+ manpath_parseline(dirs, defp);
+ return;
+ }
+
+ /* MANPATH and man.conf(5) cooperate. */
+ defp = getenv("MANPATH");
+ if (NULL == file)
+ file = MAN_CONF_FILE;
+
+ /* No MANPATH; use man.conf(5) only. */
+ if (NULL == defp || '\0' == defp[0]) {
+ manpath_manconf(dirs, file);
+ return;
+ }
+
+ /* Prepend man.conf(5) to MANPATH. */
+ if (':' == defp[0]) {
+ manpath_manconf(dirs, file);
+ manpath_parseline(dirs, defp);
+ return;
+ }
- if (NULL == defp)
- manpath_manconf(dirs, file ? file : MAN_CONF_FILE);
- else
+ /* Append man.conf(5) to MANPATH. */
+ if (':' == defp[(int)strlen(defp) - 1]) {
manpath_parseline(dirs, defp);
+ manpath_manconf(dirs, file);
+ return;
+ }
+
+ /* Insert man.conf(5) into MANPATH. */
+ insert = strstr(defp, "::");
+ if (NULL != insert) {
+ *insert++ = '\0';
+ manpath_parseline(dirs, defp);
+ manpath_manconf(dirs, file);
+ manpath_parseline(dirs, insert + 1);
+ return;
+ }
+
+ /* MANPATH overrides man.conf(5) completely. */
+ manpath_parseline(dirs, defp);
#endif
}