From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailout.scc.kit.edu (mailout.scc.kit.edu [129.13.185.202]) by krisdoz.my.domain (8.14.5/8.14.5) with ESMTP id q4V1gNOO017421 for ; Wed, 30 May 2012 21:42:24 -0400 (EDT) Received: from hekate.usta.de (asta-nat.asta.uni-karlsruhe.de [172.22.63.82]) by scc-mailout-02.scc.kit.edu with esmtp (Exim 4.72 #1) id 1SZuP9-0008N0-1J; Thu, 31 May 2012 03:42:23 +0200 Received: from donnerwolke.usta.de ([172.24.96.3]) by hekate.usta.de with esmtp (Exim 4.77) (envelope-from ) id 1SZuP9-0001od-2K; Thu, 31 May 2012 03:42:23 +0200 Received: from iris.usta.de ([172.24.96.5] helo=usta.de) by donnerwolke.usta.de with esmtp (Exim 4.72) (envelope-from ) id 1SZuP9-0002Zf-1G; Thu, 31 May 2012 03:42:23 +0200 Received: from schwarze by usta.de with local (Exim 4.77) (envelope-from ) id 1SZuP9-0004jh-0Q; Thu, 31 May 2012 03:42:23 +0200 Date: Thu, 31 May 2012 03:42:22 +0200 From: Ingo Schwarze To: tech@mdocml.bsd.lv Subject: fix blank line handling in .if Message-ID: <20120531014222.GB11297@iris.usta.de> X-Mailinglist: mdocml-tech Reply-To: tech@mdocml.bsd.lv MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by krisdoz.my.domain id q4V1gNOO017421 OK to commit to bsd.lv as well? ----- Forwarded message from Ingo Schwarze ----- From: Ingo Schwarze Date: Wed, 30 May 2012 19:36:56 -0600 (MDT) To: source-changes@cvs.openbsd.org CVSROOT: /cvs Module name: src Changes by: schwarze@cvs.openbsd.org 2012/05/30 19:36:56 Modified files: usr.bin/mandoc : roff.c regress/usr.bin/mandoc/roff/cond: if.in if.out_ascii Log message: Fix blank line handling in .if. In particular, two cases were wrong: - single-line .if with trailing whitespace gave no blank line - multiline .if with \{ but without \{\ gave no blank line While here, simplify roff_cond() by partially reordering the code. ----- End forwarded message ----- Index: usr.bin/mandoc/roff.c =================================================================== RCS file: /cvs/src/usr.bin/mandoc/roff.c,v retrieving revision 1.45 diff -u -p -r1.45 roff.c --- usr.bin/mandoc/roff.c 24 Oct 2011 21:38:56 -0000 1.45 +++ usr.bin/mandoc/roff.c 31 May 2012 01:30:16 -0000 @@ -1,7 +1,7 @@ /* $Id: roff.c,v 1.45 2011/10/24 21:38:56 schwarze Exp $ */ /* * Copyright (c) 2010, 2011 Kristaps Dzonsons - * Copyright (c) 2010, 2011 Ingo Schwarze + * Copyright (c) 2010, 2011, 2012 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -774,7 +774,7 @@ roffnode_cleanscope(struct roff *r) { while (r->last) { - if (--r->last->endspan < 0) + if (--r->last->endspan != 0) break; roffnode_pop(r); } @@ -1094,8 +1094,8 @@ roff_line_ignore(ROFF_ARGS) static enum rofferr roff_cond(ROFF_ARGS) { - int sv; - enum roffrule rule; + + roffnode_push(r, tok, NULL, ln, ppos); /* * An `.el' has no conditional body: it will consume the value @@ -1105,31 +1105,11 @@ roff_cond(ROFF_ARGS) * If we're not an `el', however, then evaluate the conditional. */ - rule = ROFF_el == tok ? + r->last->rule = ROFF_el == tok ? (r->rstackpos < 0 ? ROFFRULE_DENY : r->rstack[r->rstackpos--]) : roff_evalcond(*bufp, &pos); - sv = pos; - while (' ' == (*bufp)[pos]) - pos++; - - /* - * Roff is weird. If we have just white-space after the - * conditional, it's considered the BODY and we exit without - * really doing anything. Warn about this. It's probably - * wrong. - */ - - if ('\0' == (*bufp)[pos] && sv != pos) { - mandoc_msg(MANDOCERR_NOARGS, r->parse, ln, ppos, NULL); - return(ROFF_IGN); - } - - roffnode_push(r, tok, NULL, ln, ppos); - - r->last->rule = rule; - /* * An if-else will put the NEGATION of the current evaluated * conditional into the stack of rules. @@ -1152,28 +1132,39 @@ roff_cond(ROFF_ARGS) r->last->rule = ROFFRULE_DENY; /* - * Determine scope. If we're invoked with "\{" trailing the - * conditional, then we're in a multiline scope. Else our scope - * expires on the next line. + * Determine scope. + * If there is nothing on the line after the conditional, + * not even whitespace, use next-line scope. */ - r->last->endspan = 1; + if ('\0' == (*bufp)[pos]) { + r->last->endspan = 2; + goto out; + } + + while (' ' == (*bufp)[pos]) + pos++; + + /* An opening brace requests multiline scope. */ if ('\\' == (*bufp)[pos] && '{' == (*bufp)[pos + 1]) { r->last->endspan = -1; pos += 2; + goto out; } /* - * If there are no arguments on the line, the next-line scope is - * assumed. + * Anything else following the conditional causes + * single-line scope. Warn if the scope contains + * nothing but trailing whitespace. */ if ('\0' == (*bufp)[pos]) - return(ROFF_IGN); + mandoc_msg(MANDOCERR_NOARGS, r->parse, ln, ppos, NULL); - /* Otherwise re-run the roff parser after recalculating. */ + r->last->endspan = 1; +out: *offs = pos; return(ROFF_RERUN); } Index: regress/usr.bin/mandoc/roff/cond/if.in =================================================================== RCS file: /cvs/src/regress/usr.bin/mandoc/roff/cond/if.in,v retrieving revision 1.2 diff -u -p -r1.2 if.in --- regress/usr.bin/mandoc/roff/cond/if.in 17 Nov 2011 16:28:46 -0000 1.2 +++ regress/usr.bin/mandoc/roff/cond/if.in 31 May 2012 01:30:16 -0000 @@ -1,9 +1,20 @@ -.TH IF 1 "April 25, 2010" OpenBSD +.TH IF 1 "May 30, 2012" OpenBSD .SH NAME if \- the roff conditional instruction .SH DESCRIPTION .if n One-line true condition. .if t One-line false condition. +.if n +Next-line empty true condition. +.if t +Next-line empty false condition. +.br +False condition with whitespace: +.if t +True condition with whitespace: +.if n +.if n \{One-line true condition with block.\} +.if t \{One-line false condition with block.\} .br .if n \{Two-line true condition without continuation and macros.\} @@ -18,6 +29,11 @@ with continuation and macros. Two-line false condition with continuation and macros. .\} +.br +.if n \{ +Two-line true condition with blank line.\} +.if t \{ +Two-line false condition with blank line.\} .br .if n \{Outer true condition. .br Index: regress/usr.bin/mandoc/roff/cond/if.out_ascii =================================================================== RCS file: /cvs/src/regress/usr.bin/mandoc/roff/cond/if.out_ascii,v retrieving revision 1.4 diff -u -p -r1.4 if.out_ascii --- regress/usr.bin/mandoc/roff/cond/if.out_ascii 2 Dec 2011 01:50:46 -0000 1.4 +++ regress/usr.bin/mandoc/roff/cond/if.out_ascii 31 May 2012 01:30:16 -0000 @@ -7,8 +7,15 @@ NNAAMMEE DDEESSCCRRIIPPTTIIOONN One-line true condition. + + Next-line empty true condition. + False condition with whitespace: True condition with whitespace: + + One-line true condition with block. Two-line true condition without continuation and macros. Two-line true condition with continuation and macros. + + Two-line true condition with blank line. Outer true condition. Inner one-line true condition. Inner two-line true condition without continuation and macros. @@ -16,4 +23,4 @@ DDEESSCCRRIIPPTTIIOONN -OpenBSD April 25, 2010 IF(1) +OpenBSD May 30, 2012 IF(1) -- To unsubscribe send an email to tech+unsubscribe@mdocml.bsd.lv