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