source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: Cleanup regarding -offset and -width: * Bugfix: Last one wins,
@ 2014-07-05  1:12 schwarze
  0 siblings, 0 replies; only message in thread
From: schwarze @ 2014-07-05  1:12 UTC (permalink / raw)
  To: source

Log Message:
-----------
Cleanup regarding -offset and -width:
* Bugfix: Last one wins, not first one.
* Fix .Bl -width without argument: it means 0n, so do not ignore it.
* Report macro names, argument names and fallbacks in related messages.
* Simplify: Garbage collect auxiliary variables in pre_bd() and pre_bl().

Modified Files:
--------------
    mdocml:
        mandoc.h
        mdoc_validate.c
        read.c

Revision Data
-------------
Index: mdoc_validate.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_validate.c,v
retrieving revision 1.226
retrieving revision 1.227
diff -Lmdoc_validate.c -Lmdoc_validate.c -u -p -r1.226 -r1.227
--- mdoc_validate.c
+++ mdoc_validate.c
@@ -594,10 +594,10 @@ pre_display(PRE_ARGS)
 static int
 pre_bl(PRE_ARGS)
 {
-	int		  i, comp, dup;
-	const char	 *offs, *width;
-	enum mdoc_list	  lt;
 	struct mdoc_node *np;
+	struct mdoc_argv *argv;
+	int		  i;
+	enum mdoc_list	  lt;
 
 	if (MDOC_BLOCK != n->type) {
 		if (ENDBODY_NOT != n->end) {
@@ -619,10 +619,9 @@ pre_bl(PRE_ARGS)
 	 */
 
 	for (i = 0; n->args && i < (int)n->args->argc; i++) {
+		argv = n->args->argv + i;
 		lt = LIST__NONE;
-		dup = comp = 0;
-		width = offs = NULL;
-		switch (n->args->argv[i].arg) {
+		switch (argv->arg) {
 		/* Set list types. */
 		case MDOC_Bullet:
 			lt = LIST_bullet;
@@ -659,43 +658,45 @@ pre_bl(PRE_ARGS)
 			break;
 		/* Set list arguments. */
 		case MDOC_Compact:
-			dup = n->norm->Bl.comp;
-			comp = 1;
+			if (n->norm->Bl.comp)
+				mandoc_msg(MANDOCERR_ARG_REP,
+				    mdoc->parse, argv->line,
+				    argv->pos, "Bl -compact");
+			n->norm->Bl.comp = 1;
 			break;
 		case MDOC_Width:
-			/* NB: this can be empty! */
-			if (n->args->argv[i].sz) {
-				width = n->args->argv[i].value[0];
-				dup = (NULL != n->norm->Bl.width);
+			if (0 == argv->sz) {
+				mandoc_msg(MANDOCERR_ARG_EMPTY,
+				    mdoc->parse, argv->line,
+				    argv->pos, "Bl -width");
+				n->norm->Bl.width = "0n";
 				break;
 			}
-			mdoc_nmsg(mdoc, n, MANDOCERR_IGNARGV);
+			if (NULL != n->norm->Bl.width)
+				mandoc_vmsg(MANDOCERR_ARG_REP,
+				    mdoc->parse, argv->line,
+				    argv->pos, "Bl -width %s",
+				    argv->value[0]);
+			n->norm->Bl.width = argv->value[0];
 			break;
 		case MDOC_Offset:
-			/* NB: this can be empty! */
-			if (n->args->argv[i].sz) {
-				offs = n->args->argv[i].value[0];
-				dup = (NULL != n->norm->Bl.offs);
+			if (0 == argv->sz) {
+				mandoc_msg(MANDOCERR_ARG_EMPTY,
+				    mdoc->parse, argv->line,
+				    argv->pos, "Bl -offset");
 				break;
 			}
-			mdoc_nmsg(mdoc, n, MANDOCERR_IGNARGV);
+			if (NULL != n->norm->Bl.offs)
+				mandoc_vmsg(MANDOCERR_ARG_REP,
+				    mdoc->parse, argv->line,
+				    argv->pos, "Bl -offset %s",
+				    argv->value[0]);
+			n->norm->Bl.offs = argv->value[0];
 			break;
 		default:
 			continue;
 		}
 
-		/* Check: duplicate auxiliary arguments. */
-
-		if (dup)
-			mdoc_nmsg(mdoc, n, MANDOCERR_ARGVREP);
-
-		if (comp && ! dup)
-			n->norm->Bl.comp = comp;
-		if (offs && ! dup)
-			n->norm->Bl.offs = offs;
-		if (width && ! dup)
-			n->norm->Bl.width = width;
-
 		/* Check: multiple list types. */
 
 		if (LIST__NONE != lt && n->norm->Bl.type != LIST__NONE)
@@ -779,10 +780,10 @@ pre_bl(PRE_ARGS)
 static int
 pre_bd(PRE_ARGS)
 {
-	int		  i, dup, comp;
-	enum mdoc_disp	  dt;
-	const char	 *offs;
 	struct mdoc_node *np;
+	struct mdoc_argv *argv;
+	int		  i;
+	enum mdoc_disp	  dt;
 
 	if (MDOC_BLOCK != n->type) {
 		if (ENDBODY_NOT != n->end) {
@@ -798,11 +799,10 @@ pre_bd(PRE_ARGS)
 	}
 
 	for (i = 0; n->args && i < (int)n->args->argc; i++) {
+		argv = n->args->argv + i;
 		dt = DISP__NONE;
-		dup = comp = 0;
-		offs = NULL;
 
-		switch (n->args->argv[i].arg) {
+		switch (argv->arg) {
 		case MDOC_Centred:
 			dt = DISP_centred;
 			break;
@@ -822,34 +822,30 @@ pre_bd(PRE_ARGS)
 			mdoc_nmsg(mdoc, n, MANDOCERR_BADDISP);
 			return(0);
 		case MDOC_Offset:
-			/* NB: this can be empty! */
-			if (n->args->argv[i].sz) {
-				offs = n->args->argv[i].value[0];
-				dup = (NULL != n->norm->Bd.offs);
+			if (0 == argv->sz) {
+				mandoc_msg(MANDOCERR_ARG_EMPTY,
+				    mdoc->parse, argv->line,
+				    argv->pos, "Bd -offset");
 				break;
 			}
-			mdoc_nmsg(mdoc, n, MANDOCERR_IGNARGV);
+			if (NULL != n->norm->Bd.offs)
+				mandoc_vmsg(MANDOCERR_ARG_REP,
+				    mdoc->parse, argv->line,
+				    argv->pos, "Bd -offset %s",
+				    argv->value[0]);
+			n->norm->Bd.offs = argv->value[0];
 			break;
 		case MDOC_Compact:
-			comp = 1;
-			dup = n->norm->Bd.comp;
+			if (n->norm->Bd.comp)
+				mandoc_msg(MANDOCERR_ARG_REP,
+				    mdoc->parse, argv->line,
+				    argv->pos, "Bd -compact");
+			n->norm->Bd.comp = 1;
 			break;
 		default:
 			abort();
 			/* NOTREACHED */
 		}
-
-		/* Check whether we have duplicates. */
-
-		if (dup)
-			mdoc_nmsg(mdoc, n, MANDOCERR_ARGVREP);
-
-		/* Make our auxiliary assignments. */
-
-		if (offs && ! dup)
-			n->norm->Bd.offs = offs;
-		if (comp && ! dup)
-			n->norm->Bd.comp = comp;
 
 		/* Check whether a type has already been assigned. */
 
Index: mandoc.h
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mandoc.h,v
retrieving revision 1.134
retrieving revision 1.135
diff -Lmandoc.h -Lmandoc.h -u -p -r1.134 -r1.135
--- mandoc.h
+++ mandoc.h
@@ -87,6 +87,7 @@ enum	mandocerr {
 	MANDOCERR_REQ_EMPTY, /* skipping empty request: request */
 	MANDOCERR_COND_EMPTY, /* conditional request controls empty scope */
 	MANDOCERR_MACRO_EMPTY, /* skipping empty macro: macro */
+	MANDOCERR_ARG_EMPTY, /* empty argument, using 0n: macro arg */
 	MANDOCERR_ARGCWARN, /* argument count wrong */
 	MANDOCERR_BD_NOTYPE, /* missing display type, using -ragged */
 	MANDOCERR_BL_LATETYPE, /* list type is not the first argument: arg */
@@ -99,7 +100,7 @@ enum	mandocerr {
 
 	/* related to bad macro arguments */
 	MANDOCERR_IGNARGV, /* skipping argument */
-	MANDOCERR_ARGVREP, /* duplicate argument */
+	MANDOCERR_ARG_REP, /* duplicate argument: macro arg */
 	MANDOCERR_DISPREP, /* duplicate display type */
 	MANDOCERR_LISTREP, /* duplicate list type */
 	MANDOCERR_BADATT, /* unknown AT&T UNIX version */
Index: read.c
===================================================================
RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/read.c,v
retrieving revision 1.61
retrieving revision 1.62
diff -Lread.c -Lread.c -u -p -r1.61 -r1.62
--- read.c
+++ read.c
@@ -131,6 +131,7 @@ static	const char * const	mandocerrs[MAN
 	"skipping empty request",
 	"conditional request controls empty scope",
 	"skipping empty macro",
+	"empty argument, using 0n",
 	"argument count wrong",
 	"missing display type, using -ragged",
 	"list type is not the first argument",
--
 To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2014-07-05  1:12 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-07-05  1:12 mdocml: Cleanup regarding -offset and -width: * Bugfix: Last one wins, schwarze

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).