=================================================================== RCS file: /cvs/mandoc/mdoc_term.c,v retrieving revision 1.264 retrieving revision 1.268 diff -u -p -r1.264 -r1.268 --- mandoc/mdoc_term.c 2014/04/20 16:46:05 1.264 +++ mandoc/mdoc_term.c 2014/07/02 03:48:07 1.268 @@ -1,4 +1,4 @@ -/* $Id: mdoc_term.c,v 1.264 2014/04/20 16:46:05 schwarze Exp $ */ +/* $Id: mdoc_term.c,v 1.268 2014/07/02 03:48:07 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010, 2012, 2013, 2014 Ingo Schwarze @@ -30,6 +30,7 @@ #include #include "mandoc.h" +#include "mandoc_aux.h" #include "out.h" #include "term.h" #include "mdoc.h" @@ -94,6 +95,7 @@ static int termp_bt_pre(DECL_ARGS); static int termp_bx_pre(DECL_ARGS); static int termp_cd_pre(DECL_ARGS); static int termp_d1_pre(DECL_ARGS); +static int termp_es_pre(DECL_ARGS); static int termp_ex_pre(DECL_ARGS); static int termp_fa_pre(DECL_ARGS); static int termp_fd_pre(DECL_ARGS); @@ -157,7 +159,7 @@ static const struct termact termacts[MDOC_MAX] = { { termp_nd_pre, NULL }, /* Nd */ { termp_nm_pre, termp_nm_post }, /* Nm */ { termp_quote_pre, termp_quote_post }, /* Op */ - { NULL, NULL }, /* Ot */ + { termp_ft_pre, NULL }, /* Ot */ { termp_under_pre, NULL }, /* Pa */ { termp_rv_pre, NULL }, /* Rv */ { NULL, NULL }, /* St */ @@ -227,7 +229,7 @@ static const struct termact termacts[MDOC_MAX] = { { NULL, NULL }, /* Ek */ { termp_bt_pre, NULL }, /* Bt */ { NULL, NULL }, /* Hf */ - { NULL, NULL }, /* Fr */ + { termp_under_pre, NULL }, /* Fr */ { termp_ud_pre, NULL }, /* Ud */ { NULL, termp_lb_post }, /* Lb */ { termp_sp_pre, NULL }, /* Lp */ @@ -237,8 +239,8 @@ static const struct termact termacts[MDOC_MAX] = { { termp_quote_pre, termp_quote_post }, /* Bro */ { NULL, NULL }, /* Brc */ { NULL, termp____post }, /* %C */ - { NULL, NULL }, /* Es */ /* TODO */ - { NULL, NULL }, /* En */ /* TODO */ + { termp_es_pre, NULL }, /* Es */ + { termp_quote_pre, termp_quote_post }, /* En */ { termp_xx_pre, NULL }, /* Dx */ { NULL, termp____post }, /* %Q */ { termp_sp_pre, NULL }, /* br */ @@ -441,9 +443,9 @@ print_mdoc_foot(struct termp *p, const void *arg) static void print_mdoc_head(struct termp *p, const void *arg) { - char buf[BUFSIZ], title[BUFSIZ]; - size_t buflen, titlen; - const struct mdoc_meta *meta; + const struct mdoc_meta *meta; + char *volume, *title; + size_t vollen, titlen; meta = (const struct mdoc_meta *)arg; @@ -464,35 +466,32 @@ print_mdoc_head(struct termp *p, const void *arg) p->rmargin = p->maxrmargin; assert(meta->vol); - strlcpy(buf, meta->vol, BUFSIZ); - buflen = term_strlen(p, buf); + if (NULL == meta->arch) + volume = mandoc_strdup(meta->vol); + else + mandoc_asprintf(&volume, "%s (%s)", + meta->vol, meta->arch); + vollen = term_strlen(p, volume); - if (meta->arch) { - strlcat(buf, " (", BUFSIZ); - strlcat(buf, meta->arch, BUFSIZ); - strlcat(buf, ")", BUFSIZ); - } - - snprintf(title, BUFSIZ, "%s(%s)", meta->title, meta->msec); + mandoc_asprintf(&title, "%s(%s)", meta->title, meta->msec); titlen = term_strlen(p, title); p->flags |= TERMP_NOBREAK | TERMP_NOSPACE; p->trailspace = 1; p->offset = 0; - p->rmargin = 2 * (titlen+1) + buflen < p->maxrmargin ? - (p->maxrmargin - - term_strlen(p, buf) + term_len(p, 1)) / 2 : - p->maxrmargin - buflen; + p->rmargin = 2 * (titlen+1) + vollen < p->maxrmargin ? + (p->maxrmargin - vollen + term_len(p, 1)) / 2 : + p->maxrmargin - vollen; term_word(p, title); term_flushln(p); p->flags |= TERMP_NOSPACE; p->offset = p->rmargin; - p->rmargin = p->offset + buflen + titlen < p->maxrmargin ? + p->rmargin = p->offset + vollen + titlen < p->maxrmargin ? p->maxrmargin - titlen : p->maxrmargin; - term_word(p, buf); + term_word(p, volume); term_flushln(p); p->flags &= ~TERMP_NOBREAK; @@ -508,6 +507,8 @@ print_mdoc_head(struct termp *p, const void *arg) p->flags &= ~TERMP_NOSPACE; p->offset = 0; p->rmargin = p->maxrmargin; + free(title); + free(volume); } static size_t @@ -620,7 +621,7 @@ static int termp_it_pre(DECL_ARGS) { const struct mdoc_node *bl, *nn; - char buf[7]; + char buf[24]; int i; size_t width, offset, ncols, dcol; enum mdoc_list type; @@ -916,7 +917,7 @@ termp_it_pre(DECL_ARGS) break; case LIST_enum: (pair->ppair->ppair->count)++; - snprintf(buf, sizeof(buf), "%d.", + (void)snprintf(buf, sizeof(buf), "%d.", pair->ppair->ppair->count); term_word(p, buf); break; @@ -1829,6 +1830,13 @@ termp_sp_pre(DECL_ARGS) } static int +termp_es_pre(DECL_ARGS) +{ + + return(0); +} + +static int termp_quote_pre(DECL_ARGS) { @@ -1860,6 +1868,12 @@ termp_quote_pre(DECL_ARGS) case MDOC_Dq: term_word(p, "\\(lq"); break; + case MDOC_En: + if (NULL == n->norm->Es || + NULL == n->norm->Es->child) + return(1); + term_word(p, n->norm->Es->child->string); + break; case MDOC_Eo: break; case MDOC_Po: @@ -1897,7 +1911,8 @@ termp_quote_post(DECL_ARGS) if (MDOC_BODY != n->type && MDOC_ELEM != n->type) return; - p->flags |= TERMP_NOSPACE; + if (MDOC_En != n->tok) + p->flags |= TERMP_NOSPACE; switch (n->tok) { case MDOC_Ao: @@ -1923,6 +1938,14 @@ termp_quote_post(DECL_ARGS) /* FALLTHROUGH */ case MDOC_Dq: term_word(p, "\\(rq"); + break; + case MDOC_En: + if (NULL != n->norm->Es && + NULL != n->norm->Es->child && + NULL != n->norm->Es->child->next) { + p->flags |= TERMP_NOSPACE; + term_word(p, n->norm->Es->child->next->string); + } break; case MDOC_Eo: break;