From: schwarze@mdocml.bsd.lv
To: source@mdocml.bsd.lv
Subject: mdocml: better error reporting regarding .OP .RS .UR .TH arguments
Date: Fri, 6 Feb 2015 06:55:07 -0500 (EST) [thread overview]
Message-ID: <4201095191360000558.enqueue@fantadrom.bsd.lv> (raw)
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
reply other threads:[~2015-02-06 11:55 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4201095191360000558.enqueue@fantadrom.bsd.lv \
--to=schwarze@mdocml.bsd.lv \
--cc=source@mdocml.bsd.lv \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).