Annotation of src/usr.bin/mandoc/tree.c, Revision 1.8
1.8 ! schwarze 1: /* $Id: tree.c,v 1.7 2010/05/23 22:45:01 schwarze Exp $ */
1.1 kristaps 2: /*
1.8 ! schwarze 3: * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>
1.1 kristaps 4: *
5: * Permission to use, copy, modify, and distribute this software for any
1.2 schwarze 6: * purpose with or without fee is hereby granted, provided that the above
7: * copyright notice and this permission notice appear in all copies.
1.1 kristaps 8: *
1.2 schwarze 9: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1.1 kristaps 16: */
17: #include <assert.h>
18: #include <stdio.h>
19: #include <stdlib.h>
1.6 schwarze 20: #include <time.h>
1.1 kristaps 21:
1.7 schwarze 22: #include "mandoc.h"
1.8 ! schwarze 23: #include "regs.h"
1.1 kristaps 24: #include "mdoc.h"
25: #include "man.h"
1.5 schwarze 26: #include "main.h"
1.1 kristaps 27:
28: static void print_mdoc(const struct mdoc_node *, int);
29: static void print_man(const struct man_node *, int);
30:
31:
32: /* ARGSUSED */
1.4 schwarze 33: void
1.1 kristaps 34: tree_mdoc(void *arg, const struct mdoc *mdoc)
35: {
36:
37: print_mdoc(mdoc_node(mdoc), 0);
38: }
39:
40:
41: /* ARGSUSED */
1.4 schwarze 42: void
1.1 kristaps 43: tree_man(void *arg, const struct man *man)
44: {
45:
46: print_man(man_node(man), 0);
47: }
48:
49:
50: static void
51: print_mdoc(const struct mdoc_node *n, int indent)
52: {
53: const char *p, *t;
54: int i, j;
55: size_t argc, sz;
56: char **params;
57: struct mdoc_argv *argv;
58:
59: argv = NULL;
60: argc = sz = 0;
61: params = NULL;
62:
63: switch (n->type) {
64: case (MDOC_ROOT):
65: t = "root";
66: break;
67: case (MDOC_BLOCK):
68: t = "block";
69: break;
70: case (MDOC_HEAD):
71: t = "block-head";
72: break;
73: case (MDOC_BODY):
74: t = "block-body";
75: break;
76: case (MDOC_TAIL):
77: t = "block-tail";
78: break;
79: case (MDOC_ELEM):
80: t = "elem";
81: break;
82: case (MDOC_TEXT):
83: t = "text";
84: break;
85: default:
86: abort();
87: /* NOTREACHED */
88: }
89:
90: switch (n->type) {
91: case (MDOC_TEXT):
92: p = n->string;
93: break;
94: case (MDOC_BODY):
95: p = mdoc_macronames[n->tok];
96: break;
97: case (MDOC_HEAD):
98: p = mdoc_macronames[n->tok];
99: break;
100: case (MDOC_TAIL):
101: p = mdoc_macronames[n->tok];
102: break;
103: case (MDOC_ELEM):
104: p = mdoc_macronames[n->tok];
105: if (n->args) {
106: argv = n->args->argv;
107: argc = n->args->argc;
108: }
109: break;
110: case (MDOC_BLOCK):
111: p = mdoc_macronames[n->tok];
112: if (n->args) {
113: argv = n->args->argv;
114: argc = n->args->argc;
115: }
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: (void)printf(" ");
127: (void)printf("%s (%s)", p, t);
128:
129: for (i = 0; i < (int)argc; i++) {
130: (void)printf(" -%s", mdoc_argnames[argv[i].arg]);
131: if (argv[i].sz > 0)
132: (void)printf(" [");
133: for (j = 0; j < (int)argv[i].sz; j++)
134: (void)printf(" [%s]", argv[i].value[j]);
135: if (argv[i].sz > 0)
136: (void)printf(" ]");
137: }
138:
139: for (i = 0; i < (int)sz; i++)
140: (void)printf(" [%s]", params[i]);
141:
142: (void)printf(" %d:%d\n", n->line, n->pos);
143:
144: if (n->child)
145: print_mdoc(n->child, indent + 1);
146: if (n->next)
147: print_mdoc(n->next, indent);
148: }
149:
150:
151: static void
152: print_man(const struct man_node *n, int indent)
153: {
154: const char *p, *t;
155: int i;
156:
157: switch (n->type) {
158: case (MAN_ROOT):
159: t = "root";
160: break;
161: case (MAN_ELEM):
162: t = "elem";
163: break;
164: case (MAN_TEXT):
165: t = "text";
166: break;
1.3 schwarze 167: case (MAN_BLOCK):
168: t = "block";
169: break;
170: case (MAN_HEAD):
171: t = "block-head";
172: break;
173: case (MAN_BODY):
174: t = "block-body";
175: break;
1.1 kristaps 176: default:
177: abort();
178: /* NOTREACHED */
179: }
180:
181: switch (n->type) {
182: case (MAN_TEXT):
183: p = n->string;
184: break;
185: case (MAN_ELEM):
1.3 schwarze 186: /* FALLTHROUGH */
187: case (MAN_BLOCK):
188: /* FALLTHROUGH */
189: case (MAN_HEAD):
190: /* FALLTHROUGH */
191: case (MAN_BODY):
1.1 kristaps 192: p = man_macronames[n->tok];
193: break;
194: case (MAN_ROOT):
195: p = "root";
196: break;
197: default:
198: abort();
199: /* NOTREACHED */
200: }
201:
202: for (i = 0; i < indent; i++)
203: (void)printf(" ");
204: (void)printf("%s (%s) %d:%d\n", p, t, n->line, n->pos);
205:
206: if (n->child)
207: print_man(n->child, indent + 1);
208: if (n->next)
209: print_man(n->next, indent);
210: }