source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mdocml: better error reporting regarding .OP .RS .UR .TH arguments
@ 2015-02-06 11:55 schwarze
  0 siblings, 0 replies; only message in thread
From: schwarze @ 2015-02-06 11:55 UTC (permalink / raw)
  To: source

Log Message:
-----------
better error reporting regarding .OP .RS .UR .TH arguments

Modified Files:
--------------
    mdocml:
        man_macro.c
        man_validate.c
        mandoc.1
        mandoc.h
        read.c

Revision Data
-------------
Index: mandoc.1
===================================================================
RCS file: /home/cvs/mdocml/mdocml/mandoc.1,v
retrieving revision 1.149
retrieving revision 1.150
diff -Lmandoc.1 -Lmandoc.1 -u -p -r1.149 -r1.150
--- mandoc.1
+++ mandoc.1
@@ -1125,6 +1125,18 @@ The
 utility assumes
 .Fl std
 even when it is not specified, but other implementations may not.
+.It Sy "missing option string, using \(dq\(dq"
+.Pq man
+The
+.Ic \&OP
+macro is invoked without any argument.
+An empty pair of square brackets is shown.
+.It Sy "missing resource identifier, using \(dq\(dq"
+.Pq man
+The
+.Ic \&UR
+macro is invoked without any argument.
+An empty pair of angle brackets is shown.
 .It Sy "missing eqn box, using \(dq\(dq"
 .Pq eqn
 A diacritic mark or a binary operator is found,
@@ -1645,30 +1657,41 @@ block closing request is invoked with at
 All arguments are ignored.
 .It Sy "skipping excess arguments"
 .Pq mdoc , man , roff
-The
+A macro or request is invoked with too many arguments:
+.Bl -dash -offset 2n -width 2n -compact
+.It
+.Ic \&Fo ,
+.Ic \&PD ,
+.Ic \&RS ,
+.Ic \&UR ,
+.Ic \&ft ,
+or
+.Ic \&sp
+with more than one argument
+.It
 .Ic \&An
-macro is invoked with another argument after
+with another argument after
 .Fl split
 or
-.Fl nosplit ,
-.Ic \&Fo
-is invoked with more than one argument,
+.Fl nosplit
+.It
+.Ic \&RE
+with more than one argument or with a non-integer argument
+.It
+.Ic \&OP
+or a request of the
+.Ic \&de
+family with more than two arguments
+.It
+.Ic \&TH
+with more than five arguments
+.It
 .Ic \&Bd ,
 .Ic \&Bk ,
 or
 .Ic \&Bl
-are invoked with invalid arguments, the
-.Ic \&RE
-macro is invoked with more than one argument
-or with a non-integer argument, the
-.Ic \&PD
-macro or the
-.Ic \&ft
-or
-.Ic \&sp
-request is invoked with more than one argument, or a request of the
-.Ic \&de
-family is invoked with more than two arguments.
+with invalid arguments
+.El
 The excess arguments are ignored.
 .El
 .Ss Unsupported features
Index: man_validate.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/man_validate.c,v
retrieving revision 1.112
retrieving revision 1.113
diff -Lman_validate.c -Lman_validate.c -u -p -r1.112 -r1.113
--- man_validate.c
+++ man_validate.c
@@ -1,7 +1,7 @@
 /*	$OpenBSD$ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010, 2012-2015 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -38,8 +38,6 @@
 
 typedef	void	(*v_check)(CHKARGS);
 
-static	void	  check_eq2(CHKARGS);
-static	void	  check_le5(CHKARGS);
 static	void	  check_par(CHKARGS);
 static	void	  check_part(CHKARGS);
 static	void	  check_root(CHKARGS);
@@ -51,6 +49,7 @@ static	void	  post_vs(CHKARGS);
 static	void	  post_fi(CHKARGS);
 static	void	  post_ft(CHKARGS);
 static	void	  post_nf(CHKARGS);
+static	void	  post_OP(CHKARGS);
 static	void	  post_TH(CHKARGS);
 static	void	  post_UC(CHKARGS);
 static	void	  post_UR(CHKARGS);
@@ -88,7 +87,7 @@ static	v_check man_valids[MAN_MAX] = {
 	post_AT,    /* AT */
 	NULL,       /* in */
 	post_ft,    /* ft */
-	check_eq2,  /* OP */
+	post_OP,    /* OP */
 	post_nf,    /* EX */
 	post_fi,    /* EE */
 	post_UR,    /* UR */
@@ -169,27 +168,27 @@ check_text(CHKARGS)
 		    n->line, n->pos + (p - cp), NULL);
 }
 
-#define	INEQ_DEFINE(x, ineq, name) \
-static void \
-check_##name(CHKARGS) \
-{ \
-	if (n->nchild ineq (x)) \
-		return; \
-	mandoc_vmsg(MANDOCERR_ARGCOUNT, man->parse, n->line, n->pos, \
-	    "line arguments %s %d (have %d)", \
-	    #ineq, (x), n->nchild); \
-}
+static void
+post_OP(CHKARGS)
+{
 
-INEQ_DEFINE(2, ==, eq2)
-INEQ_DEFINE(5, <=, le5)
+	if (n->nchild == 0)
+		mandoc_msg(MANDOCERR_OP_EMPTY, man->parse,
+		    n->line, n->pos, "OP");
+	else if (n->nchild > 2) {
+		n = n->child->next->next;
+		mandoc_vmsg(MANDOCERR_ARG_EXCESS, man->parse,
+		    n->line, n->pos, "OP ... %s", n->string);
+	}
+}
 
 static void
 post_UR(CHKARGS)
 {
 
-	if (MAN_HEAD == n->type && 1 != n->nchild)
-		mandoc_vmsg(MANDOCERR_ARGCOUNT, man->parse, n->line,
-		    n->pos, "line arguments eq 1 (have %d)", n->nchild);
+	if (n->type == MAN_HEAD && n->child == NULL)
+		mandoc_vmsg(MANDOCERR_UR_NOHEAD, man->parse,
+		    n->line, n->pos, "UR");
 	check_part(man, n);
 }
 
@@ -303,8 +302,6 @@ post_TH(CHKARGS)
 	struct man_node	*nb;
 	const char	*p;
 
-	check_le5(man, n);
-
 	free(man->meta.title);
 	free(man->meta.vol);
 	free(man->meta.source);
@@ -381,6 +378,10 @@ post_TH(CHKARGS)
 	else if ('\0' != man->meta.msec[0] &&
 	    (NULL != (p = mandoc_a2msec(man->meta.msec))))
 		man->meta.vol = mandoc_strdup(p);
+
+	if (n != NULL && (n = n->next) != NULL)
+		mandoc_vmsg(MANDOCERR_ARG_EXCESS, man->parse,
+		    n->line, n->pos, "TH ... %s", n->string);
 
 	/*
 	 * Remove the `TH' node after we've processed it for our
Index: mandoc.h
===================================================================
RCS file: /home/cvs/mdocml/mdocml/mandoc.h,v
retrieving revision 1.198
retrieving revision 1.199
diff -Lmandoc.h -Lmandoc.h -u -p -r1.198 -r1.199
--- mandoc.h
+++ mandoc.h
@@ -106,6 +106,8 @@ enum	mandocerr {
 	MANDOCERR_PF_SKIP, /* nothing follows prefix: Pf arg */
 	MANDOCERR_RS_EMPTY, /* empty reference block: Rs */
 	MANDOCERR_ARG_STD, /* missing -std argument, adding it: macro */
+	MANDOCERR_OP_EMPTY, /* missing option string, using "": OP */
+	MANDOCERR_UR_NOHEAD, /* missing resource identifier, using "": UR */
 	MANDOCERR_EQN_NOBOX, /* missing eqn box, using "": op */
 
 	/* related to bad arguments */
Index: man_macro.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/man_macro.c,v
retrieving revision 1.97
retrieving revision 1.98
diff -Lman_macro.c -Lman_macro.c -u -p -r1.97 -r1.98
--- man_macro.c
+++ man_macro.c
@@ -337,31 +337,25 @@ blk_close(MACRO_PROT_ARGS)
 void
 blk_exp(MACRO_PROT_ARGS)
 {
-	struct man_node	*n;
-	int		 la;
+	struct man_node	*head;
 	char		*p;
+	int		 la;
 
 	rew_scope(MAN_BLOCK, man, tok);
 	man_block_alloc(man, line, ppos, tok);
 	man_head_alloc(man, line, ppos, tok);
+	head = man->last;
 
-	for (;;) {
-		la = *pos;
-		if ( ! man_args(man, line, pos, buf, &p))
-			break;
+	la = *pos;
+	if (man_args(man, line, pos, buf, &p))
 		man_word_alloc(man, line, la, p);
-	}
-
-	assert(man);
-	assert(tok != MAN_MAX);
 
-	for (n = man->last; n; n = n->parent)
-		if (n->tok == tok) {
-			assert(n->type == MAN_HEAD);
-			man_unscope(man, n);
-			break;
-		}
+	if (buf[*pos] != '\0')
+		mandoc_vmsg(MANDOCERR_ARG_EXCESS,
+		    man->parse, line, *pos, "%s ... %s",
+		    man_macronames[tok], buf + *pos);
 
+	man_unscope(man, head);
 	man_body_alloc(man, line, ppos, tok);
 }
 
Index: read.c
===================================================================
RCS file: /home/cvs/mdocml/mdocml/read.c,v
retrieving revision 1.124
retrieving revision 1.125
diff -Lread.c -Lread.c -u -p -r1.124 -r1.125
--- read.c
+++ read.c
@@ -150,6 +150,8 @@ static	const char * const	mandocerrs[MAN
 	"nothing follows prefix",
 	"empty reference block",
 	"missing -std argument, adding it",
+	"missing option string, using \"\"",
+	"missing resource identifier, using \"\"",
 	"missing eqn box, using \"\"",
 
 	/* related to bad macro arguments */
--
 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:[~2015-02-06 11:55 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-02-06 11:55 mdocml: better error reporting regarding .OP .RS .UR .TH arguments 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).