summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--mdocml.c3
-rw-r--r--validate.c101
2 files changed, 72 insertions, 32 deletions
diff --git a/mdocml.c b/mdocml.c
index 2c2e5aef..2b7c4388 100644
--- a/mdocml.c
+++ b/mdocml.c
@@ -1,4 +1,4 @@
-/* $Id: mdocml.c,v 1.45 2009/01/16 11:50:54 kristaps Exp $ */
+/* $Id: mdocml.c,v 1.46 2009/01/16 14:15:12 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -194,6 +194,7 @@ buf_begin(struct md_parse *p)
}
+/* TODO: remove this to a print-tree output filter. */
static void
print_node(const struct mdoc_node *n, int indent)
{
diff --git a/validate.c b/validate.c
index 6e777731..d541f0c0 100644
--- a/validate.c
+++ b/validate.c
@@ -1,4 +1,4 @@
-/* $Id: validate.c,v 1.33 2009/01/16 14:04:26 kristaps Exp $ */
+/* $Id: validate.c,v 1.34 2009/01/16 14:15:12 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -49,15 +49,17 @@ static int pre_prologue(struct mdoc *, struct mdoc_node *);
static int pre_prologue(struct mdoc *, struct mdoc_node *);
static int pre_prologue(struct mdoc *, struct mdoc_node *);
-static int headchild_err_ge1(struct mdoc *);
-static int headchild_warn_ge1(struct mdoc *);
-static int headchild_err_eq0(struct mdoc *);
-static int elemchild_err_eq0(struct mdoc *);
-static int elemchild_err_ge1(struct mdoc *);
-static int elemchild_warn_eq0(struct mdoc *);
-static int bodychild_warn_ge1(struct mdoc *);
-static int bodychild_err_eq0(struct mdoc *);
-static int elemchild_warn_ge1(struct mdoc *);
+static int head_err_ge1(struct mdoc *);
+static int head_warn_ge1(struct mdoc *);
+static int head_err_eq0(struct mdoc *);
+static int elem_err_eq0(struct mdoc *);
+static int elem_err_eq1(struct mdoc *);
+static int elem_err_ge1(struct mdoc *);
+static int elem_warn_eq0(struct mdoc *);
+static int body_warn_ge1(struct mdoc *);
+static int body_err_eq0(struct mdoc *);
+static int elem_warn_ge1(struct mdoc *);
+static int elem_bool(struct mdoc *);
static int post_sh(struct mdoc *);
static int post_bl(struct mdoc *);
static int post_it(struct mdoc *);
@@ -73,17 +75,20 @@ static v_pre pres_cd[] = { pre_cd, NULL };
static v_pre pres_er[] = { pre_er, NULL };
static v_pre pres_ex[] = { pre_ex, NULL };
-static v_post posts_bd[] = { headchild_err_eq0, bodychild_warn_ge1, NULL };
-static v_post posts_text[] = { elemchild_err_ge1, NULL };
-static v_post posts_wtext[] = { elemchild_warn_ge1, NULL };
-static v_post posts_notext[] = { elemchild_err_eq0, NULL };
-static v_post posts_wline[] = { headchild_warn_ge1, bodychild_err_eq0, NULL };
-static v_post posts_sh[] = { headchild_err_ge1, bodychild_warn_ge1, post_sh, NULL };
-static v_post posts_bl[] = { headchild_err_eq0, bodychild_warn_ge1, post_bl, NULL };
+static v_post posts_bool[] = { elem_err_eq1, elem_bool, NULL };
+static v_post posts_bd[] = { head_err_eq0, body_warn_ge1, NULL };
+static v_post posts_text[] = { elem_err_ge1, NULL };
+static v_post posts_wtext[] = { elem_warn_ge1, NULL };
+static v_post posts_notext[] = { elem_err_eq0, NULL };
+static v_post posts_wline[] = { head_warn_ge1, body_err_eq0, NULL };
+static v_post posts_sh[] = { head_err_ge1,
+ body_warn_ge1, post_sh, NULL };
+static v_post posts_bl[] = { head_err_eq0,
+ body_warn_ge1, post_bl, NULL };
static v_post posts_it[] = { post_it, NULL };
-static v_post posts_ss[] = { headchild_err_ge1, NULL };
-static v_post posts_pp[] = { elemchild_warn_eq0, NULL };
-static v_post posts_d1[] = { headchild_err_ge1, NULL };
+static v_post posts_ss[] = { head_err_ge1, NULL };
+static v_post posts_pp[] = { elem_warn_eq0, NULL };
+static v_post posts_d1[] = { head_err_ge1, NULL };
const struct valids mdoc_valids[MDOC_MAX] = {
@@ -156,7 +161,7 @@ const struct valids mdoc_valids[MDOC_MAX] = {
{ NULL, posts_wline }, /* Bq */
{ NULL, NULL }, /* Bsx */
{ NULL, NULL }, /* Bx */
- { NULL, NULL }, /* Db */ /* FIXME: boolean */
+ { NULL, posts_bool }, /* Db */
{ NULL, NULL }, /* Dc */
{ NULL, NULL }, /* Do */
{ NULL, posts_wline }, /* Dq */
@@ -183,7 +188,7 @@ const struct valids mdoc_valids[MDOC_MAX] = {
{ NULL, NULL }, /* Sc */
{ NULL, NULL }, /* So */
{ NULL, posts_wline }, /* Sq */
- { NULL, NULL }, /* Sm */ /* FIXME: boolean */
+ { NULL, posts_bool }, /* Sm */
{ NULL, posts_text }, /* Sx */
{ NULL, posts_text }, /* Sy */
{ NULL, posts_text }, /* Tn */
@@ -235,7 +240,7 @@ pre_check_parent(struct mdoc *mdoc, struct mdoc_node *node,
static int
-bodychild_err_eq0(struct mdoc *mdoc)
+body_err_eq0(struct mdoc *mdoc)
{
if (MDOC_BODY != mdoc->last->type)
@@ -247,7 +252,7 @@ bodychild_err_eq0(struct mdoc *mdoc)
static int
-bodychild_warn_ge1(struct mdoc *mdoc)
+body_warn_ge1(struct mdoc *mdoc)
{
if (MDOC_BODY != mdoc->last->type)
@@ -259,7 +264,7 @@ bodychild_warn_ge1(struct mdoc *mdoc)
static int
-elemchild_warn_eq0(struct mdoc *mdoc)
+elem_warn_eq0(struct mdoc *mdoc)
{
assert(MDOC_ELEM == mdoc->last->type);
@@ -271,7 +276,7 @@ elemchild_warn_eq0(struct mdoc *mdoc)
static int
-elemchild_warn_ge1(struct mdoc *mdoc)
+elem_warn_ge1(struct mdoc *mdoc)
{
assert(MDOC_ELEM == mdoc->last->type);
@@ -282,7 +287,20 @@ elemchild_warn_ge1(struct mdoc *mdoc)
static int
-elemchild_err_eq0(struct mdoc *mdoc)
+elem_err_eq1(struct mdoc *mdoc)
+{
+
+ assert(MDOC_ELEM == mdoc->last->type);
+ if (NULL == mdoc->last->child)
+ return(mdoc_err(mdoc, "macro expects one parameter"));
+ if (mdoc->last->child->next)
+ return(mdoc_err(mdoc, "macro expects one parameter"));
+ return(1);
+}
+
+
+static int
+elem_err_eq0(struct mdoc *mdoc)
{
assert(MDOC_ELEM == mdoc->last->type);
@@ -293,7 +311,7 @@ elemchild_err_eq0(struct mdoc *mdoc)
static int
-elemchild_err_ge1(struct mdoc *mdoc)
+elem_err_ge1(struct mdoc *mdoc)
{
assert(MDOC_ELEM == mdoc->last->type);
@@ -304,7 +322,7 @@ elemchild_err_ge1(struct mdoc *mdoc)
static int
-headchild_err_eq0(struct mdoc *mdoc)
+head_err_eq0(struct mdoc *mdoc)
{
if (MDOC_HEAD != mdoc->last->type)
@@ -317,7 +335,7 @@ headchild_err_eq0(struct mdoc *mdoc)
static int
-headchild_warn_ge1(struct mdoc *mdoc)
+head_warn_ge1(struct mdoc *mdoc)
{
if (MDOC_HEAD != mdoc->last->type)
@@ -329,7 +347,7 @@ headchild_warn_ge1(struct mdoc *mdoc)
static int
-headchild_err_ge1(struct mdoc *mdoc)
+head_err_ge1(struct mdoc *mdoc)
{
if (MDOC_HEAD != mdoc->last->type)
@@ -715,6 +733,27 @@ post_bl(struct mdoc *mdoc)
}
+static int
+elem_bool(struct mdoc *mdoc)
+{
+ struct mdoc_node *n;
+
+ assert(MDOC_ELEM == mdoc->last->type);
+ for (n = mdoc->last->child; n; n = n->next) {
+ if (MDOC_TEXT != n->type)
+ break;
+ if (xstrcmp(n->data.text.string, "on"))
+ continue;
+ if (xstrcmp(n->data.text.string, "off"))
+ continue;
+ break;
+ }
+ if (NULL == n)
+ return(1);
+ return(mdoc_nerr(mdoc, n, "expected boolean value [on/off]"));
+}
+
+
/* Warn if conventional sections are out of order. */
static int
post_sh(struct mdoc *mdoc)