diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2017-01-27 13:47:10 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2017-01-27 13:47:10 +0000 |
commit | f67234f1df04f274f9d9360bd62c6916d1f4878b (patch) | |
tree | b7e0c425e331fef992ff5480362aad3cc420ca71 /manpath.c | |
parent | 7efe93e3b86eedc728ca70b488cc2c8cef9d1790 (diff) | |
download | mandoc-f67234f1df04f274f9d9360bd62c6916d1f4878b.tar.gz |
warn about invalid output options
and error out if they occur on the command line;
missing feature found in the TODO file
Diffstat (limited to 'manpath.c')
-rw-r--r-- | manpath.c | 95 |
1 files changed, 67 insertions, 28 deletions
@@ -1,6 +1,6 @@ /* $Id$ */ /* - * Copyright (c) 2011, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org> + * Copyright (c) 2011, 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org> * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv> * * Permission to use, copy, modify, and distribute this software for any @@ -207,7 +207,7 @@ manconf_file(struct manconf *conf, const char *file) *manpath_default = '\0'; break; case 1: /* output */ - manconf_output(&conf->output, cp); + manconf_output(&conf->output, cp, 1); break; default: break; @@ -221,15 +221,17 @@ out: manpath_parseline(&conf->manpath, manpath_default, 0); } -void -manconf_output(struct manoutput *conf, const char *cp) +int +manconf_output(struct manoutput *conf, const char *cp, int fromfile) { const char *const toks[] = { "includes", "man", "paper", "style", "indent", "width", "fragment", "mdoc" }; - size_t len, tok; + const char *errstr; + char *oldval; + size_t len, tok; for (tok = 0; tok < sizeof(toks)/sizeof(toks[0]); tok++) { len = strlen(toks[tok]); @@ -244,41 +246,78 @@ manconf_output(struct manoutput *conf, const char *cp) } } - if (tok < 6 && *cp == '\0') - return; + if (tok < 6 && *cp == '\0') { + warnx("-O %s=?: Missing argument value", toks[tok]); + return -1; + } + if ((tok == 6 || tok == 7) && *cp != '\0') { + warnx("-O %s: Does not take a value: %s", toks[tok], cp); + return -1; + } switch (tok) { case 0: - if (conf->includes == NULL) - conf->includes = mandoc_strdup(cp); - break; + if (conf->includes != NULL) { + oldval = mandoc_strdup(conf->includes); + break; + } + conf->includes = mandoc_strdup(cp); + return 0; case 1: - if (conf->man == NULL) - conf->man = mandoc_strdup(cp); - break; + if (conf->man != NULL) { + oldval = mandoc_strdup(conf->man); + break; + } + conf->man = mandoc_strdup(cp); + return 0; case 2: - if (conf->paper == NULL) - conf->paper = mandoc_strdup(cp); - break; + if (conf->paper != NULL) { + oldval = mandoc_strdup(conf->paper); + break; + } + conf->paper = mandoc_strdup(cp); + return 0; case 3: - if (conf->style == NULL) - conf->style = mandoc_strdup(cp); - break; + if (conf->style != NULL) { + oldval = mandoc_strdup(conf->style); + break; + } + conf->style = mandoc_strdup(cp); + return 0; case 4: - if (conf->indent == 0) - conf->indent = strtonum(cp, 0, 1000, NULL); - break; + if (conf->indent) { + mandoc_asprintf(&oldval, "%zu", conf->indent); + break; + } + conf->indent = strtonum(cp, 0, 1000, &errstr); + if (errstr == NULL) + return 0; + warnx("-O indent=%s is %s", cp, errstr); + return -1; case 5: - if (conf->width == 0) - conf->width = strtonum(cp, 58, 1000, NULL); - break; + if (conf->width) { + mandoc_asprintf(&oldval, "%zu", conf->width); + break; + } + conf->width = strtonum(cp, 58, 1000, &errstr); + if (errstr == NULL) + return 0; + warnx("-O width=%s is %s", cp, errstr); + return -1; case 6: conf->fragment = 1; - break; + return 0; case 7: conf->mdoc = 1; - break; + return 0; default: - break; + if (fromfile) + warnx("-O %s: Bad argument", cp); + return -1; } + if (fromfile == 0) + warnx("-O %s=%s: Option already set to %s", + toks[tok], cp, oldval); + free(oldval); + return -1; } |