=================================================================== RCS file: /cvs/mandoc/mdoc_man.c,v retrieving revision 1.37 retrieving revision 1.42 diff -u -p -r1.37 -r1.42 --- mandoc/mdoc_man.c 2012/07/13 20:43:40 1.37 +++ mandoc/mdoc_man.c 2012/11/17 00:26:33 1.42 @@ -1,4 +1,4 @@ -/* $Id: mdoc_man.c,v 1.37 2012/07/13 20:43:40 schwarze Exp $ */ +/* $Id: mdoc_man.c,v 1.42 2012/11/17 00:26:33 schwarze Exp $ */ /* * Copyright (c) 2011, 2012 Ingo Schwarze * @@ -28,7 +28,7 @@ #include "mdoc.h" #include "main.h" -#define DECL_ARGS const struct mdoc_meta *m, \ +#define DECL_ARGS const struct mdoc_meta *meta, \ const struct mdoc_node *n struct manact { @@ -471,14 +471,15 @@ man_man(void *arg, const struct man *man) void man_mdoc(void *arg, const struct mdoc *mdoc) { - const struct mdoc_meta *m; + const struct mdoc_meta *meta; const struct mdoc_node *n; - m = mdoc_meta(mdoc); + meta = mdoc_meta(mdoc); n = mdoc_node(mdoc); printf(".TH \"%s\" \"%s\" \"%s\" \"%s\" \"%s\"", - m->title, m->msec, m->date, m->os, m->vol); + meta->title, meta->msec, meta->date, + meta->os, meta->vol); outflags = MMAN_nl | MMAN_Sm; if (0 == fontqueue.size) { @@ -486,7 +487,7 @@ man_mdoc(void *arg, const struct mdoc *mdoc) fontqueue.head = fontqueue.tail = mandoc_malloc(8); *fontqueue.tail = 'R'; } - print_node(m, n); + print_node(meta, n); putchar('\n'); } @@ -527,9 +528,9 @@ print_node(DECL_ARGS) * node. */ act = manacts + n->tok; - cond = NULL == act->cond || (*act->cond)(m, n); + cond = NULL == act->cond || (*act->cond)(meta, n); if (cond && act->pre) - do_sub = (*act->pre)(m, n); + do_sub = (*act->pre)(meta, n); } /* @@ -539,13 +540,13 @@ print_node(DECL_ARGS) */ if (do_sub) for (sub = n->child; sub; sub = sub->next) - print_node(m, sub); + print_node(meta, sub); /* * Lastly, conditionally run the post-node handler. */ if (cond && act->post) - (*act->post)(m, n); + (*act->post)(meta, n); } static int @@ -636,7 +637,7 @@ post__t(DECL_ARGS) putchar('\"'); } else font_pop(); - post_percent(m, n); + post_percent(meta, n); } /* @@ -939,7 +940,7 @@ pre_fa(DECL_ARGS) while (NULL != n) { font_push('I'); - print_node(m, n); + print_node(meta, n); font_pop(); if (NULL != (n = n->next)) print_word(","); @@ -1003,7 +1004,7 @@ pre_fn(DECL_ARGS) return(0); font_push('B'); - print_node(m, n); + print_node(meta, n); font_pop(); outflags &= ~MMAN_spc; print_word("("); @@ -1011,7 +1012,7 @@ pre_fn(DECL_ARGS) n = n->next; if (NULL != n) - pre_fa(m, n); + pre_fa(meta, n); return(0); } @@ -1057,7 +1058,7 @@ post_fo(DECL_ARGS) font_pop(); break; case (MDOC_BODY): - post_fn(m, n); + post_fn(meta, n); break; default: break; @@ -1116,7 +1117,8 @@ pre_it(DECL_ARGS) outflags |= MMAN_PP | MMAN_nl; bln = n->parent->parent; if (0 == bln->norm->Bl.comp || - NULL == bln->parent->prev) + (NULL == n->parent->prev && + NULL == bln->parent->prev)) outflags |= MMAN_sp; outflags &= ~MMAN_br; switch (bln->norm->Bl.type) { @@ -1249,16 +1251,25 @@ pre_li(DECL_ARGS) static int pre_nm(DECL_ARGS) { + char *name; if (MDOC_BLOCK == n->type) pre_syn(n); if (MDOC_ELEM != n->type && MDOC_HEAD != n->type) return(1); - if (NULL == n->child && NULL == m->name) + name = n->child ? n->child->string : meta->name; + if (NULL == name) return(0); + if (MDOC_HEAD == n->type) { + if (NULL == n->parent->prev) + outflags |= MMAN_sp; + print_block(".HP", 0); + printf(" %ldn", strlen(name) + 1); + outflags |= MMAN_nl; + } font_push('B'); if (NULL == n->child) - print_word(m->name); + print_word(meta->name); return(1); } @@ -1332,7 +1343,11 @@ static int pre_sp(DECL_ARGS) { - print_line(".sp", MMAN_nl); + if (MMAN_PP & outflags) { + outflags &= ~MMAN_PP; + print_line(".PP", 0); + } else + print_line(".sp", 0); return(1); } @@ -1386,13 +1401,13 @@ pre_xr(DECL_ARGS) n = n->child; if (NULL == n) return(0); - print_node(m, n); + print_node(meta, n); n = n->next; if (NULL == n) return(0); outflags &= ~MMAN_spc; print_word("("); - print_node(m, n); + print_node(meta, n); print_word(")"); return(0); }