version 1.226, 2014/07/04 16:12:08 |
version 1.229, 2014/07/06 19:09:00 |
Line 551 check_text(struct mdoc *mdoc, int ln, int pos, char *p |
|
Line 551 check_text(struct mdoc *mdoc, int ln, int pos, char *p |
|
return; |
return; |
|
|
for (cp = p; NULL != (p = strchr(p, '\t')); p++) |
for (cp = p; NULL != (p = strchr(p, '\t')); p++) |
mdoc_pmsg(mdoc, ln, pos + (int)(p - cp), MANDOCERR_BADTAB); |
mandoc_msg(MANDOCERR_FI_TAB, mdoc->parse, |
|
ln, pos + (int)(p - cp), NULL); |
} |
} |
|
|
static int |
static int |
Line 594 pre_display(PRE_ARGS) |
|
Line 595 pre_display(PRE_ARGS) |
|
static int |
static int |
pre_bl(PRE_ARGS) |
pre_bl(PRE_ARGS) |
{ |
{ |
int i, comp, dup; |
|
const char *offs, *width; |
|
enum mdoc_list lt; |
|
struct mdoc_node *np; |
struct mdoc_node *np; |
|
struct mdoc_argv *argv; |
|
int i; |
|
enum mdoc_list lt; |
|
|
if (MDOC_BLOCK != n->type) { |
if (MDOC_BLOCK != n->type) { |
if (ENDBODY_NOT != n->end) { |
if (ENDBODY_NOT != n->end) { |
Line 619 pre_bl(PRE_ARGS) |
|
Line 620 pre_bl(PRE_ARGS) |
|
*/ |
*/ |
|
|
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; |
lt = LIST__NONE; |
lt = LIST__NONE; |
dup = comp = 0; |
switch (argv->arg) { |
width = offs = NULL; |
|
switch (n->args->argv[i].arg) { |
|
/* Set list types. */ |
/* Set list types. */ |
case MDOC_Bullet: |
case MDOC_Bullet: |
lt = LIST_bullet; |
lt = LIST_bullet; |
Line 659 pre_bl(PRE_ARGS) |
|
Line 659 pre_bl(PRE_ARGS) |
|
break; |
break; |
/* Set list arguments. */ |
/* Set list arguments. */ |
case MDOC_Compact: |
case MDOC_Compact: |
dup = n->norm->Bl.comp; |
if (n->norm->Bl.comp) |
comp = 1; |
mandoc_msg(MANDOCERR_ARG_REP, |
|
mdoc->parse, argv->line, |
|
argv->pos, "Bl -compact"); |
|
n->norm->Bl.comp = 1; |
break; |
break; |
case MDOC_Width: |
case MDOC_Width: |
/* NB: this can be empty! */ |
if (0 == argv->sz) { |
if (n->args->argv[i].sz) { |
mandoc_msg(MANDOCERR_ARG_EMPTY, |
width = n->args->argv[i].value[0]; |
mdoc->parse, argv->line, |
dup = (NULL != n->norm->Bl.width); |
argv->pos, "Bl -width"); |
|
n->norm->Bl.width = "0n"; |
break; |
break; |
} |
} |
mdoc_nmsg(mdoc, n, MANDOCERR_IGNARGV); |
if (NULL != n->norm->Bl.width) |
|
mandoc_vmsg(MANDOCERR_ARG_REP, |
|
mdoc->parse, argv->line, |
|
argv->pos, "Bl -width %s", |
|
argv->value[0]); |
|
n->norm->Bl.width = argv->value[0]; |
break; |
break; |
case MDOC_Offset: |
case MDOC_Offset: |
/* NB: this can be empty! */ |
if (0 == argv->sz) { |
if (n->args->argv[i].sz) { |
mandoc_msg(MANDOCERR_ARG_EMPTY, |
offs = n->args->argv[i].value[0]; |
mdoc->parse, argv->line, |
dup = (NULL != n->norm->Bl.offs); |
argv->pos, "Bl -offset"); |
break; |
break; |
} |
} |
mdoc_nmsg(mdoc, n, MANDOCERR_IGNARGV); |
if (NULL != n->norm->Bl.offs) |
|
mandoc_vmsg(MANDOCERR_ARG_REP, |
|
mdoc->parse, argv->line, |
|
argv->pos, "Bl -offset %s", |
|
argv->value[0]); |
|
n->norm->Bl.offs = argv->value[0]; |
break; |
break; |
default: |
default: |
continue; |
continue; |
} |
} |
|
if (LIST__NONE == lt) |
|
continue; |
|
|
/* Check: duplicate auxiliary arguments. */ |
|
|
|
if (dup) |
|
mdoc_nmsg(mdoc, n, MANDOCERR_ARGVREP); |
|
|
|
if (comp && ! dup) |
|
n->norm->Bl.comp = comp; |
|
if (offs && ! dup) |
|
n->norm->Bl.offs = offs; |
|
if (width && ! dup) |
|
n->norm->Bl.width = width; |
|
|
|
/* Check: multiple list types. */ |
/* Check: multiple list types. */ |
|
|
if (LIST__NONE != lt && n->norm->Bl.type != LIST__NONE) |
if (LIST__NONE != n->norm->Bl.type) { |
mdoc_nmsg(mdoc, n, MANDOCERR_LISTREP); |
mandoc_msg(MANDOCERR_BL_REP, |
|
mdoc->parse, n->line, n->pos, |
/* Assign list type. */ |
mdoc_argnames[argv->arg]); |
|
continue; |
if (LIST__NONE != lt && n->norm->Bl.type == LIST__NONE) { |
|
n->norm->Bl.type = lt; |
|
/* Set column information, too. */ |
|
if (LIST_column == lt) { |
|
n->norm->Bl.ncols = |
|
n->args->argv[i].sz; |
|
n->norm->Bl.cols = (void *) |
|
n->args->argv[i].value; |
|
} |
|
} |
} |
|
|
/* The list type should come first. */ |
/* The list type should come first. */ |
|
|
if (n->norm->Bl.type == LIST__NONE) |
if (n->norm->Bl.width || |
if (n->norm->Bl.width || |
n->norm->Bl.offs || |
n->norm->Bl.offs || |
n->norm->Bl.comp) |
n->norm->Bl.comp) |
mandoc_msg(MANDOCERR_BL_LATETYPE, |
mandoc_msg(MANDOCERR_BL_LATETYPE, |
mdoc->parse, n->line, n->pos, |
mdoc->parse, n->line, n->pos, |
mdoc_argnames[n->args->argv[0].arg]); |
mdoc_argnames[n->args->argv[0].arg]); |
|
continue; |
n->norm->Bl.type = lt; |
|
if (LIST_column == lt) { |
|
n->norm->Bl.ncols = argv->sz; |
|
n->norm->Bl.cols = (void *)argv->value; |
|
} |
} |
} |
|
|
/* Allow lists to default to LIST_item. */ |
/* Allow lists to default to LIST_item. */ |
Line 743 pre_bl(PRE_ARGS) |
|
Line 742 pre_bl(PRE_ARGS) |
|
switch (n->norm->Bl.type) { |
switch (n->norm->Bl.type) { |
case LIST_tag: |
case LIST_tag: |
if (NULL == n->norm->Bl.width) |
if (NULL == n->norm->Bl.width) |
mdoc_nmsg(mdoc, n, MANDOCERR_BL_WIDTH); |
mdoc_nmsg(mdoc, n, MANDOCERR_BL_NOWIDTH); |
break; |
break; |
case LIST_column: |
case LIST_column: |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
Line 779 pre_bl(PRE_ARGS) |
|
Line 778 pre_bl(PRE_ARGS) |
|
static int |
static int |
pre_bd(PRE_ARGS) |
pre_bd(PRE_ARGS) |
{ |
{ |
int i, dup, comp; |
|
enum mdoc_disp dt; |
|
const char *offs; |
|
struct mdoc_node *np; |
struct mdoc_node *np; |
|
struct mdoc_argv *argv; |
|
int i; |
|
enum mdoc_disp dt; |
|
|
if (MDOC_BLOCK != n->type) { |
if (MDOC_BLOCK != n->type) { |
if (ENDBODY_NOT != n->end) { |
if (ENDBODY_NOT != n->end) { |
Line 798 pre_bd(PRE_ARGS) |
|
Line 797 pre_bd(PRE_ARGS) |
|
} |
} |
|
|
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; |
dt = DISP__NONE; |
dt = DISP__NONE; |
dup = comp = 0; |
|
offs = NULL; |
|
|
|
switch (n->args->argv[i].arg) { |
switch (argv->arg) { |
case MDOC_Centred: |
case MDOC_Centred: |
dt = DISP_centred; |
dt = DISP_centred; |
break; |
break; |
Line 822 pre_bd(PRE_ARGS) |
|
Line 820 pre_bd(PRE_ARGS) |
|
mdoc_nmsg(mdoc, n, MANDOCERR_BADDISP); |
mdoc_nmsg(mdoc, n, MANDOCERR_BADDISP); |
return(0); |
return(0); |
case MDOC_Offset: |
case MDOC_Offset: |
/* NB: this can be empty! */ |
if (0 == argv->sz) { |
if (n->args->argv[i].sz) { |
mandoc_msg(MANDOCERR_ARG_EMPTY, |
offs = n->args->argv[i].value[0]; |
mdoc->parse, argv->line, |
dup = (NULL != n->norm->Bd.offs); |
argv->pos, "Bd -offset"); |
break; |
break; |
} |
} |
mdoc_nmsg(mdoc, n, MANDOCERR_IGNARGV); |
if (NULL != n->norm->Bd.offs) |
|
mandoc_vmsg(MANDOCERR_ARG_REP, |
|
mdoc->parse, argv->line, |
|
argv->pos, "Bd -offset %s", |
|
argv->value[0]); |
|
n->norm->Bd.offs = argv->value[0]; |
break; |
break; |
case MDOC_Compact: |
case MDOC_Compact: |
comp = 1; |
if (n->norm->Bd.comp) |
dup = n->norm->Bd.comp; |
mandoc_msg(MANDOCERR_ARG_REP, |
|
mdoc->parse, argv->line, |
|
argv->pos, "Bd -compact"); |
|
n->norm->Bd.comp = 1; |
break; |
break; |
default: |
default: |
abort(); |
abort(); |
/* NOTREACHED */ |
/* NOTREACHED */ |
} |
} |
|
if (DISP__NONE == dt) |
|
continue; |
|
|
/* Check whether we have duplicates. */ |
if (DISP__NONE == n->norm->Bd.type) |
|
|
if (dup) |
|
mdoc_nmsg(mdoc, n, MANDOCERR_ARGVREP); |
|
|
|
/* Make our auxiliary assignments. */ |
|
|
|
if (offs && ! dup) |
|
n->norm->Bd.offs = offs; |
|
if (comp && ! dup) |
|
n->norm->Bd.comp = comp; |
|
|
|
/* Check whether a type has already been assigned. */ |
|
|
|
if (DISP__NONE != dt && n->norm->Bd.type != DISP__NONE) |
|
mdoc_nmsg(mdoc, n, MANDOCERR_DISPREP); |
|
|
|
/* Make our type assignment. */ |
|
|
|
if (DISP__NONE != dt && n->norm->Bd.type == DISP__NONE) |
|
n->norm->Bd.type = dt; |
n->norm->Bd.type = dt; |
|
else |
|
mandoc_msg(MANDOCERR_BD_REP, |
|
mdoc->parse, n->line, n->pos, |
|
mdoc_argnames[argv->arg]); |
} |
} |
|
|
if (DISP__NONE == n->norm->Bd.type) { |
if (DISP__NONE == n->norm->Bd.type) { |
Line 1226 post_at(POST_ARGS) |
|
Line 1219 post_at(POST_ARGS) |
|
|
|
assert(MDOC_TEXT == n->type); |
assert(MDOC_TEXT == n->type); |
if (NULL == (std_att = mdoc_a2att(n->string))) { |
if (NULL == (std_att = mdoc_a2att(n->string))) { |
mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADATT); |
mandoc_msg(MANDOCERR_AT_BAD, mdoc->parse, |
|
n->line, n->pos, n->string); |
mandoc_asprintf(&att, "AT&T UNIX %s", n->string); |
mandoc_asprintf(&att, "AT&T UNIX %s", n->string); |
} else |
} else |
att = mandoc_strdup(std_att); |
att = mandoc_strdup(std_att); |
Line 1429 post_bl_block_width(POST_ARGS) |
|
Line 1423 post_bl_block_width(POST_ARGS) |
|
width = 6; |
width = 6; |
else if (MDOC_MAX == (tok = mdoc_hash_find(n->norm->Bl.width))) |
else if (MDOC_MAX == (tok = mdoc_hash_find(n->norm->Bl.width))) |
return(1); |
return(1); |
else if (0 == (width = macro2len(tok))) { |
else |
mdoc_nmsg(mdoc, n, MANDOCERR_BADWIDTH); |
width = macro2len(tok); |
return(1); |
|
} |
|
|
|
/* The value already exists: free and reallocate it. */ |
/* The value already exists: free and reallocate it. */ |
|
|
Line 1663 post_bl(POST_ARGS) |
|
Line 1655 post_bl(POST_ARGS) |
|
static int |
static int |
ebool(struct mdoc *mdoc) |
ebool(struct mdoc *mdoc) |
{ |
{ |
|
struct mdoc_node *nch; |
|
enum mdoct tok; |
|
|
if (NULL == mdoc->last->child) { |
tok = mdoc->last->tok; |
if (MDOC_Sm == mdoc->last->tok) |
nch = mdoc->last->child; |
|
|
|
if (NULL == nch) { |
|
if (MDOC_Sm == tok) |
mdoc->flags ^= MDOC_SMOFF; |
mdoc->flags ^= MDOC_SMOFF; |
return(1); |
return(1); |
} |
} |
|
|
check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_LT, 2); |
check_count(mdoc, MDOC_ELEM, CHECK_WARN, CHECK_LT, 2); |
|
|
assert(MDOC_TEXT == mdoc->last->child->type); |
assert(MDOC_TEXT == nch->type); |
|
|
if (0 == strcmp(mdoc->last->child->string, "on")) { |
if (0 == strcmp(nch->string, "on")) { |
if (MDOC_Sm == mdoc->last->tok) |
if (MDOC_Sm == tok) |
mdoc->flags &= ~MDOC_SMOFF; |
mdoc->flags &= ~MDOC_SMOFF; |
return(1); |
return(1); |
} |
} |
if (0 == strcmp(mdoc->last->child->string, "off")) { |
if (0 == strcmp(nch->string, "off")) { |
if (MDOC_Sm == mdoc->last->tok) |
if (MDOC_Sm == tok) |
mdoc->flags |= MDOC_SMOFF; |
mdoc->flags |= MDOC_SMOFF; |
return(1); |
return(1); |
} |
} |
|
|
mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADBOOL); |
mandoc_vmsg(MANDOCERR_SM_BAD, |
return(1); |
mdoc->parse, nch->line, nch->pos, |
|
"%s %s", mdoc_macronames[tok], nch->string); |
|
return(mdoc_node_relink(mdoc, nch)); |
} |
} |
|
|
static int |
static int |
Line 1722 post_root(POST_ARGS) |
|
Line 1721 post_root(POST_ARGS) |
|
static int |
static int |
post_st(POST_ARGS) |
post_st(POST_ARGS) |
{ |
{ |
struct mdoc_node *ch; |
struct mdoc_node *n, *nch; |
const char *p; |
const char *p; |
|
|
if (NULL == (ch = mdoc->last->child)) { |
n = mdoc->last; |
|
nch = n->child; |
|
|
|
if (NULL == nch) { |
mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse, |
mandoc_msg(MANDOCERR_MACRO_EMPTY, mdoc->parse, |
mdoc->last->line, mdoc->last->pos, |
n->line, n->pos, mdoc_macronames[n->tok]); |
mdoc_macronames[mdoc->last->tok]); |
mdoc_node_delete(mdoc, n); |
mdoc_node_delete(mdoc, mdoc->last); |
|
return(1); |
return(1); |
} |
} |
|
|
assert(MDOC_TEXT == ch->type); |
assert(MDOC_TEXT == nch->type); |
|
|
if (NULL == (p = mdoc_a2st(ch->string))) { |
if (NULL == (p = mdoc_a2st(nch->string))) { |
mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADSTANDARD); |
mandoc_msg(MANDOCERR_ST_BAD, mdoc->parse, |
mdoc_node_delete(mdoc, mdoc->last); |
nch->line, nch->pos, nch->string); |
|
mdoc_node_delete(mdoc, n); |
} else { |
} else { |
free(ch->string); |
free(nch->string); |
ch->string = mandoc_strdup(p); |
nch->string = mandoc_strdup(p); |
} |
} |
|
|
return(1); |
return(1); |