version 1.338, 2017/01/10 13:47:00 |
version 1.350, 2017/04/24 23:06:18 |
|
|
/* $Id$ */ |
/* $Id$ */ |
/* |
/* |
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2010, 2012-2016 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2010, 2012-2017 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2013 Franco Fichtner <franco@lastsummer.de> |
* Copyright (c) 2013 Franco Fichtner <franco@lastsummer.de> |
* |
* |
* Permission to use, copy, modify, and distribute this software for any |
* Permission to use, copy, modify, and distribute this software for any |
Line 80 static void termp_pf_post(DECL_ARGS); |
|
Line 80 static void termp_pf_post(DECL_ARGS); |
|
static void termp_quote_post(DECL_ARGS); |
static void termp_quote_post(DECL_ARGS); |
static void termp_sh_post(DECL_ARGS); |
static void termp_sh_post(DECL_ARGS); |
static void termp_ss_post(DECL_ARGS); |
static void termp_ss_post(DECL_ARGS); |
|
static void termp_xx_post(DECL_ARGS); |
|
|
static int termp__a_pre(DECL_ARGS); |
static int termp__a_pre(DECL_ARGS); |
static int termp__t_pre(DECL_ARGS); |
static int termp__t_pre(DECL_ARGS); |
Line 90 static int termp_bf_pre(DECL_ARGS); |
|
Line 91 static int termp_bf_pre(DECL_ARGS); |
|
static int termp_bk_pre(DECL_ARGS); |
static int termp_bk_pre(DECL_ARGS); |
static int termp_bl_pre(DECL_ARGS); |
static int termp_bl_pre(DECL_ARGS); |
static int termp_bold_pre(DECL_ARGS); |
static int termp_bold_pre(DECL_ARGS); |
static int termp_bt_pre(DECL_ARGS); |
|
static int termp_bx_pre(DECL_ARGS); |
|
static int termp_cd_pre(DECL_ARGS); |
static int termp_cd_pre(DECL_ARGS); |
static int termp_d1_pre(DECL_ARGS); |
static int termp_d1_pre(DECL_ARGS); |
static int termp_eo_pre(DECL_ARGS); |
static int termp_eo_pre(DECL_ARGS); |
Line 114 static int termp_nm_pre(DECL_ARGS); |
|
Line 113 static int termp_nm_pre(DECL_ARGS); |
|
static int termp_ns_pre(DECL_ARGS); |
static int termp_ns_pre(DECL_ARGS); |
static int termp_quote_pre(DECL_ARGS); |
static int termp_quote_pre(DECL_ARGS); |
static int termp_rs_pre(DECL_ARGS); |
static int termp_rs_pre(DECL_ARGS); |
static int termp_rv_pre(DECL_ARGS); |
|
static int termp_sh_pre(DECL_ARGS); |
static int termp_sh_pre(DECL_ARGS); |
static int termp_skip_pre(DECL_ARGS); |
static int termp_skip_pre(DECL_ARGS); |
static int termp_sm_pre(DECL_ARGS); |
static int termp_sm_pre(DECL_ARGS); |
Line 123 static int termp_ss_pre(DECL_ARGS); |
|
Line 121 static int termp_ss_pre(DECL_ARGS); |
|
static int termp_sy_pre(DECL_ARGS); |
static int termp_sy_pre(DECL_ARGS); |
static int termp_tag_pre(DECL_ARGS); |
static int termp_tag_pre(DECL_ARGS); |
static int termp_under_pre(DECL_ARGS); |
static int termp_under_pre(DECL_ARGS); |
static int termp_ud_pre(DECL_ARGS); |
|
static int termp_vt_pre(DECL_ARGS); |
static int termp_vt_pre(DECL_ARGS); |
static int termp_xr_pre(DECL_ARGS); |
static int termp_xr_pre(DECL_ARGS); |
static int termp_xx_pre(DECL_ARGS); |
static int termp_xx_pre(DECL_ARGS); |
|
|
static const struct termact termacts[MDOC_MAX] = { |
static const struct termact __termacts[MDOC_MAX - MDOC_Dd] = { |
{ termp_ap_pre, NULL }, /* Ap */ |
|
{ NULL, NULL }, /* Dd */ |
{ NULL, NULL }, /* Dd */ |
{ NULL, NULL }, /* Dt */ |
{ NULL, NULL }, /* Dt */ |
{ NULL, NULL }, /* Os */ |
{ NULL, NULL }, /* Os */ |
Line 145 static const struct termact termacts[MDOC_MAX] = { |
|
Line 141 static const struct termact termacts[MDOC_MAX] = { |
|
{ termp_it_pre, termp_it_post }, /* It */ |
{ termp_it_pre, termp_it_post }, /* It */ |
{ termp_under_pre, NULL }, /* Ad */ |
{ termp_under_pre, NULL }, /* Ad */ |
{ termp_an_pre, NULL }, /* An */ |
{ termp_an_pre, NULL }, /* An */ |
|
{ termp_ap_pre, NULL }, /* Ap */ |
{ termp_under_pre, NULL }, /* Ar */ |
{ termp_under_pre, NULL }, /* Ar */ |
{ termp_cd_pre, NULL }, /* Cd */ |
{ termp_cd_pre, NULL }, /* Cd */ |
{ termp_bold_pre, NULL }, /* Cm */ |
{ termp_bold_pre, NULL }, /* Cm */ |
Line 165 static const struct termact termacts[MDOC_MAX] = { |
|
Line 162 static const struct termact termacts[MDOC_MAX] = { |
|
{ termp_quote_pre, termp_quote_post }, /* Op */ |
{ termp_quote_pre, termp_quote_post }, /* Op */ |
{ termp_ft_pre, NULL }, /* Ot */ |
{ termp_ft_pre, NULL }, /* Ot */ |
{ termp_under_pre, NULL }, /* Pa */ |
{ termp_under_pre, NULL }, /* Pa */ |
{ termp_rv_pre, NULL }, /* Rv */ |
{ termp_ex_pre, NULL }, /* Rv */ |
{ NULL, NULL }, /* St */ |
{ NULL, NULL }, /* St */ |
{ termp_under_pre, NULL }, /* Va */ |
{ termp_under_pre, NULL }, /* Va */ |
{ termp_vt_pre, NULL }, /* Vt */ |
{ termp_vt_pre, NULL }, /* Vt */ |
Line 189 static const struct termact termacts[MDOC_MAX] = { |
|
Line 186 static const struct termact termacts[MDOC_MAX] = { |
|
{ termp_bf_pre, NULL }, /* Bf */ |
{ termp_bf_pre, NULL }, /* Bf */ |
{ termp_quote_pre, termp_quote_post }, /* Bo */ |
{ termp_quote_pre, termp_quote_post }, /* Bo */ |
{ termp_quote_pre, termp_quote_post }, /* Bq */ |
{ termp_quote_pre, termp_quote_post }, /* Bq */ |
{ termp_xx_pre, NULL }, /* Bsx */ |
{ termp_xx_pre, termp_xx_post }, /* Bsx */ |
{ termp_bx_pre, NULL }, /* Bx */ |
{ NULL, NULL }, /* Bx */ |
{ termp_skip_pre, NULL }, /* Db */ |
{ termp_skip_pre, NULL }, /* Db */ |
{ NULL, NULL }, /* Dc */ |
{ NULL, NULL }, /* Dc */ |
{ termp_quote_pre, termp_quote_post }, /* Do */ |
{ termp_quote_pre, termp_quote_post }, /* Do */ |
Line 199 static const struct termact termacts[MDOC_MAX] = { |
|
Line 196 static const struct termact termacts[MDOC_MAX] = { |
|
{ NULL, NULL }, /* Ef */ |
{ NULL, NULL }, /* Ef */ |
{ termp_em_pre, NULL }, /* Em */ |
{ termp_em_pre, NULL }, /* Em */ |
{ termp_eo_pre, termp_eo_post }, /* Eo */ |
{ termp_eo_pre, termp_eo_post }, /* Eo */ |
{ termp_xx_pre, NULL }, /* Fx */ |
{ termp_xx_pre, termp_xx_post }, /* Fx */ |
{ termp_bold_pre, NULL }, /* Ms */ |
{ termp_bold_pre, NULL }, /* Ms */ |
{ termp_li_pre, NULL }, /* No */ |
{ termp_li_pre, NULL }, /* No */ |
{ termp_ns_pre, NULL }, /* Ns */ |
{ termp_ns_pre, NULL }, /* Ns */ |
{ termp_xx_pre, NULL }, /* Nx */ |
{ termp_xx_pre, termp_xx_post }, /* Nx */ |
{ termp_xx_pre, NULL }, /* Ox */ |
{ termp_xx_pre, termp_xx_post }, /* Ox */ |
{ NULL, NULL }, /* Pc */ |
{ NULL, NULL }, /* Pc */ |
{ NULL, termp_pf_post }, /* Pf */ |
{ NULL, termp_pf_post }, /* Pf */ |
{ termp_quote_pre, termp_quote_post }, /* Po */ |
{ termp_quote_pre, termp_quote_post }, /* Po */ |
Line 222 static const struct termact termacts[MDOC_MAX] = { |
|
Line 219 static const struct termact termacts[MDOC_MAX] = { |
|
{ termp_under_pre, NULL }, /* Sx */ |
{ termp_under_pre, NULL }, /* Sx */ |
{ termp_sy_pre, NULL }, /* Sy */ |
{ termp_sy_pre, NULL }, /* Sy */ |
{ NULL, NULL }, /* Tn */ |
{ NULL, NULL }, /* Tn */ |
{ termp_xx_pre, NULL }, /* Ux */ |
{ termp_xx_pre, termp_xx_post }, /* Ux */ |
{ NULL, NULL }, /* Xc */ |
{ NULL, NULL }, /* Xc */ |
{ NULL, NULL }, /* Xo */ |
{ NULL, NULL }, /* Xo */ |
{ termp_fo_pre, termp_fo_post }, /* Fo */ |
{ termp_fo_pre, termp_fo_post }, /* Fo */ |
Line 231 static const struct termact termacts[MDOC_MAX] = { |
|
Line 228 static const struct termact termacts[MDOC_MAX] = { |
|
{ NULL, NULL }, /* Oc */ |
{ NULL, NULL }, /* Oc */ |
{ termp_bk_pre, termp_bk_post }, /* Bk */ |
{ termp_bk_pre, termp_bk_post }, /* Bk */ |
{ NULL, NULL }, /* Ek */ |
{ NULL, NULL }, /* Ek */ |
{ termp_bt_pre, NULL }, /* Bt */ |
{ NULL, NULL }, /* Bt */ |
{ NULL, NULL }, /* Hf */ |
{ NULL, NULL }, /* Hf */ |
{ termp_under_pre, NULL }, /* Fr */ |
{ termp_under_pre, NULL }, /* Fr */ |
{ termp_ud_pre, NULL }, /* Ud */ |
{ NULL, NULL }, /* Ud */ |
{ NULL, termp_lb_post }, /* Lb */ |
{ NULL, termp_lb_post }, /* Lb */ |
{ termp_sp_pre, NULL }, /* Lp */ |
{ termp_sp_pre, NULL }, /* Lp */ |
{ termp_lk_pre, NULL }, /* Lk */ |
{ termp_lk_pre, NULL }, /* Lk */ |
Line 245 static const struct termact termacts[MDOC_MAX] = { |
|
Line 242 static const struct termact termacts[MDOC_MAX] = { |
|
{ NULL, termp____post }, /* %C */ |
{ NULL, termp____post }, /* %C */ |
{ termp_skip_pre, NULL }, /* Es */ |
{ termp_skip_pre, NULL }, /* Es */ |
{ termp_quote_pre, termp_quote_post }, /* En */ |
{ termp_quote_pre, termp_quote_post }, /* En */ |
{ termp_xx_pre, NULL }, /* Dx */ |
{ termp_xx_pre, termp_xx_post }, /* Dx */ |
{ NULL, termp____post }, /* %Q */ |
{ NULL, termp____post }, /* %Q */ |
{ termp_sp_pre, NULL }, /* br */ |
{ termp_sp_pre, NULL }, /* br */ |
{ termp_sp_pre, NULL }, /* sp */ |
{ termp_sp_pre, NULL }, /* sp */ |
Line 253 static const struct termact termacts[MDOC_MAX] = { |
|
Line 250 static const struct termact termacts[MDOC_MAX] = { |
|
{ NULL, NULL }, /* Ta */ |
{ NULL, NULL }, /* Ta */ |
{ termp_ll_pre, NULL }, /* ll */ |
{ termp_ll_pre, NULL }, /* ll */ |
}; |
}; |
|
static const struct termact *const termacts = __termacts - MDOC_Dd; |
|
|
static int fn_prio; |
static int fn_prio; |
|
|
|
|
void |
void |
terminal_mdoc(void *arg, const struct roff_man *mdoc) |
terminal_mdoc(void *arg, const struct roff_man *mdoc) |
{ |
{ |
struct roff_node *n; |
struct roff_node *n; |
struct termp *p; |
struct termp *p; |
|
size_t save_defindent; |
|
|
p = (struct termp *)arg; |
p = (struct termp *)arg; |
p->overstep = 0; |
p->overstep = 0; |
Line 281 terminal_mdoc(void *arg, const struct roff_man *mdoc) |
|
Line 281 terminal_mdoc(void *arg, const struct roff_man *mdoc) |
|
n = n->next; |
n = n->next; |
} |
} |
} else { |
} else { |
|
save_defindent = p->defindent; |
if (p->defindent == 0) |
if (p->defindent == 0) |
p->defindent = 5; |
p->defindent = 5; |
term_begin(p, print_mdoc_head, print_mdoc_foot, |
term_begin(p, print_mdoc_head, print_mdoc_foot, |
Line 293 terminal_mdoc(void *arg, const struct roff_man *mdoc) |
|
Line 294 terminal_mdoc(void *arg, const struct roff_man *mdoc) |
|
print_mdoc_nodelist(p, NULL, &mdoc->meta, n); |
print_mdoc_nodelist(p, NULL, &mdoc->meta, n); |
} |
} |
term_end(p); |
term_end(p); |
|
p->defindent = save_defindent; |
} |
} |
} |
} |
|
|
Line 363 print_mdoc_node(DECL_ARGS) |
|
Line 365 print_mdoc_node(DECL_ARGS) |
|
term_tbl(p, n->span); |
term_tbl(p, n->span); |
break; |
break; |
default: |
default: |
if (termacts[n->tok].pre && |
if (termacts[n->tok].pre != NULL && |
(n->end == ENDBODY_NOT || n->child != NULL)) |
(n->end == ENDBODY_NOT || n->child != NULL)) |
chld = (*termacts[n->tok].pre) |
chld = (*termacts[n->tok].pre) |
(p, &npair, meta, n); |
(p, &npair, meta, n); |
Line 384 print_mdoc_node(DECL_ARGS) |
|
Line 386 print_mdoc_node(DECL_ARGS) |
|
case ROFFT_EQN: |
case ROFFT_EQN: |
break; |
break; |
default: |
default: |
if ( ! termacts[n->tok].post || NODE_ENDED & n->flags) |
if (termacts[n->tok].post == NULL || n->flags & NODE_ENDED) |
break; |
break; |
(void)(*termacts[n->tok].post)(p, &npair, meta, n); |
(void)(*termacts[n->tok].post)(p, &npair, meta, n); |
|
|
Line 395 print_mdoc_node(DECL_ARGS) |
|
Line 397 print_mdoc_node(DECL_ARGS) |
|
*/ |
*/ |
if (ENDBODY_NOT != n->end) |
if (ENDBODY_NOT != n->end) |
n->body->flags |= NODE_ENDED; |
n->body->flags |= NODE_ENDED; |
|
|
/* |
|
* End of line terminating an implicit block |
|
* while an explicit block is still open. |
|
* Continue the explicit block without spacing. |
|
*/ |
|
if (ENDBODY_NOSPACE == n->end) |
|
p->flags |= TERMP_NOSPACE; |
|
break; |
break; |
} |
} |
|
|
Line 614 termp_ll_pre(DECL_ARGS) |
|
Line 608 termp_ll_pre(DECL_ARGS) |
|
static int |
static int |
termp_it_pre(DECL_ARGS) |
termp_it_pre(DECL_ARGS) |
{ |
{ |
|
struct roffsu su; |
char buf[24]; |
char buf[24]; |
const struct roff_node *bl, *nn; |
const struct roff_node *bl, *nn; |
size_t ncols, dcol; |
size_t ncols, dcol; |
Line 691 termp_it_pre(DECL_ARGS) |
|
Line 686 termp_it_pre(DECL_ARGS) |
|
|
|
for (i = 0, nn = n->prev; |
for (i = 0, nn = n->prev; |
nn->prev && i < (int)ncols; |
nn->prev && i < (int)ncols; |
nn = nn->prev, i++) |
nn = nn->prev, i++) { |
offset += dcol + a2width(p, |
SCALE_HS_INIT(&su, |
bl->norm->Bl.cols[i]); |
term_strlen(p, bl->norm->Bl.cols[i])); |
|
su.scale /= term_strlen(p, "0"); |
|
offset += term_hspan(p, &su) / 24 + dcol; |
|
} |
|
|
/* |
/* |
* When exceeding the declared number of columns, leave |
* When exceeding the declared number of columns, leave |
Line 708 termp_it_pre(DECL_ARGS) |
|
Line 706 termp_it_pre(DECL_ARGS) |
|
* Use the declared column widths, extended as explained |
* Use the declared column widths, extended as explained |
* in the preceding paragraph. |
* in the preceding paragraph. |
*/ |
*/ |
width = a2width(p, bl->norm->Bl.cols[i]) + dcol; |
SCALE_HS_INIT(&su, term_strlen(p, bl->norm->Bl.cols[i])); |
|
su.scale /= term_strlen(p, "0"); |
|
width = term_hspan(p, &su) / 24 + dcol; |
break; |
break; |
default: |
default: |
if (NULL == bl->norm->Bl.width) |
if (NULL == bl->norm->Bl.width) |
Line 996 termp_nm_pre(DECL_ARGS) |
|
Line 996 termp_nm_pre(DECL_ARGS) |
|
return 1; |
return 1; |
} |
} |
|
|
if (NULL == n->child && NULL == meta->name) |
if (n->child == NULL) |
return 0; |
return 0; |
|
|
if (n->type == ROFFT_HEAD) |
if (n->type == ROFFT_HEAD) |
Line 1020 termp_nm_pre(DECL_ARGS) |
|
Line 1020 termp_nm_pre(DECL_ARGS) |
|
} |
} |
|
|
term_fontpush(p, TERMFONT_BOLD); |
term_fontpush(p, TERMFONT_BOLD); |
if (NULL == n->child) |
|
term_word(p, meta->name); |
|
return 1; |
return 1; |
} |
} |
|
|
Line 1113 termp_rs_pre(DECL_ARGS) |
|
Line 1111 termp_rs_pre(DECL_ARGS) |
|
} |
} |
|
|
static int |
static int |
termp_rv_pre(DECL_ARGS) |
|
{ |
|
struct roff_node *nch; |
|
|
|
term_newln(p); |
|
|
|
if (n->child != NULL) { |
|
term_word(p, "The"); |
|
|
|
for (nch = n->child; nch != NULL; nch = nch->next) { |
|
term_fontpush(p, TERMFONT_BOLD); |
|
term_word(p, nch->string); |
|
term_fontpop(p); |
|
|
|
p->flags |= TERMP_NOSPACE; |
|
term_word(p, "()"); |
|
|
|
if (nch->next == NULL) |
|
continue; |
|
|
|
if (nch->prev != NULL || nch->next->next != NULL) { |
|
p->flags |= TERMP_NOSPACE; |
|
term_word(p, ","); |
|
} |
|
if (nch->next->next == NULL) |
|
term_word(p, "and"); |
|
} |
|
|
|
if (n->child != NULL && n->child->next != NULL) |
|
term_word(p, "functions return"); |
|
else |
|
term_word(p, "function returns"); |
|
|
|
term_word(p, "the value\\~0 if successful;"); |
|
} else |
|
term_word(p, "Upon successful completion," |
|
" the value\\~0 is returned;"); |
|
|
|
term_word(p, "otherwise the value\\~\\-1 is returned" |
|
" and the global variable"); |
|
|
|
term_fontpush(p, TERMFONT_UNDER); |
|
term_word(p, "errno"); |
|
term_fontpop(p); |
|
|
|
term_word(p, "is set to indicate the error."); |
|
p->flags |= TERMP_SENTENCE; |
|
|
|
return 0; |
|
} |
|
|
|
static int |
|
termp_ex_pre(DECL_ARGS) |
termp_ex_pre(DECL_ARGS) |
{ |
{ |
struct roff_node *nch; |
|
|
|
term_newln(p); |
term_newln(p); |
term_word(p, "The"); |
return 1; |
|
|
for (nch = n->child; nch != NULL; nch = nch->next) { |
|
term_fontpush(p, TERMFONT_BOLD); |
|
term_word(p, nch->string); |
|
term_fontpop(p); |
|
|
|
if (nch->next == NULL) |
|
continue; |
|
|
|
if (nch->prev != NULL || nch->next->next != NULL) { |
|
p->flags |= TERMP_NOSPACE; |
|
term_word(p, ","); |
|
} |
|
|
|
if (nch->next->next == NULL) |
|
term_word(p, "and"); |
|
} |
|
|
|
if (n->child != NULL && n->child->next != NULL) |
|
term_word(p, "utilities exit\\~0"); |
|
else |
|
term_word(p, "utility exits\\~0"); |
|
|
|
term_word(p, "on success, and\\~>0 if an error occurs."); |
|
|
|
p->flags |= TERMP_SENTENCE; |
|
return 0; |
|
} |
} |
|
|
static int |
static int |
Line 1398 termp_sh_post(DECL_ARGS) |
|
Line 1315 termp_sh_post(DECL_ARGS) |
|
} |
} |
} |
} |
|
|
static int |
|
termp_bt_pre(DECL_ARGS) |
|
{ |
|
|
|
term_word(p, "is currently in beta test."); |
|
p->flags |= TERMP_SENTENCE; |
|
return 0; |
|
} |
|
|
|
static void |
static void |
termp_lb_post(DECL_ARGS) |
termp_lb_post(DECL_ARGS) |
{ |
{ |
Line 1416 termp_lb_post(DECL_ARGS) |
|
Line 1324 termp_lb_post(DECL_ARGS) |
|
} |
} |
|
|
static int |
static int |
termp_ud_pre(DECL_ARGS) |
|
{ |
|
|
|
term_word(p, "currently under development."); |
|
p->flags |= TERMP_SENTENCE; |
|
return 0; |
|
} |
|
|
|
static int |
|
termp_d1_pre(DECL_ARGS) |
termp_d1_pre(DECL_ARGS) |
{ |
{ |
|
|
Line 1652 termp_bd_post(DECL_ARGS) |
|
Line 1551 termp_bd_post(DECL_ARGS) |
|
} |
} |
|
|
static int |
static int |
termp_bx_pre(DECL_ARGS) |
termp_xx_pre(DECL_ARGS) |
{ |
{ |
|
if ((n->aux = p->flags & TERMP_PREKEEP) == 0) |
if (NULL != (n = n->child)) { |
p->flags |= TERMP_PREKEEP; |
term_word(p, n->string); |
return 1; |
p->flags |= TERMP_NOSPACE; |
|
term_word(p, "BSD"); |
|
} else { |
|
term_word(p, "BSD"); |
|
return 0; |
|
} |
|
|
|
if (NULL != (n = n->next)) { |
|
p->flags |= TERMP_NOSPACE; |
|
term_word(p, "-"); |
|
p->flags |= TERMP_NOSPACE; |
|
term_word(p, n->string); |
|
} |
|
|
|
return 0; |
|
} |
} |
|
|
static int |
static void |
termp_xx_pre(DECL_ARGS) |
termp_xx_post(DECL_ARGS) |
{ |
{ |
const char *pp; |
if (n->aux == 0) |
int flags; |
p->flags &= ~(TERMP_KEEP | TERMP_PREKEEP); |
|
|
pp = NULL; |
|
switch (n->tok) { |
|
case MDOC_Bsx: |
|
pp = "BSD/OS"; |
|
break; |
|
case MDOC_Dx: |
|
pp = "DragonFly"; |
|
break; |
|
case MDOC_Fx: |
|
pp = "FreeBSD"; |
|
break; |
|
case MDOC_Nx: |
|
pp = "NetBSD"; |
|
break; |
|
case MDOC_Ox: |
|
pp = "OpenBSD"; |
|
break; |
|
case MDOC_Ux: |
|
pp = "UNIX"; |
|
break; |
|
default: |
|
abort(); |
|
} |
|
|
|
term_word(p, pp); |
|
if (n->child) { |
|
flags = p->flags; |
|
p->flags |= TERMP_KEEP; |
|
term_word(p, n->child->string); |
|
p->flags = flags; |
|
} |
|
return 0; |
|
} |
} |
|
|
static void |
static void |
Line 1865 termp_quote_pre(DECL_ARGS) |
|
Line 1716 termp_quote_pre(DECL_ARGS) |
|
case MDOC_Bq: |
case MDOC_Bq: |
term_word(p, "["); |
term_word(p, "["); |
break; |
break; |
|
case MDOC__T: |
|
/* FALLTHROUGH */ |
case MDOC_Do: |
case MDOC_Do: |
case MDOC_Dq: |
case MDOC_Dq: |
term_word(p, "\\(Lq"); |
term_word(p, "\\(Lq"); |
Line 1879 termp_quote_pre(DECL_ARGS) |
|
Line 1732 termp_quote_pre(DECL_ARGS) |
|
case MDOC_Pq: |
case MDOC_Pq: |
term_word(p, "("); |
term_word(p, "("); |
break; |
break; |
case MDOC__T: |
|
case MDOC_Qo: |
case MDOC_Qo: |
case MDOC_Qq: |
case MDOC_Qq: |
term_word(p, "\""); |
term_word(p, "\""); |
Line 1922 termp_quote_post(DECL_ARGS) |
|
Line 1774 termp_quote_post(DECL_ARGS) |
|
case MDOC_Bq: |
case MDOC_Bq: |
term_word(p, "]"); |
term_word(p, "]"); |
break; |
break; |
|
case MDOC__T: |
|
/* FALLTHROUGH */ |
case MDOC_Do: |
case MDOC_Do: |
case MDOC_Dq: |
case MDOC_Dq: |
term_word(p, "\\(Rq"); |
term_word(p, "\\(Rq"); |
Line 1938 termp_quote_post(DECL_ARGS) |
|
Line 1792 termp_quote_post(DECL_ARGS) |
|
case MDOC_Pq: |
case MDOC_Pq: |
term_word(p, ")"); |
term_word(p, ")"); |
break; |
break; |
case MDOC__T: |
|
case MDOC_Qo: |
case MDOC_Qo: |
case MDOC_Qq: |
case MDOC_Qq: |
term_word(p, "\""); |
term_word(p, "\""); |
|
|
termp_lk_pre(DECL_ARGS) |
termp_lk_pre(DECL_ARGS) |
{ |
{ |
const struct roff_node *link, *descr; |
const struct roff_node *link, *descr; |
|
int display; |
|
|
if (NULL == (link = n->child)) |
if ((link = n->child) == NULL) |
return 0; |
return 0; |
|
|
if (NULL != (descr = link->next)) { |
/* Link text. */ |
|
if ((descr = link->next) != NULL && !(descr->flags & NODE_DELIMC)) { |
term_fontpush(p, TERMFONT_UNDER); |
term_fontpush(p, TERMFONT_UNDER); |
while (NULL != descr) { |
while (descr != NULL && !(descr->flags & NODE_DELIMC)) { |
term_word(p, descr->string); |
term_word(p, descr->string); |
descr = descr->next; |
descr = descr->next; |
} |
} |
|
term_fontpop(p); |
p->flags |= TERMP_NOSPACE; |
p->flags |= TERMP_NOSPACE; |
term_word(p, ":"); |
term_word(p, ":"); |
term_fontpop(p); |
|
} |
} |
|
|
|
/* Link target. */ |
|
display = term_strlen(p, link->string) >= 26; |
|
if (display) { |
|
term_newln(p); |
|
p->offset += term_len(p, p->defindent + 1); |
|
} |
term_fontpush(p, TERMFONT_BOLD); |
term_fontpush(p, TERMFONT_BOLD); |
term_word(p, link->string); |
term_word(p, link->string); |
term_fontpop(p); |
term_fontpop(p); |
|
|
|
/* Trailing punctuation. */ |
|
while (descr != NULL) { |
|
p->flags |= TERMP_NOSPACE; |
|
term_word(p, descr->string); |
|
descr = descr->next; |
|
} |
|
if (display) |
|
term_newln(p); |
return 0; |
return 0; |
} |
} |
|
|