summaryrefslogtreecommitdiffstatshomepage
path: root/macro.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2009-03-08 18:02:36 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2009-03-08 18:02:36 +0000
commit3c63611ee89298b92b89ee5a72e03ddf82e2059f (patch)
treefb23a285271560c4502791d265d2916405469a89 /macro.c
parentf4174d477ac34e47067d4a9e45cc192f7271973a (diff)
downloadmandoc-3c63611ee89298b92b89ee5a72e03ddf82e2059f.tar.gz
mandoc-3c63611ee89298b92b89ee5a72e03ddf82e2059f.tar.zst
mandoc-3c63611ee89298b92b89ee5a72e03ddf82e2059f.zip
Updated manuals.
Added -fign-scope and -fign-escape.
Diffstat (limited to 'macro.c')
-rw-r--r--macro.c68
1 files changed, 57 insertions, 11 deletions
diff --git a/macro.c b/macro.c
index ea4af29b..edc19e03 100644
--- a/macro.c
+++ b/macro.c
@@ -1,4 +1,4 @@
-/* $Id: macro.c,v 1.58 2009/03/08 11:41:22 kristaps Exp $ */
+/* $Id: macro.c,v 1.59 2009/03/08 18:02:36 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -60,6 +60,8 @@ static int append_delims(struct mdoc *, int, int *, char *);
static int lookup(struct mdoc *, int, int, int, const char *);
static int pwarn(struct mdoc *, int, int, int);
static int perr(struct mdoc *, int, int, int);
+static int scopewarn(struct mdoc *, enum mdoc_type, int, int,
+ const struct mdoc_node *);
#define WMACPARM (1)
#define WOBS (2)
@@ -192,7 +194,7 @@ perr(struct mdoc *mdoc, int line, int pos, int type)
switch (type) {
case (ENOCTX):
c = mdoc_perr(mdoc, line, pos,
- "closing macro has prior context");
+ "closing macro has no prior context");
break;
case (ENOPARMS):
c = mdoc_perr(mdoc, line, pos,
@@ -228,6 +230,53 @@ pwarn(struct mdoc *mdoc, int line, int pos, int type)
static int
+scopewarn(struct mdoc *mdoc, enum mdoc_type type,
+ int line, int pos, const struct mdoc_node *p)
+{
+ const char *n, *t, *tt;
+
+ n = t = "<root>";
+ tt = "block";
+
+ switch (p->type) {
+ case (MDOC_BODY):
+ tt = "multi-line";
+ break;
+ case (MDOC_HEAD):
+ tt = "line";
+ break;
+ default:
+ break;
+ }
+
+ switch (p->type) {
+ case (MDOC_BLOCK):
+ n = mdoc_macronames[p->tok];
+ t = "block";
+ break;
+ case (MDOC_BODY):
+ n = mdoc_macronames[p->tok];
+ t = "multi-line";
+ break;
+ case (MDOC_HEAD):
+ n = mdoc_macronames[p->tok];
+ t = "line";
+ break;
+ default:
+ break;
+ }
+
+ if ( ! (MDOC_IGN_SCOPE & mdoc->pflags))
+ return(mdoc_perr(mdoc, line, pos,
+ "%s scope breaks %s scope of %s",
+ tt, t, n));
+ return(mdoc_pwarn(mdoc, line, pos, WARN_SYNTAX,
+ "%s scope breaks %s scope of %s",
+ tt, t, n));
+}
+
+
+static int
lookup(struct mdoc *mdoc, int line, int pos, int from, const char *p)
{
int res;
@@ -512,9 +561,8 @@ rewind_subblock(enum mdoc_type type, struct mdoc *mdoc,
break;
else if (rewind_dobreak(tok, n))
continue;
- return(mdoc_perr(mdoc, line, ppos,
- "scope breaks %s", MDOC_ROOT == n->type ?
- "<root>" : mdoc_macronames[n->tok]));
+ if ( ! scopewarn(mdoc, type, line, ppos, n))
+ return(0);
}
assert(n);
@@ -537,9 +585,8 @@ rewind_expblock(struct mdoc *mdoc, int tok, int line, int ppos)
break;
else if (rewind_dobreak(tok, n))
continue;
- return(mdoc_perr(mdoc, line, ppos,
- "scope breaks %s", MDOC_ROOT == n->type ?
- "<root>" : mdoc_macronames[n->tok]));
+ if ( ! scopewarn(mdoc, MDOC_BLOCK, line, ppos, n))
+ return(0);
}
assert(n);
@@ -562,9 +609,8 @@ rewind_impblock(struct mdoc *mdoc, int tok, int line, int ppos)
break;
else if (rewind_dobreak(tok, n))
continue;
- return(mdoc_perr(mdoc, line, ppos,
- "scope breaks %s", MDOC_ROOT == n->type ?
- "<root>" : mdoc_macronames[n->tok]));
+ if ( ! scopewarn(mdoc, MDOC_BLOCK, line, ppos, n))
+ return(0);
}
assert(n);