version 1.293, 2015/09/26 00:54:04 |
version 1.298, 2015/10/20 02:01:32 |
Line 63 static void check_argv(struct roff_man *, |
|
Line 63 static void check_argv(struct roff_man *, |
|
struct roff_node *, struct mdoc_argv *); |
struct roff_node *, struct mdoc_argv *); |
static void check_args(struct roff_man *, struct roff_node *); |
static void check_args(struct roff_man *, struct roff_node *); |
static int child_an(const struct roff_node *); |
static int child_an(const struct roff_node *); |
static enum roff_sec a2sec(const char *); |
|
static size_t macro2len(int); |
static size_t macro2len(int); |
static void rewrite_macro2len(char **); |
static void rewrite_macro2len(char **); |
|
|
Line 111 static void post_st(POST_ARGS); |
|
Line 110 static void post_st(POST_ARGS); |
|
static void pre_an(PRE_ARGS); |
static void pre_an(PRE_ARGS); |
static void pre_bd(PRE_ARGS); |
static void pre_bd(PRE_ARGS); |
static void pre_bl(PRE_ARGS); |
static void pre_bl(PRE_ARGS); |
static void pre_dd(PRE_ARGS); |
|
static void pre_display(PRE_ARGS); |
static void pre_display(PRE_ARGS); |
static void pre_dt(PRE_ARGS); |
|
static void pre_literal(PRE_ARGS); |
|
static void pre_obsolete(PRE_ARGS); |
static void pre_obsolete(PRE_ARGS); |
static void pre_os(PRE_ARGS); |
|
static void pre_par(PRE_ARGS); |
static void pre_par(PRE_ARGS); |
static void pre_std(PRE_ARGS); |
static void pre_std(PRE_ARGS); |
|
|
static const struct valids mdoc_valids[MDOC_MAX] = { |
static const struct valids mdoc_valids[MDOC_MAX] = { |
{ NULL, NULL }, /* Ap */ |
{ NULL, NULL }, /* Ap */ |
{ pre_dd, post_dd }, /* Dd */ |
{ NULL, post_dd }, /* Dd */ |
{ pre_dt, post_dt }, /* Dt */ |
{ NULL, post_dt }, /* Dt */ |
{ pre_os, post_os }, /* Os */ |
{ NULL, post_os }, /* Os */ |
{ NULL, post_sh }, /* Sh */ |
{ NULL, post_sh }, /* Sh */ |
{ NULL, post_ignpar }, /* Ss */ |
{ NULL, post_ignpar }, /* Ss */ |
{ pre_par, post_par }, /* Pp */ |
{ pre_par, post_par }, /* Pp */ |
{ pre_display, post_d1 }, /* D1 */ |
{ pre_display, post_d1 }, /* D1 */ |
{ pre_literal, post_literal }, /* Dl */ |
{ pre_display, post_literal }, /* Dl */ |
{ pre_bd, post_literal }, /* Bd */ |
{ pre_bd, post_literal }, /* Bd */ |
{ NULL, NULL }, /* Ed */ |
{ NULL, NULL }, /* Ed */ |
{ pre_bl, post_bl }, /* Bl */ |
{ pre_bl, post_bl }, /* Bl */ |
Line 301 mdoc_valid_pre(struct roff_man *mdoc, struct roff_node |
|
Line 296 mdoc_valid_pre(struct roff_man *mdoc, struct roff_node |
|
case ROFFT_TEXT: |
case ROFFT_TEXT: |
if (n->sec != SEC_SYNOPSIS || n->parent->tok != MDOC_Fd) |
if (n->sec != SEC_SYNOPSIS || n->parent->tok != MDOC_Fd) |
check_text(mdoc, n->line, n->pos, n->string); |
check_text(mdoc, n->line, n->pos, n->string); |
/* FALLTHROUGH */ |
return; |
case ROFFT_TBL: |
case ROFFT_TBL: |
/* FALLTHROUGH */ |
|
case ROFFT_EQN: |
case ROFFT_EQN: |
/* FALLTHROUGH */ |
|
case ROFFT_ROOT: |
case ROFFT_ROOT: |
return; |
return; |
default: |
default: |
Line 319 mdoc_valid_pre(struct roff_man *mdoc, struct roff_node |
|
Line 312 mdoc_valid_pre(struct roff_man *mdoc, struct roff_node |
|
} |
} |
|
|
void |
void |
mdoc_valid_post(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; |
if (n->flags & MDOC_VALID) |
mdoc->last = mdoc->last->child; |
return; |
while (mdoc->last != NULL) { |
n->flags |= MDOC_VALID | MDOC_ENDED; |
mdoc_node_validate(mdoc); |
|
if (mdoc->last == n) |
|
mdoc->last = mdoc->last->child; |
|
else |
|
mdoc->last = mdoc->last->next; |
|
} |
|
|
|
mdoc->last = n; |
|
mdoc->next = ROFF_NEXT_SIBLING; |
switch (n->type) { |
switch (n->type) { |
case ROFFT_TEXT: |
case ROFFT_TEXT: |
/* FALLTHROUGH */ |
|
case ROFFT_EQN: |
case ROFFT_EQN: |
/* FALLTHROUGH */ |
|
case ROFFT_TBL: |
case ROFFT_TBL: |
break; |
break; |
case ROFFT_ROOT: |
case ROFFT_ROOT: |
Line 357 mdoc_valid_post(struct roff_man *mdoc) |
|
Line 355 mdoc_valid_post(struct roff_man *mdoc) |
|
p = mdoc_valids[n->tok].post; |
p = mdoc_valids[n->tok].post; |
if (*p) |
if (*p) |
(*p)(mdoc); |
(*p)(mdoc); |
|
if (mdoc->last == n) |
|
mdoc_state(mdoc, n); |
break; |
break; |
} |
} |
} |
} |
Line 566 pre_bl(PRE_ARGS) |
|
Line 566 pre_bl(PRE_ARGS) |
|
n->line, n->pos, "Bl -tag"); |
n->line, n->pos, "Bl -tag"); |
break; |
break; |
case LIST_column: |
case LIST_column: |
/* FALLTHROUGH */ |
|
case LIST_diag: |
case LIST_diag: |
/* FALLTHROUGH */ |
|
case LIST_ohang: |
case LIST_ohang: |
/* FALLTHROUGH */ |
|
case LIST_inset: |
case LIST_inset: |
/* FALLTHROUGH */ |
|
case LIST_item: |
case LIST_item: |
if (n->norm->Bl.width) |
if (n->norm->Bl.width) |
mandoc_vmsg(MANDOCERR_BL_SKIPW, mdoc->parse, |
mandoc_vmsg(MANDOCERR_BL_SKIPW, mdoc->parse, |
Line 580 pre_bl(PRE_ARGS) |
|
Line 576 pre_bl(PRE_ARGS) |
|
mdoc_argnames[mdoclt]); |
mdoc_argnames[mdoclt]); |
break; |
break; |
case LIST_bullet: |
case LIST_bullet: |
/* FALLTHROUGH */ |
|
case LIST_dash: |
case LIST_dash: |
/* FALLTHROUGH */ |
|
case LIST_hyphen: |
case LIST_hyphen: |
if (NULL == n->norm->Bl.width) |
if (NULL == n->norm->Bl.width) |
n->norm->Bl.width = "2n"; |
n->norm->Bl.width = "2n"; |
Line 604 pre_bd(PRE_ARGS) |
|
Line 598 pre_bd(PRE_ARGS) |
|
int i; |
int i; |
enum mdoc_disp dt; |
enum mdoc_disp dt; |
|
|
pre_literal(mdoc, n); |
pre_display(mdoc, n); |
|
|
if (n->type != ROFFT_BLOCK) |
if (n->type != ROFFT_BLOCK) |
return; |
return; |
Line 724 pre_obsolete(PRE_ARGS) |
|
Line 718 pre_obsolete(PRE_ARGS) |
|
} |
} |
|
|
static void |
static void |
pre_dt(PRE_ARGS) |
|
{ |
|
|
|
if (mdoc->meta.title != NULL) |
|
mandoc_msg(MANDOCERR_PROLOG_REP, mdoc->parse, |
|
n->line, n->pos, "Dt"); |
|
else if (mdoc->meta.os != NULL) |
|
mandoc_msg(MANDOCERR_PROLOG_ORDER, mdoc->parse, |
|
n->line, n->pos, "Dt after Os"); |
|
} |
|
|
|
static void |
|
pre_os(PRE_ARGS) |
|
{ |
|
|
|
if (mdoc->meta.os != NULL) |
|
mandoc_msg(MANDOCERR_PROLOG_REP, mdoc->parse, |
|
n->line, n->pos, "Os"); |
|
else if (mdoc->flags & MDOC_PBODY) |
|
mandoc_msg(MANDOCERR_PROLOG_LATE, mdoc->parse, |
|
n->line, n->pos, "Os"); |
|
} |
|
|
|
static void |
|
pre_dd(PRE_ARGS) |
|
{ |
|
|
|
if (mdoc->meta.date != NULL) |
|
mandoc_msg(MANDOCERR_PROLOG_REP, mdoc->parse, |
|
n->line, n->pos, "Dd"); |
|
else if (mdoc->flags & MDOC_PBODY) |
|
mandoc_msg(MANDOCERR_PROLOG_LATE, mdoc->parse, |
|
n->line, n->pos, "Dd"); |
|
else if (mdoc->meta.title != NULL) |
|
mandoc_msg(MANDOCERR_PROLOG_ORDER, mdoc->parse, |
|
n->line, n->pos, "Dd after Dt"); |
|
else if (mdoc->meta.os != NULL) |
|
mandoc_msg(MANDOCERR_PROLOG_ORDER, mdoc->parse, |
|
n->line, n->pos, "Dd after Os"); |
|
} |
|
|
|
static void |
|
post_bf(POST_ARGS) |
post_bf(POST_ARGS) |
{ |
{ |
struct roff_node *np, *nch; |
struct roff_node *np, *nch; |
enum mdocargt arg; |
|
|
|
/* |
/* |
* Unlike other data pointers, these are "housed" by the HEAD |
* Unlike other data pointers, these are "housed" by the HEAD |
Line 781 post_bf(POST_ARGS) |
|
Line 732 post_bf(POST_ARGS) |
|
return; |
return; |
|
|
assert(np->parent->type == ROFFT_BLOCK); |
assert(np->parent->type == ROFFT_BLOCK); |
assert(MDOC_Bf == np->parent->tok); |
assert(np->parent->tok == MDOC_Bf); |
|
|
/* Check the number of arguments. */ |
/* Check the number of arguments. */ |
|
|
nch = np->child; |
nch = np->child; |
if (NULL == np->parent->args) { |
if (np->parent->args == NULL) { |
if (NULL == nch) { |
if (nch == NULL) { |
mandoc_msg(MANDOCERR_BF_NOFONT, mdoc->parse, |
mandoc_msg(MANDOCERR_BF_NOFONT, mdoc->parse, |
np->line, np->pos, "Bf"); |
np->line, np->pos, "Bf"); |
return; |
return; |
} |
} |
nch = nch->next; |
nch = nch->next; |
} |
} |
if (NULL != nch) |
if (nch != NULL) |
mandoc_vmsg(MANDOCERR_ARG_EXCESS, mdoc->parse, |
mandoc_vmsg(MANDOCERR_ARG_EXCESS, mdoc->parse, |
nch->line, nch->pos, "Bf ... %s", nch->string); |
nch->line, nch->pos, "Bf ... %s", nch->string); |
|
|
/* Extract argument into data. */ |
/* Extract argument into data. */ |
|
|
if (np->parent->args) { |
if (np->parent->args != NULL) { |
arg = np->parent->args->argv[0].arg; |
switch (np->parent->args->argv[0].arg) { |
if (MDOC_Emphasis == arg) |
case MDOC_Emphasis: |
np->norm->Bf.font = FONT_Em; |
np->norm->Bf.font = FONT_Em; |
else if (MDOC_Literal == arg) |
break; |
|
case MDOC_Literal: |
np->norm->Bf.font = FONT_Li; |
np->norm->Bf.font = FONT_Li; |
else if (MDOC_Symbolic == arg) |
break; |
|
case MDOC_Symbolic: |
np->norm->Bf.font = FONT_Sy; |
np->norm->Bf.font = FONT_Sy; |
else |
break; |
|
default: |
abort(); |
abort(); |
|
} |
return; |
return; |
} |
} |
|
|
/* Extract parameter into data. */ |
/* Extract parameter into data. */ |
|
|
if (0 == strcmp(np->child->string, "Em")) |
if ( ! strcmp(np->child->string, "Em")) |
np->norm->Bf.font = FONT_Em; |
np->norm->Bf.font = FONT_Em; |
else if (0 == strcmp(np->child->string, "Li")) |
else if ( ! strcmp(np->child->string, "Li")) |
np->norm->Bf.font = FONT_Li; |
np->norm->Bf.font = FONT_Li; |
else if (0 == strcmp(np->child->string, "Sy")) |
else if ( ! strcmp(np->child->string, "Sy")) |
np->norm->Bf.font = FONT_Sy; |
np->norm->Bf.font = FONT_Sy; |
else |
else |
mandoc_vmsg(MANDOCERR_BF_BADFONT, mdoc->parse, |
mandoc_vmsg(MANDOCERR_BF_BADFONT, mdoc->parse, |
Line 853 post_eoln(POST_ARGS) |
|
Line 808 post_eoln(POST_ARGS) |
|
const struct roff_node *n; |
const struct roff_node *n; |
|
|
n = mdoc->last; |
n = mdoc->last; |
if (n->child) |
if (n->child != NULL) |
mandoc_vmsg(MANDOCERR_ARG_SKIP, |
mandoc_vmsg(MANDOCERR_ARG_SKIP, |
mdoc->parse, n->line, n->pos, |
mdoc->parse, n->line, n->pos, |
"%s %s", mdoc_macronames[n->tok], |
"%s %s", mdoc_macronames[n->tok], |
Line 942 post_nm(POST_ARGS) |
|
Line 897 post_nm(POST_ARGS) |
|
n->last->tok == MDOC_Lp)) |
n->last->tok == MDOC_Lp)) |
mdoc_node_relink(mdoc, n->last); |
mdoc_node_relink(mdoc, n->last); |
|
|
if (NULL != mdoc->meta.name) |
if (mdoc->meta.name != NULL) |
return; |
return; |
|
|
deroff(&mdoc->meta.name, n); |
deroff(&mdoc->meta.name, n); |
|
|
if (NULL == mdoc->meta.name) |
if (mdoc->meta.name == NULL) |
mandoc_msg(MANDOCERR_NM_NONAME, mdoc->parse, |
mandoc_msg(MANDOCERR_NM_NONAME, mdoc->parse, |
n->line, n->pos, "Nm"); |
n->line, n->pos, "Nm"); |
} |
} |
Line 993 post_literal(POST_ARGS) |
|
Line 948 post_literal(POST_ARGS) |
|
|
|
n = mdoc->last; |
n = mdoc->last; |
|
|
if (n->type != ROFFT_BODY) |
if (n->type != ROFFT_BODY || n->end != ENDBODY_NOT) |
return; |
return; |
|
|
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, mdoc_macronames[n->tok]); |
n->line, n->pos, mdoc_macronames[n->tok]); |
|
|
if (n->tok == MDOC_Bd && |
|
n->norm->Bd.type != DISP_literal && |
|
n->norm->Bd.type != DISP_unfilled) |
|
return; |
|
|
|
mdoc->flags &= ~MDOC_LITERAL; |
|
} |
} |
|
|
static void |
static void |
Line 1019 post_defaults(POST_ARGS) |
|
Line 967 post_defaults(POST_ARGS) |
|
* gets an empty string. |
* gets an empty string. |
*/ |
*/ |
|
|
if (mdoc->last->child) |
if (mdoc->last->child != NULL) |
return; |
return; |
|
|
nn = mdoc->last; |
nn = mdoc->last; |
mdoc->next = ROFF_NEXT_CHILD; |
|
|
|
switch (nn->tok) { |
switch (nn->tok) { |
case MDOC_Ar: |
case MDOC_Ar: |
|
mdoc->next = ROFF_NEXT_CHILD; |
roff_word_alloc(mdoc, nn->line, nn->pos, "file"); |
roff_word_alloc(mdoc, nn->line, nn->pos, "file"); |
roff_word_alloc(mdoc, nn->line, nn->pos, "..."); |
roff_word_alloc(mdoc, nn->line, nn->pos, "..."); |
break; |
break; |
case MDOC_Pa: |
case MDOC_Pa: |
/* FALLTHROUGH */ |
|
case MDOC_Mt: |
case MDOC_Mt: |
|
mdoc->next = ROFF_NEXT_CHILD; |
roff_word_alloc(mdoc, nn->line, nn->pos, "~"); |
roff_word_alloc(mdoc, nn->line, nn->pos, "~"); |
break; |
break; |
default: |
default: |
Line 1064 post_at(POST_ARGS) |
|
Line 1012 post_at(POST_ARGS) |
|
|
|
n = n->child; |
n = n->child; |
assert(n->type == ROFFT_TEXT); |
assert(n->type == ROFFT_TEXT); |
if (NULL == (std_att = mdoc_a2att(n->string))) { |
if ((std_att = mdoc_a2att(n->string)) == NULL) { |
mandoc_vmsg(MANDOCERR_AT_BAD, mdoc->parse, |
mandoc_vmsg(MANDOCERR_AT_BAD, mdoc->parse, |
n->line, n->pos, "At %s", n->string); |
n->line, n->pos, "At %s", n->string); |
mandoc_asprintf(&att, "AT&T UNIX %s", n->string); |
mandoc_asprintf(&att, "AT&T UNIX %s", n->string); |
Line 1122 post_it(POST_ARGS) |
|
Line 1070 post_it(POST_ARGS) |
|
|
|
switch (lt) { |
switch (lt) { |
case LIST_tag: |
case LIST_tag: |
/* FALLTHROUGH */ |
|
case LIST_hang: |
case LIST_hang: |
/* FALLTHROUGH */ |
|
case LIST_ohang: |
case LIST_ohang: |
/* FALLTHROUGH */ |
|
case LIST_inset: |
case LIST_inset: |
/* FALLTHROUGH */ |
|
case LIST_diag: |
case LIST_diag: |
if (nit->head->child == NULL) |
if (nit->head->child == NULL) |
mandoc_vmsg(MANDOCERR_IT_NOHEAD, |
mandoc_vmsg(MANDOCERR_IT_NOHEAD, |
Line 1137 post_it(POST_ARGS) |
|
Line 1081 post_it(POST_ARGS) |
|
mdoc_argnames[nbl->args->argv[0].arg]); |
mdoc_argnames[nbl->args->argv[0].arg]); |
break; |
break; |
case LIST_bullet: |
case LIST_bullet: |
/* FALLTHROUGH */ |
|
case LIST_dash: |
case LIST_dash: |
/* FALLTHROUGH */ |
|
case LIST_enum: |
case LIST_enum: |
/* FALLTHROUGH */ |
|
case LIST_hyphen: |
case LIST_hyphen: |
if (nit->body == NULL || nit->body->child == NULL) |
if (nit->body == NULL || nit->body->child == NULL) |
mandoc_vmsg(MANDOCERR_IT_NOBODY, |
mandoc_vmsg(MANDOCERR_IT_NOBODY, |
Line 1160 post_it(POST_ARGS) |
|
Line 1101 post_it(POST_ARGS) |
|
|
|
assert(nit->head->child == NULL); |
assert(nit->head->child == NULL); |
|
|
for (i = 0, nch = nit->child; nch; nch = nch->next) |
i = 0; |
|
for (nch = nit->child; nch != NULL; nch = nch->next) |
if (nch->type == ROFFT_BODY) |
if (nch->type == ROFFT_BODY) |
i++; |
i++; |
|
|
Line 1189 post_bl_block(POST_ARGS) |
|
Line 1131 post_bl_block(POST_ARGS) |
|
|
|
n = mdoc->last; |
n = mdoc->last; |
|
|
if (LIST_tag == n->norm->Bl.type && |
if (n->norm->Bl.type == LIST_tag && |
NULL == n->norm->Bl.width) { |
n->norm->Bl.width == NULL) { |
post_bl_block_tag(mdoc); |
post_bl_block_tag(mdoc); |
assert(n->norm->Bl.width); |
assert(n->norm->Bl.width != NULL); |
} |
} |
|
|
for (ni = n->body->child; ni; ni = ni->next) { |
for (ni = n->body->child; ni != NULL; ni = ni->next) { |
if (NULL == ni->body) |
if (ni->body == NULL) |
continue; |
continue; |
nc = ni->body->last; |
nc = ni->body->last; |
while (NULL != nc) { |
while (nc != NULL) { |
switch (nc->tok) { |
switch (nc->tok) { |
case MDOC_Pp: |
case MDOC_Pp: |
/* FALLTHROUGH */ |
|
case MDOC_Lp: |
case MDOC_Lp: |
/* FALLTHROUGH */ |
|
case MDOC_br: |
case MDOC_br: |
break; |
break; |
default: |
default: |
nc = NULL; |
nc = NULL; |
continue; |
continue; |
} |
} |
if (NULL == ni->next) { |
if (ni->next == NULL) { |
mandoc_msg(MANDOCERR_PAR_MOVE, |
mandoc_msg(MANDOCERR_PAR_MOVE, |
mdoc->parse, nc->line, nc->pos, |
mdoc->parse, nc->line, nc->pos, |
mdoc_macronames[nc->tok]); |
mdoc_macronames[nc->tok]); |
mdoc_node_relink(mdoc, nc); |
mdoc_node_relink(mdoc, nc); |
} else if (0 == n->norm->Bl.comp && |
} else if (n->norm->Bl.comp == 0 && |
LIST_column != n->norm->Bl.type) { |
n->norm->Bl.type != LIST_column) { |
mandoc_vmsg(MANDOCERR_PAR_SKIP, |
mandoc_vmsg(MANDOCERR_PAR_SKIP, |
mdoc->parse, nc->line, nc->pos, |
mdoc->parse, nc->line, nc->pos, |
"%s before It", |
"%s before It", |
Line 1271 post_bl_block_tag(POST_ARGS) |
|
Line 1211 post_bl_block_tag(POST_ARGS) |
|
sz = 10; |
sz = 10; |
n = mdoc->last; |
n = mdoc->last; |
|
|
for (nn = n->body->child; nn; nn = nn->next) { |
for (nn = n->body->child; nn != NULL; nn = nn->next) { |
if (MDOC_It != nn->tok) |
if (nn->tok != MDOC_It) |
continue; |
continue; |
|
|
assert(nn->type == ROFFT_BLOCK); |
assert(nn->type == ROFFT_BLOCK); |
Line 1301 post_bl_block_tag(POST_ARGS) |
|
Line 1241 post_bl_block_tag(POST_ARGS) |
|
* We're guaranteed that a MDOC_Width doesn't already exist. |
* We're guaranteed that a MDOC_Width doesn't already exist. |
*/ |
*/ |
|
|
assert(n->args); |
assert(n->args != NULL); |
i = (int)(n->args->argc)++; |
i = (int)(n->args->argc)++; |
|
|
n->args->argv = mandoc_reallocarray(n->args->argv, |
n->args->argv = mandoc_reallocarray(n->args->argv, |
Line 1400 post_bl(POST_ARGS) |
|
Line 1340 post_bl(POST_ARGS) |
|
default: |
default: |
return; |
return; |
} |
} |
|
if (nbody->end != ENDBODY_NOT) |
|
return; |
|
|
nchild = nbody->child; |
nchild = nbody->child; |
if (nchild == NULL) { |
if (nchild == NULL) { |
Line 1434 post_bl(POST_ARGS) |
|
Line 1376 post_bl(POST_ARGS) |
|
* Unlink this child. |
* Unlink this child. |
*/ |
*/ |
|
|
assert(NULL == nchild->prev); |
assert(nchild->prev == NULL); |
if (0 == --nbody->nchild) { |
if (--nbody->nchild == 0) { |
nbody->child = NULL; |
nbody->child = NULL; |
nbody->last = NULL; |
nbody->last = NULL; |
assert(NULL == nnext); |
assert(nnext == NULL); |
} else { |
} else { |
nbody->child = nnext; |
nbody->child = nnext; |
nnext->prev = NULL; |
nnext->prev = NULL; |
Line 1454 post_bl(POST_ARGS) |
|
Line 1396 post_bl(POST_ARGS) |
|
|
|
nblock->prev = nchild; |
nblock->prev = nchild; |
nparent->nchild++; |
nparent->nchild++; |
if (NULL == nprev) |
if (nprev == NULL) |
nparent->child = nchild; |
nparent->child = nchild; |
else |
else |
nprev->next = nchild; |
nprev->next = nchild; |
Line 1478 post_bk(POST_ARGS) |
|
Line 1420 post_bk(POST_ARGS) |
|
} |
} |
|
|
static void |
static void |
post_sm(struct roff_man *mdoc) |
post_sm(POST_ARGS) |
{ |
{ |
struct roff_node *nch; |
struct roff_node *nch; |
|
|
Line 1559 post_st(POST_ARGS) |
|
Line 1501 post_st(POST_ARGS) |
|
|
|
assert(nch->type == ROFFT_TEXT); |
assert(nch->type == ROFFT_TEXT); |
|
|
if (NULL == (p = mdoc_a2st(nch->string))) { |
if ((p = mdoc_a2st(nch->string)) == NULL) { |
mandoc_vmsg(MANDOCERR_ST_BAD, mdoc->parse, |
mandoc_vmsg(MANDOCERR_ST_BAD, mdoc->parse, |
nch->line, nch->pos, "St %s", nch->string); |
nch->line, nch->pos, "St %s", nch->string); |
roff_node_delete(mdoc, n); |
roff_node_delete(mdoc, n); |
|
|
post_ns(POST_ARGS) |
post_ns(POST_ARGS) |
{ |
{ |
|
|
if (MDOC_LINE & mdoc->last->flags) |
if (mdoc->last->flags & MDOC_LINE) |
mandoc_msg(MANDOCERR_NS_SKIP, mdoc->parse, |
mandoc_msg(MANDOCERR_NS_SKIP, mdoc->parse, |
mdoc->last->line, mdoc->last->pos, NULL); |
mdoc->last->line, mdoc->last->pos, NULL); |
} |
} |
Line 1828 child_an(const struct roff_node *n) |
|
Line 1770 child_an(const struct roff_node *n) |
|
|
|
for (n = n->child; n != NULL; n = n->next) |
for (n = n->child; n != NULL; n = n->next) |
if ((n->tok == MDOC_An && n->nchild) || child_an(n)) |
if ((n->tok == MDOC_An && n->nchild) || child_an(n)) |
return(1); |
return 1; |
return(0); |
return 0; |
} |
} |
|
|
static void |
static void |
Line 1844 post_sh_authors(POST_ARGS) |
|
Line 1786 post_sh_authors(POST_ARGS) |
|
static void |
static void |
post_sh_head(POST_ARGS) |
post_sh_head(POST_ARGS) |
{ |
{ |
struct roff_node *n; |
|
const char *goodsec; |
const char *goodsec; |
char *secname; |
|
enum roff_sec sec; |
enum roff_sec sec; |
|
|
/* |
/* |
Line 1856 post_sh_head(POST_ARGS) |
|
Line 1796 post_sh_head(POST_ARGS) |
|
* manual sections. |
* manual sections. |
*/ |
*/ |
|
|
secname = NULL; |
sec = mdoc->last->sec; |
sec = SEC_CUSTOM; |
|
deroff(&secname, mdoc->last); |
|
sec = NULL == secname ? SEC_CUSTOM : a2sec(secname); |
|
|
|
/* The NAME should be first. */ |
/* The NAME should be first. */ |
|
|
if (SEC_NAME != sec && SEC_NONE == mdoc->lastnamed) |
if (SEC_NAME != sec && SEC_NONE == mdoc->lastnamed) |
mandoc_vmsg(MANDOCERR_NAMESEC_FIRST, mdoc->parse, |
mandoc_vmsg(MANDOCERR_NAMESEC_FIRST, mdoc->parse, |
mdoc->last->line, mdoc->last->pos, |
mdoc->last->line, mdoc->last->pos, |
"Sh %s", secname); |
"Sh %s", secnames[sec]); |
|
|
/* The SYNOPSIS gets special attention in other areas. */ |
/* The SYNOPSIS gets special attention in other areas. */ |
|
|
if (SEC_SYNOPSIS == sec) { |
if (sec == SEC_SYNOPSIS) { |
roff_setreg(mdoc->roff, "nS", 1, '='); |
roff_setreg(mdoc->roff, "nS", 1, '='); |
mdoc->flags |= MDOC_SYNOPSIS; |
mdoc->flags |= MDOC_SYNOPSIS; |
} else { |
} else { |
Line 1882 post_sh_head(POST_ARGS) |
|
Line 1819 post_sh_head(POST_ARGS) |
|
|
|
mdoc->lastsec = sec; |
mdoc->lastsec = sec; |
|
|
/* |
|
* Set the section attribute for the current HEAD, for its |
|
* parent BLOCK, and for the HEAD children; the latter can |
|
* only be TEXT nodes, so no recursion is needed. |
|
* For other blocks and elements, including .Sh BODY, this is |
|
* done when allocating the node data structures, but for .Sh |
|
* BLOCK and HEAD, the section is still unknown at that time. |
|
*/ |
|
|
|
mdoc->last->parent->sec = sec; |
|
mdoc->last->sec = sec; |
|
for (n = mdoc->last->child; n; n = n->next) |
|
n->sec = sec; |
|
|
|
/* We don't care about custom sections after this. */ |
/* We don't care about custom sections after this. */ |
|
|
if (SEC_CUSTOM == sec) { |
if (sec == SEC_CUSTOM) |
free(secname); |
|
return; |
return; |
} |
|
|
|
/* |
/* |
* Check whether our non-custom section is being repeated or is |
* Check whether our non-custom section is being repeated or is |
Line 1911 post_sh_head(POST_ARGS) |
|
Line 1832 post_sh_head(POST_ARGS) |
|
if (sec == mdoc->lastnamed) |
if (sec == mdoc->lastnamed) |
mandoc_vmsg(MANDOCERR_SEC_REP, mdoc->parse, |
mandoc_vmsg(MANDOCERR_SEC_REP, mdoc->parse, |
mdoc->last->line, mdoc->last->pos, |
mdoc->last->line, mdoc->last->pos, |
"Sh %s", secname); |
"Sh %s", secnames[sec]); |
|
|
if (sec < mdoc->lastnamed) |
if (sec < mdoc->lastnamed) |
mandoc_vmsg(MANDOCERR_SEC_ORDER, mdoc->parse, |
mandoc_vmsg(MANDOCERR_SEC_ORDER, mdoc->parse, |
mdoc->last->line, mdoc->last->pos, |
mdoc->last->line, mdoc->last->pos, |
"Sh %s", secname); |
"Sh %s", secnames[sec]); |
|
|
/* Mark the last named section. */ |
/* Mark the last named section. */ |
|
|
Line 1924 post_sh_head(POST_ARGS) |
|
Line 1845 post_sh_head(POST_ARGS) |
|
|
|
/* Check particular section/manual conventions. */ |
/* Check particular section/manual conventions. */ |
|
|
if (mdoc->meta.msec == NULL) { |
if (mdoc->meta.msec == NULL) |
free(secname); |
|
return; |
return; |
} |
|
|
|
goodsec = NULL; |
goodsec = NULL; |
switch (sec) { |
switch (sec) { |
Line 1937 post_sh_head(POST_ARGS) |
|
Line 1856 post_sh_head(POST_ARGS) |
|
goodsec = "2, 3, 4, 9"; |
goodsec = "2, 3, 4, 9"; |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case SEC_RETURN_VALUES: |
case SEC_RETURN_VALUES: |
/* FALLTHROUGH */ |
|
case SEC_LIBRARY: |
case SEC_LIBRARY: |
if (*mdoc->meta.msec == '2') |
if (*mdoc->meta.msec == '2') |
break; |
break; |
Line 1953 post_sh_head(POST_ARGS) |
|
Line 1871 post_sh_head(POST_ARGS) |
|
goodsec = "9"; |
goodsec = "9"; |
mandoc_vmsg(MANDOCERR_SEC_MSEC, mdoc->parse, |
mandoc_vmsg(MANDOCERR_SEC_MSEC, mdoc->parse, |
mdoc->last->line, mdoc->last->pos, |
mdoc->last->line, mdoc->last->pos, |
"Sh %s for %s only", secname, goodsec); |
"Sh %s for %s only", secnames[sec], goodsec); |
break; |
break; |
default: |
default: |
break; |
break; |
} |
} |
free(secname); |
|
} |
} |
|
|
static void |
static void |
Line 1976 post_ignpar(POST_ARGS) |
|
Line 1893 post_ignpar(POST_ARGS) |
|
return; |
return; |
} |
} |
|
|
if (NULL != (np = mdoc->last->child)) |
if ((np = mdoc->last->child) != NULL) |
if (MDOC_Pp == np->tok || MDOC_Lp == np->tok) { |
if (np->tok == MDOC_Pp || np->tok == MDOC_Lp) { |
mandoc_vmsg(MANDOCERR_PAR_SKIP, |
mandoc_vmsg(MANDOCERR_PAR_SKIP, |
mdoc->parse, np->line, np->pos, |
mdoc->parse, np->line, np->pos, |
"%s after %s", mdoc_macronames[np->tok], |
"%s after %s", mdoc_macronames[np->tok], |
Line 1985 post_ignpar(POST_ARGS) |
|
Line 1902 post_ignpar(POST_ARGS) |
|
roff_node_delete(mdoc, np); |
roff_node_delete(mdoc, np); |
} |
} |
|
|
if (NULL != (np = mdoc->last->last)) |
if ((np = mdoc->last->last) != NULL) |
if (MDOC_Pp == np->tok || MDOC_Lp == np->tok) { |
if (np->tok == MDOC_Pp || np->tok == MDOC_Lp) { |
mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse, |
mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse, |
np->line, np->pos, "%s at the end of %s", |
np->line, np->pos, "%s at the end of %s", |
mdoc_macronames[np->tok], |
mdoc_macronames[np->tok], |
Line 2044 post_par(POST_ARGS) |
|
Line 1961 post_par(POST_ARGS) |
|
mdoc->parse, np->line, np->pos, "%s %s", |
mdoc->parse, np->line, np->pos, "%s %s", |
mdoc_macronames[np->tok], np->child->string); |
mdoc_macronames[np->tok], np->child->string); |
|
|
if (NULL == (np = mdoc->last->prev)) { |
if ((np = mdoc->last->prev) == NULL) { |
np = mdoc->last->parent; |
np = mdoc->last->parent; |
if (MDOC_Sh != np->tok && MDOC_Ss != np->tok) |
if (np->tok != MDOC_Sh && np->tok != MDOC_Ss) |
return; |
return; |
} else if (MDOC_Pp != np->tok && MDOC_Lp != np->tok && |
} else if (np->tok != MDOC_Pp && np->tok != MDOC_Lp && |
(MDOC_br != mdoc->last->tok || |
(mdoc->last->tok != MDOC_br || |
(MDOC_sp != np->tok && MDOC_br != np->tok))) |
(np->tok != MDOC_sp && np->tok != MDOC_br))) |
return; |
return; |
|
|
mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse, |
mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse, |
Line 2061 post_par(POST_ARGS) |
|
Line 1978 post_par(POST_ARGS) |
|
} |
} |
|
|
static void |
static void |
pre_literal(PRE_ARGS) |
|
{ |
|
|
|
pre_display(mdoc, n); |
|
|
|
if (n->type != ROFFT_BODY) |
|
return; |
|
|
|
/* |
|
* The `Dl' (note "el" not "one") and `Bd -literal' and `Bd |
|
* -unfilled' macros set MDOC_LITERAL on entrance to the body. |
|
*/ |
|
|
|
switch (n->tok) { |
|
case MDOC_Dl: |
|
mdoc->flags |= MDOC_LITERAL; |
|
break; |
|
case MDOC_Bd: |
|
if (DISP_literal == n->norm->Bd.type) |
|
mdoc->flags |= MDOC_LITERAL; |
|
if (DISP_unfilled == n->norm->Bd.type) |
|
mdoc->flags |= MDOC_LITERAL; |
|
break; |
|
default: |
|
abort(); |
|
} |
|
} |
|
|
|
static void |
|
post_dd(POST_ARGS) |
post_dd(POST_ARGS) |
{ |
{ |
struct roff_node *n; |
struct roff_node *n; |
char *datestr; |
char *datestr; |
|
|
if (mdoc->meta.date) |
n = mdoc->last; |
|
if (mdoc->meta.date != NULL) { |
|
mandoc_msg(MANDOCERR_PROLOG_REP, mdoc->parse, |
|
n->line, n->pos, "Dd"); |
free(mdoc->meta.date); |
free(mdoc->meta.date); |
|
} else if (mdoc->flags & MDOC_PBODY) |
|
mandoc_msg(MANDOCERR_PROLOG_LATE, mdoc->parse, |
|
n->line, n->pos, "Dd"); |
|
else if (mdoc->meta.title != NULL) |
|
mandoc_msg(MANDOCERR_PROLOG_ORDER, mdoc->parse, |
|
n->line, n->pos, "Dd after Dt"); |
|
else if (mdoc->meta.os != NULL) |
|
mandoc_msg(MANDOCERR_PROLOG_ORDER, mdoc->parse, |
|
n->line, n->pos, "Dd after Os"); |
|
|
n = mdoc->last; |
if (n->child == NULL || n->child->string[0] == '\0') { |
if (NULL == n->child || '\0' == n->child->string[0]) { |
|
mdoc->meta.date = mdoc->quick ? mandoc_strdup("") : |
mdoc->meta.date = mdoc->quick ? mandoc_strdup("") : |
mandoc_normdate(mdoc->parse, NULL, n->line, n->pos); |
mandoc_normdate(mdoc->parse, NULL, n->line, n->pos); |
goto out; |
goto out; |
Line 2126 post_dt(POST_ARGS) |
|
Line 2025 post_dt(POST_ARGS) |
|
char *p; |
char *p; |
|
|
n = mdoc->last; |
n = mdoc->last; |
|
if (mdoc->flags & MDOC_PBODY) { |
|
mandoc_msg(MANDOCERR_DT_LATE, mdoc->parse, |
|
n->line, n->pos, "Dt"); |
|
goto out; |
|
} |
|
|
|
if (mdoc->meta.title != NULL) |
|
mandoc_msg(MANDOCERR_PROLOG_REP, mdoc->parse, |
|
n->line, n->pos, "Dt"); |
|
else if (mdoc->meta.os != NULL) |
|
mandoc_msg(MANDOCERR_PROLOG_ORDER, mdoc->parse, |
|
n->line, n->pos, "Dt after Os"); |
|
|
free(mdoc->meta.title); |
free(mdoc->meta.title); |
free(mdoc->meta.msec); |
free(mdoc->meta.msec); |
free(mdoc->meta.vol); |
free(mdoc->meta.vol); |
Line 2214 post_bx(POST_ARGS) |
|
Line 2125 post_bx(POST_ARGS) |
|
* uppercase blindly. |
* uppercase blindly. |
*/ |
*/ |
|
|
n = mdoc->last->child; |
if ((n = mdoc->last->child) != NULL && (n = n->next) != NULL) |
if (n && NULL != (n = n->next)) |
|
*n->string = (char)toupper((unsigned char)*n->string); |
*n->string = (char)toupper((unsigned char)*n->string); |
} |
} |
|
|
Line 2229 post_os(POST_ARGS) |
|
Line 2139 post_os(POST_ARGS) |
|
struct roff_node *n; |
struct roff_node *n; |
|
|
n = mdoc->last; |
n = mdoc->last; |
|
if (mdoc->meta.os != NULL) |
|
mandoc_msg(MANDOCERR_PROLOG_REP, mdoc->parse, |
|
n->line, n->pos, "Os"); |
|
else if (mdoc->flags & MDOC_PBODY) |
|
mandoc_msg(MANDOCERR_PROLOG_LATE, mdoc->parse, |
|
n->line, n->pos, "Os"); |
|
|
/* |
/* |
* Set the operating system by way of the `Os' macro. |
* Set the operating system by way of the `Os' macro. |
Line 2253 post_os(POST_ARGS) |
|
Line 2169 post_os(POST_ARGS) |
|
#ifdef OSNAME |
#ifdef OSNAME |
mdoc->meta.os = mandoc_strdup(OSNAME); |
mdoc->meta.os = mandoc_strdup(OSNAME); |
#else /*!OSNAME */ |
#else /*!OSNAME */ |
if (NULL == defbuf) { |
if (defbuf == NULL) { |
if (-1 == uname(&utsname)) { |
if (uname(&utsname) == -1) { |
mandoc_msg(MANDOCERR_OS_UNAME, mdoc->parse, |
mandoc_msg(MANDOCERR_OS_UNAME, mdoc->parse, |
n->line, n->pos, "Os"); |
n->line, n->pos, "Os"); |
defbuf = mandoc_strdup("UNKNOWN"); |
defbuf = mandoc_strdup("UNKNOWN"); |
Line 2280 post_ex(POST_ARGS) |
|
Line 2196 post_ex(POST_ARGS) |
|
|
|
n = mdoc->last; |
n = mdoc->last; |
|
|
if (n->child) |
if (n->child != NULL) |
return; |
return; |
|
|
if (mdoc->meta.name == NULL) { |
if (mdoc->meta.name == NULL) { |
Line 2294 post_ex(POST_ARGS) |
|
Line 2210 post_ex(POST_ARGS) |
|
mdoc->last = n; |
mdoc->last = n; |
} |
} |
|
|
static enum roff_sec |
enum roff_sec |
a2sec(const char *p) |
mdoc_a2sec(const char *p) |
{ |
{ |
int i; |
int i; |
|
|
for (i = 0; i < (int)SEC__MAX; i++) |
for (i = 0; i < (int)SEC__MAX; i++) |
if (secnames[i] && 0 == strcmp(p, secnames[i])) |
if (secnames[i] && 0 == strcmp(p, secnames[i])) |
return((enum roff_sec)i); |
return (enum roff_sec)i; |
|
|
return(SEC_CUSTOM); |
return SEC_CUSTOM; |
} |
} |
|
|
static size_t |
static size_t |
Line 2312 macro2len(int macro) |
|
Line 2228 macro2len(int macro) |
|
|
|
switch (macro) { |
switch (macro) { |
case MDOC_Ad: |
case MDOC_Ad: |
return(12); |
return 12; |
case MDOC_Ao: |
case MDOC_Ao: |
return(12); |
return 12; |
case MDOC_An: |
case MDOC_An: |
return(12); |
return 12; |
case MDOC_Aq: |
case MDOC_Aq: |
return(12); |
return 12; |
case MDOC_Ar: |
case MDOC_Ar: |
return(12); |
return 12; |
case MDOC_Bo: |
case MDOC_Bo: |
return(12); |
return 12; |
case MDOC_Bq: |
case MDOC_Bq: |
return(12); |
return 12; |
case MDOC_Cd: |
case MDOC_Cd: |
return(12); |
return 12; |
case MDOC_Cm: |
case MDOC_Cm: |
return(10); |
return 10; |
case MDOC_Do: |
case MDOC_Do: |
return(10); |
return 10; |
case MDOC_Dq: |
case MDOC_Dq: |
return(12); |
return 12; |
case MDOC_Dv: |
case MDOC_Dv: |
return(12); |
return 12; |
case MDOC_Eo: |
case MDOC_Eo: |
return(12); |
return 12; |
case MDOC_Em: |
case MDOC_Em: |
return(10); |
return 10; |
case MDOC_Er: |
case MDOC_Er: |
return(17); |
return 17; |
case MDOC_Ev: |
case MDOC_Ev: |
return(15); |
return 15; |
case MDOC_Fa: |
case MDOC_Fa: |
return(12); |
return 12; |
case MDOC_Fl: |
case MDOC_Fl: |
return(10); |
return 10; |
case MDOC_Fo: |
case MDOC_Fo: |
return(16); |
return 16; |
case MDOC_Fn: |
case MDOC_Fn: |
return(16); |
return 16; |
case MDOC_Ic: |
case MDOC_Ic: |
return(10); |
return 10; |
case MDOC_Li: |
case MDOC_Li: |
return(16); |
return 16; |
case MDOC_Ms: |
case MDOC_Ms: |
return(6); |
return 6; |
case MDOC_Nm: |
case MDOC_Nm: |
return(10); |
return 10; |
case MDOC_No: |
case MDOC_No: |
return(12); |
return 12; |
case MDOC_Oo: |
case MDOC_Oo: |
return(10); |
return 10; |
case MDOC_Op: |
case MDOC_Op: |
return(14); |
return 14; |
case MDOC_Pa: |
case MDOC_Pa: |
return(32); |
return 32; |
case MDOC_Pf: |
case MDOC_Pf: |
return(12); |
return 12; |
case MDOC_Po: |
case MDOC_Po: |
return(12); |
return 12; |
case MDOC_Pq: |
case MDOC_Pq: |
return(12); |
return 12; |
case MDOC_Ql: |
case MDOC_Ql: |
return(16); |
return 16; |
case MDOC_Qo: |
case MDOC_Qo: |
return(12); |
return 12; |
case MDOC_So: |
case MDOC_So: |
return(12); |
return 12; |
case MDOC_Sq: |
case MDOC_Sq: |
return(12); |
return 12; |
case MDOC_Sy: |
case MDOC_Sy: |
return(6); |
return 6; |
case MDOC_Sx: |
case MDOC_Sx: |
return(16); |
return 16; |
case MDOC_Tn: |
case MDOC_Tn: |
return(10); |
return 10; |
case MDOC_Va: |
case MDOC_Va: |
return(12); |
return 12; |
case MDOC_Vt: |
case MDOC_Vt: |
return(12); |
return 12; |
case MDOC_Xr: |
case MDOC_Xr: |
return(10); |
return 10; |
default: |
default: |
break; |
break; |
}; |
}; |
return(0); |
return 0; |
} |
} |