=================================================================== RCS file: /cvs/mandoc/man_term.c,v retrieving revision 1.105 retrieving revision 1.111 diff -u -p -r1.105 -r1.111 --- mandoc/man_term.c 2011/03/22 10:13:01 1.105 +++ mandoc/man_term.c 2011/06/18 17:58:48 1.111 @@ -1,4 +1,4 @@ -/* $Id: man_term.c,v 1.105 2011/03/22 10:13:01 kristaps Exp $ */ +/* $Id: man_term.c,v 1.111 2011/06/18 17:58:48 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010, 2011 Ingo Schwarze @@ -156,14 +156,7 @@ terminal_man(void *arg, const struct man *man) p->tabwidth = term_len(p, 5); if (NULL == p->symtab) - switch (p->enc) { - case (TERMENC_ASCII): - p->symtab = chars_init(CHARS_ASCII); - break; - default: - abort(); - /* NOTREACHED */ - } + p->symtab = mchars_alloc(); n = man_node(man); m = man_meta(man); @@ -205,27 +198,31 @@ a2width(const struct termp *p, const char *cp) return((int)term_hspan(p, &su)); } - +/* + * Printing leading vertical space before a block. + * This is used for the paragraph macros. + * The rules are pretty simple, since there's very little nesting going + * on here. Basically, if we're the first within another block (SS/SH), + * then don't emit vertical space. If we are (RS), then do. If not the + * first, print it. + */ static void print_bvspace(struct termp *p, const struct man_node *n) { + term_newln(p); - if (n->body && n->body->child && MAN_TBL == n->body->child->type) - return; + if (n->body && n->body->child) + if (MAN_TBL == n->body->child->type) + return; - if (NULL == n->prev) - return; + if (MAN_ROOT == n->parent->type || MAN_RS != n->parent->tok) + if (NULL == n->prev) + return; - if (MAN_SS == n->prev->tok) - return; - if (MAN_SH == n->prev->tok) - return; - term_vspace(p); } - /* ARGSUSED */ static int pre_ign(DECL_ARGS) @@ -798,13 +795,12 @@ post_SH(DECL_ARGS) } } - /* ARGSUSED */ static int pre_RS(DECL_ARGS) { - const struct man_node *nn; - int ival; + int ival; + size_t sz; switch (n->type) { case (MAN_BLOCK): @@ -816,40 +812,44 @@ pre_RS(DECL_ARGS) break; } - if (NULL == (nn = n->parent->head->child)) { - mt->offset = mt->lmargin + term_len(p, INDENT); - p->offset = mt->offset; - return(1); - } + sz = term_len(p, INDENT); - if ((ival = a2width(p, nn->string)) < 0) - return(1); + if (NULL != (n = n->parent->head->child)) + if ((ival = a2width(p, n->string)) >= 0) + sz = (size_t)ival; - mt->offset = term_len(p, INDENT) + (size_t)ival; + mt->offset += sz; p->offset = mt->offset; return(1); } - /* ARGSUSED */ static void post_RS(DECL_ARGS) { + int ival; + size_t sz; switch (n->type) { case (MAN_BLOCK): - mt->offset = mt->lmargin = term_len(p, INDENT); - break; + return; case (MAN_HEAD): - break; + return; default: term_newln(p); - p->offset = term_len(p, INDENT); break; } -} + sz = term_len(p, INDENT); + + if (NULL != (n = n->parent->head->child)) + if ((ival = a2width(p, n->string)) >= 0) + sz = (size_t)ival; + + mt->offset = mt->offset < sz ? 0 : mt->offset - sz; + p->offset = mt->offset; +} static void print_man_node(DECL_ARGS)