diff options
author | Ingo Schwarze <schwarze@cvs.openbsd.org> | 2017-01-27 13:47:18 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@cvs.openbsd.org> | 2017-01-27 13:47:18 +0000 |
commit | 4c35bf5d5033c8d11fab77d1ce3aaa786780fc5c (patch) | |
tree | 4ce731203b8f74eda84b9edda83de82f323ee871 | |
parent | 6c9f8f909905d522a518fd4515101e7bad6a8404 (diff) |
warn about invalid output options
and error out if they occur on the command line;
missing feature found in the TODO file
-rw-r--r-- | usr.bin/mandoc/main.c | 14 | ||||
-rw-r--r-- | usr.bin/mandoc/manconf.h | 4 | ||||
-rw-r--r-- | usr.bin/mandoc/manpath.c | 97 |
3 files changed, 80 insertions, 35 deletions
diff --git a/usr.bin/mandoc/main.c b/usr.bin/mandoc/main.c index a5eacd713e9..b0a3a6d756a 100644 --- a/usr.bin/mandoc/main.c +++ b/usr.bin/mandoc/main.c @@ -1,4 +1,4 @@ -/* $OpenBSD: main.c,v 1.182 2017/01/09 17:49:55 schwarze Exp $ */ +/* $OpenBSD: main.c,v 1.183 2017/01/27 13:47:17 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2010-2012, 2014-2017 Ingo Schwarze <schwarze@openbsd.org> @@ -117,6 +117,7 @@ main(int argc, char *argv[]) struct manpage *res, *resp; char *conf_file, *defpaths; const char *sec; + const char *thisarg; size_t i, sz; int prio, best_prio; enum outmode outmode; @@ -223,9 +224,14 @@ main(int argc, char *argv[]) break; case 'O': search.outkey = optarg; - while (optarg != NULL) - manconf_output(&conf.output, - strsep(&optarg, ",")); + while (optarg != NULL) { + thisarg = optarg; + if (manconf_output(&conf.output, + strsep(&optarg, ","), 0) == 0) + continue; + warnx("-O %s: Bad argument", thisarg); + return (int)MANDOCLEVEL_BADARG; + } break; case 'S': search.arch = optarg; diff --git a/usr.bin/mandoc/manconf.h b/usr.bin/mandoc/manconf.h index 8cdb071a691..64f04b3b55d 100644 --- a/usr.bin/mandoc/manconf.h +++ b/usr.bin/mandoc/manconf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: manconf.h,v 1.2 2015/11/07 13:57:55 schwarze Exp $ */ +/* $OpenBSD: manconf.h,v 1.3 2017/01/27 13:47:17 schwarze Exp $ */ /* * Copyright (c) 2011, 2015 Ingo Schwarze <schwarze@openbsd.org> * Copyright (c) 2011 Kristaps Dzonsons <kristaps@bsd.lv> @@ -44,5 +44,5 @@ struct manconf { void manconf_parse(struct manconf *, const char *, char *, char *); -void manconf_output(struct manoutput *, const char *); +int manconf_output(struct manoutput *, const char *, int); void manconf_free(struct manconf *); diff --git a/usr.bin/mandoc/manpath.c b/usr.bin/mandoc/manpath.c index 908bdd06b49..718f8d945b9 100644 --- a/usr.bin/mandoc/manpath.c +++ b/usr.bin/mandoc/manpath.c @@ -1,6 +1,6 @@ -/* $OpenBSD: manpath.c,v 1.18 2016/05/23 18:59:00 millert Exp $ */ +/* $OpenBSD: manpath.c,v 1.19 2017/01/27 13:47:17 schwarze Exp $ */ /* - * 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 @@ -206,7 +206,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; @@ -220,15 +220,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]); @@ -243,41 +245,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; } |