-/* $Id: mdocml.c,v 1.23 2008/12/17 17:18:38 kristaps Exp $ */
+/* $Id: mdocml.c,v 1.28 2008/12/29 18:08:44 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
static void
print_node(const struct mdoc_node *n, int indent)
{
- const char *p, *t;
- int i;
+ const char *p, *t;
+ int i, j;
+ size_t argc, sz;
+ char **params;
+ struct mdoc_arg *argv;
+
+ argv = NULL;
+ argc = 0;
+ params = NULL;
+ sz = 0;
switch (n->type) {
case (MDOC_TEXT):
assert(NULL == n->child);
- p = "<text>";
+ p = n->data.text.string;
t = "text";
break;
case (MDOC_BODY):
case (MDOC_HEAD):
p = mdoc_macronames[n->data.head.tok];
t = "block-head";
+ params = n->data.head.args;
+ sz = n->data.head.sz;
break;
case (MDOC_ELEM):
assert(NULL == n->child);
p = mdoc_macronames[n->data.elem.tok];
t = "element";
+ argv = n->data.elem.argv;
+ argc = n->data.elem.argc;
+ params = n->data.elem.args;
+ sz = n->data.elem.sz;
break;
case (MDOC_BLOCK):
p = mdoc_macronames[n->data.block.tok];
t = "block";
+ argv = n->data.block.argv;
+ argc = n->data.block.argc;
break;
default:
abort();
for (i = 0; i < indent; i++)
(void)printf(" ");
- (void)printf("%s (%s)\n", p, t);
+ (void)printf("%s (%s)", p, t);
+
+ for (i = 0; i < (int)argc; i++) {
+ (void)printf(" -%s", mdoc_argnames[argv[i].arg]);
+ for (j = 0; j < (int)argv[i].sz; j++)
+ (void)printf(" \"%s\"", argv[i].value[j]);
+ }
+
+ for (i = 0; i < (int)sz; i++)
+ (void)printf(" \"%s\"", params[i]);
+
+ (void)printf("\n");
if (n->child)
print_node(n->child, indent + 1);
switch (type) {
case (ERR_SYNTAX_QUOTE):
+ lit = "syntax: disallowed argument quotation";
+ break;
+ case (ERR_SYNTAX_UNQUOTE):
lit = "syntax: unterminated quotation";
break;
case (ERR_SYNTAX_WS):
lit = "syntax: whitespace in argument";
break;
- case (ERR_SYNTAX_ARGS):
+ case (ERR_SYNTAX_ARGFORM):
fmt = "syntax: macro `%s' arguments malformed";
break;
+ case (ERR_SYNTAX_NOPUNCT):
+ fmt = "syntax: macro `%s' doesn't understand punctuation";
+ break;
+ case (ERR_SYNTAX_ARG):
+ fmt = "syntax: unknown argument for macro `%s'";
+ break;
case (ERR_SCOPE_BREAK):
/* Which scope is broken? */
- fmt = "macro `%s' breaks prior explicit scope";
+ fmt = "scope: macro `%s' breaks prior explicit scope";
+ break;
+ case (ERR_SCOPE_NOCTX):
+ fmt = "scope: closure macro `%s' has no context";
+ break;
+ case (ERR_SCOPE_NONEST):
+ fmt = "scope: macro `%s' may not be nested in the current context";
break;
case (ERR_MACRO_NOTSUP):
fmt = "macro `%s' not supported";
case (ERR_SEC_NPROLOGUE):
fmt = "macro `%s' called outside of prologue";
break;
+ case (ERR_ARGS_EQ0):
+ fmt = "macro `%s' expects zero arguments";
+ break;
case (ERR_ARGS_GE1):
fmt = "macro `%s' expects one or more arguments";
break;
+ case (ERR_ARGS_LE2):
+ fmt = "macro `%s' expects two or fewer arguments";
+ break;
case (ERR_ARGS_MANY):
fmt = "macro `%s' has too many arguments";
break;
case (ERR_SEC_NAME):
lit = "`NAME' section must be first";
break;
+ case (ERR_SYNTAX_ARGVAL):
+ lit = "syntax: expected value for macro argument";
+ break;
+ case (ERR_SYNTAX_ARGBAD):
+ lit = "syntax: invalid value for macro argument";
+ break;
+ case (ERR_SYNTAX_ARGMANY):
+ lit = "syntax: too many values for macro argument";
+ break;
default:
abort();
/* NOTREACHED */
case (WARN_SYNTAX_WS_EOLN):
lit = "syntax: whitespace at end-of-line";
break;
+ case (WARN_SYNTAX_QUOTED):
+ lit = "syntax: quotation mark starting string";
+ break;
case (WARN_SYNTAX_MACLIKE):
lit = "syntax: macro-like argument";
break;
+ case (WARN_SYNTAX_ARGLIKE):
+ lit = "syntax: argument-like value";
+ break;
case (WARN_SEC_OO):
lit = "section is out of conventional order";
break;
case (WARN_ARGS_GE1):
fmt = "macro `%s' suggests one or more arguments";
break;
+ case (WARN_ARGS_EQ0):
+ fmt = "macro `%s' suggests zero arguments";
+ break;
+ case (WARN_IGN_AFTER_BLK):
+ fmt = "ignore: macro `%s' ignored after block macro";
+ break;
+ case (WARN_IGN_BEFORE_BLK):
+ fmt = "ignore: macro before block macro `%s' ignored";
+ break;
+ case (WARN_COMPAT_TROFF):
+ fmt = "compat: macro `%s' behaves differently in troff and nroff";
+ break;
default:
abort();
/* NOTREACHED */