version 1.214, 2015/10/20 02:00:49 |
version 1.215, 2015/10/21 23:49:05 |
|
|
|
|
/* FIXME: .Bl -diag can't have non-text children in HEAD. */ |
/* FIXME: .Bl -diag can't have non-text children in HEAD. */ |
|
|
#define PRE_ARGS struct roff_man *mdoc, struct roff_node *n |
|
#define POST_ARGS struct roff_man *mdoc |
#define POST_ARGS struct roff_man *mdoc |
|
|
enum check_ineq { |
enum check_ineq { |
|
|
CHECK_EQ |
CHECK_EQ |
}; |
}; |
|
|
typedef void (*v_pre)(PRE_ARGS); |
|
typedef void (*v_post)(POST_ARGS); |
typedef void (*v_post)(POST_ARGS); |
|
|
struct valids { |
|
v_pre pre; |
|
v_post post; |
|
}; |
|
|
|
static void check_text(struct roff_man *, int, int, char *); |
static void check_text(struct roff_man *, int, int, char *); |
static void check_argv(struct roff_man *, |
static void check_argv(struct roff_man *, |
struct roff_node *, struct mdoc_argv *); |
struct roff_node *, struct mdoc_argv *); |
|
|
static void rewrite_macro2len(char **); |
static void rewrite_macro2len(char **); |
|
|
static void post_an(POST_ARGS); |
static void post_an(POST_ARGS); |
|
static void post_an_norm(POST_ARGS); |
static void post_at(POST_ARGS); |
static void post_at(POST_ARGS); |
|
static void post_bd(POST_ARGS); |
static void post_bf(POST_ARGS); |
static void post_bf(POST_ARGS); |
static void post_bk(POST_ARGS); |
static void post_bk(POST_ARGS); |
static void post_bl(POST_ARGS); |
static void post_bl(POST_ARGS); |
static void post_bl_block(POST_ARGS); |
static void post_bl_block(POST_ARGS); |
static void post_bl_block_tag(POST_ARGS); |
static void post_bl_block_tag(POST_ARGS); |
static void post_bl_head(POST_ARGS); |
static void post_bl_head(POST_ARGS); |
|
static void post_bl_norm(POST_ARGS); |
static void post_bx(POST_ARGS); |
static void post_bx(POST_ARGS); |
static void post_d1(POST_ARGS); |
|
static void post_defaults(POST_ARGS); |
static void post_defaults(POST_ARGS); |
|
static void post_display(POST_ARGS); |
static void post_dd(POST_ARGS); |
static void post_dd(POST_ARGS); |
static void post_dt(POST_ARGS); |
static void post_dt(POST_ARGS); |
static void post_en(POST_ARGS); |
static void post_en(POST_ARGS); |
|
|
static void post_ignpar(POST_ARGS); |
static void post_ignpar(POST_ARGS); |
static void post_it(POST_ARGS); |
static void post_it(POST_ARGS); |
static void post_lb(POST_ARGS); |
static void post_lb(POST_ARGS); |
static void post_literal(POST_ARGS); |
|
static void post_nd(POST_ARGS); |
static void post_nd(POST_ARGS); |
static void post_nm(POST_ARGS); |
static void post_nm(POST_ARGS); |
static void post_ns(POST_ARGS); |
static void post_ns(POST_ARGS); |
|
static void post_obsolete(POST_ARGS); |
static void post_os(POST_ARGS); |
static void post_os(POST_ARGS); |
static void post_par(POST_ARGS); |
static void post_par(POST_ARGS); |
|
static void post_prevpar(POST_ARGS); |
static void post_root(POST_ARGS); |
static void post_root(POST_ARGS); |
static void post_rs(POST_ARGS); |
static void post_rs(POST_ARGS); |
static void post_sh(POST_ARGS); |
static void post_sh(POST_ARGS); |
|
|
static void post_sh_authors(POST_ARGS); |
static void post_sh_authors(POST_ARGS); |
static void post_sm(POST_ARGS); |
static void post_sm(POST_ARGS); |
static void post_st(POST_ARGS); |
static void post_st(POST_ARGS); |
|
static void post_std(POST_ARGS); |
|
|
static void pre_an(PRE_ARGS); |
static v_post mdoc_valids[MDOC_MAX] = { |
static void pre_bd(PRE_ARGS); |
NULL, /* Ap */ |
static void pre_bl(PRE_ARGS); |
post_dd, /* Dd */ |
static void pre_display(PRE_ARGS); |
post_dt, /* Dt */ |
static void pre_obsolete(PRE_ARGS); |
post_os, /* Os */ |
static void pre_par(PRE_ARGS); |
post_sh, /* Sh */ |
static void pre_std(PRE_ARGS); |
post_ignpar, /* Ss */ |
|
post_par, /* Pp */ |
static const struct valids mdoc_valids[MDOC_MAX] = { |
post_display, /* D1 */ |
{ NULL, NULL }, /* Ap */ |
post_display, /* Dl */ |
{ NULL, post_dd }, /* Dd */ |
post_display, /* Bd */ |
{ NULL, post_dt }, /* Dt */ |
NULL, /* Ed */ |
{ NULL, post_os }, /* Os */ |
post_bl, /* Bl */ |
{ NULL, post_sh }, /* Sh */ |
NULL, /* El */ |
{ NULL, post_ignpar }, /* Ss */ |
post_it, /* It */ |
{ pre_par, post_par }, /* Pp */ |
NULL, /* Ad */ |
{ pre_display, post_d1 }, /* D1 */ |
post_an, /* An */ |
{ pre_display, post_literal }, /* Dl */ |
post_defaults, /* Ar */ |
{ pre_bd, post_literal }, /* Bd */ |
NULL, /* Cd */ |
{ NULL, NULL }, /* Ed */ |
NULL, /* Cm */ |
{ pre_bl, post_bl }, /* Bl */ |
NULL, /* Dv */ |
{ NULL, NULL }, /* El */ |
NULL, /* Er */ |
{ pre_par, post_it }, /* It */ |
NULL, /* Ev */ |
{ NULL, NULL }, /* Ad */ |
post_ex, /* Ex */ |
{ pre_an, post_an }, /* An */ |
post_fa, /* Fa */ |
{ NULL, post_defaults }, /* Ar */ |
NULL, /* Fd */ |
{ NULL, NULL }, /* Cd */ |
NULL, /* Fl */ |
{ NULL, NULL }, /* Cm */ |
post_fn, /* Fn */ |
{ NULL, NULL }, /* Dv */ |
NULL, /* Ft */ |
{ NULL, NULL }, /* Er */ |
NULL, /* Ic */ |
{ NULL, NULL }, /* Ev */ |
NULL, /* In */ |
{ pre_std, post_ex }, /* Ex */ |
post_defaults, /* Li */ |
{ NULL, post_fa }, /* Fa */ |
post_nd, /* Nd */ |
{ NULL, NULL }, /* Fd */ |
post_nm, /* Nm */ |
{ NULL, NULL }, /* Fl */ |
NULL, /* Op */ |
{ NULL, post_fn }, /* Fn */ |
post_obsolete, /* Ot */ |
{ NULL, NULL }, /* Ft */ |
post_defaults, /* Pa */ |
{ NULL, NULL }, /* Ic */ |
post_std, /* Rv */ |
{ NULL, NULL }, /* In */ |
post_st, /* St */ |
{ NULL, post_defaults }, /* Li */ |
NULL, /* Va */ |
{ NULL, post_nd }, /* Nd */ |
NULL, /* Vt */ |
{ NULL, post_nm }, /* Nm */ |
NULL, /* Xr */ |
{ NULL, NULL }, /* Op */ |
NULL, /* %A */ |
{ pre_obsolete, NULL }, /* Ot */ |
post_hyph, /* %B */ /* FIXME: can be used outside Rs/Re. */ |
{ NULL, post_defaults }, /* Pa */ |
NULL, /* %D */ |
{ pre_std, NULL }, /* Rv */ |
NULL, /* %I */ |
{ NULL, post_st }, /* St */ |
NULL, /* %J */ |
{ NULL, NULL }, /* Va */ |
post_hyph, /* %N */ |
{ NULL, NULL }, /* Vt */ |
post_hyph, /* %O */ |
{ NULL, NULL }, /* Xr */ |
NULL, /* %P */ |
{ NULL, NULL }, /* %A */ |
post_hyph, /* %R */ |
{ NULL, post_hyph }, /* %B */ /* FIXME: can be used outside Rs/Re. */ |
post_hyph, /* %T */ /* FIXME: can be used outside Rs/Re. */ |
{ NULL, NULL }, /* %D */ |
NULL, /* %V */ |
{ NULL, NULL }, /* %I */ |
NULL, /* Ac */ |
{ NULL, NULL }, /* %J */ |
NULL, /* Ao */ |
{ NULL, post_hyph }, /* %N */ |
NULL, /* Aq */ |
{ NULL, post_hyph }, /* %O */ |
post_at, /* At */ |
{ NULL, NULL }, /* %P */ |
NULL, /* Bc */ |
{ NULL, post_hyph }, /* %R */ |
post_bf, /* Bf */ |
{ NULL, post_hyph }, /* %T */ /* FIXME: can be used outside Rs/Re. */ |
NULL, /* Bo */ |
{ NULL, NULL }, /* %V */ |
NULL, /* Bq */ |
{ NULL, NULL }, /* Ac */ |
NULL, /* Bsx */ |
{ NULL, NULL }, /* Ao */ |
post_bx, /* Bx */ |
{ NULL, NULL }, /* Aq */ |
post_obsolete, /* Db */ |
{ NULL, post_at }, /* At */ |
NULL, /* Dc */ |
{ NULL, NULL }, /* Bc */ |
NULL, /* Do */ |
{ NULL, post_bf }, /* Bf */ |
NULL, /* Dq */ |
{ NULL, NULL }, /* Bo */ |
NULL, /* Ec */ |
{ NULL, NULL }, /* Bq */ |
NULL, /* Ef */ |
{ NULL, NULL }, /* Bsx */ |
NULL, /* Em */ |
{ NULL, post_bx }, /* Bx */ |
NULL, /* Eo */ |
{ pre_obsolete, NULL }, /* Db */ |
NULL, /* Fx */ |
{ NULL, NULL }, /* Dc */ |
NULL, /* Ms */ |
{ NULL, NULL }, /* Do */ |
NULL, /* No */ |
{ NULL, NULL }, /* Dq */ |
post_ns, /* Ns */ |
{ NULL, NULL }, /* Ec */ |
NULL, /* Nx */ |
{ NULL, NULL }, /* Ef */ |
NULL, /* Ox */ |
{ NULL, NULL }, /* Em */ |
NULL, /* Pc */ |
{ NULL, NULL }, /* Eo */ |
NULL, /* Pf */ |
{ NULL, NULL }, /* Fx */ |
NULL, /* Po */ |
{ NULL, NULL }, /* Ms */ |
NULL, /* Pq */ |
{ NULL, NULL }, /* No */ |
NULL, /* Qc */ |
{ NULL, post_ns }, /* Ns */ |
NULL, /* Ql */ |
{ NULL, NULL }, /* Nx */ |
NULL, /* Qo */ |
{ NULL, NULL }, /* Ox */ |
NULL, /* Qq */ |
{ NULL, NULL }, /* Pc */ |
NULL, /* Re */ |
{ NULL, NULL }, /* Pf */ |
post_rs, /* Rs */ |
{ NULL, NULL }, /* Po */ |
NULL, /* Sc */ |
{ NULL, NULL }, /* Pq */ |
NULL, /* So */ |
{ NULL, NULL }, /* Qc */ |
NULL, /* Sq */ |
{ NULL, NULL }, /* Ql */ |
post_sm, /* Sm */ |
{ NULL, NULL }, /* Qo */ |
post_hyph, /* Sx */ |
{ NULL, NULL }, /* Qq */ |
NULL, /* Sy */ |
{ NULL, NULL }, /* Re */ |
NULL, /* Tn */ |
{ NULL, post_rs }, /* Rs */ |
NULL, /* Ux */ |
{ NULL, NULL }, /* Sc */ |
NULL, /* Xc */ |
{ NULL, NULL }, /* So */ |
NULL, /* Xo */ |
{ NULL, NULL }, /* Sq */ |
post_fo, /* Fo */ |
{ NULL, post_sm }, /* Sm */ |
NULL, /* Fc */ |
{ NULL, post_hyph }, /* Sx */ |
NULL, /* Oo */ |
{ NULL, NULL }, /* Sy */ |
NULL, /* Oc */ |
{ NULL, NULL }, /* Tn */ |
post_bk, /* Bk */ |
{ NULL, NULL }, /* Ux */ |
NULL, /* Ek */ |
{ NULL, NULL }, /* Xc */ |
post_eoln, /* Bt */ |
{ NULL, NULL }, /* Xo */ |
NULL, /* Hf */ |
{ NULL, post_fo }, /* Fo */ |
post_obsolete, /* Fr */ |
{ NULL, NULL }, /* Fc */ |
post_eoln, /* Ud */ |
{ NULL, NULL }, /* Oo */ |
post_lb, /* Lb */ |
{ NULL, NULL }, /* Oc */ |
post_par, /* Lp */ |
{ NULL, post_bk }, /* Bk */ |
NULL, /* Lk */ |
{ NULL, NULL }, /* Ek */ |
post_defaults, /* Mt */ |
{ NULL, post_eoln }, /* Bt */ |
NULL, /* Brq */ |
{ NULL, NULL }, /* Hf */ |
NULL, /* Bro */ |
{ pre_obsolete, NULL }, /* Fr */ |
NULL, /* Brc */ |
{ NULL, post_eoln }, /* Ud */ |
NULL, /* %C */ |
{ NULL, post_lb }, /* Lb */ |
post_es, /* Es */ |
{ pre_par, post_par }, /* Lp */ |
post_en, /* En */ |
{ NULL, NULL }, /* Lk */ |
NULL, /* Dx */ |
{ NULL, post_defaults }, /* Mt */ |
NULL, /* %Q */ |
{ NULL, NULL }, /* Brq */ |
post_par, /* br */ |
{ NULL, NULL }, /* Bro */ |
post_par, /* sp */ |
{ NULL, NULL }, /* Brc */ |
NULL, /* %U */ |
{ NULL, NULL }, /* %C */ |
NULL, /* Ta */ |
{ pre_obsolete, post_es }, /* Es */ |
NULL, /* ll */ |
{ pre_obsolete, post_en }, /* En */ |
|
{ NULL, NULL }, /* Dx */ |
|
{ NULL, NULL }, /* %Q */ |
|
{ NULL, post_par }, /* br */ |
|
{ NULL, post_par }, /* sp */ |
|
{ NULL, NULL }, /* %U */ |
|
{ NULL, NULL }, /* Ta */ |
|
{ NULL, NULL }, /* ll */ |
|
}; |
}; |
|
|
#define RSORD_MAX 14 /* Number of `Rs' blocks. */ |
#define RSORD_MAX 14 /* Number of `Rs' blocks. */ |
|
|
|
|
|
|
void |
void |
mdoc_valid_pre(struct roff_man *mdoc, struct roff_node *n) |
|
{ |
|
v_pre p; |
|
|
|
switch (n->type) { |
|
case ROFFT_TEXT: |
|
if (n->sec != SEC_SYNOPSIS || n->parent->tok != MDOC_Fd) |
|
check_text(mdoc, n->line, n->pos, n->string); |
|
return; |
|
case ROFFT_TBL: |
|
case ROFFT_EQN: |
|
case ROFFT_ROOT: |
|
return; |
|
default: |
|
break; |
|
} |
|
|
|
check_args(mdoc, n); |
|
p = mdoc_valids[n->tok].pre; |
|
if (*p) |
|
(*p)(mdoc, n); |
|
} |
|
|
|
void |
|
mdoc_node_validate(struct roff_man *mdoc) |
mdoc_node_validate(struct roff_man *mdoc) |
{ |
{ |
struct roff_node *n; |
struct roff_node *n; |
v_post p; |
v_post *p; |
|
|
n = mdoc->last; |
n = mdoc->last; |
mdoc->last = mdoc->last->child; |
mdoc->last = mdoc->last->child; |
|
|
mdoc->next = ROFF_NEXT_SIBLING; |
mdoc->next = ROFF_NEXT_SIBLING; |
switch (n->type) { |
switch (n->type) { |
case ROFFT_TEXT: |
case ROFFT_TEXT: |
|
if (n->sec != SEC_SYNOPSIS || n->parent->tok != MDOC_Fd) |
|
check_text(mdoc, n->line, n->pos, n->string); |
|
break; |
case ROFFT_EQN: |
case ROFFT_EQN: |
case ROFFT_TBL: |
case ROFFT_TBL: |
break; |
break; |
|
|
post_root(mdoc); |
post_root(mdoc); |
break; |
break; |
default: |
default: |
|
check_args(mdoc, mdoc->last); |
|
|
/* |
/* |
* Closing delimiters are not special at the |
* Closing delimiters are not special at the |
|
|
|
|
/* Call the macro's postprocessor. */ |
/* Call the macro's postprocessor. */ |
|
|
p = mdoc_valids[n->tok].post; |
p = mdoc_valids + n->tok; |
if (*p) |
if (*p) |
(*p)(mdoc); |
(*p)(mdoc); |
if (mdoc->last == n) |
if (mdoc->last == n) |
|
|
} |
} |
|
|
static void |
static void |
pre_display(PRE_ARGS) |
post_bl_norm(POST_ARGS) |
{ |
{ |
struct roff_node *node; |
struct roff_node *n; |
|
|
if (n->type != ROFFT_BLOCK) |
|
return; |
|
|
|
for (node = mdoc->last->parent; node; node = node->parent) |
|
if (node->type == ROFFT_BLOCK) |
|
if (MDOC_Bd == node->tok) |
|
break; |
|
|
|
if (node) |
|
mandoc_vmsg(MANDOCERR_BD_NEST, |
|
mdoc->parse, n->line, n->pos, |
|
"%s in Bd", mdoc_macronames[n->tok]); |
|
} |
|
|
|
static void |
|
pre_bl(PRE_ARGS) |
|
{ |
|
struct mdoc_argv *argv, *wa; |
struct mdoc_argv *argv, *wa; |
int i; |
int i; |
enum mdocargt mdoclt; |
enum mdocargt mdoclt; |
enum mdoc_list lt; |
enum mdoc_list lt; |
|
|
if (n->type != ROFFT_BLOCK) |
n = mdoc->last->parent; |
return; |
n->norm->Bl.type = LIST__NONE; |
|
|
/* |
/* |
* First figure out which kind of list to use: bind ourselves to |
* First figure out which kind of list to use: bind ourselves to |
|
|
default: |
default: |
break; |
break; |
} |
} |
pre_par(mdoc, n); |
|
} |
} |
|
|
static void |
static void |
pre_bd(PRE_ARGS) |
post_bd(POST_ARGS) |
{ |
{ |
|
struct roff_node *n; |
struct mdoc_argv *argv; |
struct mdoc_argv *argv; |
int i; |
int i; |
enum mdoc_disp dt; |
enum mdoc_disp dt; |
|
|
pre_display(mdoc, n); |
n = mdoc->last; |
|
|
if (n->type != ROFFT_BLOCK) |
|
return; |
|
|
|
for (i = 0; n->args && i < (int)n->args->argc; i++) { |
for (i = 0; n->args && i < (int)n->args->argc; i++) { |
argv = n->args->argv + i; |
argv = n->args->argv + i; |
dt = DISP__NONE; |
dt = DISP__NONE; |
|
|
n->line, n->pos, "Bd"); |
n->line, n->pos, "Bd"); |
n->norm->Bd.type = DISP_ragged; |
n->norm->Bd.type = DISP_ragged; |
} |
} |
pre_par(mdoc, n); |
|
} |
} |
|
|
static void |
static void |
pre_an(PRE_ARGS) |
post_an_norm(POST_ARGS) |
{ |
{ |
|
struct roff_node *n; |
struct mdoc_argv *argv; |
struct mdoc_argv *argv; |
size_t i; |
size_t i; |
|
|
|
n = mdoc->last; |
if (n->args == NULL) |
if (n->args == NULL) |
return; |
return; |
|
|
|
|
} |
} |
|
|
static void |
static void |
pre_std(PRE_ARGS) |
post_std(POST_ARGS) |
{ |
{ |
|
struct roff_node *n; |
|
|
if (n->args && 1 == n->args->argc) |
n = mdoc->last; |
if (MDOC_Std == n->args->argv[0].arg) |
if (n->args && n->args->argc == 1) |
|
if (n->args->argv[0].arg == MDOC_Std) |
return; |
return; |
|
|
mandoc_msg(MANDOCERR_ARG_STD, mdoc->parse, |
mandoc_msg(MANDOCERR_ARG_STD, mdoc->parse, |
|
|
} |
} |
|
|
static void |
static void |
pre_obsolete(PRE_ARGS) |
post_obsolete(POST_ARGS) |
{ |
{ |
|
struct roff_node *n; |
|
|
|
n = mdoc->last; |
if (n->type == ROFFT_ELEM || n->type == ROFFT_BLOCK) |
if (n->type == ROFFT_ELEM || n->type == ROFFT_BLOCK) |
mandoc_msg(MANDOCERR_MACRO_OBS, mdoc->parse, |
mandoc_msg(MANDOCERR_MACRO_OBS, mdoc->parse, |
n->line, n->pos, mdoc_macronames[n->tok]); |
n->line, n->pos, mdoc_macronames[n->tok]); |
|
|
} |
} |
|
|
static void |
static void |
post_d1(POST_ARGS) |
post_display(POST_ARGS) |
{ |
{ |
struct roff_node *n; |
struct roff_node *n, *np; |
|
|
n = mdoc->last; |
n = mdoc->last; |
|
switch (n->type) { |
if (n->type != ROFFT_BODY) |
case ROFFT_BODY: |
return; |
if (n->end != ENDBODY_NOT) |
|
break; |
if (n->child == NULL) |
if (n->child == NULL) |
mandoc_msg(MANDOCERR_BLK_EMPTY, mdoc->parse, |
mandoc_msg(MANDOCERR_BLK_EMPTY, mdoc->parse, |
n->line, n->pos, "D1"); |
n->line, n->pos, mdoc_macronames[n->tok]); |
|
else if (n->tok == MDOC_D1) |
post_hyph(mdoc); |
post_hyph(mdoc); |
|
break; |
|
case ROFFT_BLOCK: |
|
if (n->tok == MDOC_Bd) { |
|
post_bd(mdoc); |
|
post_prevpar(mdoc); |
|
} |
|
for (np = n->parent; np != NULL; np = np->parent) { |
|
if (np->type == ROFFT_BLOCK && np->tok == MDOC_Bd) { |
|
mandoc_vmsg(MANDOCERR_BD_NEST, |
|
mdoc->parse, n->line, n->pos, |
|
"%s in Bd", mdoc_macronames[n->tok]); |
|
break; |
|
} |
|
} |
|
break; |
|
default: |
|
break; |
|
} |
} |
} |
|
|
static void |
static void |
post_literal(POST_ARGS) |
|
{ |
|
struct roff_node *n; |
|
|
|
n = mdoc->last; |
|
|
|
if (n->type != ROFFT_BODY || n->end != ENDBODY_NOT) |
|
return; |
|
|
|
if (n->child == NULL) |
|
mandoc_msg(MANDOCERR_BLK_EMPTY, mdoc->parse, |
|
n->line, n->pos, mdoc_macronames[n->tok]); |
|
} |
|
|
|
static void |
|
post_defaults(POST_ARGS) |
post_defaults(POST_ARGS) |
{ |
{ |
struct roff_node *nn; |
struct roff_node *nn; |
|
|
{ |
{ |
struct roff_node *np, *nch; |
struct roff_node *np, *nch; |
|
|
|
post_an_norm(mdoc); |
|
|
np = mdoc->last; |
np = mdoc->last; |
nch = np->child; |
nch = np->child; |
if (np->norm->An.auth == AUTH__NONE) { |
if (np->norm->An.auth == AUTH__NONE) { |
|
|
post_en(POST_ARGS) |
post_en(POST_ARGS) |
{ |
{ |
|
|
|
post_obsolete(mdoc); |
if (mdoc->last->type == ROFFT_BLOCK) |
if (mdoc->last->type == ROFFT_BLOCK) |
mdoc->last->norm->Es = mdoc->last_es; |
mdoc->last->norm->Es = mdoc->last_es; |
} |
} |
|
|
post_es(POST_ARGS) |
post_es(POST_ARGS) |
{ |
{ |
|
|
|
post_obsolete(mdoc); |
mdoc->last_es = mdoc->last; |
mdoc->last_es = mdoc->last; |
} |
} |
|
|
|
|
int i, cols; |
int i, cols; |
enum mdoc_list lt; |
enum mdoc_list lt; |
|
|
|
post_prevpar(mdoc); |
|
|
nit = mdoc->last; |
nit = mdoc->last; |
if (nit->type != ROFFT_BLOCK) |
if (nit->type != ROFFT_BLOCK) |
return; |
return; |
|
|
{ |
{ |
struct roff_node *n, *ni, *nc; |
struct roff_node *n, *ni, *nc; |
|
|
|
post_prevpar(mdoc); |
|
|
/* |
/* |
* These are fairly complicated, so we've broken them into two |
* These are fairly complicated, so we've broken them into two |
* functions. post_bl_block_tag() is called when a -tag is |
* functions. post_bl_block_tag() is called when a -tag is |
|
|
struct mdoc_argv *argv; |
struct mdoc_argv *argv; |
int i, j; |
int i, j; |
|
|
nh = mdoc->last; |
post_bl_norm(mdoc); |
|
|
|
nh = mdoc->last; |
if (nh->norm->Bl.type != LIST_column) { |
if (nh->norm->Bl.type != LIST_column) { |
if ((nch = nh->child) == NULL) |
if ((nch = nh->child) == NULL) |
return; |
return; |
|
|
} |
} |
|
|
static void |
static void |
pre_par(PRE_ARGS) |
post_prevpar(POST_ARGS) |
{ |
{ |
|
struct roff_node *n; |
|
|
if (NULL == mdoc->last) |
n = mdoc->last; |
|
if (NULL == n->prev) |
return; |
return; |
if (n->type != ROFFT_ELEM && n->type != ROFFT_BLOCK) |
if (n->type != ROFFT_ELEM && n->type != ROFFT_BLOCK) |
return; |
return; |
|
|
* block: `Lp', `Pp', or non-compact `Bd' or `Bl'. |
* block: `Lp', `Pp', or non-compact `Bd' or `Bl'. |
*/ |
*/ |
|
|
if (MDOC_Pp != mdoc->last->tok && |
if (n->prev->tok != MDOC_Pp && |
MDOC_Lp != mdoc->last->tok && |
n->prev->tok != MDOC_Lp && |
MDOC_br != mdoc->last->tok) |
n->prev->tok != MDOC_br) |
return; |
return; |
if (MDOC_Bl == n->tok && n->norm->Bl.comp) |
if (n->tok == MDOC_Bl && n->norm->Bl.comp) |
return; |
return; |
if (MDOC_Bd == n->tok && n->norm->Bd.comp) |
if (n->tok == MDOC_Bd && n->norm->Bd.comp) |
return; |
return; |
if (MDOC_It == n->tok && n->parent->norm->Bl.comp) |
if (n->tok == MDOC_It && n->parent->norm->Bl.comp) |
return; |
return; |
|
|
mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse, |
mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse, |
mdoc->last->line, mdoc->last->pos, |
n->prev->line, n->prev->pos, |
"%s before %s", mdoc_macronames[mdoc->last->tok], |
"%s before %s", mdoc_macronames[n->prev->tok], |
mdoc_macronames[n->tok]); |
mdoc_macronames[n->tok]); |
roff_node_delete(mdoc, mdoc->last); |
roff_node_delete(mdoc, n->prev); |
} |
} |
|
|
static void |
static void |
|
|
struct roff_node *np; |
struct roff_node *np; |
|
|
np = mdoc->last; |
np = mdoc->last; |
|
if (np->tok != MDOC_br && np->tok != MDOC_sp) |
|
post_prevpar(mdoc); |
|
|
if (np->tok == MDOC_sp) { |
if (np->tok == MDOC_sp) { |
if (np->nchild > 1) |
if (np->nchild > 1) |
|
|
{ |
{ |
struct roff_node *n; |
struct roff_node *n; |
|
|
n = mdoc->last; |
post_std(mdoc); |
|
|
|
n = mdoc->last; |
if (n->child != NULL) |
if (n->child != NULL) |
return; |
return; |
|
|