-/* $Id: mdocml.c,v 1.21 2008/12/15 01:54:58 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();
+ /* NOTREACHED */
}
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);
for (i = 0; i < sz; i++) {
if ('\n' != p->buf[i]) {
if (pos < sizeof(line)) {
- /* LINTED */
- sv[pos] = p->buf[i];
- line[pos++] = p->buf[i];
+ sv[(int)pos] = p->buf[(int)i];
+ line[(int)pos++] =
+ p->buf[(int)i];
continue;
}
warnx("%s: line %d too long",
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_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_MACRO_NOTCALL):
fmt = "macro `%s' not callable";
break;
+ case (ERR_SEC_PROLOGUE):
+ fmt = "macro `%s' cannot be called in the prologue";
+ break;
+ 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_PROLOGUE_OO):
+ fmt = "prologue macro `%s' is out-of-order";
+ break;
+ case (ERR_SEC_PROLOGUE_REP):
+ fmt = "prologue macro `%s' repeated";
+ 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 */
p->name, p->lnn, lit);
if (p->dbg < 1) {
- (void)fprintf(stderr, " (column %d)\n", col);
+ if (-1 != col)
+ (void)fprintf(stderr, " (column %d)\n", col);
+ return(0);
+ } else if (-1 == col) {
+ (void)fprintf(stderr, "\nFrom: %s", p->line);
return(0);
}
(void)printf("%s:%d: %s", p->name, p->lnn, msg);
if (p->dbg < 3) {
- (void)printf(" (column %d)\n", col);
+ if (-1 != col)
+ (void)printf(" (column %d)\n", col);
+ return;
+ } else if (-1 == col) {
+ (void)printf("\nFrom %s\n", p->line);
return;
}
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 */