Annotation of mandoc/mdoctree.c, Revision 1.7
1.7 ! kristaps 1: /* $Id: mdoctree.c,v 1.6 2009/03/08 14:01:46 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.5 kristaps 34: struct mmain *p;
1.7 ! kristaps 35: const struct mdoc *mdoc;
1.5 kristaps 36: int c;
1.7 ! kristaps 37: char *in;
1.2 kristaps 38:
39: p = mmain_alloc();
1.1 kristaps 40:
1.7 ! kristaps 41: c = mmain_getopt(p, argc, argv, NULL,
! 42: "[infile]", NULL, NULL, NULL);
! 43:
! 44: argv += c;
! 45: if ((argc -= c) > 0)
! 46: in = *argv++;
! 47: else
! 48: in = "-";
1.1 kristaps 49:
1.7 ! kristaps 50: if (NULL == (mdoc = mmain_mdoc(p, in)))
1.2 kristaps 51: mmain_exit(p, 1);
1.1 kristaps 52:
1.3 kristaps 53: doprint(mdoc_node(mdoc), 0);
1.2 kristaps 54: mmain_exit(p, 0);
55: /* NOTREACHED */
1.1 kristaps 56: }
57:
58:
1.3 kristaps 59: static void
60: doprint(const struct mdoc_node *n, int indent)
61: {
62: const char *p, *t;
63: int i, j;
64: size_t argc, sz;
65: char **params;
1.6 kristaps 66: struct mdoc_argv *argv;
1.3 kristaps 67:
68: argv = NULL;
69: argc = sz = 0;
70: params = NULL;
71:
72: switch (n->type) {
73: case (MDOC_ROOT):
74: t = "root";
75: break;
76: case (MDOC_BLOCK):
77: t = "block";
78: break;
79: case (MDOC_HEAD):
80: t = "block-head";
81: break;
82: case (MDOC_BODY):
83: t = "block-body";
84: break;
85: case (MDOC_TAIL):
86: t = "block-tail";
87: break;
88: case (MDOC_ELEM):
89: t = "elem";
90: break;
91: case (MDOC_TEXT):
92: t = "text";
93: break;
94: default:
95: abort();
96: /* NOTREACHED */
97: }
98:
99: switch (n->type) {
100: case (MDOC_TEXT):
1.6 kristaps 101: p = n->string;
1.3 kristaps 102: break;
103: case (MDOC_BODY):
104: p = mdoc_macronames[n->tok];
105: break;
106: case (MDOC_HEAD):
107: p = mdoc_macronames[n->tok];
108: break;
109: case (MDOC_TAIL):
110: p = mdoc_macronames[n->tok];
111: break;
112: case (MDOC_ELEM):
113: p = mdoc_macronames[n->tok];
1.6 kristaps 114: if (n->args) {
115: argv = n->args->argv;
116: argc = n->args->argc;
117: }
1.3 kristaps 118: break;
119: case (MDOC_BLOCK):
120: p = mdoc_macronames[n->tok];
1.6 kristaps 121: if (n->args) {
122: argv = n->args->argv;
123: argc = n->args->argc;
124: }
1.3 kristaps 125: break;
126: case (MDOC_ROOT):
127: p = "root";
128: break;
129: default:
130: abort();
131: /* NOTREACHED */
132: }
133:
134: for (i = 0; i < indent; i++)
135: xprintf(" ");
136: xprintf("%s (%s)", p, t);
137:
138: for (i = 0; i < (int)argc; i++) {
139: xprintf(" -%s", mdoc_argnames[argv[i].arg]);
140: if (argv[i].sz > 0)
141: xprintf(" [");
142: for (j = 0; j < (int)argv[i].sz; j++)
143: xprintf(" [%s]", argv[i].value[j]);
144: if (argv[i].sz > 0)
145: xprintf(" ]");
146: }
147:
148: for (i = 0; i < (int)sz; i++)
149: xprintf(" [%s]", params[i]);
150:
151: xprintf(" %d:%d\n", n->line, n->pos);
152:
153: if (n->child)
154: doprint(n->child, indent + 1);
155: if (n->next)
156: doprint(n->next, indent);
157: }
CVSweb