]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoctree.c
Bumped minor-number.
[mandoc.git] / mdoctree.c
index 2c62359c39327b5646f2584b716845598e71d49d..6507034816f3fcd74470d1da79216d97b8b9b33c 100644 (file)
@@ -1,4 +1,4 @@
-       /* $Id: mdoctree.c,v 1.2 2009/02/22 22:58:39 kristaps Exp $ */
+       /* $Id: mdoctree.c,v 1.6 2009/03/08 14:01:46 kristaps Exp $ */
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
 #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;
+       struct mmain      *p;
+       int                c;
        const struct mdoc *mdoc;
-       int              c;
-
-       extern int       optreset;
-       extern int       optind;
 
        p = mmain_alloc();
 
-       if ( ! mmain_getopt(p, argc, argv, 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 */
-               }
+       c = mmain_getopt(p, argc, argv, NULL, NULL, NULL, NULL);
+       if (1 != c) 
+               mmain_exit(p, -1 == c ? 1 : 0);
 
        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_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++)
+               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);
+}