summaryrefslogtreecommitdiffstatshomepage
path: root/mdoctree.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2009-02-23 07:09:13 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2009-02-23 07:09:13 +0000
commit7caa51ee5a0c6624eb97d1d6bf06b84bdbd7f034 (patch)
treefff13d3e7f77987fac0c4418de599f1bb1f4805f /mdoctree.c
parentb96fa66b3bba1ea8e09fda0e994688409dbe30ce (diff)
downloadmandoc-7caa51ee5a0c6624eb97d1d6bf06b84bdbd7f034.tar.gz
mandoc-7caa51ee5a0c6624eb97d1d6bf06b84bdbd7f034.tar.zst
mandoc-7caa51ee5a0c6624eb97d1d6bf06b84bdbd7f034.zip
termact.c -> term.c
term.c -> mdocterm.c tree.c -> mdoctree.c Fixed/finished mmain.h.
Diffstat (limited to 'mdoctree.c')
-rw-r--r--mdoctree.c129
1 files changed, 102 insertions, 27 deletions
diff --git a/mdoctree.c b/mdoctree.c
index 2c62359c..444dde48 100644
--- a/mdoctree.c
+++ b/mdoctree.c
@@ -1,4 +1,4 @@
- /* $Id: mdoctree.c,v 1.2 2009/02/22 22:58:39 kristaps Exp $ */
+ /* $Id: mdoctree.c,v 1.3 2009/02/23 07:09:13 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -19,55 +19,130 @@
#include <assert.h>
#include <err.h>
#include <getopt.h>
+#include <stdio.h>
#include <stdlib.h>
#include "mmain.h"
-extern void treeprint(const struct mdoc_node *,
- const struct mdoc_meta *);
+#define xprintf (void)printf
+
+static void doprint(const struct mdoc_node *, int);
int
main(int argc, char *argv[])
{
struct mmain *p;
const struct mdoc *mdoc;
- int c;
extern int optreset;
extern int optind;
p = mmain_alloc();
- if ( ! mmain_getopt(p, argc, argv, NULL))
+ if ( ! mmain_getopt(p, argc, argv, NULL, NULL, NULL, NULL))
mmain_exit(p, 1);
- optreset = optind = 1;
- printf("here\n");
-
- while (-1 != (c = getopt(argc, argv, "f:")))
- switch (c) {
- case ('f'):
- printf("%s\n", optarg);
- break;
- case ('?'):
- if (mmain_isopt(optopt)) {
- printf("ok: %d\n", optopt);
- break;
- }
- printf("bad: %d\n", optopt);
- /* FALLTHROUGH */
- default:
- mmain_usage(NULL);
- mmain_exit(p, 1);
- /* NOTREACHED */
- }
-
if (NULL == (mdoc = mmain_mdoc(p)))
mmain_exit(p, 1);
- treeprint(mdoc_node(mdoc), mdoc_meta(mdoc));
+ doprint(mdoc_node(mdoc), 0);
mmain_exit(p, 0);
/* NOTREACHED */
}
+static void
+doprint(const struct mdoc_node *n, int indent)
+{
+ const char *p, *t;
+ int i, j;
+ size_t argc, sz;
+ char **params;
+ struct mdoc_arg *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->data.text.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];
+ argv = n->data.elem.argv;
+ argc = n->data.elem.argc;
+ break;
+ case (MDOC_BLOCK):
+ p = mdoc_macronames[n->tok];
+ argv = n->data.block.argv;
+ argc = n->data.block.argc;
+ break;
+ case (MDOC_ROOT):
+ p = "root";
+ break;
+ default:
+ abort();
+ /* NOTREACHED */
+ }
+
+ for (i = 0; i < indent; i++)
+ xprintf(" ");
+ xprintf("%s (%s)", p, t);
+
+ for (i = 0; i < (int)argc; i++) {
+ xprintf(" -%s", mdoc_argnames[argv[i].arg]);
+ if (argv[i].sz > 0)
+ xprintf(" [");
+ for (j = 0; j < (int)argv[i].sz; j++)
+ xprintf(" [%s]", argv[i].value[j]);
+ if (argv[i].sz > 0)
+ xprintf(" ]");
+ }
+
+ for (i = 0; i < (int)sz; i++)
+ xprintf(" [%s]", params[i]);
+
+ xprintf(" %d:%d\n", n->line, n->pos);
+
+ if (n->child)
+ doprint(n->child, indent + 1);
+ if (n->next)
+ doprint(n->next, indent);
+}