xref: /netbsd-src/external/bsd/mdocml/dist/tree.c (revision 5c46dd73a9bcb28b2994504ea090f64066b17a77)
1 /*	$Vendor-Id: tree.c,v 1.20 2010/05/17 22:11:42 kristaps Exp $ */
2 /*
3  * Copyright (c) 2008, 2009 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 above
7  * copyright notice and this permission notice appear in all copies.
8  *
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.
16  */
17 #ifdef HAVE_CONFIG_H
18 #include "config.h"
19 #endif
20 
21 #include <assert.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <time.h>
25 
26 #include "mandoc.h"
27 #include "mdoc.h"
28 #include "man.h"
29 #include "main.h"
30 
31 static	void	print_mdoc(const struct mdoc_node *, int);
32 static	void	print_man(const struct man_node *, int);
33 
34 
35 /* ARGSUSED */
36 void
37 tree_mdoc(void *arg, const struct mdoc *mdoc)
38 {
39 
40 	print_mdoc(mdoc_node(mdoc), 0);
41 }
42 
43 
44 /* ARGSUSED */
45 void
46 tree_man(void *arg, const struct man *man)
47 {
48 
49 	print_man(man_node(man), 0);
50 }
51 
52 
53 static void
54 print_mdoc(const struct mdoc_node *n, int indent)
55 {
56 	const char	 *p, *t;
57 	int		  i, j;
58 	size_t		  argc, sz;
59 	char		**params;
60 	struct mdoc_argv *argv;
61 
62 	argv = NULL;
63 	argc = sz = 0;
64 	params = NULL;
65 
66 	switch (n->type) {
67 	case (MDOC_ROOT):
68 		t = "root";
69 		break;
70 	case (MDOC_BLOCK):
71 		t = "block";
72 		break;
73 	case (MDOC_HEAD):
74 		t = "block-head";
75 		break;
76 	case (MDOC_BODY):
77 		t = "block-body";
78 		break;
79 	case (MDOC_TAIL):
80 		t = "block-tail";
81 		break;
82 	case (MDOC_ELEM):
83 		t = "elem";
84 		break;
85 	case (MDOC_TEXT):
86 		t = "text";
87 		break;
88 	default:
89 		abort();
90 		/* NOTREACHED */
91 	}
92 
93 	switch (n->type) {
94 	case (MDOC_TEXT):
95 		p = n->string;
96 		break;
97 	case (MDOC_BODY):
98 		p = mdoc_macronames[n->tok];
99 		break;
100 	case (MDOC_HEAD):
101 		p = mdoc_macronames[n->tok];
102 		break;
103 	case (MDOC_TAIL):
104 		p = mdoc_macronames[n->tok];
105 		break;
106 	case (MDOC_ELEM):
107 		p = mdoc_macronames[n->tok];
108 		if (n->args) {
109 			argv = n->args->argv;
110 			argc = n->args->argc;
111 		}
112 		break;
113 	case (MDOC_BLOCK):
114 		p = mdoc_macronames[n->tok];
115 		if (n->args) {
116 			argv = n->args->argv;
117 			argc = n->args->argc;
118 		}
119 		break;
120 	case (MDOC_ROOT):
121 		p = "root";
122 		break;
123 	default:
124 		abort();
125 		/* NOTREACHED */
126 	}
127 
128 	for (i = 0; i < indent; i++)
129 		(void)printf("    ");
130 	(void)printf("%s (%s)", p, t);
131 
132 	for (i = 0; i < (int)argc; i++) {
133 		(void)printf(" -%s", mdoc_argnames[argv[i].arg]);
134 		if (argv[i].sz > 0)
135 			(void)printf(" [");
136 		for (j = 0; j < (int)argv[i].sz; j++)
137 			(void)printf(" [%s]", argv[i].value[j]);
138 		if (argv[i].sz > 0)
139 			(void)printf(" ]");
140 	}
141 
142 	for (i = 0; i < (int)sz; i++)
143 		(void)printf(" [%s]", params[i]);
144 
145 	(void)printf(" %d:%d\n", n->line, n->pos);
146 
147 	if (n->child)
148 		print_mdoc(n->child, indent + 1);
149 	if (n->next)
150 		print_mdoc(n->next, indent);
151 }
152 
153 
154 static void
155 print_man(const struct man_node *n, int indent)
156 {
157 	const char	 *p, *t;
158 	int		  i;
159 
160 	switch (n->type) {
161 	case (MAN_ROOT):
162 		t = "root";
163 		break;
164 	case (MAN_ELEM):
165 		t = "elem";
166 		break;
167 	case (MAN_TEXT):
168 		t = "text";
169 		break;
170 	case (MAN_BLOCK):
171 		t = "block";
172 		break;
173 	case (MAN_HEAD):
174 		t = "block-head";
175 		break;
176 	case (MAN_BODY):
177 		t = "block-body";
178 		break;
179 	default:
180 		abort();
181 		/* NOTREACHED */
182 	}
183 
184 	switch (n->type) {
185 	case (MAN_TEXT):
186 		p = n->string;
187 		break;
188 	case (MAN_ELEM):
189 		/* FALLTHROUGH */
190 	case (MAN_BLOCK):
191 		/* FALLTHROUGH */
192 	case (MAN_HEAD):
193 		/* FALLTHROUGH */
194 	case (MAN_BODY):
195 		p = man_macronames[n->tok];
196 		break;
197 	case (MAN_ROOT):
198 		p = "root";
199 		break;
200 	default:
201 		abort();
202 		/* NOTREACHED */
203 	}
204 
205 	for (i = 0; i < indent; i++)
206 		(void)printf("    ");
207 	(void)printf("%s (%s) %d:%d\n", p, t, n->line, n->pos);
208 
209 	if (n->child)
210 		print_man(n->child, indent + 1);
211 	if (n->next)
212 		print_man(n->next, indent);
213 }
214