version 1.316, 2017/01/10 23:36:34 |
version 1.325, 2017/05/05 13:17:55 |
Line 51 enum check_ineq { |
|
Line 51 enum check_ineq { |
|
|
|
typedef void (*v_post)(POST_ARGS); |
typedef void (*v_post)(POST_ARGS); |
|
|
|
static int build_list(struct roff_man *, int); |
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 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 size_t macro2len(int); |
static size_t macro2len(enum roff_tok); |
static void rewrite_macro2len(char **); |
static void rewrite_macro2len(struct roff_man *, char **); |
|
|
static void post_an(POST_ARGS); |
static void post_an(POST_ARGS); |
static void post_an_norm(POST_ARGS); |
static void post_an_norm(POST_ARGS); |
Line 95 static void post_par(POST_ARGS); |
|
Line 96 static void post_par(POST_ARGS); |
|
static void post_prevpar(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_rv(POST_ARGS); |
static void post_sh(POST_ARGS); |
static void post_sh(POST_ARGS); |
static void post_sh_head(POST_ARGS); |
static void post_sh_head(POST_ARGS); |
static void post_sh_name(POST_ARGS); |
static void post_sh_name(POST_ARGS); |
Line 106 static void post_std(POST_ARGS); |
|
Line 108 static void post_std(POST_ARGS); |
|
static void post_xr(POST_ARGS); |
static void post_xr(POST_ARGS); |
static void post_xx(POST_ARGS); |
static void post_xx(POST_ARGS); |
|
|
static v_post mdoc_valids[MDOC_MAX] = { |
static const v_post __mdoc_valids[MDOC_MAX - MDOC_Dd] = { |
NULL, /* Ap */ |
|
post_dd, /* Dd */ |
post_dd, /* Dd */ |
post_dt, /* Dt */ |
post_dt, /* Dt */ |
post_os, /* Os */ |
post_os, /* Os */ |
Line 123 static v_post mdoc_valids[MDOC_MAX] = { |
|
Line 124 static v_post mdoc_valids[MDOC_MAX] = { |
|
post_it, /* It */ |
post_it, /* It */ |
NULL, /* Ad */ |
NULL, /* Ad */ |
post_an, /* An */ |
post_an, /* An */ |
|
NULL, /* Ap */ |
post_defaults, /* Ar */ |
post_defaults, /* Ar */ |
NULL, /* Cd */ |
NULL, /* Cd */ |
NULL, /* Cm */ |
NULL, /* Cm */ |
Line 143 static v_post mdoc_valids[MDOC_MAX] = { |
|
Line 145 static v_post mdoc_valids[MDOC_MAX] = { |
|
NULL, /* Op */ |
NULL, /* Op */ |
post_obsolete, /* Ot */ |
post_obsolete, /* Ot */ |
post_defaults, /* Pa */ |
post_defaults, /* Pa */ |
post_std, /* Rv */ |
post_rv, /* Rv */ |
post_st, /* St */ |
post_st, /* St */ |
NULL, /* Va */ |
NULL, /* Va */ |
NULL, /* Vt */ |
NULL, /* Vt */ |
Line 225 static v_post mdoc_valids[MDOC_MAX] = { |
|
Line 227 static v_post mdoc_valids[MDOC_MAX] = { |
|
post_en, /* En */ |
post_en, /* En */ |
post_xx, /* Dx */ |
post_xx, /* Dx */ |
NULL, /* %Q */ |
NULL, /* %Q */ |
post_par, /* br */ |
|
post_par, /* sp */ |
post_par, /* sp */ |
NULL, /* %U */ |
NULL, /* %U */ |
NULL, /* Ta */ |
NULL, /* Ta */ |
NULL, /* ll */ |
|
}; |
}; |
|
static const v_post *const mdoc_valids = __mdoc_valids - MDOC_Dd; |
|
|
#define RSORD_MAX 14 /* Number of `Rs' blocks. */ |
#define RSORD_MAX 14 /* Number of `Rs' blocks. */ |
|
|
static const int rsord[RSORD_MAX] = { |
static const enum roff_tok rsord[RSORD_MAX] = { |
MDOC__A, |
MDOC__A, |
MDOC__T, |
MDOC__T, |
MDOC__B, |
MDOC__B, |
|
|
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; |
const v_post *p; |
|
|
n = mdoc->last; |
n = mdoc->last; |
mdoc->last = mdoc->last->child; |
mdoc->last = mdoc->last->child; |
Line 324 mdoc_node_validate(struct roff_man *mdoc) |
|
Line 325 mdoc_node_validate(struct roff_man *mdoc) |
|
|
|
/* Call the macro's postprocessor. */ |
/* Call the macro's postprocessor. */ |
|
|
|
if (n->tok < ROFF_MAX) { |
|
switch(n->tok) { |
|
case ROFF_br: |
|
post_par(mdoc); |
|
break; |
|
default: |
|
roff_validate(mdoc); |
|
break; |
|
} |
|
break; |
|
} |
|
|
|
assert(n->tok >= MDOC_Dd && n->tok < MDOC_MAX); |
p = mdoc_valids + n->tok; |
p = mdoc_valids + n->tok; |
if (*p) |
if (*p) |
(*p)(mdoc); |
(*p)(mdoc); |
Line 448 post_bl_norm(POST_ARGS) |
|
Line 462 post_bl_norm(POST_ARGS) |
|
mdoc->parse, argv->line, |
mdoc->parse, argv->line, |
argv->pos, "Bl -width %s", |
argv->pos, "Bl -width %s", |
argv->value[0]); |
argv->value[0]); |
rewrite_macro2len(argv->value); |
rewrite_macro2len(mdoc, argv->value); |
n->norm->Bl.width = argv->value[0]; |
n->norm->Bl.width = argv->value[0]; |
break; |
break; |
case MDOC_Offset: |
case MDOC_Offset: |
Line 463 post_bl_norm(POST_ARGS) |
|
Line 477 post_bl_norm(POST_ARGS) |
|
mdoc->parse, argv->line, |
mdoc->parse, argv->line, |
argv->pos, "Bl -offset %s", |
argv->pos, "Bl -offset %s", |
argv->value[0]); |
argv->value[0]); |
rewrite_macro2len(argv->value); |
rewrite_macro2len(mdoc, argv->value); |
n->norm->Bl.offs = argv->value[0]; |
n->norm->Bl.offs = argv->value[0]; |
break; |
break; |
default: |
default: |
Line 590 post_bd(POST_ARGS) |
|
Line 604 post_bd(POST_ARGS) |
|
mdoc->parse, argv->line, |
mdoc->parse, argv->line, |
argv->pos, "Bd -offset %s", |
argv->pos, "Bd -offset %s", |
argv->value[0]); |
argv->value[0]); |
rewrite_macro2len(argv->value); |
rewrite_macro2len(mdoc, argv->value); |
n->norm->Bd.offs = argv->value[0]; |
n->norm->Bd.offs = argv->value[0]; |
break; |
break; |
case MDOC_Compact: |
case MDOC_Compact: |
Line 621 post_bd(POST_ARGS) |
|
Line 635 post_bd(POST_ARGS) |
|
} |
} |
} |
} |
|
|
|
/* |
|
* Stand-alone line macros. |
|
*/ |
|
|
static void |
static void |
post_an_norm(POST_ARGS) |
post_an_norm(POST_ARGS) |
{ |
{ |
Line 649 post_an_norm(POST_ARGS) |
|
Line 667 post_an_norm(POST_ARGS) |
|
} |
} |
|
|
static void |
static void |
|
post_eoln(POST_ARGS) |
|
{ |
|
struct roff_node *n; |
|
|
|
n = mdoc->last; |
|
if (n->child != NULL) |
|
mandoc_vmsg(MANDOCERR_ARG_SKIP, mdoc->parse, n->line, |
|
n->pos, "%s %s", roff_name[n->tok], n->child->string); |
|
|
|
while (n->child != NULL) |
|
roff_node_delete(mdoc, n->child); |
|
|
|
roff_word_alloc(mdoc, n->line, n->pos, n->tok == MDOC_Bt ? |
|
"is currently in beta test." : "currently under development."); |
|
mdoc->last->flags |= NODE_EOS | NODE_NOSRC; |
|
mdoc->last = n; |
|
} |
|
|
|
static int |
|
build_list(struct roff_man *mdoc, int tok) |
|
{ |
|
struct roff_node *n; |
|
int ic; |
|
|
|
n = mdoc->last->next; |
|
for (ic = 1;; ic++) { |
|
roff_elem_alloc(mdoc, n->line, n->pos, tok); |
|
mdoc->last->flags |= NODE_NOSRC; |
|
mdoc_node_relink(mdoc, n); |
|
n = mdoc->last = mdoc->last->parent; |
|
mdoc->next = ROFF_NEXT_SIBLING; |
|
if (n->next == NULL) |
|
return ic; |
|
if (ic > 1 || n->next->next != NULL) { |
|
roff_word_alloc(mdoc, n->line, n->pos, ","); |
|
mdoc->last->flags |= NODE_DELIMC | NODE_NOSRC; |
|
} |
|
n = mdoc->last->next; |
|
if (n->next == NULL) { |
|
roff_word_alloc(mdoc, n->line, n->pos, "and"); |
|
mdoc->last->flags |= NODE_NOSRC; |
|
} |
|
} |
|
} |
|
|
|
static void |
|
post_ex(POST_ARGS) |
|
{ |
|
struct roff_node *n; |
|
int ic; |
|
|
|
post_std(mdoc); |
|
|
|
n = mdoc->last; |
|
mdoc->next = ROFF_NEXT_CHILD; |
|
roff_word_alloc(mdoc, n->line, n->pos, "The"); |
|
mdoc->last->flags |= NODE_NOSRC; |
|
|
|
if (mdoc->last->next != NULL) |
|
ic = build_list(mdoc, MDOC_Nm); |
|
else if (mdoc->meta.name != NULL) { |
|
roff_elem_alloc(mdoc, n->line, n->pos, MDOC_Nm); |
|
mdoc->last->flags |= NODE_NOSRC; |
|
roff_word_alloc(mdoc, n->line, n->pos, mdoc->meta.name); |
|
mdoc->last->flags |= NODE_NOSRC; |
|
mdoc->last = mdoc->last->parent; |
|
mdoc->next = ROFF_NEXT_SIBLING; |
|
ic = 1; |
|
} else { |
|
mandoc_msg(MANDOCERR_EX_NONAME, mdoc->parse, |
|
n->line, n->pos, "Ex"); |
|
ic = 0; |
|
} |
|
|
|
roff_word_alloc(mdoc, n->line, n->pos, |
|
ic > 1 ? "utilities exit\\~0" : "utility exits\\~0"); |
|
mdoc->last->flags |= NODE_NOSRC; |
|
roff_word_alloc(mdoc, n->line, n->pos, |
|
"on success, and\\~>0 if an error occurs."); |
|
mdoc->last->flags |= NODE_EOS | NODE_NOSRC; |
|
mdoc->last = n; |
|
} |
|
|
|
static void |
|
post_lb(POST_ARGS) |
|
{ |
|
struct roff_node *n; |
|
const char *p; |
|
|
|
n = mdoc->last; |
|
assert(n->child->type == ROFFT_TEXT); |
|
mdoc->next = ROFF_NEXT_CHILD; |
|
|
|
if ((p = mdoc_a2lib(n->child->string)) != NULL) { |
|
n->child->flags |= NODE_NOPRT; |
|
roff_word_alloc(mdoc, n->line, n->pos, p); |
|
mdoc->last->flags = NODE_NOSRC; |
|
mdoc->last = n; |
|
return; |
|
} |
|
|
|
roff_word_alloc(mdoc, n->line, n->pos, "library"); |
|
mdoc->last->flags = NODE_NOSRC; |
|
roff_word_alloc(mdoc, n->line, n->pos, "\\(Lq"); |
|
mdoc->last->flags = NODE_DELIMO | NODE_NOSRC; |
|
mdoc->last = mdoc->last->next; |
|
roff_word_alloc(mdoc, n->line, n->pos, "\\(Rq"); |
|
mdoc->last->flags = NODE_DELIMC | NODE_NOSRC; |
|
mdoc->last = n; |
|
} |
|
|
|
static void |
|
post_rv(POST_ARGS) |
|
{ |
|
struct roff_node *n; |
|
int ic; |
|
|
|
post_std(mdoc); |
|
|
|
n = mdoc->last; |
|
mdoc->next = ROFF_NEXT_CHILD; |
|
if (n->child != NULL) { |
|
roff_word_alloc(mdoc, n->line, n->pos, "The"); |
|
mdoc->last->flags |= NODE_NOSRC; |
|
ic = build_list(mdoc, MDOC_Fn); |
|
roff_word_alloc(mdoc, n->line, n->pos, |
|
ic > 1 ? "functions return" : "function returns"); |
|
mdoc->last->flags |= NODE_NOSRC; |
|
roff_word_alloc(mdoc, n->line, n->pos, |
|
"the value\\~0 if successful;"); |
|
} else |
|
roff_word_alloc(mdoc, n->line, n->pos, "Upon successful " |
|
"completion, the value\\~0 is returned;"); |
|
mdoc->last->flags |= NODE_NOSRC; |
|
|
|
roff_word_alloc(mdoc, n->line, n->pos, "otherwise " |
|
"the value\\~\\-1 is returned and the global variable"); |
|
mdoc->last->flags |= NODE_NOSRC; |
|
roff_elem_alloc(mdoc, n->line, n->pos, MDOC_Va); |
|
mdoc->last->flags |= NODE_NOSRC; |
|
roff_word_alloc(mdoc, n->line, n->pos, "errno"); |
|
mdoc->last->flags |= NODE_NOSRC; |
|
mdoc->last = mdoc->last->parent; |
|
mdoc->next = ROFF_NEXT_SIBLING; |
|
roff_word_alloc(mdoc, n->line, n->pos, |
|
"is set to indicate the error."); |
|
mdoc->last->flags |= NODE_EOS | NODE_NOSRC; |
|
mdoc->last = n; |
|
} |
|
|
|
static void |
post_std(POST_ARGS) |
post_std(POST_ARGS) |
{ |
{ |
struct roff_node *n; |
struct roff_node *n; |
Line 659 post_std(POST_ARGS) |
|
Line 828 post_std(POST_ARGS) |
|
return; |
return; |
|
|
mandoc_msg(MANDOCERR_ARG_STD, mdoc->parse, |
mandoc_msg(MANDOCERR_ARG_STD, mdoc->parse, |
n->line, n->pos, mdoc_macronames[n->tok]); |
n->line, n->pos, roff_name[n->tok]); |
} |
} |
|
|
static void |
static void |
|
post_st(POST_ARGS) |
|
{ |
|
struct roff_node *n, *nch; |
|
const char *p; |
|
|
|
n = mdoc->last; |
|
nch = n->child; |
|
assert(nch->type == ROFFT_TEXT); |
|
|
|
if ((p = mdoc_a2st(nch->string)) == NULL) { |
|
mandoc_vmsg(MANDOCERR_ST_BAD, mdoc->parse, |
|
nch->line, nch->pos, "St %s", nch->string); |
|
roff_node_delete(mdoc, n); |
|
return; |
|
} |
|
|
|
nch->flags |= NODE_NOPRT; |
|
mdoc->next = ROFF_NEXT_CHILD; |
|
roff_word_alloc(mdoc, nch->line, nch->pos, p); |
|
mdoc->last->flags |= NODE_NOSRC; |
|
mdoc->last= n; |
|
} |
|
|
|
static void |
post_obsolete(POST_ARGS) |
post_obsolete(POST_ARGS) |
{ |
{ |
struct roff_node *n; |
struct roff_node *n; |
Line 670 post_obsolete(POST_ARGS) |
|
Line 863 post_obsolete(POST_ARGS) |
|
n = mdoc->last; |
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, roff_name[n->tok]); |
} |
} |
|
|
|
/* |
|
* Block macros. |
|
*/ |
|
|
static void |
static void |
post_bf(POST_ARGS) |
post_bf(POST_ARGS) |
{ |
{ |
Line 739 post_bf(POST_ARGS) |
|
Line 936 post_bf(POST_ARGS) |
|
} |
} |
|
|
static void |
static void |
post_lb(POST_ARGS) |
|
{ |
|
struct roff_node *n; |
|
const char *stdlibname; |
|
char *libname; |
|
|
|
n = mdoc->last->child; |
|
assert(n->type == ROFFT_TEXT); |
|
|
|
if (NULL == (stdlibname = mdoc_a2lib(n->string))) |
|
mandoc_asprintf(&libname, |
|
"library \\(Lq%s\\(Rq", n->string); |
|
else |
|
libname = mandoc_strdup(stdlibname); |
|
|
|
free(n->string); |
|
n->string = libname; |
|
} |
|
|
|
static void |
|
post_eoln(POST_ARGS) |
|
{ |
|
const struct roff_node *n; |
|
|
|
n = mdoc->last; |
|
if (n->child != NULL) |
|
mandoc_vmsg(MANDOCERR_ARG_SKIP, |
|
mdoc->parse, n->line, n->pos, |
|
"%s %s", mdoc_macronames[n->tok], |
|
n->child->string); |
|
} |
|
|
|
static void |
|
post_fname(POST_ARGS) |
post_fname(POST_ARGS) |
{ |
{ |
const struct roff_node *n; |
const struct roff_node *n; |
Line 860 post_nm(POST_ARGS) |
|
Line 1024 post_nm(POST_ARGS) |
|
(mdoc->lastsec == SEC_NAME && n->child == NULL)) |
(mdoc->lastsec == SEC_NAME && n->child == 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"); |
|
|
|
if ((n->type != ROFFT_ELEM && n->type != ROFFT_HEAD) || |
|
(n->child != NULL && n->child->type == ROFFT_TEXT) || |
|
mdoc->meta.name == NULL) |
|
return; |
|
|
|
mdoc->next = ROFF_NEXT_CHILD; |
|
roff_word_alloc(mdoc, n->line, n->pos, mdoc->meta.name); |
|
mdoc->last->flags |= NODE_NOSRC; |
|
mdoc->last = n; |
} |
} |
|
|
static void |
static void |
Line 872 post_nd(POST_ARGS) |
|
Line 1046 post_nd(POST_ARGS) |
|
if (n->type != ROFFT_BODY) |
if (n->type != ROFFT_BODY) |
return; |
return; |
|
|
|
if (n->sec != SEC_NAME) |
|
mandoc_msg(MANDOCERR_ND_LATE, mdoc->parse, |
|
n->line, n->pos, "Nd"); |
|
|
if (n->child == NULL) |
if (n->child == NULL) |
mandoc_msg(MANDOCERR_ND_EMPTY, mdoc->parse, |
mandoc_msg(MANDOCERR_ND_EMPTY, mdoc->parse, |
n->line, n->pos, "Nd"); |
n->line, n->pos, "Nd"); |
Line 893 post_display(POST_ARGS) |
|
Line 1071 post_display(POST_ARGS) |
|
roff_node_delete(mdoc, n); |
roff_node_delete(mdoc, n); |
} else if (n->child == NULL) |
} else 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, roff_name[n->tok]); |
else if (n->tok == MDOC_D1) |
else if (n->tok == MDOC_D1) |
post_hyph(mdoc); |
post_hyph(mdoc); |
break; |
break; |
Line 916 post_display(POST_ARGS) |
|
Line 1094 post_display(POST_ARGS) |
|
if (np->type == ROFFT_BLOCK && np->tok == MDOC_Bd) { |
if (np->type == ROFFT_BLOCK && np->tok == MDOC_Bd) { |
mandoc_vmsg(MANDOCERR_BD_NEST, |
mandoc_vmsg(MANDOCERR_BD_NEST, |
mdoc->parse, n->line, n->pos, |
mdoc->parse, n->line, n->pos, |
"%s in Bd", mdoc_macronames[n->tok]); |
"%s in Bd", roff_name[n->tok]); |
break; |
break; |
} |
} |
} |
} |
Line 1102 post_it(POST_ARGS) |
|
Line 1280 post_it(POST_ARGS) |
|
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case LIST_item: |
case LIST_item: |
if ((nch = nit->head->child) != NULL) |
if ((nch = nit->head->child) != NULL) |
mandoc_vmsg(MANDOCERR_ARG_SKIP, |
mandoc_vmsg(MANDOCERR_ARG_SKIP, mdoc->parse, |
mdoc->parse, nit->line, nit->pos, |
nit->line, nit->pos, "It %s", |
"It %s", nch->string == NULL ? |
nch->string == NULL ? roff_name[nch->tok] : |
mdoc_macronames[nch->tok] : nch->string); |
nch->string); |
break; |
break; |
case LIST_column: |
case LIST_column: |
cols = (int)nbl->norm->Bl.ncols; |
cols = (int)nbl->norm->Bl.ncols; |
Line 1143 post_bl_block(POST_ARGS) |
|
Line 1321 post_bl_block(POST_ARGS) |
|
switch (nc->tok) { |
switch (nc->tok) { |
case MDOC_Pp: |
case MDOC_Pp: |
case MDOC_Lp: |
case MDOC_Lp: |
case MDOC_br: |
case ROFF_br: |
break; |
break; |
default: |
default: |
nc = NULL; |
nc = NULL; |
Line 1152 post_bl_block(POST_ARGS) |
|
Line 1330 post_bl_block(POST_ARGS) |
|
if (ni->next == NULL) { |
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]); |
roff_name[nc->tok]); |
mdoc_node_relink(mdoc, nc); |
mdoc_node_relink(mdoc, nc); |
} else if (n->norm->Bl.comp == 0 && |
} else if (n->norm->Bl.comp == 0 && |
n->norm->Bl.type != LIST_column) { |
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", roff_name[nc->tok]); |
mdoc_macronames[nc->tok]); |
|
roff_node_delete(mdoc, nc); |
roff_node_delete(mdoc, nc); |
} else |
} else |
break; |
break; |
Line 1172 post_bl_block(POST_ARGS) |
|
Line 1349 post_bl_block(POST_ARGS) |
|
* If the argument of -offset or -width is a macro, |
* If the argument of -offset or -width is a macro, |
* replace it with the associated default width. |
* replace it with the associated default width. |
*/ |
*/ |
void |
static void |
rewrite_macro2len(char **arg) |
rewrite_macro2len(struct roff_man *mdoc, char **arg) |
{ |
{ |
size_t width; |
size_t width; |
int tok; |
enum roff_tok tok; |
|
|
if (*arg == NULL) |
if (*arg == NULL) |
return; |
return; |
else if ( ! strcmp(*arg, "Ds")) |
else if ( ! strcmp(*arg, "Ds")) |
width = 6; |
width = 6; |
else if ((tok = mdoc_hash_find(*arg)) == TOKEN_NONE) |
else if ((tok = roffhash_find(mdoc->mdocmac, *arg, 0)) == TOKEN_NONE) |
return; |
return; |
else |
else |
width = macro2len(tok); |
width = macro2len(tok); |
Line 1323 post_bl(POST_ARGS) |
|
Line 1500 post_bl(POST_ARGS) |
|
} |
} |
|
|
mandoc_msg(MANDOCERR_BL_MOVE, mdoc->parse, |
mandoc_msg(MANDOCERR_BL_MOVE, mdoc->parse, |
nchild->line, nchild->pos, |
nchild->line, nchild->pos, roff_name[nchild->tok]); |
mdoc_macronames[nchild->tok]); |
|
|
|
/* |
/* |
* Move the node out of the Bl block. |
* Move the node out of the Bl block. |
Line 1402 post_sm(POST_ARGS) |
|
Line 1578 post_sm(POST_ARGS) |
|
|
|
mandoc_vmsg(MANDOCERR_SM_BAD, |
mandoc_vmsg(MANDOCERR_SM_BAD, |
mdoc->parse, nch->line, nch->pos, |
mdoc->parse, nch->line, nch->pos, |
"%s %s", mdoc_macronames[mdoc->last->tok], nch->string); |
"%s %s", roff_name[mdoc->last->tok], nch->string); |
mdoc_node_relink(mdoc, nch); |
mdoc_node_relink(mdoc, nch); |
return; |
return; |
} |
} |
Line 1445 post_root(POST_ARGS) |
|
Line 1621 post_root(POST_ARGS) |
|
mandoc_msg(MANDOCERR_DOC_EMPTY, mdoc->parse, 0, 0, NULL); |
mandoc_msg(MANDOCERR_DOC_EMPTY, mdoc->parse, 0, 0, NULL); |
else if (n->tok != MDOC_Sh) |
else if (n->tok != MDOC_Sh) |
mandoc_msg(MANDOCERR_SEC_BEFORE, mdoc->parse, |
mandoc_msg(MANDOCERR_SEC_BEFORE, mdoc->parse, |
n->line, n->pos, mdoc_macronames[n->tok]); |
n->line, n->pos, roff_name[n->tok]); |
} |
} |
|
|
static void |
static void |
post_st(POST_ARGS) |
|
{ |
|
struct roff_node *n, *nch; |
|
const char *p; |
|
|
|
n = mdoc->last; |
|
nch = n->child; |
|
|
|
assert(nch->type == ROFFT_TEXT); |
|
|
|
if ((p = mdoc_a2st(nch->string)) == NULL) { |
|
mandoc_vmsg(MANDOCERR_ST_BAD, mdoc->parse, |
|
nch->line, nch->pos, "St %s", nch->string); |
|
roff_node_delete(mdoc, n); |
|
} else { |
|
free(nch->string); |
|
nch->string = mandoc_strdup(p); |
|
} |
|
} |
|
|
|
static void |
|
post_rs(POST_ARGS) |
post_rs(POST_ARGS) |
{ |
{ |
struct roff_node *np, *nch, *next, *prev; |
struct roff_node *np, *nch, *next, *prev; |
Line 1500 post_rs(POST_ARGS) |
|
Line 1655 post_rs(POST_ARGS) |
|
break; |
break; |
|
|
if (i == RSORD_MAX) { |
if (i == RSORD_MAX) { |
mandoc_msg(MANDOCERR_RS_BAD, |
mandoc_msg(MANDOCERR_RS_BAD, mdoc->parse, |
mdoc->parse, nch->line, nch->pos, |
nch->line, nch->pos, roff_name[nch->tok]); |
mdoc_macronames[nch->tok]); |
|
i = -1; |
i = -1; |
} else if (nch->tok == MDOC__J || nch->tok == MDOC__B) |
} else if (nch->tok == MDOC__J || nch->tok == MDOC__B) |
np->norm->Rs.quote_T++; |
np->norm->Rs.quote_T++; |
Line 1655 post_sh_name(POST_ARGS) |
|
Line 1809 post_sh_name(POST_ARGS) |
|
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
default: |
default: |
mandoc_msg(MANDOCERR_NAMESEC_BAD, mdoc->parse, |
mandoc_msg(MANDOCERR_NAMESEC_BAD, mdoc->parse, |
n->line, n->pos, mdoc_macronames[n->tok]); |
n->line, n->pos, roff_name[n->tok]); |
continue; |
continue; |
} |
} |
break; |
break; |
Line 1776 post_sh_head(POST_ARGS) |
|
Line 1930 post_sh_head(POST_ARGS) |
|
sec != SEC_CUSTOM ? secnames[sec] : |
sec != SEC_CUSTOM ? secnames[sec] : |
(nch = mdoc->last->child) == NULL ? "" : |
(nch = mdoc->last->child) == NULL ? "" : |
nch->type == ROFFT_TEXT ? nch->string : |
nch->type == ROFFT_TEXT ? nch->string : |
mdoc_macronames[nch->tok]); |
roff_name[nch->tok]); |
|
|
/* The SYNOPSIS gets special attention in other areas. */ |
/* The SYNOPSIS gets special attention in other areas. */ |
|
|
Line 1872 post_ignpar(POST_ARGS) |
|
Line 2026 post_ignpar(POST_ARGS) |
|
struct roff_node *np; |
struct roff_node *np; |
|
|
switch (mdoc->last->type) { |
switch (mdoc->last->type) { |
|
case ROFFT_BLOCK: |
|
post_prevpar(mdoc); |
|
return; |
case ROFFT_HEAD: |
case ROFFT_HEAD: |
post_hyph(mdoc); |
post_hyph(mdoc); |
return; |
return; |
Line 1885 post_ignpar(POST_ARGS) |
|
Line 2042 post_ignpar(POST_ARGS) |
|
if (np->tok == MDOC_Pp || np->tok == MDOC_Lp) { |
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", roff_name[np->tok], |
mdoc_macronames[mdoc->last->tok]); |
roff_name[mdoc->last->tok]); |
roff_node_delete(mdoc, np); |
roff_node_delete(mdoc, np); |
} |
} |
|
|
Line 1894 post_ignpar(POST_ARGS) |
|
Line 2051 post_ignpar(POST_ARGS) |
|
if (np->tok == MDOC_Pp || np->tok == MDOC_Lp) { |
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], |
roff_name[np->tok], |
mdoc_macronames[mdoc->last->tok]); |
roff_name[mdoc->last->tok]); |
roff_node_delete(mdoc, np); |
roff_node_delete(mdoc, np); |
} |
} |
} |
} |
Line 1918 post_prevpar(POST_ARGS) |
|
Line 2075 post_prevpar(POST_ARGS) |
|
|
|
if (n->prev->tok != MDOC_Pp && |
if (n->prev->tok != MDOC_Pp && |
n->prev->tok != MDOC_Lp && |
n->prev->tok != MDOC_Lp && |
n->prev->tok != MDOC_br) |
n->prev->tok != ROFF_br) |
return; |
return; |
if (n->tok == MDOC_Bl && n->norm->Bl.comp) |
if (n->tok == MDOC_Bl && n->norm->Bl.comp) |
return; |
return; |
Line 1928 post_prevpar(POST_ARGS) |
|
Line 2085 post_prevpar(POST_ARGS) |
|
return; |
return; |
|
|
mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse, |
mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse, |
n->prev->line, n->prev->pos, |
n->prev->line, n->prev->pos, "%s before %s", |
"%s before %s", mdoc_macronames[n->prev->tok], |
roff_name[n->prev->tok], roff_name[n->tok]); |
mdoc_macronames[n->tok]); |
|
roff_node_delete(mdoc, n->prev); |
roff_node_delete(mdoc, n->prev); |
} |
} |
|
|
Line 1940 post_par(POST_ARGS) |
|
Line 2096 post_par(POST_ARGS) |
|
struct roff_node *np; |
struct roff_node *np; |
|
|
np = mdoc->last; |
np = mdoc->last; |
if (np->tok != MDOC_br && np->tok != MDOC_sp) |
if (np->tok != ROFF_br && np->tok != MDOC_sp) |
post_prevpar(mdoc); |
post_prevpar(mdoc); |
|
|
if (np->tok == MDOC_sp) { |
if (np->tok == MDOC_sp) { |
Line 1951 post_par(POST_ARGS) |
|
Line 2107 post_par(POST_ARGS) |
|
} else if (np->child != NULL) |
} else if (np->child != NULL) |
mandoc_vmsg(MANDOCERR_ARG_SKIP, |
mandoc_vmsg(MANDOCERR_ARG_SKIP, |
mdoc->parse, np->line, np->pos, "%s %s", |
mdoc->parse, np->line, np->pos, "%s %s", |
mdoc_macronames[np->tok], np->child->string); |
roff_name[np->tok], np->child->string); |
|
|
if ((np = mdoc->last->prev) == NULL) { |
if ((np = mdoc->last->prev) == NULL) { |
np = mdoc->last->parent; |
np = mdoc->last->parent; |
if (np->tok != MDOC_Sh && np->tok != MDOC_Ss) |
if (np->tok != MDOC_Sh && np->tok != MDOC_Ss) |
return; |
return; |
} else if (np->tok != MDOC_Pp && np->tok != MDOC_Lp && |
} else if (np->tok != MDOC_Pp && np->tok != MDOC_Lp && |
(mdoc->last->tok != MDOC_br || |
(mdoc->last->tok != ROFF_br || |
(np->tok != MDOC_sp && np->tok != MDOC_br))) |
(np->tok != MDOC_sp && np->tok != ROFF_br))) |
return; |
return; |
|
|
mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse, |
mandoc_vmsg(MANDOCERR_PAR_SKIP, mdoc->parse, |
mdoc->last->line, mdoc->last->pos, |
mdoc->last->line, mdoc->last->pos, "%s after %s", |
"%s after %s", mdoc_macronames[mdoc->last->tok], |
roff_name[mdoc->last->tok], roff_name[np->tok]); |
mdoc_macronames[np->tok]); |
|
roff_node_delete(mdoc, mdoc->last); |
roff_node_delete(mdoc, mdoc->last); |
} |
} |
|
|
Line 2203 post_os(POST_ARGS) |
|
Line 2358 post_os(POST_ARGS) |
|
#endif /*!OSNAME*/ |
#endif /*!OSNAME*/ |
} |
} |
|
|
/* |
|
* If no argument is provided, |
|
* fill in the name of the current manual page. |
|
*/ |
|
static void |
|
post_ex(POST_ARGS) |
|
{ |
|
struct roff_node *n; |
|
|
|
post_std(mdoc); |
|
|
|
n = mdoc->last; |
|
if (n->child != NULL) |
|
return; |
|
|
|
if (mdoc->meta.name == NULL) { |
|
mandoc_msg(MANDOCERR_EX_NONAME, mdoc->parse, |
|
n->line, n->pos, "Ex"); |
|
return; |
|
} |
|
|
|
mdoc->next = ROFF_NEXT_CHILD; |
|
roff_word_alloc(mdoc, n->line, n->pos, mdoc->meta.name); |
|
mdoc->last = n; |
|
} |
|
|
|
enum roff_sec |
enum roff_sec |
mdoc_a2sec(const char *p) |
mdoc_a2sec(const char *p) |
{ |
{ |
Line 2242 mdoc_a2sec(const char *p) |
|
Line 2371 mdoc_a2sec(const char *p) |
|
} |
} |
|
|
static size_t |
static size_t |
macro2len(int macro) |
macro2len(enum roff_tok macro) |
{ |
{ |
|
|
switch (macro) { |
switch (macro) { |