=================================================================== RCS file: /cvs/mandoc/man_term.c,v retrieving revision 1.60 retrieving revision 1.75 diff -u -p -r1.60 -r1.75 --- mandoc/man_term.c 2010/05/10 08:05:17 1.60 +++ mandoc/man_term.c 2010/06/10 23:24:37 1.75 @@ -1,4 +1,4 @@ -/* $Id: man_term.c,v 1.60 2010/05/10 08:05:17 kristaps Exp $ */ +/* $Id: man_term.c,v 1.75 2010/06/10 23:24:37 schwarze Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -26,6 +26,7 @@ #include #include +#include "mandoc.h" #include "out.h" #include "man.h" #include "term.h" @@ -72,12 +73,10 @@ struct termact { static int a2width(const struct man_node *); static int a2height(const struct man_node *); -static void print_man_head(struct termp *, - const struct man_meta *); static void print_man_nodelist(DECL_ARGS); static void print_man_node(DECL_ARGS); -static void print_man_foot(struct termp *, - const struct man_meta *); +static void print_man_head(struct termp *, const void *); +static void print_man_foot(struct termp *, const void *); static void print_bvspace(struct termp *, const struct man_node *); @@ -142,12 +141,7 @@ static const struct termact termacts[MAN_MAX] = { { pre_sp, NULL, MAN_NOTEXT }, /* Sp */ { pre_nf, NULL, 0 }, /* Vb */ { pre_fi, NULL, 0 }, /* Ve */ - { pre_ign, NULL, MAN_NOTEXT }, /* de */ - { pre_ign, NULL, MAN_NOTEXT }, /* dei */ - { pre_ign, NULL, MAN_NOTEXT }, /* am */ - { pre_ign, NULL, MAN_NOTEXT }, /* ami */ - { pre_ign, NULL, MAN_NOTEXT }, /* ig */ - { NULL, NULL, 0 }, /* . */ + { pre_ign, NULL, 0 }, /* AT */ }; @@ -163,7 +157,8 @@ terminal_man(void *arg, const struct man *man) p = (struct termp *)arg; p->overstep = 0; - p->maxrmargin = 65; + p->maxrmargin = p->defrmargin; + p->tabwidth = 5; if (NULL == p->symtab) switch (p->enc) { @@ -178,7 +173,7 @@ terminal_man(void *arg, const struct man *man) n = man_node(man); m = man_meta(man); - print_man_head(p, m); + term_begin(p, print_man_head, print_man_foot, m); p->flags |= TERMP_NOSPACE; mt.fl = 0; @@ -187,7 +182,8 @@ terminal_man(void *arg, const struct man *man) if (n->child) print_man_nodelist(p, &mt, n->child, m); - print_man_foot(p, m); + + term_end(p); } @@ -369,7 +365,7 @@ pre_sp(DECL_ARGS) if (0 == len) term_newln(p); - for (i = 0; i < len; i++) + for (i = 0; i <= len; i++) term_vspace(p); return(0); @@ -484,7 +480,6 @@ pre_IP(DECL_ARGS) break; case (MAN_HEAD): p->flags |= TERMP_NOBREAK; - p->flags |= TERMP_TWOSPACE; break; case (MAN_BLOCK): print_bvspace(p, n); @@ -545,7 +540,6 @@ post_IP(DECL_ARGS) case (MAN_HEAD): term_flushln(p); p->flags &= ~TERMP_NOBREAK; - p->flags &= ~TERMP_TWOSPACE; p->rmargin = p->maxrmargin; break; case (MAN_BODY): @@ -710,6 +704,9 @@ pre_SH(DECL_ARGS) if (n->prev && MAN_SH == n->prev->tok) if (NULL == n->prev->body->child) break; + /* If the first macro, no vspae. */ + if (NULL == n->prev) + break; term_vspace(p); break; case (MAN_HEAD): @@ -800,6 +797,7 @@ post_RS(DECL_ARGS) static void print_man_node(DECL_ARGS) { + size_t rm, rmax; int c; c = 1; @@ -816,10 +814,13 @@ print_man_node(DECL_ARGS) /* FIXME: this means that macro lines are munged! */ if (MANT_LITERAL & mt->fl) { + rm = p->rmargin; + rmax = p->maxrmargin; p->rmargin = p->maxrmargin = TERM_MAXMARGIN; p->flags |= TERMP_NOSPACE; term_flushln(p); - p->rmargin = p->maxrmargin = 65; + p->rmargin = rm; + p->maxrmargin = rmax; } break; default: @@ -839,6 +840,9 @@ print_man_node(DECL_ARGS) if ( ! (MAN_NOTEXT & termacts[n->tok].flags)) term_fontrepl(p, TERMFONT_NONE); } + + if (MAN_EOS & n->flags) + p->flags |= TERMP_SENTENCE; } @@ -854,15 +858,23 @@ print_man_nodelist(DECL_ARGS) static void -print_man_foot(struct termp *p, const struct man_meta *meta) +print_man_foot(struct termp *p, const void *arg) { char buf[DATESIZ]; + const struct man_meta *meta; + meta = (const struct man_meta *)arg; + term_fontrepl(p, TERMFONT_NONE); - time2a(meta->date, buf, DATESIZ); + if (meta->rawdate) + strlcpy(buf, meta->rawdate, DATESIZ); + else + time2a(meta->date, buf, DATESIZ); term_vspace(p); + term_vspace(p); + term_vspace(p); p->flags |= TERMP_NOSPACE | TERMP_NOBREAK; p->rmargin = p->maxrmargin - strlen(buf); @@ -885,11 +897,20 @@ print_man_foot(struct termp *p, const struct man_meta static void -print_man_head(struct termp *p, const struct man_meta *m) +print_man_head(struct termp *p, const void *arg) { char buf[BUFSIZ], title[BUFSIZ]; size_t buflen, titlen; + const struct man_meta *m; + m = (const struct man_meta *)arg; + + /* + * Note that old groff would spit out some spaces before the + * header. We discontinue this strange behaviour, but at one + * point we did so here. + */ + p->rmargin = p->maxrmargin; p->offset = 0; @@ -899,7 +920,7 @@ print_man_head(struct termp *p, const struct man_meta strlcpy(buf, m->vol, BUFSIZ); buflen = strlen(buf); - snprintf(title, BUFSIZ, "%s(%d)", m->title, m->msec); + snprintf(title, BUFSIZ, "%s(%s)", m->title, m->msec); titlen = strlen(title); p->offset = 0; @@ -931,4 +952,13 @@ print_man_head(struct termp *p, const struct man_meta p->rmargin = p->maxrmargin; p->offset = 0; p->flags &= ~TERMP_NOSPACE; + + /* + * Groff likes to have some leading spaces before content. Well + * that's fine by me. + */ + + term_vspace(p); + term_vspace(p); + term_vspace(p); }