From 3c63611ee89298b92b89ee5a72e03ddf82e2059f Mon Sep 17 00:00:00 2001 From: Kristaps Dzonsons Date: Sun, 8 Mar 2009 18:02:36 +0000 Subject: Updated manuals. Added -fign-scope and -fign-escape. --- macro.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 57 insertions(+), 11 deletions(-) (limited to 'macro.c') 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 * @@ -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, @@ -227,6 +229,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 = ""; + 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) { @@ -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 ? - "" : 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 ? - "" : 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 ? - "" : mdoc_macronames[n->tok])); + if ( ! scopewarn(mdoc, MDOC_BLOCK, line, ppos, n)) + return(0); } assert(n); -- cgit v1.2.3