version 1.56, 2009/07/21 15:39:04 |
version 1.62, 2009/07/24 12:52:28 |
Line 66 const int ttypes[TTYPE_NMAX] = { |
|
Line 66 const int ttypes[TTYPE_NMAX] = { |
|
TERMP_UNDER, /* TTYPE_FUNC_ARG */ |
TERMP_UNDER, /* TTYPE_FUNC_ARG */ |
TERMP_UNDER, /* TTYPE_LINK */ |
TERMP_UNDER, /* TTYPE_LINK */ |
TERMP_BOLD, /* TTYPE_SSECTION */ |
TERMP_BOLD, /* TTYPE_SSECTION */ |
0, /* TTYPE_FILE */ |
TERMP_UNDER, /* TTYPE_FILE */ |
TERMP_UNDER, /* TTYPE_EMPH */ |
TERMP_UNDER, /* TTYPE_EMPH */ |
TERMP_BOLD, /* TTYPE_CONFIG */ |
TERMP_BOLD, /* TTYPE_CONFIG */ |
TERMP_BOLD, /* TTYPE_CMD */ |
TERMP_BOLD, /* TTYPE_CMD */ |
|
|
}; |
}; |
|
|
static void termp____post(DECL_ARGS); |
static void termp____post(DECL_ARGS); |
|
static void termp_an_post(DECL_ARGS); |
static void termp_aq_post(DECL_ARGS); |
static void termp_aq_post(DECL_ARGS); |
static void termp_bd_post(DECL_ARGS); |
static void termp_bd_post(DECL_ARGS); |
static void termp_bl_post(DECL_ARGS); |
static void termp_bl_post(DECL_ARGS); |
Line 124 static void termp_vt_post(DECL_ARGS); |
|
Line 125 static void termp_vt_post(DECL_ARGS); |
|
|
|
static int termp__j_pre(DECL_ARGS); |
static int termp__j_pre(DECL_ARGS); |
static int termp__t_pre(DECL_ARGS); |
static int termp__t_pre(DECL_ARGS); |
|
static int termp_an_pre(DECL_ARGS); |
static int termp_ap_pre(DECL_ARGS); |
static int termp_ap_pre(DECL_ARGS); |
static int termp_aq_pre(DECL_ARGS); |
static int termp_aq_pre(DECL_ARGS); |
static int termp_ar_pre(DECL_ARGS); |
static int termp_ar_pre(DECL_ARGS); |
Line 155 static int termp_nd_pre(DECL_ARGS); |
|
Line 157 static int termp_nd_pre(DECL_ARGS); |
|
static int termp_nm_pre(DECL_ARGS); |
static int termp_nm_pre(DECL_ARGS); |
static int termp_ns_pre(DECL_ARGS); |
static int termp_ns_pre(DECL_ARGS); |
static int termp_op_pre(DECL_ARGS); |
static int termp_op_pre(DECL_ARGS); |
|
static int termp_pa_pre(DECL_ARGS); |
static int termp_pf_pre(DECL_ARGS); |
static int termp_pf_pre(DECL_ARGS); |
static int termp_pp_pre(DECL_ARGS); |
static int termp_pp_pre(DECL_ARGS); |
static int termp_pq_pre(DECL_ARGS); |
static int termp_pq_pre(DECL_ARGS); |
Line 190 static const struct termact termacts[MDOC_MAX] = { |
|
Line 193 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 */ |
{ NULL, NULL }, /* Ad */ |
{ NULL, NULL }, /* Ad */ |
{ NULL, NULL }, /* An */ |
{ termp_an_pre, termp_an_post }, /* An */ |
{ termp_ar_pre, NULL }, /* Ar */ |
{ termp_ar_pre, NULL }, /* Ar */ |
{ termp_cd_pre, NULL }, /* Cd */ |
{ termp_cd_pre, NULL }, /* Cd */ |
{ termp_cm_pre, NULL }, /* Cm */ |
{ termp_cm_pre, NULL }, /* Cm */ |
Line 210 static const struct termact termacts[MDOC_MAX] = { |
|
Line 213 static const struct termact termacts[MDOC_MAX] = { |
|
{ termp_nm_pre, NULL }, /* Nm */ |
{ termp_nm_pre, NULL }, /* Nm */ |
{ termp_op_pre, termp_op_post }, /* Op */ |
{ termp_op_pre, termp_op_post }, /* Op */ |
{ NULL, NULL }, /* Ot */ |
{ NULL, NULL }, /* Ot */ |
{ NULL, NULL }, /* Pa */ |
{ termp_pa_pre, NULL }, /* Pa */ |
{ termp_rv_pre, NULL }, /* Rv */ |
{ termp_rv_pre, NULL }, /* Rv */ |
{ NULL, NULL }, /* St */ |
{ NULL, NULL }, /* St */ |
{ termp_va_pre, NULL }, /* Va */ |
{ termp_va_pre, NULL }, /* Va */ |
Line 669 fmt_block_vspace(struct termp *p, |
|
Line 672 fmt_block_vspace(struct termp *p, |
|
|
|
term_newln(p); |
term_newln(p); |
|
|
if (arg_hasattr(MDOC_Compact, bl)) |
if (MDOC_Bl == bl->tok && arg_hasattr(MDOC_Compact, bl)) |
return; |
return; |
|
|
/* |
/* |
Line 694 fmt_block_vspace(struct termp *p, |
|
Line 697 fmt_block_vspace(struct termp *p, |
|
* within the list. |
* within the list. |
*/ |
*/ |
|
|
if (arg_hasattr(MDOC_Column, bl)) |
if (MDOC_Bl == bl->tok && arg_hasattr(MDOC_Column, bl)) |
if (node->prev && MDOC_It == node->prev->tok) |
if (node->prev && MDOC_It == node->prev->tok) |
return; |
return; |
|
|
Line 702 fmt_block_vspace(struct termp *p, |
|
Line 705 fmt_block_vspace(struct termp *p, |
|
* XXX - not documented: a `-diag' without a body does not |
* XXX - not documented: a `-diag' without a body does not |
* assert a vspace prior to the next element. |
* assert a vspace prior to the next element. |
*/ |
*/ |
if (arg_hasattr(MDOC_Diag, bl)) |
if (MDOC_Bl == bl->tok && arg_hasattr(MDOC_Diag, bl)) |
if (node->prev && MDOC_It == node->prev->tok) { |
if (node->prev && MDOC_It == node->prev->tok) { |
assert(node->prev->body); |
assert(node->prev->body); |
if (NULL == node->prev->body->child) |
if (NULL == node->prev->body->child) |
Line 781 termp_it_pre(DECL_ARGS) |
|
Line 784 termp_it_pre(DECL_ARGS) |
|
case (MDOC_Column): |
case (MDOC_Column): |
if (MDOC_BODY == node->type) |
if (MDOC_BODY == node->type) |
break; |
break; |
for (i = 0, n = node->prev; n; n = n->prev, i++) |
/* |
|
* Work around groff's column handling. The offset is |
|
* equal to the sum of all widths leading to the current |
|
* column (plus the -offset value). If this column |
|
* exceeds the stated number of columns, the width is |
|
* set as 0, else it's the stated column width (later |
|
* the 0 will be adjusted to default 10 or, if in the |
|
* last column case, set to stretch to the margin). |
|
*/ |
|
for (i = 0, n = node->prev; n && n && |
|
i < (int)bl->args[vals[2]].argv->sz; |
|
n = n->prev, i++) |
offset += arg_width |
offset += arg_width |
(&bl->args->argv[vals[2]], i); |
(&bl->args->argv[vals[2]], i); |
assert(i < (int)bl->args->argv[vals[2]].sz); |
|
width = arg_width(&bl->args->argv[vals[2]], i); |
/* Whether exceeds maximum column. */ |
|
if (i < (int)bl->args[vals[2]].argv->sz) |
|
width = arg_width(&bl->args->argv[vals[2]], i); |
|
else |
|
width = 0; |
|
|
if (vals[1] >= 0) |
if (vals[1] >= 0) |
offset += arg_offset(&bl->args->argv[vals[1]]); |
offset += arg_offset(&bl->args->argv[vals[1]]); |
break; |
break; |
Line 839 termp_it_pre(DECL_ARGS) |
|
Line 858 termp_it_pre(DECL_ARGS) |
|
|
|
switch (type) { |
switch (type) { |
case (MDOC_Diag): |
case (MDOC_Diag): |
term_word(p, "\\ \\ "); |
if (MDOC_BODY == node->type) |
|
term_word(p, "\\ \\ "); |
break; |
break; |
case (MDOC_Inset): |
case (MDOC_Inset): |
if (MDOC_BODY == node->type) |
if (MDOC_BODY == node->type) |
Line 891 termp_it_pre(DECL_ARGS) |
|
Line 911 termp_it_pre(DECL_ARGS) |
|
else |
else |
p->flags |= TERMP_NOLPAD; |
p->flags |= TERMP_NOLPAD; |
|
|
if (MDOC_HEAD == node->type) |
if (MDOC_HEAD != node->type) |
|
break; |
|
|
|
/* |
|
* This is ugly. If `-hang' is specified and the body |
|
* is a `Bl' or `Bd', then we want basically to nullify |
|
* the "overstep" effect in term_flushln() and treat |
|
* this as a `-ohang' list instead. |
|
*/ |
|
if (node->next->child && |
|
(MDOC_Bl == node->next->child->tok || |
|
MDOC_Bd == node->next->child->tok)) { |
|
p->flags &= ~TERMP_NOBREAK; |
|
p->flags &= ~TERMP_NOLPAD; |
|
} else |
p->flags |= TERMP_HANG; |
p->flags |= TERMP_HANG; |
break; |
break; |
case (MDOC_Tag): |
case (MDOC_Tag): |
Line 933 termp_it_pre(DECL_ARGS) |
|
Line 967 termp_it_pre(DECL_ARGS) |
|
p->offset += offset; |
p->offset += offset; |
|
|
switch (type) { |
switch (type) { |
|
case (MDOC_Hang): |
|
/* |
|
* Same stipulation as above, regarding `-hang'. We |
|
* don't want to recalculate rmargin and offsets when |
|
* using `Bd' or `Bl' within `-hang' overstep lists. |
|
*/ |
|
if (MDOC_HEAD == node->type && node->next->child && |
|
(MDOC_Bl == node->next->child->tok || |
|
MDOC_Bd == node->next->child->tok)) |
|
break; |
|
/* FALLTHROUGH */ |
case (MDOC_Bullet): |
case (MDOC_Bullet): |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case (MDOC_Dash): |
case (MDOC_Dash): |
Line 941 termp_it_pre(DECL_ARGS) |
|
Line 986 termp_it_pre(DECL_ARGS) |
|
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case (MDOC_Hyphen): |
case (MDOC_Hyphen): |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case (MDOC_Hang): |
|
/* FALLTHROUGH */ |
|
case (MDOC_Tag): |
case (MDOC_Tag): |
assert(width); |
assert(width); |
if (MDOC_HEAD == node->type) |
if (MDOC_HEAD == node->type) |
Line 1090 termp_fl_pre(DECL_ARGS) |
|
Line 1133 termp_fl_pre(DECL_ARGS) |
|
|
|
/* ARGSUSED */ |
/* ARGSUSED */ |
static int |
static int |
|
termp_an_pre(DECL_ARGS) |
|
{ |
|
|
|
if (NULL == node->child) |
|
return(1); |
|
|
|
/* |
|
* XXX: this is poorly documented. If not in the AUTHORS |
|
* section, `An -split' will cause 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 (node->sec == SEC_AUTHORS) { |
|
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); |
|
return(1); |
|
} |
|
|
|
if (TERMP_SPLIT & p->flags) |
|
term_newln(p); |
|
|
|
return(1); |
|
} |
|
|
|
|
|
/* ARGSUSED */ |
|
static void |
|
termp_an_post(DECL_ARGS) |
|
{ |
|
|
|
if (node->child) { |
|
if (SEC_AUTHORS == node->sec) |
|
p->flags |= TERMP_ANPREC; |
|
return; |
|
} |
|
|
|
if (arg_getattr(MDOC_Split, node) > -1) { |
|
p->flags &= ~TERMP_NOSPLIT; |
|
p->flags |= TERMP_SPLIT; |
|
} else { |
|
p->flags &= ~TERMP_SPLIT; |
|
p->flags |= TERMP_NOSPLIT; |
|
} |
|
|
|
} |
|
|
|
|
|
/* ARGSUSED */ |
|
static int |
termp_ar_pre(DECL_ARGS) |
termp_ar_pre(DECL_ARGS) |
{ |
{ |
|
|
Line 1542 termp_va_pre(DECL_ARGS) |
|
Line 1644 termp_va_pre(DECL_ARGS) |
|
static int |
static int |
termp_bd_pre(DECL_ARGS) |
termp_bd_pre(DECL_ARGS) |
{ |
{ |
int i, type, ln; |
int i, type; |
|
|
/* |
/* |
* This is fairly tricky due primarily to crappy documentation. |
* This is fairly tricky due primarily to crappy documentation. |
Line 1561 termp_bd_pre(DECL_ARGS) |
|
Line 1663 termp_bd_pre(DECL_ARGS) |
|
} else if (MDOC_BODY != node->type) |
} else if (MDOC_BODY != node->type) |
return(1); |
return(1); |
|
|
/* FIXME: display type should be mandated by parser. */ |
assert(node->parent->args); |
|
|
if (NULL == node->parent->args) |
for (type = -1, i = 0; -1 == type && |
errx(1, "missing display type"); |
|
|
|
for (type = -1, i = 0; |
|
i < (int)node->parent->args->argc; i++) { |
i < (int)node->parent->args->argc; i++) { |
switch (node->parent->args->argv[i].arg) { |
switch (node->parent->args->argv[i].arg) { |
case (MDOC_Ragged): |
case (MDOC_Ragged): |
Line 1577 termp_bd_pre(DECL_ARGS) |
|
Line 1676 termp_bd_pre(DECL_ARGS) |
|
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case (MDOC_Literal): |
case (MDOC_Literal): |
type = node->parent->args->argv[i].arg; |
type = node->parent->args->argv[i].arg; |
i = (int)node->parent->args->argc; |
|
break; |
break; |
default: |
default: |
break; |
break; |
} |
} |
} |
} |
|
|
|
assert(type > -1); |
|
|
if (NULL == node->parent->args) |
|
errx(1, "missing display type"); |
|
|
|
i = arg_getattr(MDOC_Offset, node->parent); |
i = arg_getattr(MDOC_Offset, node->parent); |
if (-1 != i) { |
if (-1 != i) |
if (1 != node->parent->args->argv[i].sz) |
|
errx(1, "expected single value"); |
|
p->offset += arg_offset(&node->parent->args->argv[i]); |
p->offset += arg_offset(&node->parent->args->argv[i]); |
} |
|
|
|
switch (type) { |
switch (type) { |
case (MDOC_Literal): |
case (MDOC_Literal): |
Line 1603 termp_bd_pre(DECL_ARGS) |
|
Line 1697 termp_bd_pre(DECL_ARGS) |
|
return(1); |
return(1); |
} |
} |
|
|
/* |
|
* Tricky. Iterate through all children. If we're on a |
|
* different parse line, append a newline and then the contents. |
|
* Ew. |
|
*/ |
|
|
|
ln = node->child ? node->child->line : 0; |
|
|
|
for (node = node->child; node; node = node->next) { |
for (node = node->child; node; node = node->next) { |
if (ln < node->line) { |
p->flags |= TERMP_NOSPACE; |
term_flushln(p); |
|
p->flags |= TERMP_NOSPACE; |
|
} |
|
ln = node->line; |
|
print_node(p, pair, meta, node); |
print_node(p, pair, meta, node); |
|
if (node->next) |
|
term_flushln(p); |
} |
} |
|
|
return(0); |
return(0); |
Line 1631 termp_bd_post(DECL_ARGS) |
|
Line 1715 termp_bd_post(DECL_ARGS) |
|
|
|
if (MDOC_BODY != node->type) |
if (MDOC_BODY != node->type) |
return; |
return; |
|
p->flags |= TERMP_NOSPACE; |
term_flushln(p); |
term_flushln(p); |
} |
} |
|
|
Line 1729 termp_sq_post(DECL_ARGS) |
|
Line 1814 termp_sq_post(DECL_ARGS) |
|
return; |
return; |
p->flags |= TERMP_NOSPACE; |
p->flags |= TERMP_NOSPACE; |
term_word(p, "\\(aq"); |
term_word(p, "\\(aq"); |
|
} |
|
|
|
|
|
/* ARGSUSED */ |
|
static int |
|
termp_pa_pre(DECL_ARGS) |
|
{ |
|
|
|
pair->flag |= ttypes[TTYPE_FILE]; |
|
return(1); |
} |
} |
|
|
|
|