From d806944940b787e24fae0b8cd31a3b81855822b7 Mon Sep 17 00:00:00 2001 From: Ingo Schwarze Date: Fri, 7 Mar 2014 18:37:37 +0000 Subject: In roff_cond_sub(), make sure that the incorrect input sequence `\\}', when found on a macro line, does not close a conditional block. The companion function roff_cond_text() already did this correctly, but make the code more readable without functional change. While here, report the correct column number in related error messages. --- roff.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/roff.c b/roff.c index 9cf39dbf..a3482135 100644 --- a/roff.c +++ b/roff.c @@ -1,4 +1,4 @@ -/* $Id: roff.c,v 1.196 2014/03/07 18:30:11 schwarze Exp $ */ +/* $Id: roff.c,v 1.197 2014/03/07 18:37:37 schwarze Exp $ */ /* * Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons * Copyright (c) 2010-2014 Ingo Schwarze @@ -1082,10 +1082,11 @@ roff_cond_sub(ROFF_ARGS) /* Always check for the closing delimiter `\}'. */ while (NULL != (ep = strchr(ep, '\\'))) { - if ('}' != *(++ep)) - continue; - *ep = '&'; - roff_ccond(r, ln, pos); + if ('}' == *(++ep)) { + *ep = '&'; + roff_ccond(r, ln, ep - *bufp - 1); + } + ++ep; } return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT); } @@ -1100,13 +1101,13 @@ roff_cond_text(ROFF_ARGS) rr = r->last->rule; roffnode_cleanscope(r); - ep = &(*bufp)[pos]; - for ( ; NULL != (ep = strchr(ep, '\\')); ep++) { - ep++; - if ('}' != *ep) - continue; - *ep = '&'; - roff_ccond(r, ln, pos); + ep = *bufp + pos; + while (NULL != (ep = strchr(ep, '\\'))) { + if ('}' == *(++ep)) { + *ep = '&'; + roff_ccond(r, ln, ep - *bufp - 1); + } + ++ep; } return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT); } -- cgit v1.2.3