version 1.20, 2009/07/12 21:45:44 |
version 1.21, 2009/07/12 22:35:08 |
|
|
#define PRE_ARGS struct mdoc *mdoc, const struct mdoc_node *n |
#define PRE_ARGS struct mdoc *mdoc, const struct mdoc_node *n |
#define POST_ARGS struct mdoc *mdoc |
#define POST_ARGS struct mdoc *mdoc |
|
|
enum mwarn { |
|
WPRINT, |
|
WNOWIDTH, |
|
WMISSWIDTH, |
|
WESCAPE, |
|
WWRONGMSEC, |
|
WSECOOO, |
|
WSECREP, |
|
WBADSTAND, |
|
WNAMESECINC, |
|
WNOMULTILINE, |
|
WMULTILINE, |
|
WLINE, |
|
WNOLINE, |
|
WPROLOOO, |
|
WPROLREP, |
|
WARGVAL, |
|
WBADSEC, |
|
WBADMSEC |
|
}; |
|
|
|
typedef int (*v_pre)(PRE_ARGS); |
typedef int (*v_pre)(PRE_ARGS); |
typedef int (*v_post)(POST_ARGS); |
typedef int (*v_post)(POST_ARGS); |
|
|
v_post *post; |
v_post *post; |
}; |
}; |
|
|
static int pwarn(struct mdoc *, int, int, enum mwarn); |
|
static int check_parent(PRE_ARGS, int, enum mdoc_type); |
static int check_parent(PRE_ARGS, int, enum mdoc_type); |
static int check_msec(PRE_ARGS, ...); |
static int check_msec(PRE_ARGS, ...); |
static int check_sec(PRE_ARGS, ...); |
static int check_sec(PRE_ARGS, ...); |
|
|
static int post_sh_head(POST_ARGS); |
static int post_sh_head(POST_ARGS); |
static int post_st(POST_ARGS); |
static int post_st(POST_ARGS); |
|
|
#define vwarn(m, t) nwarn((m), (m)->last, (t)) |
|
#define nwarn(m, n, t) pwarn((m), (n)->line, (n)->pos, (t)) |
|
|
|
static v_pre pres_an[] = { pre_an, NULL }; |
static v_pre pres_an[] = { pre_an, NULL }; |
static v_pre pres_bd[] = { pre_display, pre_bd, NULL }; |
static v_pre pres_bd[] = { pre_display, pre_bd, NULL }; |
static v_pre pres_bl[] = { pre_bl, NULL }; |
static v_pre pres_bl[] = { pre_bl, NULL }; |
|
|
|
|
|
|
static int |
static int |
pwarn(struct mdoc *m, int line, int pos, enum mwarn type) |
|
{ |
|
char *p; |
|
enum mdoc_warn c; |
|
|
|
c = WARN_SYNTAX; |
|
p = NULL; |
|
switch (type) { |
|
case (WBADMSEC): |
|
p = "inappropriate manual section"; |
|
c = WARN_COMPAT; |
|
break; |
|
case (WBADSEC): |
|
p = "inappropriate document section"; |
|
c = WARN_COMPAT; |
|
break; |
|
case (WARGVAL): |
|
p = "argument value suggested"; |
|
c = WARN_COMPAT; |
|
break; |
|
case (WPROLREP): |
|
p = "prologue macros repeated"; |
|
c = WARN_COMPAT; |
|
break; |
|
case (WPROLOOO): |
|
p = "prologue macros out-of-order"; |
|
c = WARN_COMPAT; |
|
break; |
|
case (WNOWIDTH): |
|
p = "superfluous width argument"; |
|
break; |
|
case (WMISSWIDTH): |
|
p = "missing width argument"; |
|
break; |
|
case (WPRINT): |
|
p = "invalid character"; |
|
break; |
|
case (WESCAPE): |
|
p = "invalid escape sequence"; |
|
break; |
|
case (WNOLINE): |
|
p = "suggested no line arguments"; |
|
break; |
|
case (WLINE): |
|
p = "suggested line arguments"; |
|
break; |
|
case (WMULTILINE): |
|
p = "suggested multi-line arguments"; |
|
break; |
|
case (WNOMULTILINE): |
|
p = "suggested no multi-line arguments"; |
|
break; |
|
case (WWRONGMSEC): |
|
p = "document section in wrong manual section"; |
|
c = WARN_COMPAT; |
|
break; |
|
case (WSECOOO): |
|
p = "document section out of conventional order"; |
|
break; |
|
case (WSECREP): |
|
p = "document section repeated"; |
|
break; |
|
case (WBADSTAND): |
|
p = "unknown standard"; |
|
break; |
|
case (WNAMESECINC): |
|
p = "NAME section contents incomplete/badly-ordered"; |
|
break; |
|
} |
|
assert(p); |
|
return(mdoc_pwarn(m, line, pos, c, p)); |
|
} |
|
|
|
|
|
static int |
|
warn_print(struct mdoc *m, int ln, int pos) |
warn_print(struct mdoc *m, int ln, int pos) |
{ |
{ |
|
|
if (MDOC_IGN_CHARS & m->pflags) |
if (MDOC_IGN_CHARS & m->pflags) |
return(pwarn(m, ln, pos, WPRINT)); |
return(mdoc_pwarn(m, ln, pos, EPRINT)); |
return(mdoc_perr(m, ln, pos, EPRINT)); |
return(mdoc_perr(m, ln, pos, EPRINT)); |
} |
} |
|
|
|
|
if (n->args && 1 == n->args->argc) |
if (n->args && 1 == n->args->argc) |
if (MDOC_Std == n->args->argv[0].arg) |
if (MDOC_Std == n->args->argv[0].arg) |
return(1); |
return(1); |
return(nwarn(mdoc, n, WARGVAL)); |
return(mdoc_nwarn(mdoc, n, EARGVAL)); |
} |
} |
|
|
|
|
|
|
} |
} |
|
|
va_end(ap); |
va_end(ap); |
return(nwarn(mdoc, n, WBADSEC)); |
return(mdoc_nwarn(mdoc, n, EBADSEC)); |
} |
} |
|
|
|
|
|
|
} |
} |
|
|
va_end(ap); |
va_end(ap); |
return(nwarn(mdoc, n, WBADMSEC)); |
return(mdoc_nwarn(mdoc, n, EBADMSEC)); |
} |
} |
|
|
|
|
|
|
|
|
switch (type) { |
switch (type) { |
case (MDOC_Tag): |
case (MDOC_Tag): |
if (-1 == width && ! nwarn(mdoc, n, WMISSWIDTH)) |
if (-1 == width && ! mdoc_nwarn(mdoc, n, EMISSWIDTH)) |
return(0); |
return(0); |
break; |
break; |
case (MDOC_Column): |
case (MDOC_Column): |
|
|
case (MDOC_Inset): |
case (MDOC_Inset): |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case (MDOC_Item): |
case (MDOC_Item): |
if (-1 != width && ! nwarn(mdoc, n, WNOWIDTH)) |
if (-1 != width && ! mdoc_nwarn(mdoc, n, ENOWIDTH)) |
return(0); |
return(0); |
break; |
break; |
default: |
default: |
|
|
{ |
{ |
|
|
if (0 == mdoc->meta.date || mdoc->meta.os) |
if (0 == mdoc->meta.date || mdoc->meta.os) |
if ( ! nwarn(mdoc, n, WPROLOOO)) |
if ( ! mdoc_nwarn(mdoc, n, EPROLOOO)) |
return(0); |
return(0); |
if (mdoc->meta.title) |
if (mdoc->meta.title) |
if ( ! nwarn(mdoc, n, WPROLREP)) |
if ( ! mdoc_nwarn(mdoc, n, EPROLREP)) |
return(0); |
return(0); |
return(1); |
return(1); |
} |
} |
|
|
{ |
{ |
|
|
if (NULL == mdoc->meta.title || 0 == mdoc->meta.date) |
if (NULL == mdoc->meta.title || 0 == mdoc->meta.date) |
if ( ! nwarn(mdoc, n, WPROLOOO)) |
if ( ! mdoc_nwarn(mdoc, n, EPROLOOO)) |
return(0); |
return(0); |
if (mdoc->meta.os) |
if (mdoc->meta.os) |
if ( ! nwarn(mdoc, n, WPROLREP)) |
if ( ! mdoc_nwarn(mdoc, n, EPROLREP)) |
return(0); |
return(0); |
return(1); |
return(1); |
} |
} |
|
|
{ |
{ |
|
|
if (mdoc->meta.title || mdoc->meta.os) |
if (mdoc->meta.title || mdoc->meta.os) |
if ( ! nwarn(mdoc, n, WPROLOOO)) |
if ( ! mdoc_nwarn(mdoc, n, EPROLOOO)) |
return(0); |
return(0); |
if (mdoc->meta.date) |
if (mdoc->meta.date) |
if ( ! nwarn(mdoc, n, WPROLREP)) |
if ( ! mdoc_nwarn(mdoc, n, EPROLREP)) |
return(0); |
return(0); |
return(1); |
return(1); |
} |
} |
|
|
switch (type) { |
switch (type) { |
case (MDOC_Tag): |
case (MDOC_Tag): |
if (NULL == mdoc->last->head->child) |
if (NULL == mdoc->last->head->child) |
if ( ! vwarn(mdoc, WLINE)) |
if ( ! mdoc_nwarn(mdoc, mdoc->last, ELINE)) |
return(0); |
return(0); |
break; |
break; |
case (MDOC_Hang): |
case (MDOC_Hang): |
|
|
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case (MDOC_Diag): |
case (MDOC_Diag): |
if (NULL == mdoc->last->head->child) |
if (NULL == mdoc->last->head->child) |
if ( ! vwarn(mdoc, WLINE)) |
if ( ! mdoc_nwarn(mdoc, mdoc->last, ELINE)) |
return(0); |
return(0); |
if (NULL == mdoc->last->body->child) |
if (NULL == mdoc->last->body->child) |
if ( ! vwarn(mdoc, WMULTILINE)) |
if ( ! mdoc_nwarn(mdoc, mdoc->last, EMULTILINE)) |
return(0); |
return(0); |
break; |
break; |
case (MDOC_Bullet): |
case (MDOC_Bullet): |
|
|
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case (MDOC_Item): |
case (MDOC_Item): |
if (mdoc->last->head->child) |
if (mdoc->last->head->child) |
if ( ! vwarn(mdoc, WNOLINE)) |
if ( ! mdoc_nwarn(mdoc, mdoc->last, ENOLINE)) |
return(0); |
return(0); |
if (NULL == mdoc->last->body->child) |
if (NULL == mdoc->last->body->child) |
if ( ! vwarn(mdoc, WMULTILINE)) |
if ( ! mdoc_nwarn(mdoc, mdoc->last, EMULTILINE)) |
return(0); |
return(0); |
break; |
break; |
case (MDOC_Column): |
case (MDOC_Column): |
if (NULL == mdoc->last->head->child) |
if (NULL == mdoc->last->head->child) |
if ( ! vwarn(mdoc, WLINE)) |
if ( ! mdoc_nwarn(mdoc, mdoc->last, ELINE)) |
return(0); |
return(0); |
if (mdoc->last->body->child) |
if (mdoc->last->body->child) |
if ( ! vwarn(mdoc, WNOMULTILINE)) |
if ( ! mdoc_nwarn(mdoc, mdoc->last, ENOMULTILINE)) |
return(0); |
return(0); |
c = mdoc->last->child; |
c = mdoc->last->child; |
for (i = 0; c && MDOC_HEAD == c->type; c = c->next) |
for (i = 0; c && MDOC_HEAD == c->type; c = c->next) |
|
|
|
|
if (mdoc_a2st(mdoc->last->child->string)) |
if (mdoc_a2st(mdoc->last->child->string)) |
return(1); |
return(1); |
return(vwarn(mdoc, WBADSTAND)); |
return(mdoc_nwarn(mdoc, mdoc->last, EBADSTAND)); |
} |
} |
|
|
|
|
|
|
*/ |
*/ |
|
|
if (NULL == (n = mdoc->last->child)) |
if (NULL == (n = mdoc->last->child)) |
return(vwarn(mdoc, WNAMESECINC)); |
return(mdoc_nwarn(mdoc, mdoc->last, ENAMESECINC)); |
|
|
for ( ; n && n->next; n = n->next) { |
for ( ; n && n->next; n = n->next) { |
if (MDOC_ELEM == n->type && MDOC_Nm == n->tok) |
if (MDOC_ELEM == n->type && MDOC_Nm == n->tok) |
continue; |
continue; |
if (MDOC_TEXT == n->type) |
if (MDOC_TEXT == n->type) |
continue; |
continue; |
if ( ! vwarn(mdoc, WNAMESECINC)) |
if ( ! mdoc_nwarn(mdoc, mdoc->last, ENAMESECINC)) |
return(0); |
return(0); |
} |
} |
|
|
if (MDOC_ELEM == n->type && MDOC_Nd == n->tok) |
if (MDOC_ELEM == n->type && MDOC_Nd == n->tok) |
return(1); |
return(1); |
return(vwarn(mdoc, WNAMESECINC)); |
return(mdoc_nwarn(mdoc, mdoc->last, ENAMESECINC)); |
} |
} |
|
|
|
|
|
|
if (SEC_CUSTOM == sec) |
if (SEC_CUSTOM == sec) |
return(1); |
return(1); |
if (sec == mdoc->lastnamed) |
if (sec == mdoc->lastnamed) |
return(vwarn(mdoc, WSECREP)); |
return(mdoc_nwarn(mdoc, mdoc->last, ESECREP)); |
if (sec < mdoc->lastnamed) |
if (sec < mdoc->lastnamed) |
return(vwarn(mdoc, WSECOOO)); |
return(mdoc_nwarn(mdoc, mdoc->last, ESECOOO)); |
|
|
/* |
/* |
* Check particular section/manual conventions. LIBRARY can |
* Check particular section/manual conventions. LIBRARY can |
|
|
case (3): |
case (3): |
break; |
break; |
default: |
default: |
return(vwarn(mdoc, WWRONGMSEC)); |
return(mdoc_nwarn(mdoc, mdoc->last, EWRONGMSEC)); |
} |
} |
break; |
break; |
default: |
default: |