summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2009-01-17 20:10:36 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2009-01-17 20:10:36 +0000
commitefab70236b25559a1c5375d7071cbd2c4f4a5bd1 (patch)
tree8173d251fb7dad8da1326446a75fb8d99d1b0854
parentd286305c5d6ecdd0f3ae341a607819738139f1ec (diff)
downloadmandoc-efab70236b25559a1c5375d7071cbd2c4f4a5bd1.tar.gz
mandoc-efab70236b25559a1c5375d7071cbd2c4f4a5bd1.tar.zst
mandoc-efab70236b25559a1c5375d7071cbd2c4f4a5bd1.zip
Lint checks.
-rw-r--r--argv.c8
-rw-r--r--macro.c172
-rw-r--r--mdoc.c24
-rw-r--r--private.h3
-rw-r--r--validate.c16
5 files changed, 113 insertions, 110 deletions
diff --git a/argv.c b/argv.c
index 5c944a58..fd32241d 100644
--- a/argv.c
+++ b/argv.c
@@ -1,4 +1,4 @@
-/* $Id: argv.c,v 1.15 2009/01/16 12:23:25 kristaps Exp $ */
+/* $Id: argv.c,v 1.16 2009/01/17 20:10:36 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -29,7 +29,7 @@
/* FIXME: .It called with -column and quoted arguments. */
static int lookup(int, const char *);
-static int parse(struct mdoc *, int, int,
+static int parse(struct mdoc *, int,
struct mdoc_arg *, int *, char *);
static int parse_single(struct mdoc *, int,
struct mdoc_arg *, int *, char *);
@@ -404,7 +404,7 @@ parse_single(struct mdoc *mdoc, int line,
static int
-parse(struct mdoc *mdoc, int line, int tok,
+parse(struct mdoc *mdoc, int line,
struct mdoc_arg *v, int *pos, char *buf)
{
@@ -469,7 +469,7 @@ mdoc_argv(struct mdoc *mdoc, int line, int tok,
/* FIXME: whitespace if no value. */
ppos = *pos;
- if ( ! parse(mdoc, line, tok, v, pos, buf))
+ if ( ! parse(mdoc, line, v, pos, buf))
return(ARGV_ERROR);
if ( ! postparse(mdoc, line, v, ppos))
return(ARGV_ERROR);
diff --git a/macro.c b/macro.c
index 4c24c01f..609517d1 100644
--- a/macro.c
+++ b/macro.c
@@ -1,4 +1,4 @@
-/* $Id: macro.c,v 1.40 2009/01/17 16:15:27 kristaps Exp $ */
+/* $Id: macro.c,v 1.41 2009/01/17 20:10:36 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -35,18 +35,16 @@ static int rewind_dohalt(int, enum mdoc_type,
#define REWIND_REWIND (1 << 0)
#define REWIND_NOHALT (1 << 1)
#define REWIND_HALT (1 << 2)
-static int rewind_dobreak(int, enum mdoc_type,
- const struct mdoc_node *);
+static int rewind_dobreak(int, const struct mdoc_node *);
static int rewind_elem(struct mdoc *, int);
static int rewind_impblock(struct mdoc *, int, int, int);
static int rewind_expblock(struct mdoc *, int, int, int);
-static int rewind_subblock(enum mdoc_type, struct mdoc *, int);
-static int rewind_last(int, int,
- struct mdoc *, struct mdoc_node *);
-static int append_delims(struct mdoc *,
- int, int, int *, char *);
+static int rewind_subblock(enum mdoc_type,
+ struct mdoc *, int, int, int);
+static int rewind_last(struct mdoc *, struct mdoc_node *);
+static int append_delims(struct mdoc *, int, int *, char *);
static int lookup(struct mdoc *, int, int, int, const char *);
@@ -60,7 +58,6 @@ lookup(struct mdoc *mdoc, int line, int pos, int from, const char *p)
return(res);
if (MDOC_MAX == res)
return(res);
-
if ( ! mdoc_pwarn(mdoc, line, pos, WARN_SYNTAX, "macro-like parameter"))
return(-1);
return(MDOC_MAX);
@@ -68,7 +65,7 @@ lookup(struct mdoc *mdoc, int line, int pos, int from, const char *p)
static int
-rewind_last(int tok, int type, struct mdoc *mdoc, struct mdoc_node *to)
+rewind_last(struct mdoc *mdoc, struct mdoc_node *to)
{
assert(to);
@@ -78,11 +75,6 @@ rewind_last(int tok, int type, struct mdoc *mdoc, struct mdoc_node *to)
return(0);
if ( ! mdoc_action_post(mdoc))
return(0);
- mdoc_msg(mdoc, "rewound %s %s to %s %s",
- mdoc_type2a(type),
- mdoc_macronames[tok],
- mdoc_type2a(mdoc->last->type),
- mdoc_macronames[mdoc->last->tok]);
return(1);
}
@@ -93,11 +85,6 @@ rewind_last(int tok, int type, struct mdoc *mdoc, struct mdoc_node *to)
return(0);
if ( ! mdoc_action_post(mdoc))
return(0);
- mdoc_msg(mdoc, "rewound %s %s to %s %s",
- mdoc_type2a(type),
- mdoc_macronames[tok],
- mdoc_type2a(mdoc->last->type),
- mdoc_macronames[mdoc->last->tok]);
} while (mdoc->last != to);
return(1);
@@ -281,7 +268,7 @@ rewind_dohalt(int tok, enum mdoc_type type, const struct mdoc_node *p)
static int
-rewind_dobreak(int tok, enum mdoc_type type, const struct mdoc_node *p)
+rewind_dobreak(int tok, const struct mdoc_node *p)
{
assert(MDOC_ROOT != p->type);
@@ -330,12 +317,13 @@ rewind_elem(struct mdoc *mdoc, int tok)
assert(MDOC_ELEM == n->type);
assert(tok == n->tok);
- return(rewind_last(tok, MDOC_ELEM, mdoc, n));
+ return(rewind_last(mdoc, n));
}
static int
-rewind_subblock(enum mdoc_type type, struct mdoc *mdoc, int tok)
+rewind_subblock(enum mdoc_type type, struct mdoc *mdoc,
+ int tok, int line, int ppos)
{
struct mdoc_node *n;
int c;
@@ -344,7 +332,7 @@ rewind_subblock(enum mdoc_type type, struct mdoc *mdoc, int tok)
if (REWIND_HALT == c)
return(1);
if (REWIND_REWIND == c)
- return(rewind_last(tok, type, mdoc, mdoc->last));
+ return(rewind_last(mdoc, mdoc->last));
/* LINTED */
for (n = mdoc->last->parent; n; n = n->parent) {
@@ -353,13 +341,13 @@ rewind_subblock(enum mdoc_type type, struct mdoc *mdoc, int tok)
return(1);
if (REWIND_REWIND == c)
break;
- else if (rewind_dobreak(tok, type, n))
+ else if (rewind_dobreak(tok, n))
continue;
- return(mdoc_nerr(mdoc, n, "body scope broken"));
+ return(mdoc_perr(mdoc, line, ppos, "scope breaks prior %s", mdoc_node2a(n)));
}
assert(n);
- return(rewind_last(tok, type, mdoc, n));
+ return(rewind_last(mdoc, n));
}
@@ -373,7 +361,7 @@ rewind_expblock(struct mdoc *mdoc, int tok, int line, int ppos)
if (REWIND_HALT == c)
return(mdoc_perr(mdoc, line, ppos, "closing macro has no context"));
if (REWIND_REWIND == c)
- return(rewind_last(tok, MDOC_BLOCK, mdoc, mdoc->last));
+ return(rewind_last(mdoc, mdoc->last));
/* LINTED */
for (n = mdoc->last->parent; n; n = n->parent) {
@@ -382,13 +370,13 @@ rewind_expblock(struct mdoc *mdoc, int tok, int line, int ppos)
return(mdoc_perr(mdoc, line, ppos, "closing macro has no context"));
if (REWIND_REWIND == c)
break;
- else if (rewind_dobreak(tok, MDOC_BLOCK, n))
+ else if (rewind_dobreak(tok, n))
continue;
- return(mdoc_nerr(mdoc, n, "block scope broken"));
+ return(mdoc_perr(mdoc, line, ppos, "scope breaks prior %s", mdoc_node2a(n)));
}
assert(n);
- return(rewind_last(tok, MDOC_BLOCK, mdoc, n));
+ return(rewind_last(mdoc, n));
}
@@ -402,7 +390,7 @@ rewind_impblock(struct mdoc *mdoc, int tok, int line, int ppos)
if (REWIND_HALT == c)
return(1);
if (REWIND_REWIND == c)
- return(rewind_last(tok, MDOC_BLOCK, mdoc, mdoc->last));
+ return(rewind_last(mdoc, mdoc->last));
/* LINTED */
for (n = mdoc->last->parent; n; n = n->parent) {
@@ -411,19 +399,18 @@ rewind_impblock(struct mdoc *mdoc, int tok, int line, int ppos)
return(1);
else if (REWIND_REWIND == c)
break;
- else if (rewind_dobreak(tok, MDOC_BLOCK, n))
+ else if (rewind_dobreak(tok, n))
continue;
- return(mdoc_nerr(mdoc, n, "block scope broken"));
+ return(mdoc_perr(mdoc, line, ppos, "scope breaks prior %s", mdoc_node2a(n)));
}
assert(n);
- return(rewind_last(tok, MDOC_BLOCK, mdoc, n));
+ return(rewind_last(mdoc, n));
}
static int
-append_delims(struct mdoc *mdoc, int tok,
- int line, int *pos, char *buf)
+append_delims(struct mdoc *mdoc, int line, int *pos, char *buf)
{
int c, lastarg;
char *p;
@@ -466,19 +453,19 @@ macro_scoped_close(MACRO_PROT_ARGS)
tt = rewind_alt(tok);
- mdoc_msg(mdoc, "parse-quiet: %s closing %s",
+ mdoc_msg(mdoc, "parse: %s closing %s",
mdoc_macronames[tok], mdoc_macronames[tt]);
if ( ! (MDOC_CALLABLE & mdoc_macros[tok].flags)) {
if (0 == buf[*pos]) {
- if ( ! rewind_subblock(MDOC_BODY, mdoc, tok))
+ if ( ! rewind_subblock(MDOC_BODY, mdoc, tok, line, ppos))
return(0);
return(rewind_expblock(mdoc, tok, line, ppos));
}
return(mdoc_perr(mdoc, line, ppos, "macro expects no parameters"));
}
- if ( ! rewind_subblock(MDOC_BODY, mdoc, tok))
+ if ( ! rewind_subblock(MDOC_BODY, mdoc, tok, line, ppos))
return(0);
lastarg = ppos;
@@ -490,7 +477,7 @@ macro_scoped_close(MACRO_PROT_ARGS)
mdoc->next = MDOC_NEXT_CHILD;
}
- for (j = 0; j < MDOC_LINEARG_MAX; j++) {
+ for (j = 0; /* No sentinel. */; j++) {
lastarg = *pos;
if (j == maxargs && ! flushed) {
@@ -525,15 +512,12 @@ macro_scoped_close(MACRO_PROT_ARGS)
mdoc->next = MDOC_NEXT_SIBLING;
}
- if (MDOC_LINEARG_MAX == j)
- return(mdoc_perr(mdoc, line, ppos, "too many arguments"));
-
if ( ! flushed && ! rewind_expblock(mdoc, tok, line, ppos))
return(0);
if (ppos > 1)
return(1);
- return(append_delims(mdoc, tok, line, pos, buf));
+ return(append_delims(mdoc, line, pos, buf));
}
@@ -549,7 +533,7 @@ macro_scoped_close(MACRO_PROT_ARGS)
int
macro_text(MACRO_PROT_ARGS)
{
- int la, lastpunct, c, sz, fl, argc;
+ int la, lastpunct, c, fl, argc;
struct mdoc_arg argv[MDOC_LINEARG_MAX];
char *p;
@@ -558,7 +542,6 @@ macro_text(MACRO_PROT_ARGS)
for (argc = 0; argc < MDOC_LINEARG_MAX; argc++) {
la = *pos;
-
c = mdoc_argv(mdoc, line, tok, &argv[argc], pos, buf);
if (ARGV_EOLN == c)
break;
@@ -573,8 +556,8 @@ macro_text(MACRO_PROT_ARGS)
}
if (MDOC_LINEARG_MAX == argc) {
- mdoc_argv_free(argc, argv);
- return(mdoc_perr(mdoc, line, ppos, "too many arguments"));
+ mdoc_argv_free(argc - 1, argv);
+ return(mdoc_perr(mdoc, line, ppos, "parameter hard-limit exceeded"));
}
c = mdoc_elem_alloc(mdoc, line, ppos, tok, argc, argv);
@@ -590,9 +573,9 @@ macro_text(MACRO_PROT_ARGS)
if (MDOC_QUOTABLE & mdoc_macros[tok].flags)
fl |= ARGS_QUOTED;
- for (lastpunct = sz = 0; sz + argc < MDOC_LINEARG_MAX; sz++) {
+ lastpunct = 0;
+ for (;;) {
la = *pos;
-
c = mdoc_args(mdoc, line, pos, buf, fl, &p);
if (ARGS_ERROR == c) {
mdoc_argv_free(argc, argv);
@@ -618,7 +601,7 @@ macro_text(MACRO_PROT_ARGS)
return(0);
if (ppos > 1)
return(1);
- return(append_delims(mdoc, tok, line, pos, buf));
+ return(append_delims(mdoc, line, pos, buf));
}
if (mdoc_isdelim(p)) {
@@ -645,14 +628,11 @@ macro_text(MACRO_PROT_ARGS)
mdoc_argv_free(argc, argv);
- if (sz == MDOC_LINEARG_MAX)
- return(mdoc_perr(mdoc, line, ppos, "too many arguments"));
-
if (0 == lastpunct && ! rewind_elem(mdoc, tok))
return(0);
if (ppos > 1)
return(1);
- return(append_delims(mdoc, tok, line, pos, buf));
+ return(append_delims(mdoc, line, pos, buf));
}
@@ -662,14 +642,14 @@ macro_text(MACRO_PROT_ARGS)
int
macro_scoped(MACRO_PROT_ARGS)
{
- int c, lastarg, argc, j, fl;
+ int c, lastarg, argc, fl;
struct mdoc_arg argv[MDOC_LINEARG_MAX];
char *p;
assert ( ! (MDOC_CALLABLE & mdoc_macros[tok].flags));
if ( ! (MDOC_EXPLICIT & mdoc_macros[tok].flags)) {
- if ( ! rewind_subblock(MDOC_BODY, mdoc, tok))
+ if ( ! rewind_subblock(MDOC_BODY, mdoc, tok, line, ppos))
return(0);
if ( ! rewind_impblock(mdoc, tok, line, ppos))
return(0);
@@ -690,8 +670,8 @@ macro_scoped(MACRO_PROT_ARGS)
}
if (MDOC_LINEARG_MAX == argc) {
- mdoc_argv_free(argc, argv);
- return(mdoc_perr(mdoc, line, ppos, "too many arguments"));
+ mdoc_argv_free(argc - 1, argv);
+ return(mdoc_perr(mdoc, line, ppos, "parameter hard-limit exceeded"));
}
c = mdoc_block_alloc(mdoc, line, ppos,
@@ -706,7 +686,7 @@ macro_scoped(MACRO_PROT_ARGS)
if (0 == buf[*pos]) {
if ( ! mdoc_head_alloc(mdoc, line, ppos, tok))
return(0);
- if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok))
+ if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok, line, ppos))
return(0);
if ( ! mdoc_body_alloc(mdoc, line, ppos, tok))
return(0);
@@ -722,7 +702,7 @@ macro_scoped(MACRO_PROT_ARGS)
if (MDOC_TABSEP & mdoc_macros[tok].flags)
fl |= ARGS_TABSEP;
- for (j = 0; j < MDOC_LINEARG_MAX; j++) {
+ for (;;) {
lastarg = *pos;
c = mdoc_args(mdoc, line, pos, buf, fl, &p);
@@ -747,12 +727,9 @@ macro_scoped(MACRO_PROT_ARGS)
break;
}
- if (j == MDOC_LINEARG_MAX)
- return(mdoc_perr(mdoc, line, ppos, "too many arguments"));
-
- if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok))
+ if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok, line, ppos))
return(0);
- if (1 == ppos && ! append_delims(mdoc, tok, line, pos, buf))
+ if (1 == ppos && ! append_delims(mdoc, line, pos, buf))
return(0);
if ( ! mdoc_body_alloc(mdoc, line, ppos, tok))
@@ -771,7 +748,7 @@ macro_scoped(MACRO_PROT_ARGS)
int
macro_scoped_line(MACRO_PROT_ARGS)
{
- int lastarg, c, j;
+ int lastarg, c;
char *p;
if ( ! mdoc_block_alloc(mdoc, line, ppos, tok, 0, NULL))
@@ -784,7 +761,8 @@ macro_scoped_line(MACRO_PROT_ARGS)
/* XXX - no known argument macros. */
- for (lastarg = ppos, j = 0; j < MDOC_LINEARG_MAX; j++) {
+ lastarg = ppos;
+ for (;;) {
lastarg = *pos;
c = mdoc_args(mdoc, line, pos, buf, ARGS_DELIM, &p);
@@ -809,15 +787,12 @@ macro_scoped_line(MACRO_PROT_ARGS)
break;
}
- if (j == MDOC_LINEARG_MAX)
- return(mdoc_perr(mdoc, line, ppos, "too many arguments"));
-
if (1 == ppos) {
- if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok))
+ if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok, line, ppos))
return(0);
- if ( ! append_delims(mdoc, tok, line, pos, buf))
+ if ( ! append_delims(mdoc, line, pos, buf))
return(0);
- } else if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok))
+ } else if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok, line, ppos))
return(0);
return(rewind_impblock(mdoc, tok, line, ppos));
}
@@ -852,7 +827,7 @@ macro_constant_scoped(MACRO_PROT_ARGS)
if (0 == maxargs) {
if ( ! mdoc_head_alloc(mdoc, line, ppos, tok))
return(0);
- if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok))
+ if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok, line, ppos))
return(0);
if ( ! mdoc_body_alloc(mdoc, line, ppos, tok))
return(0);
@@ -862,11 +837,11 @@ macro_constant_scoped(MACRO_PROT_ARGS)
mdoc->next = MDOC_NEXT_CHILD;
- for (j = 0; j < MDOC_LINEARG_MAX; j++) {
+ for (j = 0; /* No sentinel. */; j++) {
lastarg = *pos;
if (j == maxargs && ! flushed) {
- if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok))
+ if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok, line, ppos))
return(0);
flushed = 1;
if ( ! mdoc_body_alloc(mdoc, line, ppos, tok))
@@ -886,7 +861,7 @@ macro_constant_scoped(MACRO_PROT_ARGS)
return(0);
else if (MDOC_MAX != c) {
if ( ! flushed) {
- if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok))
+ if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok, line, ppos))
return(0);
flushed = 1;
if ( ! mdoc_body_alloc(mdoc, line, ppos, tok))
@@ -899,7 +874,7 @@ macro_constant_scoped(MACRO_PROT_ARGS)
}
if ( ! flushed && mdoc_isdelim(p)) {
- if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok))
+ if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok, line, ppos))
return(0);
flushed = 1;
if ( ! mdoc_body_alloc(mdoc, line, ppos, tok))
@@ -912,11 +887,8 @@ macro_constant_scoped(MACRO_PROT_ARGS)
mdoc->next = MDOC_NEXT_SIBLING;
}
- if (MDOC_LINEARG_MAX == j)
- return(mdoc_perr(mdoc, line, ppos, "too many arguments"));
-
if ( ! flushed) {
- if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok))
+ if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok, line, ppos))
return(0);
if ( ! mdoc_body_alloc(mdoc, line, ppos, tok))
return(0);
@@ -925,7 +897,7 @@ macro_constant_scoped(MACRO_PROT_ARGS)
if (ppos > 1)
return(1);
- return(append_delims(mdoc, tok, line, pos, buf));
+ return(append_delims(mdoc, line, pos, buf));
}
@@ -976,6 +948,11 @@ macro_constant_delimited(MACRO_PROT_ARGS)
return(0);
}
+ if (MDOC_LINEARG_MAX == argc) {
+ mdoc_argv_free(argc - 1, argv);
+ return(mdoc_perr(mdoc, line, ppos, "parameter hard-limit exceeded"));
+ }
+
c = mdoc_elem_alloc(mdoc, line, ppos, tok, argc, argv);
mdoc_argv_free(argc, argv);
@@ -984,7 +961,7 @@ macro_constant_delimited(MACRO_PROT_ARGS)
mdoc->next = MDOC_NEXT_CHILD;
- for (j = 0; j < MDOC_LINEARG_MAX; j++) {
+ for (j = 0; /* No sentinel. */; j++) {
lastarg = *pos;
if (j == maxargs && ! flushed) {
@@ -1023,15 +1000,12 @@ macro_constant_delimited(MACRO_PROT_ARGS)
mdoc->next = MDOC_NEXT_SIBLING;
}
- if (MDOC_LINEARG_MAX == j)
- return(mdoc_perr(mdoc, line, ppos, "too many arguments"));
-
if ( ! flushed && rewind_elem(mdoc, tok))
return(0);
if (ppos > 1)
return(1);
- return(append_delims(mdoc, tok, line, pos, buf));
+ return(append_delims(mdoc, line, pos, buf));
}
@@ -1042,7 +1016,7 @@ macro_constant_delimited(MACRO_PROT_ARGS)
int
macro_constant(MACRO_PROT_ARGS)
{
- int c, lastarg, argc, sz, fl;
+ int c, lastarg, argc, fl;
struct mdoc_arg argv[MDOC_LINEARG_MAX];
char *p;
@@ -1065,6 +1039,11 @@ macro_constant(MACRO_PROT_ARGS)
return(0);
}
+ if (MDOC_LINEARG_MAX == argc) {
+ mdoc_argv_free(argc - 1, argv);
+ return(mdoc_perr(mdoc, line, ppos, "parameter hard-limit exceeded"));
+ }
+
c = mdoc_elem_alloc(mdoc, line, ppos, tok, argc, argv);
mdoc_argv_free(argc, argv);
@@ -1073,10 +1052,7 @@ macro_constant(MACRO_PROT_ARGS)
mdoc->next = MDOC_NEXT_CHILD;
- if (MDOC_LINEARG_MAX == argc)
- return(mdoc_perr(mdoc, line, ppos, "too many arguments"));
-
- for (sz = 0; sz + argc < MDOC_LINEARG_MAX; sz++) {
+ for (;;) {
lastarg = *pos;
c = mdoc_args(mdoc, line, pos, buf, fl, &p);
if (ARGS_ERROR == c)
@@ -1098,9 +1074,6 @@ macro_constant(MACRO_PROT_ARGS)
mdoc->next = MDOC_NEXT_SIBLING;
}
- if (MDOC_LINEARG_MAX == sz + argc)
- return(mdoc_perr(mdoc, line, ppos, "too many arguments"));
-
return(rewind_elem(mdoc, tok));
}
@@ -1120,6 +1093,5 @@ macro_end(struct mdoc *mdoc)
assert(mdoc->first);
assert(mdoc->last);
- return(rewind_last(mdoc->last->tok, mdoc->last->type,
- mdoc, mdoc->first));
+ return(rewind_last(mdoc, mdoc->first));
}
diff --git a/mdoc.c b/mdoc.c
index 66785dd1..e1df0b73 100644
--- a/mdoc.c
+++ b/mdoc.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc.c,v 1.34 2009/01/17 16:15:27 kristaps Exp $ */
+/* $Id: mdoc.c,v 1.35 2009/01/17 20:10:36 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -724,3 +724,25 @@ argdup(size_t argsz, const struct mdoc_arg *args)
return(pp);
}
+
+char *
+mdoc_node2a(struct mdoc_node *node)
+{
+ static char buf[64];
+
+ assert(node);
+
+ buf[0] = 0;
+ (void)xstrlcat(buf, mdoc_type2a(node->type), 64);
+ if (MDOC_ROOT == node->type)
+ return(buf);
+ (void)xstrlcat(buf, " `", 64);
+ if (MDOC_TEXT == node->type)
+ (void)xstrlcat(buf, node->data.text.string, 64);
+ else
+ (void)xstrlcat(buf, mdoc_macronames[node->tok], 64);
+
+ return(buf);
+}
+
+
diff --git a/private.h b/private.h
index 02192565..62b4d9b7 100644
--- a/private.h
+++ b/private.h
@@ -1,4 +1,4 @@
-/* $Id: private.h,v 1.67 2009/01/17 16:15:27 kristaps Exp $ */
+/* $Id: private.h,v 1.68 2009/01/17 20:10:36 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -130,6 +130,7 @@ enum mdoc_att mdoc_atoatt(const char *);
time_t mdoc_atotime(const char *);
char *mdoc_type2a(enum mdoc_type);
+char *mdoc_node2a(struct mdoc_node *);
int mdoc_valid_pre(struct mdoc *, struct mdoc_node *);
int mdoc_valid_post(struct mdoc *);
diff --git a/validate.c b/validate.c
index 95ca922a..bf5d1364 100644
--- a/validate.c
+++ b/validate.c
@@ -1,4 +1,4 @@
-/* $Id: validate.c,v 1.37 2009/01/17 16:47:02 kristaps Exp $ */
+/* $Id: validate.c,v 1.38 2009/01/17 20:10:36 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -465,6 +465,7 @@ pre_display(struct mdoc *mdoc, struct mdoc_node *node)
return(1);
assert(mdoc->last);
+ /* LINTED */
for (n = mdoc->last->parent; n; n = n->parent)
if (MDOC_BLOCK == n->type)
if (MDOC_Bd == n->tok)
@@ -489,6 +490,7 @@ pre_bl(struct mdoc *mdoc, struct mdoc_node *node)
argv = NULL;
argc = node->data.block.argc;
+ /* LINTED */
for (i = type = err = 0; i < argc; i++) {
argv = &node->data.block.argv[(int)i];
assert(argv);
@@ -546,6 +548,7 @@ pre_bd(struct mdoc *mdoc, struct mdoc_node *node)
argv = NULL;
argc = node->data.block.argc;
+ /* LINTED */
for (err = i = type = 0; 0 == err && i < argc; i++) {
argv = &node->data.block.argv[(int)i];
assert(argv);
@@ -858,9 +861,11 @@ post_it(struct mdoc *mdoc)
argc = n->data.block.argc;
type = TYPE_NONE;
+ sv = -1;
/* Some types require block-head, some not. */
+ /* LINTED */
for (i = 0; TYPE_NONE == type && i < argc; i++)
switch (n->data.block.argv[(int)i].arg) {
case (MDOC_Tag):
@@ -926,20 +931,21 @@ post_it(struct mdoc *mdoc)
if ( ! mdoc_warn(mdoc, WARN_SYNTAX, "macro suggests body children"))
return(0);
+ assert(-1 != sv);
if (MDOC_Column != sv)
return(1);
/* Make sure the number of columns is sane. */
- sv = mdoc->last->parent->parent->data.block.argv->sz;
+ argc = mdoc->last->parent->parent->data.block.argv->sz;
n = mdoc->last->data.block.head->child;
for (i = 0; n; n = n->next)
i++;
- if (i == (size_t)sv)
+ if (i == argc)
return(1);
- return(mdoc_err(mdoc, "expected %d list columns, have %d", sv, (int)i));
+ return(mdoc_err(mdoc, "expected %zu list columns, have %zu", argc, i));
#undef TYPE_NONE
#undef TYPE_BODY
#undef TYPE_HEAD
@@ -955,6 +961,7 @@ post_bl(struct mdoc *mdoc)
return(1);
assert(MDOC_Bl == mdoc->last->tok);
+ /* LINTED */
for (n = mdoc->last->child; n; n = n->next) {
if (MDOC_BLOCK == n->type)
if (MDOC_It == n->tok)
@@ -973,6 +980,7 @@ ebool(struct mdoc *mdoc)
struct mdoc_node *n;
assert(MDOC_ELEM == mdoc->last->type);
+ /* LINTED */
for (n = mdoc->last->child; n; n = n->next) {
if (MDOC_TEXT != n->type)
break;