From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp1.rz.uni-karlsruhe.de (Debian-exim@smtp1.rz.uni-karlsruhe.de [129.13.185.217]) by krisdoz.my.domain (8.14.3/8.14.3) with ESMTP id o8LN5FdR007335 for ; Tue, 21 Sep 2010 19:05:19 -0400 (EDT) Received: from hekate.usta.de (asta-nat.asta.uni-karlsruhe.de [172.22.63.82]) by smtp1.rz.uni-karlsruhe.de with esmtp (Exim 4.63 #1) id 1OyBth-0005tE-Q3; Wed, 22 Sep 2010 01:05:13 +0200 Received: from donnerwolke.usta.de ([172.24.96.3]) by hekate.usta.de with esmtp (Exim 4.71) (envelope-from ) id 1OyBth-0000xs-Ov for discuss@mdocml.bsd.lv; Wed, 22 Sep 2010 01:05:13 +0200 Received: from iris.usta.de ([172.24.96.5] helo=usta.de) by donnerwolke.usta.de with esmtp (Exim 4.69) (envelope-from ) id 1OyBth-0006Qd-Na for discuss@mdocml.bsd.lv; Wed, 22 Sep 2010 01:05:13 +0200 Received: from schwarze by usta.de with local (Exim 4.71) (envelope-from ) id 1OyBth-00051e-GA for discuss@mdocml.bsd.lv; Wed, 22 Sep 2010 01:05:13 +0200 Date: Wed, 22 Sep 2010 01:05:13 +0200 From: Ingo Schwarze To: discuss@mdocml.bsd.lv Subject: Re: more spacing badness Message-ID: <20100921230513.GC9516@iris.usta.de> References: <20100910211434.GA17432@bramka.kerhand.co.uk> <4C90EC16.8010002@bsd.lv> X-Mailinglist: mdocml-discuss Reply-To: discuss@mdocml.bsd.lv MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C90EC16.8010002@bsd.lv> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Kristaps, Kristaps Dzonsons wrote on Wed, Sep 15, 2010 at 05:53:58PM +0200: > Jason McIntyre wrote: >> so i tried: >> >> .Nm vi\ \& >> >> old and new groff produce: >> >> vi [-eFRrS] [-c cmd] [-t tag] [-w size] [file ...] >> >> but mandoc seems to inject a tab: >> >> vi [-eFRrS] [-c cmd] [-t tag] [-w size] [file ...] > My last commit fixes this in a general way. The problem was "\ \&" > being read as the string length. Now string length calculations (for > -Tascii, -Tpdf, and -Tps) all take into account escapes. This lifts a > long-standing feature request in the TODO. WOW, great. I wouldn't have thought that could be done with so little code. Admittedly, it's a bit of code duplication, but by far less annoying than i would have expected. And it's very nice to have from a user perspective. Thanks! Of course, i was eager to see whether Jason's "vi\ \&" would now work. Guess what - it didn't. I first had to fix *two* bugs in my own code. First, my favourite function term_flushline() handled trailing white space correctly, but not trailing escaped blank characters. In the initial parsing loop, escaped whitespace is counted as normal characters, then in the final output loop, it gets converted to normal blanks, and finally, normal blanks (which break out of the initial parsing loop) are counted again, so trailing escaped blanks ended up being counted twice against the column width. Having fixed that one, Jason's "vi\ \&" still wouldn't work. The reason was a quirk implemented for mdoc's .Bl -hang lists. In such lists, when the head is wider than the declared head width, the body gets pushed ahead to make room for the head; when the head is shorter, the body gets aligned at the declared position. The quirk being that when the head is exactly one character shorter than the declared width, the body gets pulled back one character - for whatever reason. That quirk got triggered and defeated Jason's nicely escaped blank. So, the second fix is to remove the -hang flag from the SYNOPSIS .Nm block handling. I don't remember why i put that flag there in the first place, it is clearly not needed. The width is calculated such that the header will always fit, so pushing ahead is never needed, and we certainly do not want to pull back. OK? Yours, Ingo Index: mdoc_term.c =================================================================== RCS file: /cvs/src/usr.bin/mandoc/mdoc_term.c,v retrieving revision 1.104 diff -u -p -r1.104 mdoc_term.c --- mdoc_term.c 20 Sep 2010 20:02:27 -0000 1.104 +++ mdoc_term.c 21 Sep 2010 22:34:20 -0000 @@ -1027,7 +1027,7 @@ termp_nm_pre(DECL_ARGS) synopsis_pre(p, n->parent); if (MDOC_HEAD == n->type && n->next->child) { - p->flags |= TERMP_NOSPACE | TERMP_NOBREAK | TERMP_HANG; + p->flags |= TERMP_NOSPACE | TERMP_NOBREAK; p->rmargin = p->offset + term_len(p, 1) + (NULL == n->child ? term_strlen(p, m->name) : MDOC_TEXT == n->child->type ? @@ -1049,7 +1049,7 @@ termp_nm_post(DECL_ARGS) if (MDOC_HEAD == n->type && n->next->child) { term_flushln(p); - p->flags &= ~(TERMP_NOBREAK | TERMP_HANG); + p->flags &= ~TERMP_NOBREAK; } else if (MDOC_BODY == n->type && n->child) { term_flushln(p); p->flags &= ~TERMP_NOLPAD; Index: term.c =================================================================== RCS file: /cvs/src/usr.bin/mandoc/term.c,v retrieving revision 1.50 diff -u -p -r1.50 term.c --- term.c 21 Sep 2010 22:33:41 -0000 1.50 +++ term.c 21 Sep 2010 22:34:20 -0000 @@ -130,6 +130,7 @@ term_flushln(struct termp *p) size_t vbl; /* number of blanks to prepend to output */ size_t vend; /* end of word visual position on output */ size_t bp; /* visual right border position */ + size_t dv; /* temporary for visual pos calculations */ int j; /* temporary loop index for p->buf */ int jhy; /* last hyph before overflow w/r/t j */ size_t maxvis; /* output position of visible boundary */ @@ -233,7 +234,9 @@ term_flushln(struct termp *p) j = i; while (' ' == p->buf[i]) i++; - vbl += (i - j) * (*p->width)(p, ' '); + dv = (i - j) * (*p->width)(p, ' '); + vbl += dv; + vend += dv; break; } if (ASCII_NBRSP == p->buf[i]) { @@ -260,7 +263,6 @@ term_flushln(struct termp *p) p->viscol += (*p->width)(p, p->buf[i]); } } - vend += vbl; vis = vend; } -- To unsubscribe send an email to discuss+unsubscribe@mdocml.bsd.lv