version 1.43, 2020/08/27 14:59:47 |
version 1.44, 2021/11/05 18:03:08 |
|
|
#include "mandoc.h" |
#include "mandoc.h" |
#include "manconf.h" |
#include "manconf.h" |
|
|
static void manconf_file(struct manconf *, const char *); |
static void manconf_file(struct manconf *, const char *, int); |
static void manpath_add(struct manpaths *, const char *, char); |
static void manpath_add(struct manpaths *, const char *, char); |
static void manpath_parseline(struct manpaths *, char *, char); |
static void manpath_parseline(struct manpaths *, char *, char); |
|
|
|
|
void |
void |
manconf_parse(struct manconf *conf, const char *file, |
manconf_parse(struct manconf *conf, const char *file, char *pend, char *pbeg) |
char *defp, char *auxp) |
|
{ |
{ |
char *insert; |
int use_path_from_file = 1; |
|
|
/* Always prepend -m. */ |
/* Always prepend -m. */ |
manpath_parseline(&conf->manpath, auxp, 'm'); |
manpath_parseline(&conf->manpath, pbeg, 'm'); |
|
|
/* If -M is given, it overrides everything else. */ |
if (pend != NULL && *pend != '\0') { |
if (NULL != defp) { |
/* If -M is given, it overrides everything else. */ |
manpath_parseline(&conf->manpath, defp, 'M'); |
manpath_parseline(&conf->manpath, pend, 'M'); |
return; |
use_path_from_file = 0; |
|
pbeg = pend = NULL; |
|
} else if ((pbeg = getenv("MANPATH")) == NULL || *pbeg == '\0') { |
|
/* No MANPATH; use man.conf(5) only. */ |
|
pbeg = pend = NULL; |
|
} else if (*pbeg == ':') { |
|
/* Prepend man.conf(5) to MANPATH. */ |
|
pend = pbeg + 1; |
|
pbeg = NULL; |
|
} else if ((pend = strstr(pbeg, "::")) != NULL) { |
|
/* Insert man.conf(5) into MANPATH. */ |
|
*pend = '\0'; |
|
pend += 2; |
|
} else if (pbeg[strlen(pbeg) - 1] == ':') { |
|
/* Append man.conf(5) to MANPATH. */ |
|
pend = NULL; |
|
} else { |
|
/* MANPATH overrides man.conf(5) completely. */ |
|
use_path_from_file = 0; |
|
pend = NULL; |
} |
} |
|
|
/* MANPATH and man.conf(5) cooperate. */ |
manpath_parseline(&conf->manpath, pbeg, '\0'); |
defp = getenv("MANPATH"); |
|
if (NULL == file) |
if (file == NULL) |
file = MAN_CONF_FILE; |
file = MAN_CONF_FILE; |
|
manconf_file(conf, file, use_path_from_file); |
|
|
/* No MANPATH; use man.conf(5) only. */ |
manpath_parseline(&conf->manpath, pend, '\0'); |
if (NULL == defp || '\0' == defp[0]) { |
|
manconf_file(conf, file); |
|
return; |
|
} |
|
|
|
/* Prepend man.conf(5) to MANPATH. */ |
|
if (':' == defp[0]) { |
|
manconf_file(conf, file); |
|
manpath_parseline(&conf->manpath, defp, '\0'); |
|
return; |
|
} |
|
|
|
/* Append man.conf(5) to MANPATH. */ |
|
if (':' == defp[strlen(defp) - 1]) { |
|
manpath_parseline(&conf->manpath, defp, '\0'); |
|
manconf_file(conf, file); |
|
return; |
|
} |
|
|
|
/* Insert man.conf(5) into MANPATH. */ |
|
insert = strstr(defp, "::"); |
|
if (NULL != insert) { |
|
*insert++ = '\0'; |
|
manpath_parseline(&conf->manpath, defp, '\0'); |
|
manconf_file(conf, file); |
|
manpath_parseline(&conf->manpath, insert + 1, '\0'); |
|
return; |
|
} |
|
|
|
/* MANPATH overrides man.conf(5) completely. */ |
|
manpath_parseline(&conf->manpath, defp, '\0'); |
|
} |
} |
|
|
void |
void |
Line 161 manconf_free(struct manconf *conf) |
|
Line 149 manconf_free(struct manconf *conf) |
|
} |
} |
|
|
static void |
static void |
manconf_file(struct manconf *conf, const char *file) |
manconf_file(struct manconf *conf, const char *file, int use_path_from_file) |
{ |
{ |
const char *const toks[] = { "manpath", "output" }; |
const char *const toks[] = { "manpath", "output" }; |
char manpath_default[] = MANPATH_DEFAULT; |
char manpath_default[] = MANPATH_DEFAULT; |
Line 201 manconf_file(struct manconf *conf, const char *file) |
|
Line 189 manconf_file(struct manconf *conf, const char *file) |
|
|
|
switch (tok) { |
switch (tok) { |
case 0: /* manpath */ |
case 0: /* manpath */ |
manpath_add(&conf->manpath, cp, '\0'); |
if (use_path_from_file) |
|
manpath_add(&conf->manpath, cp, '\0'); |
*manpath_default = '\0'; |
*manpath_default = '\0'; |
break; |
break; |
case 1: /* output */ |
case 1: /* output */ |
Line 215 manconf_file(struct manconf *conf, const char *file) |
|
Line 204 manconf_file(struct manconf *conf, const char *file) |
|
fclose(stream); |
fclose(stream); |
|
|
out: |
out: |
if (*manpath_default != '\0') |
if (use_path_from_file && *manpath_default != '\0') |
manpath_parseline(&conf->manpath, manpath_default, '\0'); |
manpath_parseline(&conf->manpath, manpath_default, '\0'); |
} |
} |
|
|