Return to mdoc_validate.c CVS log | Up to [cvsweb.bsd.lv] / mandoc |
version 1.86, 2010/05/30 11:47:44 | version 1.89, 2010/05/31 23:10:51 | ||
---|---|---|---|
|
|
||
{ NULL, posts_notext }, /* br */ | { NULL, posts_notext }, /* br */ | ||
{ NULL, posts_sp }, /* sp */ | { NULL, posts_sp }, /* sp */ | ||
{ NULL, posts_text1 }, /* %U */ | { NULL, posts_text1 }, /* %U */ | ||
{ NULL, NULL }, /* Ta */ | |||
}; | }; | ||
|
|
||
static int | static int | ||
post_it(POST_ARGS) | post_it(POST_ARGS) | ||
{ | { | ||
int type, i, cols; | int i, cols, rc; | ||
enum mdoc_list lt; | |||
struct mdoc_node *n, *c; | struct mdoc_node *n, *c; | ||
enum mandocerr er; | |||
if (MDOC_BLOCK != mdoc->last->type) | if (MDOC_BLOCK != mdoc->last->type) | ||
return(1); | return(1); | ||
n = mdoc->last->parent->parent; | n = mdoc->last->parent->parent; | ||
if (NULL == n->args) { | lt = n->data.list; | ||
mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_LISTTYPE); | |||
return(0); | |||
} | |||
/* Some types require block-head, some not. */ | if (LIST__NONE == lt) { | ||
/* LINTED */ | |||
for (cols = type = -1, i = 0; -1 == type && | |||
i < (int)n->args->argc; i++) | |||
switch (n->args->argv[i].arg) { | |||
case (MDOC_Tag): | |||
/* FALLTHROUGH */ | |||
case (MDOC_Diag): | |||
/* FALLTHROUGH */ | |||
case (MDOC_Hang): | |||
/* FALLTHROUGH */ | |||
case (MDOC_Ohang): | |||
/* FALLTHROUGH */ | |||
case (MDOC_Inset): | |||
/* FALLTHROUGH */ | |||
case (MDOC_Bullet): | |||
/* FALLTHROUGH */ | |||
case (MDOC_Dash): | |||
/* FALLTHROUGH */ | |||
case (MDOC_Enum): | |||
/* FALLTHROUGH */ | |||
case (MDOC_Hyphen): | |||
/* FALLTHROUGH */ | |||
case (MDOC_Item): | |||
type = n->args->argv[i].arg; | |||
break; | |||
case (MDOC_Column): | |||
type = n->args->argv[i].arg; | |||
cols = (int)n->args->argv[i].sz; | |||
break; | |||
default: | |||
break; | |||
} | |||
if (-1 == type) { | |||
mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_LISTTYPE); | mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_LISTTYPE); | ||
return(0); | return(0); | ||
} | } | ||
switch (type) { | switch (lt) { | ||
case (MDOC_Tag): | case (LIST_tag): | ||
if (NULL == mdoc->last->head->child) | if (mdoc->last->head->child) | ||
if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOARGS)) | break; | ||
return(0); | /* FIXME: give this a dummy value. */ | ||
if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOARGS)) | |||
return(0); | |||
break; | break; | ||
case (MDOC_Hang): | case (LIST_hang): | ||
/* FALLTHROUGH */ | /* FALLTHROUGH */ | ||
case (MDOC_Ohang): | case (LIST_ohang): | ||
/* FALLTHROUGH */ | /* FALLTHROUGH */ | ||
case (MDOC_Inset): | case (LIST_inset): | ||
/* FALLTHROUGH */ | /* FALLTHROUGH */ | ||
case (MDOC_Diag): | case (LIST_diag): | ||
if (NULL == mdoc->last->head->child) | if (NULL == mdoc->last->head->child) | ||
if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOARGS)) | if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOARGS)) | ||
return(0); | return(0); | ||
|
|
||
if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOBODY)) | if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOBODY)) | ||
return(0); | return(0); | ||
break; | break; | ||
case (MDOC_Bullet): | case (LIST_bullet): | ||
/* FALLTHROUGH */ | /* FALLTHROUGH */ | ||
case (MDOC_Dash): | case (LIST_dash): | ||
/* FALLTHROUGH */ | /* FALLTHROUGH */ | ||
case (MDOC_Enum): | case (LIST_enum): | ||
/* FALLTHROUGH */ | /* FALLTHROUGH */ | ||
case (MDOC_Hyphen): | case (LIST_hyphen): | ||
/* FALLTHROUGH */ | /* FALLTHROUGH */ | ||
case (MDOC_Item): | case (LIST_item): | ||
if (mdoc->last->head->child) | if (mdoc->last->head->child) | ||
if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_ARGSLOST)) | if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_ARGSLOST)) | ||
return(0); | return(0); | ||
|
|
||
if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOBODY)) | if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOBODY)) | ||
return(0); | return(0); | ||
break; | break; | ||
case (MDOC_Column): | case (LIST_column): | ||
if (NULL == mdoc->last->head->child) | cols = -1; | ||
if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOARGS)) | for (i = 0; i < (int)n->args->argc; i++) | ||
return(0); | if (MDOC_Column == n->args->argv[i].arg) { | ||
if (mdoc->last->body->child) | cols = (int)n->args->argv[i].sz; | ||
if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BODYLOST)) | break; | ||
return(0); | } | ||
c = mdoc->last->child; | |||
for (i = 0; c && MDOC_HEAD == c->type; c = c->next) | |||
i++; | |||
if (i < cols) { | assert(-1 != cols); | ||
if ( ! mdoc_vmsg(mdoc, MANDOCERR_ARGCOUNT, | assert(NULL == mdoc->last->head->child); | ||
mdoc->last->line, | |||
mdoc->last->pos, | if (NULL == mdoc->last->body->child) | ||
"columns == %d (have %d)", | if ( ! mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NOBODY)) | ||
cols, i)) | |||
return(0); | return(0); | ||
for (i = 0, c = mdoc->last->child; c; c = c->next) | |||
if (MDOC_BODY == c->type) | |||
i++; | |||
if (i < cols) | |||
er = MANDOCERR_ARGCOUNT; | |||
else if (i == cols || i == cols + 1) | |||
break; | break; | ||
} else if (i == cols || i == cols + 1) | else | ||
break; | er = MANDOCERR_SYNTARGCOUNT; | ||
mdoc_vmsg(mdoc, MANDOCERR_SYNTARGCOUNT, | rc = mdoc_vmsg(mdoc, er, | ||
mdoc->last->line, mdoc->last->pos, | mdoc->last->line, mdoc->last->pos, | ||
"columns == %d (have %d)", cols, i); | "columns == %d (have %d)", cols, i); | ||
return(0); | return(rc); | ||
default: | default: | ||
break; | break; | ||
} | } |