summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2017-01-27 13:47:10 +0000
committerIngo Schwarze <schwarze@openbsd.org>2017-01-27 13:47:10 +0000
commitf67234f1df04f274f9d9360bd62c6916d1f4878b (patch)
treeb7e0c425e331fef992ff5480362aad3cc420ca71
parent7efe93e3b86eedc728ca70b488cc2c8cef9d1790 (diff)
downloadmandoc-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
-rw-r--r--TODO7
-rw-r--r--main.c12
-rw-r--r--manconf.h2
-rw-r--r--manpath.c95
4 files changed, 77 insertions, 39 deletions
diff --git a/TODO b/TODO
index 45b4fe14..fd718ee1 100644
--- a/TODO
+++ b/TODO
@@ -259,10 +259,6 @@ are mere guesses, and some may be wrong.
even for apropos title line output; req by bapt@
loc * exist * algo * size * imp ***
-- Does makewhatis(8) detect missing NAME sections, missing names,
- and missing descriptions in all the file formats?
- loc * exist * algo * size * imp ***
-
- clean up escape sequence handling, creating three classes:
(1) fully implemented, or parsed and ignored without loss of content
(2) unimplemented, potentially causing loss of content
@@ -518,9 +514,6 @@ are mere guesses, and some may be wrong.
to access the manpath and mandoc.db(3) after parsing.
asked for by jmc@ Fri, 4 Dec 2015 22:39:40 +0000
-- Report errors in -O suboption parsing.
- loc * exist * algo * size * imp **
-
- warn when .Sh or .Ss contain other macros
Steffen Nurpmeso, savannah.gnu.org/bugs/index.php?45034
loc * exist * algo * size * imp **
diff --git a/main.c b/main.c
index 84533fcd..5382d0b2 100644
--- a/main.c
+++ b/main.c
@@ -123,6 +123,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;
@@ -247,9 +248,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/manconf.h b/manconf.h
index 782269e7..80578f6a 100644
--- a/manconf.h
+++ b/manconf.h
@@ -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/manpath.c b/manpath.c
index 40f7c7f9..ba50500d 100644
--- a/manpath.c
+++ b/manpath.c
@@ -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;
}