version 1.281, 2014/09/03 05:22:45 |
version 1.290, 2014/11/17 06:44:58 |
|
|
|
|
static size_t a2width(const struct termp *, const char *); |
static size_t a2width(const struct termp *, const char *); |
static size_t a2height(const struct termp *, const char *); |
static size_t a2height(const struct termp *, const char *); |
static size_t a2offs(const struct termp *, const char *); |
|
|
|
static void print_bvspace(struct termp *, |
static void print_bvspace(struct termp *, |
const struct mdoc_node *, |
const struct mdoc_node *, |
Line 65 static void synopsis_pre(struct termp *, |
|
Line 64 static void synopsis_pre(struct termp *, |
|
|
|
static void termp____post(DECL_ARGS); |
static void termp____post(DECL_ARGS); |
static void termp__t_post(DECL_ARGS); |
static void termp__t_post(DECL_ARGS); |
static void termp_an_post(DECL_ARGS); |
|
static void termp_bd_post(DECL_ARGS); |
static void termp_bd_post(DECL_ARGS); |
static void termp_bk_post(DECL_ARGS); |
static void termp_bk_post(DECL_ARGS); |
static void termp_bl_post(DECL_ARGS); |
static void termp_bl_post(DECL_ARGS); |
Line 138 static const struct termact termacts[MDOC_MAX] = { |
|
Line 136 static const struct termact termacts[MDOC_MAX] = { |
|
{ NULL, NULL }, /* El */ |
{ NULL, NULL }, /* El */ |
{ 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, termp_an_post }, /* An */ |
{ termp_an_pre, NULL }, /* An */ |
{ 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 195 static const struct termact termacts[MDOC_MAX] = { |
|
Line 193 static const struct termact termacts[MDOC_MAX] = { |
|
{ termp_quote_pre, termp_quote_post }, /* Eo */ |
{ termp_quote_pre, termp_quote_post }, /* Eo */ |
{ termp_xx_pre, NULL }, /* Fx */ |
{ termp_xx_pre, NULL }, /* Fx */ |
{ termp_bold_pre, NULL }, /* Ms */ |
{ termp_bold_pre, NULL }, /* Ms */ |
{ NULL, 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, NULL }, /* Nx */ |
{ termp_xx_pre, NULL }, /* Ox */ |
{ termp_xx_pre, NULL }, /* Ox */ |
Line 262 terminal_mdoc(void *arg, const struct mdoc *mdoc) |
|
Line 260 terminal_mdoc(void *arg, const struct mdoc *mdoc) |
|
p->rmargin = p->maxrmargin = p->defrmargin; |
p->rmargin = p->maxrmargin = p->defrmargin; |
p->tabwidth = term_len(p, 5); |
p->tabwidth = term_len(p, 5); |
|
|
if (NULL == p->symtab) |
|
p->symtab = mchars_alloc(); |
|
|
|
n = mdoc_node(mdoc)->child; |
n = mdoc_node(mdoc)->child; |
meta = mdoc_meta(mdoc); |
meta = mdoc_meta(mdoc); |
|
|
Line 345 print_mdoc_node(DECL_ARGS) |
|
Line 340 print_mdoc_node(DECL_ARGS) |
|
p->flags |= TERMP_NOSPACE; |
p->flags |= TERMP_NOSPACE; |
break; |
break; |
case MDOC_EQN: |
case MDOC_EQN: |
|
if ( ! (n->flags & MDOC_LINE)) |
|
p->flags |= TERMP_NOSPACE; |
term_eqn(p, n->eqn); |
term_eqn(p, n->eqn); |
|
if (n->next != NULL && ! (n->next->flags & MDOC_LINE)) |
|
p->flags |= TERMP_NOSPACE; |
break; |
break; |
case MDOC_TBL: |
case MDOC_TBL: |
term_tbl(p, n->span); |
term_tbl(p, n->span); |
Line 542 a2width(const struct termp *p, const char *v) |
|
Line 541 a2width(const struct termp *p, const char *v) |
|
struct roffsu su; |
struct roffsu su; |
|
|
assert(v); |
assert(v); |
if ( ! a2roffsu(v, &su, SCALE_MAX)) |
if ( ! a2roffsu(v, &su, SCALE_MAX)) { |
SCALE_HS_INIT(&su, term_strlen(p, v)); |
SCALE_HS_INIT(&su, term_strlen(p, v)); |
|
su.scale /= term_strlen(p, "0"); |
|
} |
|
|
return(term_hspan(p, &su)); |
return(term_hspan(p, &su)); |
} |
} |
|
|
static size_t |
|
a2offs(const struct termp *p, const char *v) |
|
{ |
|
struct roffsu su; |
|
|
|
if ('\0' == *v) |
|
return(0); |
|
else if (0 == strcmp(v, "left")) |
|
return(0); |
|
else if (0 == strcmp(v, "indent")) |
|
return(term_len(p, p->defindent + 1)); |
|
else if (0 == strcmp(v, "indent-two")) |
|
return(term_len(p, (p->defindent + 1) * 2)); |
|
else if ( ! a2roffsu(v, &su, SCALE_MAX)) |
|
SCALE_HS_INIT(&su, term_strlen(p, v)); |
|
|
|
return(term_hspan(p, &su)); |
|
} |
|
|
|
/* |
/* |
* Determine how much space to print out before block elements of `It' |
* Determine how much space to print out before block elements of `It' |
* (and thus `Bl') and `Bd'. And then go ahead and print that space, |
* (and thus `Bl') and `Bd'. And then go ahead and print that space, |
Line 590 print_bvspace(struct termp *p, |
|
Line 572 print_bvspace(struct termp *p, |
|
|
|
/* Do not vspace directly after Ss/Sh. */ |
/* Do not vspace directly after Ss/Sh. */ |
|
|
for (nn = n; nn; nn = nn->parent) { |
nn = n; |
if (MDOC_BLOCK != nn->type) |
while (nn->prev == NULL) { |
continue; |
do { |
if (MDOC_Ss == nn->tok) |
nn = nn->parent; |
|
if (nn->type == MDOC_ROOT) |
|
return; |
|
} while (nn->type != MDOC_BLOCK); |
|
if (nn->tok == MDOC_Sh || nn->tok == MDOC_Ss) |
return; |
return; |
if (MDOC_Sh == nn->tok) |
if (nn->tok == MDOC_It && |
return; |
nn->parent->parent->norm->Bl.type != LIST_item) |
if (NULL == nn->prev) |
break; |
continue; |
|
break; |
|
} |
} |
|
|
/* A `-column' does not assert vspace within the list. */ |
/* A `-column' does not assert vspace within the list. */ |
Line 655 termp_it_pre(DECL_ARGS) |
|
Line 639 termp_it_pre(DECL_ARGS) |
|
width = offset = 0; |
width = offset = 0; |
|
|
if (bl->norm->Bl.offs) |
if (bl->norm->Bl.offs) |
offset = a2offs(p, bl->norm->Bl.offs); |
offset = a2width(p, bl->norm->Bl.offs); |
|
|
switch (type) { |
switch (type) { |
case LIST_column: |
case LIST_column: |
|
|
termp_an_pre(DECL_ARGS) |
termp_an_pre(DECL_ARGS) |
{ |
{ |
|
|
if (NULL == n->child) |
if (n->norm->An.auth == AUTH_split) { |
return(1); |
p->flags &= ~TERMP_NOSPLIT; |
|
p->flags |= TERMP_SPLIT; |
|
return(0); |
|
} |
|
if (n->norm->An.auth == AUTH_nosplit) { |
|
p->flags &= ~TERMP_SPLIT; |
|
p->flags |= TERMP_NOSPLIT; |
|
return(0); |
|
} |
|
|
/* |
if (n->child == NULL) |
* If not in the AUTHORS section, `An -split' will cause |
return(0); |
* newlines to occur before the author name. If in the AUTHORS |
|
* section, by default, the first `An' invocation is nosplit, |
|
* then all subsequent ones, regardless of whether interspersed |
|
* with other macros/text, are split. -split, in this case, |
|
* will override the condition of the implied first -nosplit. |
|
*/ |
|
|
|
if (n->sec == SEC_AUTHORS) { |
if (p->flags & TERMP_SPLIT) |
if ( ! (TERMP_ANPREC & p->flags)) { |
|
if (TERMP_SPLIT & p->flags) |
|
term_newln(p); |
|
return(1); |
|
} |
|
if (TERMP_NOSPLIT & p->flags) |
|
return(1); |
|
term_newln(p); |
term_newln(p); |
return(1); |
|
} |
|
|
|
if (TERMP_SPLIT & p->flags) |
if (n->sec == SEC_AUTHORS && ! (p->flags & TERMP_NOSPLIT)) |
term_newln(p); |
p->flags |= TERMP_SPLIT; |
|
|
return(1); |
return(1); |
} |
} |
|
|
static void |
|
termp_an_post(DECL_ARGS) |
|
{ |
|
|
|
if (n->child) { |
|
if (SEC_AUTHORS == n->sec) |
|
p->flags |= TERMP_ANPREC; |
|
return; |
|
} |
|
|
|
if (AUTH_split == n->norm->An.auth) { |
|
p->flags &= ~TERMP_NOSPLIT; |
|
p->flags |= TERMP_SPLIT; |
|
} else if (AUTH_nosplit == n->norm->An.auth) { |
|
p->flags &= ~TERMP_SPLIT; |
|
p->flags |= TERMP_NOSPLIT; |
|
} |
|
|
|
} |
|
|
|
static int |
static int |
termp_ns_pre(DECL_ARGS) |
termp_ns_pre(DECL_ARGS) |
{ |
{ |
Line 1604 termp_bd_pre(DECL_ARGS) |
|
Line 1561 termp_bd_pre(DECL_ARGS) |
|
} else if (MDOC_HEAD == n->type) |
} else if (MDOC_HEAD == n->type) |
return(0); |
return(0); |
|
|
if (n->norm->Bd.offs) |
/* Handle the -offset argument. */ |
p->offset += a2offs(p, n->norm->Bd.offs); |
|
|
if (n->norm->Bd.offs == NULL || |
|
! strcmp(n->norm->Bd.offs, "left")) |
|
/* nothing */; |
|
else if ( ! strcmp(n->norm->Bd.offs, "indent")) |
|
p->offset += term_len(p, p->defindent + 1); |
|
else if ( ! strcmp(n->norm->Bd.offs, "indent-two")) |
|
p->offset += term_len(p, (p->defindent + 1) * 2); |
|
else |
|
p->offset += a2width(p, n->norm->Bd.offs); |
|
|
/* |
/* |
* If -ragged or -filled are specified, the block does nothing |
* If -ragged or -filled are specified, the block does nothing |