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