-/* $Id: validate.c,v 1.40 2009/01/19 17:51:33 kristaps Exp $ */
+/* $Id: validate.c,v 1.43 2009/01/20 12:51:28 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
/* FIXME: some sections should only occur in specific msecs. */
/* FIXME: ignoring Pp. */
/* FIXME: math symbols. */
-/* FIXME: make sure prologue is complete. */
/* FIXME: valid character-escape checks. */
/* FIXME: make sure required sections are included (NAME, ...). */
/* Specific post-child-parse routines. */
static int herr_ge1(struct mdoc *);
-static int hwarn_ge1(struct mdoc *);
+static int herr_le1(struct mdoc *);
static int herr_eq0(struct mdoc *);
static int eerr_eq0(struct mdoc *);
static int eerr_le1(struct mdoc *);
static int ewarn_eq0(struct mdoc *);
static int ewarn_eq1(struct mdoc *);
static int bwarn_ge1(struct mdoc *);
-static int berr_eq0(struct mdoc *);
static int ewarn_ge1(struct mdoc *);
static int ebool(struct mdoc *);
static int post_sh(struct mdoc *);
static int post_at(struct mdoc *);
static int post_xr(struct mdoc *);
static int post_nm(struct mdoc *);
+static int post_bf(struct mdoc *);
static int post_root(struct mdoc *);
/* Collections of pre-child-parse routines. */
static v_post posts_text[] = { eerr_ge1, NULL };
static v_post posts_wtext[] = { ewarn_ge1, NULL };
static v_post posts_notext[] = { eerr_eq0, NULL };
-static v_post posts_wline[] = { hwarn_ge1, berr_eq0, NULL };
+static v_post posts_wline[] = { bwarn_ge1, herr_eq0, 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_it[] = { post_it, NULL };
static v_post posts_in[] = { ewarn_eq1, NULL };
static v_post posts_ss[] = { herr_ge1, NULL };
static v_post posts_pp[] = { ewarn_eq0, NULL };
-static v_post posts_d1[] = { herr_ge1, NULL };
static v_post posts_ex[] = { eerr_le1, post_ex, NULL };
static v_post posts_an[] = { post_an, NULL };
static v_post posts_at[] = { post_at, NULL };
static v_post posts_xr[] = { eerr_ge1, eerr_le2, post_xr, NULL };
static v_post posts_nm[] = { post_nm, NULL };
+static v_post posts_bf[] = { herr_le1, post_bf, NULL };
/* Per-macro pre- and post-child-check routine collections. */
{ pres_sh, posts_sh }, /* Sh */
{ pres_ss, posts_ss }, /* Ss */
{ NULL, posts_pp }, /* Pp */
- { pres_d1, posts_d1 }, /* D1 */
- { pres_d1, posts_d1 }, /* Dl */
+ { pres_d1, posts_wline }, /* D1 */
+ { pres_d1, posts_wline }, /* Dl */
{ pres_bd, posts_bd }, /* Bd */
{ NULL, NULL }, /* Ed */
{ pres_bl, posts_bl }, /* Bl */
{ NULL, posts_wline }, /* Aq */
{ NULL, posts_at }, /* At */
{ NULL, NULL }, /* Bc */
- { NULL, NULL }, /* Bf */ /* FIXME */
+ { NULL, posts_bf }, /* Bf */
{ NULL, NULL }, /* Bo */
{ NULL, posts_wline }, /* Bq */
{ NULL, NULL }, /* Bsx */
}
-static int
-berr_eq0(struct mdoc *mdoc)
-{
-
- if (MDOC_BODY != mdoc->last->type)
- return(1);
- return(post_check_children_eq(mdoc, "body children", 0));
-}
-
-
static int
bwarn_ge1(struct mdoc *mdoc)
{
static int
-hwarn_ge1(struct mdoc *mdoc)
+herr_le1(struct mdoc *mdoc)
{
-
if (MDOC_HEAD != mdoc->last->type)
return(1);
- return(post_check_children_wgt(mdoc, "parameters", 0));
+ return(post_check_children_lt(mdoc, "parameters", 2));
}
}
+static int
+post_bf(struct mdoc *mdoc)
+{
+ char *p;
+ struct mdoc_node *head;
+
+ if (MDOC_BLOCK != mdoc->last->type)
+ return(1);
+ assert(MDOC_Bf == mdoc->last->tok);
+ head = mdoc->last->data.block.head;
+ assert(head);
+
+ if (0 == mdoc->last->data.block.argc) {
+ if (head->child) {
+ assert(MDOC_TEXT == head->child->type);
+ p = head->child->data.text.string;
+ if (xstrcmp(p, "Em"))
+ return(1);
+ else if (xstrcmp(p, "Li"))
+ return(1);
+ else if (xstrcmp(p, "Sm"))
+ return(1);
+ return(mdoc_nerr(mdoc, head->child, "invalid font mode"));
+ }
+ return(mdoc_err(mdoc, "macro expects an argument or parameter"));
+ }
+ if (head->child)
+ return(mdoc_err(mdoc, "macro expects an argument or parameter"));
+ if (1 == mdoc->last->data.block.argc)
+ return(1);
+ return(mdoc_err(mdoc, "macro expects an argument or parameter"));
+}
+
+
static int
post_nm(struct mdoc *mdoc)
{