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 o9SAqMNb005026 for ; Thu, 28 Oct 2010 06:52:25 -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 1PBQ5j-0007g6-E4; Thu, 28 Oct 2010 12:52:21 +0200 Received: from donnerwolke.usta.de ([172.24.96.3]) by hekate.usta.de with esmtp (Exim 4.71) (envelope-from ) id 1PBQ5j-0003pl-Cq for tech@mdocml.bsd.lv; Thu, 28 Oct 2010 12:52:19 +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 1PBQ5j-0005JJ-9H for tech@mdocml.bsd.lv; Thu, 28 Oct 2010 12:52:19 +0200 Received: from schwarze by usta.de with local (Exim 4.71) (envelope-from ) id 1PBQ5i-0002RU-Ri for tech@mdocml.bsd.lv; Thu, 28 Oct 2010 12:52:18 +0200 Date: Thu, 28 Oct 2010 12:52:18 +0200 From: Ingo Schwarze To: tech@mdocml.bsd.lv Subject: fix man(7) font alternating blocks in literal mode Message-ID: <20101028105218.GA7102@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.20 (2009-06-14) OK to commit to bsd.lv, too? ----- Forwarded message from Ingo Schwarze ----- From: Ingo Schwarze Date: Thu, 28 Oct 2010 04:42:39 -0600 (MDT) To: source-changes@cvs.openbsd.org CVSROOT: /cvs Module name: src Changes by: schwarze@cvs.openbsd.org 2010/10/28 04:42:39 Modified files: usr.bin/mandoc : man_term.c Log message: Font alternating blocks like .RB must not break the line between children in literal mode. Fixing a bug found by naddy@ in the gettext(3) SYNOPSIS. This required a bit of refactoring: * consolidate pre_RB(), pre_RI(), and pre_BI() into pre_alternate() * save the MANT_LITERAL mode before descending into children * restore MANT_LITERAL mode before printing the last child ----- End forwarded message ----- Index: man_term.c =================================================================== RCS file: /cvs/src/usr.bin/mandoc/man_term.c,v retrieving revision 1.50 diff -u -p -r1.50 man_term.c --- man_term.c 16 Oct 2010 20:49:37 -0000 1.50 +++ man_term.c 28 Oct 2010 10:40:48 -0000 @@ -77,14 +77,12 @@ static void print_man_foot(struct ter static void print_bvspace(struct termp *, const struct man_node *); +static int pre_alternate(DECL_ARGS); static int pre_B(DECL_ARGS); -static int pre_BI(DECL_ARGS); static int pre_HP(DECL_ARGS); static int pre_I(DECL_ARGS); static int pre_IP(DECL_ARGS); static int pre_PP(DECL_ARGS); -static int pre_RB(DECL_ARGS); -static int pre_RI(DECL_ARGS); static int pre_RS(DECL_ARGS); static int pre_SH(DECL_ARGS); static int pre_SS(DECL_ARGS); @@ -115,15 +113,15 @@ static const struct termact termacts[MAN { pre_HP, post_HP, 0 }, /* HP */ { NULL, NULL, 0 }, /* SM */ { pre_B, NULL, 0 }, /* SB */ - { pre_BI, NULL, 0 }, /* BI */ - { pre_BI, NULL, 0 }, /* IB */ - { pre_RB, NULL, 0 }, /* BR */ - { pre_RB, NULL, 0 }, /* RB */ + { pre_alternate, NULL, 0 }, /* BI */ + { pre_alternate, NULL, 0 }, /* IB */ + { pre_alternate, NULL, 0 }, /* BR */ + { pre_alternate, NULL, 0 }, /* RB */ { NULL, NULL, 0 }, /* R */ { pre_B, NULL, 0 }, /* B */ { pre_I, NULL, 0 }, /* I */ - { pre_RI, NULL, 0 }, /* IR */ - { pre_RI, NULL, 0 }, /* RI */ + { pre_alternate, NULL, 0 }, /* IR */ + { pre_alternate, NULL, 0 }, /* RI */ { NULL, NULL, MAN_NOTEXT }, /* na */ { pre_I, NULL, 0 }, /* i */ { pre_sp, NULL, MAN_NOTEXT }, /* sp */ @@ -268,77 +266,55 @@ pre_literal(DECL_ARGS) } - /* ARGSUSED */ static int -pre_RB(DECL_ARGS) +pre_alternate(DECL_ARGS) { - const struct man_node *nn; - int i; - - for (i = 0, nn = n->child; nn; nn = nn->next, i++) { - if (i % 2 && MAN_RB == n->tok) - term_fontrepl(p, TERMFONT_BOLD); - else if ( ! (i % 2) && MAN_RB != n->tok) - term_fontrepl(p, TERMFONT_BOLD); - else - term_fontrepl(p, TERMFONT_NONE); - - if (i > 0) - p->flags |= TERMP_NOSPACE; + enum termfont font[2]; + const struct man_node *nn; + int savelit, i; - print_man_node(p, mt, nn, m); + switch (n->tok) { + case (MAN_RB): + font[0] = TERMFONT_NONE; + font[1] = TERMFONT_BOLD; + break; + case (MAN_RI): + font[0] = TERMFONT_NONE; + font[1] = TERMFONT_UNDER; + break; + case (MAN_BR): + font[0] = TERMFONT_BOLD; + font[1] = TERMFONT_NONE; + break; + case (MAN_BI): + font[0] = TERMFONT_BOLD; + font[1] = TERMFONT_UNDER; + break; + case (MAN_IR): + font[0] = TERMFONT_UNDER; + font[1] = TERMFONT_NONE; + break; + case (MAN_IB): + font[0] = TERMFONT_UNDER; + font[1] = TERMFONT_BOLD; + break; + default: + abort(); } - return(0); -} + savelit = MANT_LITERAL & mt->fl; + mt->fl &= ~MANT_LITERAL; -/* ARGSUSED */ -static int -pre_RI(DECL_ARGS) -{ - const struct man_node *nn; - int i; - - for (i = 0, nn = n->child; nn; nn = nn->next, i++) { - if (i % 2 && MAN_RI == n->tok) - term_fontrepl(p, TERMFONT_UNDER); - else if ( ! (i % 2) && MAN_RI != n->tok) - term_fontrepl(p, TERMFONT_UNDER); - else - term_fontrepl(p, TERMFONT_NONE); - - if (i > 0) - p->flags |= TERMP_NOSPACE; - + for (i = 0, nn = n->child; nn; nn = nn->next, i = 1 - i) { + term_fontrepl(p, font[i]); + if (savelit && NULL == nn->next) + mt->fl |= MANT_LITERAL; print_man_node(p, mt, nn, m); - } - return(0); -} - - -/* ARGSUSED */ -static int -pre_BI(DECL_ARGS) -{ - const struct man_node *nn; - int i; - - for (i = 0, nn = n->child; nn; nn = nn->next, i++) { - if (i % 2 && MAN_BI == n->tok) - term_fontrepl(p, TERMFONT_UNDER); - else if (i % 2) - term_fontrepl(p, TERMFONT_BOLD); - else if (MAN_BI == n->tok) - term_fontrepl(p, TERMFONT_BOLD); - else - term_fontrepl(p, TERMFONT_UNDER); - - if (i) + if (nn->next) p->flags |= TERMP_NOSPACE; - - print_man_node(p, mt, nn, m); } + return(0); } -- To unsubscribe send an email to tech+unsubscribe@mdocml.bsd.lv