[prev in list] [next in list] [prev in thread] [next in thread] 

List:       mandoc-source
Subject:    mdocml: warn about invalid output options  and error out if they occur
From:       schwarze () mdocml ! bsd ! lv
Date:       2017-01-27 13:47:40
Message-ID: 14573728262167318010.enqueue () fantadrom ! bsd ! lv
[Download RAW message or body]

Log Message:
-----------
warn about invalid output options 
and error out if they occur on the command line;
missing feature found in the TODO file

Modified Files:
--------------
    mdocml:
        TODO
        main.c
        manconf.h
        manpath.c

Revision Data
-------------
Index: manpath.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/manpath.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -Lmanpath.c -Lmanpath.c -u -p -r1.31 -r1.32
--- manpath.c
+++ 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
 			*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, c
 		}
 	}
 
-	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;
 }
Index: manconf.h
===================================================================
RCS file: /home/cvs/mdocml/mdocml/manconf.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -Lmanconf.h -Lmanconf.h -u -p -r1.2 -r1.3
--- manconf.h
+++ 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 *);
Index: main.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/main.c,v
retrieving revision 1.279
retrieving revision 1.280
diff -Lmain.c -Lmain.c -u -p -r1.279 -r1.280
--- main.c
+++ 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;
Index: TODO
===================================================================
RCS file: /home/cvs/mdocml/mdocml/TODO,v
retrieving revision 1.227
retrieving revision 1.228
diff -LTODO -LTODO -u -p -r1.227 -r1.228
--- TODO
+++ 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
@@ -517,9 +513,6 @@ are mere guesses, and some may be wrong.
   probably cannot be on by default in -Tlint because it needs
   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
--
 To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic