Annotation of mandoc/mdoctree.c, Revision 1.3
1.3 ! kristaps 1: /* $Id: mdoctree.c,v 1.2 2009/02/22 22:58:39 kristaps Exp $ */
1.1 kristaps 2: /*
3: * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
4: *
5: * Permission to use, copy, modify, and distribute this software for any
6: * purpose with or without fee is hereby granted, provided that the
7: * above copyright notice and this permission notice appear in all
8: * copies.
9: *
10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11: * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12: * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13: * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14: * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15: * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16: * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17: * PERFORMANCE OF THIS SOFTWARE.
18: */
19: #include <assert.h>
20: #include <err.h>
21: #include <getopt.h>
1.3 ! kristaps 22: #include <stdio.h>
1.1 kristaps 23: #include <stdlib.h>
24:
1.2 kristaps 25: #include "mmain.h"
1.1 kristaps 26:
1.3 ! kristaps 27: #define xprintf (void)printf
! 28:
! 29: static void doprint(const struct mdoc_node *, int);
1.1 kristaps 30:
31: int
32: main(int argc, char *argv[])
33: {
1.2 kristaps 34: struct mmain *p;
35: const struct mdoc *mdoc;
36:
37: extern int optreset;
1.1 kristaps 38: extern int optind;
39:
1.2 kristaps 40: p = mmain_alloc();
1.1 kristaps 41:
1.3 ! kristaps 42: if ( ! mmain_getopt(p, argc, argv, NULL, NULL, NULL, NULL))
1.2 kristaps 43: mmain_exit(p, 1);
1.1 kristaps 44:
1.2 kristaps 45: if (NULL == (mdoc = mmain_mdoc(p)))
46: mmain_exit(p, 1);
1.1 kristaps 47:
1.3 ! kristaps 48: doprint(mdoc_node(mdoc), 0);
1.2 kristaps 49: mmain_exit(p, 0);
50: /* NOTREACHED */
1.1 kristaps 51: }
52:
53:
1.3 ! kristaps 54: static void
! 55: doprint(const struct mdoc_node *n, int indent)
! 56: {
! 57: const char *p, *t;
! 58: int i, j;
! 59: size_t argc, sz;
! 60: char **params;
! 61: struct mdoc_arg *argv;
! 62:
! 63: argv = NULL;
! 64: argc = sz = 0;
! 65: params = NULL;
! 66:
! 67: switch (n->type) {
! 68: case (MDOC_ROOT):
! 69: t = "root";
! 70: break;
! 71: case (MDOC_BLOCK):
! 72: t = "block";
! 73: break;
! 74: case (MDOC_HEAD):
! 75: t = "block-head";
! 76: break;
! 77: case (MDOC_BODY):
! 78: t = "block-body";
! 79: break;
! 80: case (MDOC_TAIL):
! 81: t = "block-tail";
! 82: break;
! 83: case (MDOC_ELEM):
! 84: t = "elem";
! 85: break;
! 86: case (MDOC_TEXT):
! 87: t = "text";
! 88: break;
! 89: default:
! 90: abort();
! 91: /* NOTREACHED */
! 92: }
! 93:
! 94: switch (n->type) {
! 95: case (MDOC_TEXT):
! 96: p = n->data.text.string;
! 97: break;
! 98: case (MDOC_BODY):
! 99: p = mdoc_macronames[n->tok];
! 100: break;
! 101: case (MDOC_HEAD):
! 102: p = mdoc_macronames[n->tok];
! 103: break;
! 104: case (MDOC_TAIL):
! 105: p = mdoc_macronames[n->tok];
! 106: break;
! 107: case (MDOC_ELEM):
! 108: p = mdoc_macronames[n->tok];
! 109: argv = n->data.elem.argv;
! 110: argc = n->data.elem.argc;
! 111: break;
! 112: case (MDOC_BLOCK):
! 113: p = mdoc_macronames[n->tok];
! 114: argv = n->data.block.argv;
! 115: argc = n->data.block.argc;
! 116: break;
! 117: case (MDOC_ROOT):
! 118: p = "root";
! 119: break;
! 120: default:
! 121: abort();
! 122: /* NOTREACHED */
! 123: }
! 124:
! 125: for (i = 0; i < indent; i++)
! 126: xprintf(" ");
! 127: xprintf("%s (%s)", p, t);
! 128:
! 129: for (i = 0; i < (int)argc; i++) {
! 130: xprintf(" -%s", mdoc_argnames[argv[i].arg]);
! 131: if (argv[i].sz > 0)
! 132: xprintf(" [");
! 133: for (j = 0; j < (int)argv[i].sz; j++)
! 134: xprintf(" [%s]", argv[i].value[j]);
! 135: if (argv[i].sz > 0)
! 136: xprintf(" ]");
! 137: }
! 138:
! 139: for (i = 0; i < (int)sz; i++)
! 140: xprintf(" [%s]", params[i]);
! 141:
! 142: xprintf(" %d:%d\n", n->line, n->pos);
! 143:
! 144: if (n->child)
! 145: doprint(n->child, indent + 1);
! 146: if (n->next)
! 147: doprint(n->next, indent);
! 148: }
CVSweb