From 41394e59b698fac5412e3a0f5405a777debd033f Mon Sep 17 00:00:00 2001 From: Ingo Schwarze Date: Tue, 4 Jan 2011 01:23:18 +0000 Subject: Multiple man(7) .IP and .TP fixes started during p2k10: Affecting both -Tascii and -Thtml: * The .IP HEAD uses the second argument as the width, not the last one. * Only print the first .IP HEAD argument, not all but the last. Affecting only -Tascii: * The .IP and .TP HEADs must be printed without literal mode, but literal mode must be restored afterwards. * After the .IP and .TP bodies, we only want term_newln(), not term_flushln(), or we would get two blank lines in literal mode. * The .TP HEAD does not use TWOSPACE, just like .IP doesn't either. * In literal mode, clear NOLPAD after each line, or subsequent lines would get no indentation whatsoever. Affecting only -Thtml: * Only print next-line .TP children, instead of all but the first. OK kristaps@ on the -Tascii part; and: "Can you work this into man_html.c, too?" --- man_html.c | 30 +++++++++--------------------- man_term.c | 39 ++++++++++++++++++++++++--------------- 2 files changed, 33 insertions(+), 36 deletions(-) diff --git a/man_html.c b/man_html.c index eabbde06..fa21a402 100644 --- a/man_html.c +++ b/man_html.c @@ -517,14 +517,11 @@ man_IP_pre(MAN_ARGS) SCALE_HS_INIT(&su, INDENT); width = 0; - /* Width is the last token. */ + /* Width is the second token. */ if (MAN_IP == n->tok && NULL != nn) - if (NULL != (nn = nn->next)) { - for ( ; nn->next; nn = nn->next) - /* Do nothing. */ ; + if (NULL != (nn = nn->next)) width = a2width(nn, &su); - } /* Width is the first token. */ @@ -550,26 +547,17 @@ man_IP_pre(MAN_ARGS) print_otag(h, TAG_TD, 0, NULL); - /* - * Without a length string, we can print all of our children. - */ + /* For IP, only print the first header element. */ - if ( ! width) - return(1); + if (MAN_IP == n->tok && n->child) + print_man_node(m, n->child, mh, h); - /* - * When a length has been specified, we need to carefully print - * our child context: IP gets all children printed but the last - * (the width), while TP gets all children printed but the first - * (the width). - */ + /* For TP, only print next-line header elements. */ - if (MAN_IP == n->tok) - for (nn = n->child; nn->next; nn = nn->next) - print_man_node(m, nn, mh, h); if (MAN_TP == n->tok) - for (nn = n->child->next; nn; nn = nn->next) - print_man_node(m, nn, mh, h); + for (nn = n->child; nn; nn = nn->next) + if (nn->line > n->line) + print_man_node(m, nn, mh, h); return(0); } diff --git a/man_term.c b/man_term.c index 0e3ace74..8394e3e8 100644 --- a/man_term.c +++ b/man_term.c @@ -1,6 +1,7 @@ /* $Id$ */ /* * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons + * Copyright (c) 2010, 2011 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 @@ -513,7 +514,7 @@ pre_IP(DECL_ARGS) { const struct man_node *nn; size_t len; - int ival; + int savelit, ival; switch (n->type) { case (MAN_BODY): @@ -533,15 +534,11 @@ pre_IP(DECL_ARGS) len = mt->lmargin; ival = -1; - /* Calculate offset. */ - + /* Calculate the offset from the optional second argument. */ if (NULL != (nn = n->parent->head->child)) - if (NULL != (nn = nn->next)) { - for ( ; nn->next; nn = nn->next) - /* Do nothing. */ ; + if (NULL != (nn = nn->next)) if ((ival = a2width(p, nn->string)) >= 0) len = (size_t)ival; - } switch (n->type) { case (MAN_HEAD): @@ -557,9 +554,15 @@ pre_IP(DECL_ARGS) /* Set the saved left-margin. */ mt->lmargin = (size_t)ival; - /* Don't print the length value. */ - for (nn = n->child; nn->next; nn = nn->next) - print_man_node(p, mt, nn, m); + savelit = MANT_LITERAL & mt->fl; + mt->fl &= ~MANT_LITERAL; + + if (n->child) + print_man_node(p, mt, n->child, m); + + if (savelit) + mt->fl |= MANT_LITERAL; + return(0); case (MAN_BODY): p->offset = mt->offset + len; @@ -585,7 +588,7 @@ post_IP(DECL_ARGS) p->rmargin = p->maxrmargin; break; case (MAN_BODY): - term_flushln(p); + term_newln(p); p->flags &= ~TERMP_NOLPAD; break; default: @@ -600,12 +603,11 @@ pre_TP(DECL_ARGS) { const struct man_node *nn; size_t len; - int ival; + int savelit, ival; switch (n->type) { case (MAN_HEAD): p->flags |= TERMP_NOBREAK; - p->flags |= TERMP_TWOSPACE; break; case (MAN_BODY): p->flags |= TERMP_NOLPAD; @@ -640,11 +642,17 @@ pre_TP(DECL_ARGS) p->offset = mt->offset; p->rmargin = mt->offset + len; + savelit = MANT_LITERAL & mt->fl; + mt->fl &= ~MANT_LITERAL; + /* Don't print same-line elements. */ - for (nn = n->child; nn; nn = nn->next) + for (nn = n->child; nn; nn = nn->next) if (nn->line > n->line) print_man_node(p, mt, nn, m); + if (savelit) + mt->fl |= MANT_LITERAL; + if (ival >= 0) mt->lmargin = (size_t)ival; @@ -674,7 +682,7 @@ post_TP(DECL_ARGS) p->rmargin = p->maxrmargin; break; case (MAN_BODY): - term_flushln(p); + term_newln(p); p->flags &= ~TERMP_NOLPAD; break; default: @@ -861,6 +869,7 @@ print_man_node(DECL_ARGS) p->rmargin = p->maxrmargin = TERM_MAXMARGIN; p->flags |= TERMP_NOSPACE; term_flushln(p); + p->flags &= ~TERMP_NOLPAD; p->rmargin = rm; p->maxrmargin = rmax; } -- cgit