diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2011-12-24 22:37:16 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2011-12-24 22:37:16 +0000 |
commit | a9b480b159576bf3235468875295d97ac101703c (patch) | |
tree | a187db4de4b63010295115c67a9183cb51023545 /manpath.c | |
parent | 870872aa8fa9489f2f3b7be0026776ee2a54dad0 (diff) | |
download | mandoc-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.c | 51 |
1 files changed, 45 insertions, 6 deletions
@@ -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 } |