summaryrefslogtreecommitdiffstatshomepage
path: root/tree.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2009-03-19 16:17:27 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2009-03-19 16:17:27 +0000
commite81807680a9a78e4658f5e00ffc42de9da9eb19d (patch)
tree4f622609bf14b9b052004d8220c5fab112105709 /tree.c
parente1e06ec7dbe31f799c04be32aad9756e45b294bb (diff)
downloadmandoc-e81807680a9a78e4658f5e00ffc42de9da9eb19d.tar.gz
mandoc-e81807680a9a78e4658f5e00ffc42de9da9eb19d.tar.zst
mandoc-e81807680a9a78e4658f5e00ffc42de9da9eb19d.zip
Split mdocterm.c -> main.c terminal.c.
Abstracted output with -T selector (default ascii). Name change: mdocterm -> mandoc. Re-imported tree with -Ttree.
Diffstat (limited to 'tree.c')
-rw-r--r--tree.c137
1 files changed, 137 insertions, 0 deletions
diff --git a/tree.c b/tree.c
new file mode 100644
index 00000000..4341077b
--- /dev/null
+++ b/tree.c
@@ -0,0 +1,137 @@
+/* $Id: tree.c,v 1.8 2009/03/19 16:17:27 kristaps Exp $ */
+/*
+ * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+#include <assert.h>
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "mdoc.h"
+
+static void tree_body(const struct mdoc_node *, int);
+
+
+int
+tree_run(void *arg, const struct mdoc *mdoc)
+{
+
+ tree_body(mdoc_node(mdoc), 0);
+ return(1);
+}
+
+
+static void
+tree_body(const struct mdoc_node *n, int indent)
+{
+ const char *p, *t;
+ int i, j;
+ size_t argc, sz;
+ char **params;
+ struct mdoc_argv *argv;
+
+ argv = NULL;
+ argc = sz = 0;
+ params = NULL;
+
+ switch (n->type) {
+ case (MDOC_ROOT):
+ t = "root";
+ break;
+ case (MDOC_BLOCK):
+ t = "block";
+ break;
+ case (MDOC_HEAD):
+ t = "block-head";
+ break;
+ case (MDOC_BODY):
+ t = "block-body";
+ break;
+ case (MDOC_TAIL):
+ t = "block-tail";
+ break;
+ case (MDOC_ELEM):
+ t = "elem";
+ break;
+ case (MDOC_TEXT):
+ t = "text";
+ break;
+ default:
+ abort();
+ /* NOTREACHED */
+ }
+
+ switch (n->type) {
+ case (MDOC_TEXT):
+ p = n->string;
+ break;
+ case (MDOC_BODY):
+ p = mdoc_macronames[n->tok];
+ break;
+ case (MDOC_HEAD):
+ p = mdoc_macronames[n->tok];
+ break;
+ case (MDOC_TAIL):
+ p = mdoc_macronames[n->tok];
+ break;
+ case (MDOC_ELEM):
+ p = mdoc_macronames[n->tok];
+ if (n->args) {
+ argv = n->args->argv;
+ argc = n->args->argc;
+ }
+ break;
+ case (MDOC_BLOCK):
+ p = mdoc_macronames[n->tok];
+ if (n->args) {
+ argv = n->args->argv;
+ argc = n->args->argc;
+ }
+ break;
+ case (MDOC_ROOT):
+ p = "root";
+ break;
+ default:
+ abort();
+ /* NOTREACHED */
+ }
+
+ for (i = 0; i < indent; i++)
+ (void)printf(" ");
+ (void)printf("%s (%s)", p, t);
+
+ for (i = 0; i < (int)argc; i++) {
+ (void)printf(" -%s", mdoc_argnames[argv[i].arg]);
+ if (argv[i].sz > 0)
+ (void)printf(" [");
+ for (j = 0; j < (int)argv[i].sz; j++)
+ (void)printf(" [%s]", argv[i].value[j]);
+ if (argv[i].sz > 0)
+ (void)printf(" ]");
+ }
+
+ for (i = 0; i < (int)sz; i++)
+ (void)printf(" [%s]", params[i]);
+
+ (void)printf(" %d:%d\n", n->line, n->pos);
+
+ if (n->child)
+ tree_body(n->child, indent + 1);
+ if (n->next)
+ tree_body(n->next, indent);
+}
+