Annotation of mandoc/tree.c, Revision 1.11
1.11 ! kristaps 1: /* $Id: tree.c,v 1.10 2009/03/23 15:20:51 kristaps Exp $ */
1.1 kristaps 2: /*
1.8 kristaps 3: * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@openbsd.org>
1.1 kristaps 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: */
1.8 kristaps 19: #include <assert.h>
20: #include <err.h>
21: #include <stdio.h>
1.1 kristaps 22: #include <stdlib.h>
23:
24: #include "mdoc.h"
1.10 kristaps 25: #include "man.h"
1.1 kristaps 26:
1.11 ! kristaps 27: static void print_mdoc(const struct mdoc_node *, int);
! 28: static void print_man(const struct man_node *, int);
1.8 kristaps 29:
30:
1.9 kristaps 31: /* ARGSUSED */
1.8 kristaps 32: int
1.11 ! kristaps 33: tree_mdoc(void *arg, const struct mdoc *mdoc)
1.8 kristaps 34: {
35:
1.11 ! kristaps 36: print_mdoc(mdoc_node(mdoc), 0);
! 37: return(1);
! 38: }
! 39:
! 40:
! 41: /* ARGSUSED */
! 42: int
! 43: tree_man(void *arg, const struct man *man)
! 44: {
! 45:
! 46: print_man(man_node(man), 0);
1.8 kristaps 47: return(1);
48: }
1.2 kristaps 49:
1.1 kristaps 50:
51: static void
1.11 ! kristaps 52: print_mdoc(const struct mdoc_node *n, int indent)
1.1 kristaps 53: {
54: const char *p, *t;
55: int i, j;
56: size_t argc, sz;
57: char **params;
1.8 kristaps 58: struct mdoc_argv *argv;
1.1 kristaps 59:
60: argv = NULL;
61: argc = sz = 0;
62: params = NULL;
63:
1.2 kristaps 64: switch (n->type) {
65: case (MDOC_ROOT):
66: t = "root";
67: break;
68: case (MDOC_BLOCK):
69: t = "block";
70: break;
71: case (MDOC_HEAD):
72: t = "block-head";
73: break;
74: case (MDOC_BODY):
75: t = "block-body";
76: break;
77: case (MDOC_TAIL):
78: t = "block-tail";
79: break;
80: case (MDOC_ELEM):
81: t = "elem";
82: break;
83: case (MDOC_TEXT):
84: t = "text";
85: break;
86: default:
87: abort();
88: /* NOTREACHED */
89: }
1.1 kristaps 90:
91: switch (n->type) {
92: case (MDOC_TEXT):
1.8 kristaps 93: p = n->string;
1.1 kristaps 94: break;
95: case (MDOC_BODY):
96: p = mdoc_macronames[n->tok];
97: break;
98: case (MDOC_HEAD):
99: p = mdoc_macronames[n->tok];
100: break;
101: case (MDOC_TAIL):
102: p = mdoc_macronames[n->tok];
103: break;
104: case (MDOC_ELEM):
105: p = mdoc_macronames[n->tok];
1.8 kristaps 106: if (n->args) {
107: argv = n->args->argv;
108: argc = n->args->argc;
109: }
1.1 kristaps 110: break;
111: case (MDOC_BLOCK):
112: p = mdoc_macronames[n->tok];
1.8 kristaps 113: if (n->args) {
114: argv = n->args->argv;
115: argc = n->args->argc;
116: }
1.1 kristaps 117: break;
118: case (MDOC_ROOT):
119: p = "root";
120: break;
121: default:
122: abort();
123: /* NOTREACHED */
124: }
125:
126: for (i = 0; i < indent; i++)
1.8 kristaps 127: (void)printf(" ");
128: (void)printf("%s (%s)", p, t);
1.1 kristaps 129:
130: for (i = 0; i < (int)argc; i++) {
1.8 kristaps 131: (void)printf(" -%s", mdoc_argnames[argv[i].arg]);
1.1 kristaps 132: if (argv[i].sz > 0)
1.8 kristaps 133: (void)printf(" [");
1.1 kristaps 134: for (j = 0; j < (int)argv[i].sz; j++)
1.8 kristaps 135: (void)printf(" [%s]", argv[i].value[j]);
1.1 kristaps 136: if (argv[i].sz > 0)
1.8 kristaps 137: (void)printf(" ]");
1.1 kristaps 138: }
139:
140: for (i = 0; i < (int)sz; i++)
1.8 kristaps 141: (void)printf(" [%s]", params[i]);
1.1 kristaps 142:
1.8 kristaps 143: (void)printf(" %d:%d\n", n->line, n->pos);
1.1 kristaps 144:
145: if (n->child)
1.11 ! kristaps 146: print_mdoc(n->child, indent + 1);
1.1 kristaps 147: if (n->next)
1.11 ! kristaps 148: print_mdoc(n->next, indent);
1.1 kristaps 149: }
1.2 kristaps 150:
1.10 kristaps 151:
152: static void
1.11 ! kristaps 153: print_man(const struct man_node *n, int indent)
1.10 kristaps 154: {
155: const char *p, *t;
156: int i;
157:
158: switch (n->type) {
159: case (MAN_ROOT):
160: t = "root";
161: break;
162: case (MAN_ELEM):
163: t = "elem";
164: break;
165: case (MAN_TEXT):
166: t = "text";
167: break;
168: default:
169: abort();
170: /* NOTREACHED */
171: }
172:
173: switch (n->type) {
174: case (MAN_TEXT):
175: p = n->string;
176: break;
177: case (MAN_ELEM):
178: p = man_macronames[n->tok];
179: break;
180: case (MAN_ROOT):
181: p = "root";
182: break;
183: default:
184: abort();
185: /* NOTREACHED */
186: }
187:
188: for (i = 0; i < indent; i++)
189: (void)printf(" ");
190: (void)printf("%s (%s) %d:%d\n", p, t, n->line, n->pos);
191:
192: if (n->child)
1.11 ! kristaps 193: print_man(n->child, indent + 1);
1.10 kristaps 194: if (n->next)
1.11 ! kristaps 195: print_man(n->next, indent);
1.10 kristaps 196: }
CVSweb