version 1.38, 2009/01/17 20:10:36 |
version 1.39, 2009/01/19 17:02:59 |
Line 29 typedef int (*v_post)(struct mdoc *); |
|
Line 29 typedef int (*v_post)(struct mdoc *); |
|
/* FIXME: math symbols. */ |
/* FIXME: math symbols. */ |
/* FIXME: make sure prologue is complete. */ |
/* FIXME: make sure prologue is complete. */ |
/* FIXME: valid character-escape checks. */ |
/* FIXME: valid character-escape checks. */ |
|
/* FIXME: make sure required sections are included (NAME, ...). */ |
|
|
struct valids { |
struct valids { |
v_pre *pre; |
v_pre *pre; |
Line 45 static int pre_check_stdarg(struct mdoc *, struct mdoc |
|
Line 46 static int pre_check_stdarg(struct mdoc *, struct mdoc |
|
static int post_check_children_count(struct mdoc *); |
static int post_check_children_count(struct mdoc *); |
static int post_check_children_lt(struct mdoc *, int); |
static int post_check_children_lt(struct mdoc *, int); |
static int post_check_children_gt(struct mdoc *, int); |
static int post_check_children_gt(struct mdoc *, int); |
|
static int post_check_children_wgt(struct mdoc *, int); |
static int post_check_children_eq(struct mdoc *, int); |
static int post_check_children_eq(struct mdoc *, int); |
|
static int post_check_children_weq(struct mdoc *, int); |
|
|
/* Specific pre-child-parse routines. */ |
/* Specific pre-child-parse routines. */ |
|
|
Line 76 static int eerr_le2(struct mdoc *); |
|
Line 79 static int eerr_le2(struct mdoc *); |
|
static int eerr_eq1(struct mdoc *); |
static int eerr_eq1(struct mdoc *); |
static int eerr_ge1(struct mdoc *); |
static int eerr_ge1(struct mdoc *); |
static int ewarn_eq0(struct mdoc *); |
static int ewarn_eq0(struct mdoc *); |
|
static int ewarn_eq1(struct mdoc *); |
static int bwarn_ge1(struct mdoc *); |
static int bwarn_ge1(struct mdoc *); |
static int berr_eq0(struct mdoc *); |
static int berr_eq0(struct mdoc *); |
static int ewarn_ge1(struct mdoc *); |
static int ewarn_ge1(struct mdoc *); |
Line 117 static v_post posts_wline[] = { hwarn_ge1, berr_eq0, N |
|
Line 121 static v_post posts_wline[] = { hwarn_ge1, berr_eq0, N |
|
static v_post posts_sh[] = { herr_ge1, bwarn_ge1, post_sh, NULL }; |
static v_post posts_sh[] = { herr_ge1, bwarn_ge1, post_sh, NULL }; |
static v_post posts_bl[] = { herr_eq0, bwarn_ge1, post_bl, NULL }; |
static v_post posts_bl[] = { herr_eq0, bwarn_ge1, post_bl, NULL }; |
static v_post posts_it[] = { post_it, NULL }; |
static v_post posts_it[] = { post_it, NULL }; |
|
static v_post posts_in[] = { ewarn_eq1, NULL }; |
static v_post posts_ss[] = { herr_ge1, NULL }; |
static v_post posts_ss[] = { herr_ge1, NULL }; |
static v_post posts_pp[] = { ewarn_eq0, NULL }; |
static v_post posts_pp[] = { ewarn_eq0, NULL }; |
static v_post posts_d1[] = { herr_ge1, NULL }; |
static v_post posts_d1[] = { herr_ge1, NULL }; |
Line 155 const struct valids mdoc_valids[MDOC_MAX] = { |
|
Line 160 const struct valids mdoc_valids[MDOC_MAX] = { |
|
{ pres_ex, posts_ex }, /* Ex */ |
{ pres_ex, posts_ex }, /* Ex */ |
{ NULL, posts_text }, /* Fa */ |
{ NULL, posts_text }, /* Fa */ |
/* FIXME: only in SYNOPSIS section. */ |
/* FIXME: only in SYNOPSIS section. */ |
{ NULL, NULL }, /* Fd */ |
{ NULL, posts_wtext }, /* Fd */ |
{ NULL, NULL }, /* Fl */ |
{ NULL, NULL }, /* Fl */ |
{ NULL, posts_text }, /* Fn */ |
{ NULL, posts_text }, /* Fn */ |
{ NULL, NULL }, /* Ft */ |
{ NULL, posts_wtext }, /* Ft */ |
{ NULL, posts_text }, /* Ic */ |
{ NULL, posts_text }, /* Ic */ |
{ NULL, posts_wtext }, /* In */ |
{ NULL, posts_in }, /* In */ |
{ NULL, posts_text }, /* Li */ |
{ NULL, posts_text }, /* Li */ |
{ NULL, posts_wtext }, /* Nd */ |
{ NULL, posts_wtext }, /* Nd */ |
{ NULL, posts_nm }, /* Nm */ |
{ NULL, posts_nm }, /* Nm */ |
Line 188 const struct valids mdoc_valids[MDOC_MAX] = { |
|
Line 193 const struct valids mdoc_valids[MDOC_MAX] = { |
|
{ NULL, posts_wline }, /* Aq */ |
{ NULL, posts_wline }, /* Aq */ |
{ NULL, posts_at }, /* At */ |
{ NULL, posts_at }, /* At */ |
{ NULL, NULL }, /* Bc */ |
{ NULL, NULL }, /* Bc */ |
{ NULL, NULL }, /* Bf */ |
{ NULL, NULL }, /* Bf */ /* FIXME */ |
{ NULL, NULL }, /* Bo */ |
{ NULL, NULL }, /* Bo */ |
{ NULL, posts_wline }, /* Bq */ |
{ NULL, posts_wline }, /* Bq */ |
{ NULL, NULL }, /* Bsx */ |
{ NULL, NULL }, /* Bsx */ |
Line 253 post_check_children_count(struct mdoc *mdoc) |
|
Line 258 post_check_children_count(struct mdoc *mdoc) |
|
|
|
|
|
static int |
static int |
|
post_check_children_wgt(struct mdoc *mdoc, int sz) |
|
{ |
|
int i; |
|
|
|
if ((i = post_check_children_count(mdoc)) > sz) |
|
return(1); |
|
return(mdoc_warn(mdoc, WARN_SYNTAX, "macro suggests more " |
|
"than %d parameters (has %d)", sz, i)); |
|
} |
|
|
|
|
|
static int |
post_check_children_gt(struct mdoc *mdoc, int sz) |
post_check_children_gt(struct mdoc *mdoc, int sz) |
{ |
{ |
int i; |
int i; |
Line 260 post_check_children_gt(struct mdoc *mdoc, int sz) |
|
Line 277 post_check_children_gt(struct mdoc *mdoc, int sz) |
|
if ((i = post_check_children_count(mdoc)) > sz) |
if ((i = post_check_children_count(mdoc)) > sz) |
return(1); |
return(1); |
return(mdoc_err(mdoc, "macro requires more than %d " |
return(mdoc_err(mdoc, "macro requires more than %d " |
"parameters (have %d)", sz, i)); |
"parameters (has %d)", sz, i)); |
} |
} |
|
|
|
|
static int |
static int |
|
post_check_children_weq(struct mdoc *mdoc, int sz) |
|
{ |
|
int i; |
|
|
|
if ((i = post_check_children_count(mdoc)) == sz) |
|
return(1); |
|
return(mdoc_warn(mdoc, WARN_SYNTAX, "macro suggests %d " |
|
"parameters (has %d)", sz, i)); |
|
} |
|
|
|
|
|
static int |
post_check_children_eq(struct mdoc *mdoc, int sz) |
post_check_children_eq(struct mdoc *mdoc, int sz) |
{ |
{ |
int i; |
int i; |
Line 338 berr_eq0(struct mdoc *mdoc) |
|
Line 367 berr_eq0(struct mdoc *mdoc) |
|
|
|
if (MDOC_BODY != mdoc->last->type) |
if (MDOC_BODY != mdoc->last->type) |
return(1); |
return(1); |
if (NULL == mdoc->last->child) |
return(post_check_children_eq(mdoc, 0)); |
return(1); |
|
return(mdoc_warn(mdoc, WARN_SYNTAX, "macro suggests no body children")); |
|
} |
} |
|
|
|
|
Line 350 bwarn_ge1(struct mdoc *mdoc) |
|
Line 377 bwarn_ge1(struct mdoc *mdoc) |
|
|
|
if (MDOC_BODY != mdoc->last->type) |
if (MDOC_BODY != mdoc->last->type) |
return(1); |
return(1); |
if (mdoc->last->child) |
return(post_check_children_wgt(mdoc, 0)); |
return(1); |
|
return(mdoc_warn(mdoc, WARN_SYNTAX, "macro suggests one or more body children")); |
|
} |
} |
|
|
|
|
static int |
static int |
|
ewarn_eq1(struct mdoc *mdoc) |
|
{ |
|
|
|
assert(MDOC_ELEM == mdoc->last->type); |
|
return(post_check_children_weq(mdoc, 1)); |
|
} |
|
|
|
|
|
static int |
ewarn_eq0(struct mdoc *mdoc) |
ewarn_eq0(struct mdoc *mdoc) |
{ |
{ |
|
|
assert(MDOC_ELEM == mdoc->last->type); |
assert(MDOC_ELEM == mdoc->last->type); |
if (NULL == mdoc->last->child) |
return(post_check_children_weq(mdoc, 0)); |
return(1); |
|
return(mdoc_pwarn(mdoc, mdoc->last->child->line, |
|
mdoc->last->child->pos, WARN_SYNTAX, "macro suggests no parameters")); |
|
} |
} |
|
|
|
|
Line 373 ewarn_ge1(struct mdoc *mdoc) |
|
Line 404 ewarn_ge1(struct mdoc *mdoc) |
|
{ |
{ |
|
|
assert(MDOC_ELEM == mdoc->last->type); |
assert(MDOC_ELEM == mdoc->last->type); |
if (mdoc->last->child) |
return(post_check_children_wgt(mdoc, 0)); |
return(1); |
|
return(mdoc_warn(mdoc, WARN_SYNTAX, "macro suggests one or more parameters")); |
|
} |
} |
|
|
|
|
Line 440 hwarn_ge1(struct mdoc *mdoc) |
|
Line 469 hwarn_ge1(struct mdoc *mdoc) |
|
|
|
if (MDOC_HEAD != mdoc->last->type) |
if (MDOC_HEAD != mdoc->last->type) |
return(1); |
return(1); |
if (mdoc->last->child) |
return(post_check_children_wgt(mdoc, 0)); |
return(1); |
|
return(mdoc_warn(mdoc, WARN_SYNTAX, "macro suggests one or more parameters")); |
|
} |
} |
|
|
|
|
Line 1003 post_root(struct mdoc *mdoc) |
|
Line 1030 post_root(struct mdoc *mdoc) |
|
if (NULL == mdoc->last->child) |
if (NULL == mdoc->last->child) |
return(mdoc_err(mdoc, "document has no data")); |
return(mdoc_err(mdoc, "document has no data")); |
if (NULL == mdoc->meta.title) |
if (NULL == mdoc->meta.title) |
return(mdoc_err(mdoc, "document has no incomplete prologue")); |
return(mdoc_err(mdoc, "document has incomplete prologue")); |
if (NULL == mdoc->meta.os) |
if (NULL == mdoc->meta.os) |
return(mdoc_err(mdoc, "document has no incomplete prologue")); |
return(mdoc_err(mdoc, "document has incomplete prologue")); |
if (0 == mdoc->meta.date) |
if (0 == mdoc->meta.date) |
return(mdoc_err(mdoc, "document has no incomplete prologue")); |
return(mdoc_err(mdoc, "document has incomplete prologue")); |
return(1); |
return(1); |
} |
} |
|
|
|
|
mdoc_valid_post(struct mdoc *mdoc) |
mdoc_valid_post(struct mdoc *mdoc) |
{ |
{ |
v_post *p; |
v_post *p; |
|
|
|
if (MDOC_VALID & mdoc->last->flags) |
|
return(1); |
|
mdoc->last->flags |= MDOC_VALID; |
|
|
if (MDOC_TEXT == mdoc->last->type) |
if (MDOC_TEXT == mdoc->last->type) |
return(1); |
return(1); |