version 1.40, 2019/07/10 19:39:01 |
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", "_whatdb" }; |
const char *const toks[] = { "manpath", "output" }; |
char manpath_default[] = MANPATH_DEFAULT; |
char manpath_default[] = MANPATH_DEFAULT; |
|
|
FILE *stream; |
FILE *stream; |
Line 200 manconf_file(struct manconf *conf, const char *file) |
|
Line 188 manconf_file(struct manconf *conf, const char *file) |
|
} |
} |
|
|
switch (tok) { |
switch (tok) { |
case 2: /* _whatdb */ |
|
while (ep > cp && ep[-1] != '/') |
|
ep--; |
|
if (ep == cp) |
|
continue; |
|
*ep = '\0'; |
|
/* FALLTHROUGH */ |
|
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 222 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'); |
} |
} |
|
|
|
|
manconf_output(struct manoutput *conf, const char *cp, int fromfile) |
manconf_output(struct manoutput *conf, const char *cp, int fromfile) |
{ |
{ |
const char *const toks[] = { |
const char *const toks[] = { |
|
/* Tokens requiring an argument. */ |
"includes", "man", "paper", "style", "indent", "width", |
"includes", "man", "paper", "style", "indent", "width", |
"tag", "fragment", "mdoc", "noval", "toc" |
"outfilename", "tagfilename", |
|
/* Token taking an optional argument. */ |
|
"tag", |
|
/* Tokens not taking arguments. */ |
|
"fragment", "mdoc", "noval", "toc" |
}; |
}; |
const size_t ntoks = sizeof(toks) / sizeof(toks[0]); |
const size_t ntoks = sizeof(toks) / sizeof(toks[0]); |
|
|
Line 252 manconf_output(struct manoutput *conf, const char *cp, |
|
Line 239 manconf_output(struct manoutput *conf, const char *cp, |
|
} |
} |
} |
} |
|
|
if (tok < 6 && *cp == '\0') { |
if (tok < 8 && *cp == '\0') { |
mandoc_msg(MANDOCERR_BADVAL_MISS, 0, 0, "-O %s=?", toks[tok]); |
mandoc_msg(MANDOCERR_BADVAL_MISS, 0, 0, "-O %s=?", toks[tok]); |
return -1; |
return -1; |
} |
} |
if (tok > 6 && tok < ntoks && *cp != '\0') { |
if (tok > 8 && tok < ntoks && *cp != '\0') { |
mandoc_msg(MANDOCERR_BADVAL, 0, 0, "-O %s=%s", toks[tok], cp); |
mandoc_msg(MANDOCERR_BADVAL, 0, 0, "-O %s=%s", toks[tok], cp); |
return -1; |
return -1; |
} |
} |
Line 313 manconf_output(struct manoutput *conf, const char *cp, |
|
Line 300 manconf_output(struct manoutput *conf, const char *cp, |
|
"-O width=%s is %s", cp, errstr); |
"-O width=%s is %s", cp, errstr); |
return -1; |
return -1; |
case 6: |
case 6: |
|
if (conf->outfilename != NULL) { |
|
oldval = mandoc_strdup(conf->outfilename); |
|
break; |
|
} |
|
conf->outfilename = mandoc_strdup(cp); |
|
return 0; |
|
case 7: |
|
if (conf->tagfilename != NULL) { |
|
oldval = mandoc_strdup(conf->tagfilename); |
|
break; |
|
} |
|
conf->tagfilename = mandoc_strdup(cp); |
|
return 0; |
|
/* |
|
* If the index of the following token changes, |
|
* do not forget to adjust the range check above the switch. |
|
*/ |
|
case 8: |
if (conf->tag != NULL) { |
if (conf->tag != NULL) { |
oldval = mandoc_strdup(conf->tag); |
oldval = mandoc_strdup(conf->tag); |
break; |
break; |
} |
} |
conf->tag = mandoc_strdup(cp); |
conf->tag = mandoc_strdup(cp); |
return 0; |
return 0; |
case 7: |
case 9: |
conf->fragment = 1; |
conf->fragment = 1; |
return 0; |
return 0; |
case 8: |
case 10: |
conf->mdoc = 1; |
conf->mdoc = 1; |
return 0; |
return 0; |
case 9: |
case 11: |
conf->noval = 1; |
conf->noval = 1; |
return 0; |
return 0; |
case 10: |
case 12: |
conf->toc = 1; |
conf->toc = 1; |
return 0; |
return 0; |
default: |
default: |