Annotation of src/usr.bin/mandoc/tree.c, Revision 1.11
1.11 ! schwarze 1: /* $Id: tree.c,v 1.10 2010/07/13 01:09:13 schwarze Exp $ */
1.1 kristaps 2: /*
1.11 ! schwarze 3: * Copyright (c) 2008, 2009, 2011 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.1 kristaps 23: #include "mdoc.h"
24: #include "man.h"
1.5 schwarze 25: #include "main.h"
1.1 kristaps 26:
27: static void print_mdoc(const struct mdoc_node *, int);
28: static void print_man(const struct man_node *, int);
1.11 ! schwarze 29: static void print_span(const struct tbl_span *, int);
1.1 kristaps 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):
1.9 schwarze 74: if (n->end)
75: t = "body-end";
76: else
77: t = "block-body";
1.1 kristaps 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;
1.11 ! schwarze 88: case (MDOC_TBL):
! 89: t = "tbl";
! 90: break;
1.1 kristaps 91: default:
92: abort();
93: /* NOTREACHED */
94: }
95:
1.11 ! schwarze 96: p = NULL;
! 97:
1.1 kristaps 98: switch (n->type) {
99: case (MDOC_TEXT):
100: p = n->string;
101: break;
102: case (MDOC_BODY):
103: p = mdoc_macronames[n->tok];
104: break;
105: case (MDOC_HEAD):
106: p = mdoc_macronames[n->tok];
107: break;
108: case (MDOC_TAIL):
109: p = mdoc_macronames[n->tok];
110: break;
111: case (MDOC_ELEM):
112: p = mdoc_macronames[n->tok];
113: if (n->args) {
114: argv = n->args->argv;
115: argc = n->args->argc;
116: }
117: break;
118: case (MDOC_BLOCK):
119: p = mdoc_macronames[n->tok];
120: if (n->args) {
121: argv = n->args->argv;
122: argc = n->args->argc;
123: }
124: break;
1.11 ! schwarze 125: case (MDOC_TBL):
! 126: break;
1.1 kristaps 127: case (MDOC_ROOT):
128: p = "root";
129: break;
130: default:
131: abort();
132: /* NOTREACHED */
133: }
134:
1.11 ! schwarze 135: if (n->span) {
! 136: assert(NULL == p);
! 137: print_span(n->span, indent);
! 138: } else {
! 139: for (i = 0; i < indent; i++)
! 140: putchar('\t');
! 141:
! 142: printf("%s (%s)", p, t);
! 143:
! 144: for (i = 0; i < (int)argc; i++) {
! 145: printf(" -%s", mdoc_argnames[argv[i].arg]);
! 146: if (argv[i].sz > 0)
! 147: printf(" [");
! 148: for (j = 0; j < (int)argv[i].sz; j++)
! 149: printf(" [%s]", argv[i].value[j]);
! 150: if (argv[i].sz > 0)
! 151: printf(" ]");
! 152: }
! 153:
! 154: for (i = 0; i < (int)sz; i++)
! 155: printf(" [%s]", params[i]);
1.1 kristaps 156:
1.11 ! schwarze 157: printf(" %d:%d", n->line, n->pos);
1.1 kristaps 158: }
159:
1.11 ! schwarze 160: putchar('\n');
1.1 kristaps 161:
162: if (n->child)
163: print_mdoc(n->child, indent + 1);
164: if (n->next)
165: print_mdoc(n->next, indent);
166: }
167:
168:
169: static void
170: print_man(const struct man_node *n, int indent)
171: {
172: const char *p, *t;
173: int i;
174:
175: switch (n->type) {
176: case (MAN_ROOT):
177: t = "root";
178: break;
179: case (MAN_ELEM):
180: t = "elem";
181: break;
182: case (MAN_TEXT):
183: t = "text";
184: break;
1.3 schwarze 185: case (MAN_BLOCK):
186: t = "block";
187: break;
188: case (MAN_HEAD):
189: t = "block-head";
190: break;
191: case (MAN_BODY):
192: t = "block-body";
193: break;
1.11 ! schwarze 194: case (MAN_TBL):
! 195: t = "tbl";
! 196: break;
1.1 kristaps 197: default:
198: abort();
199: /* NOTREACHED */
200: }
201:
1.11 ! schwarze 202: p = NULL;
! 203:
1.1 kristaps 204: switch (n->type) {
205: case (MAN_TEXT):
206: p = n->string;
207: break;
208: case (MAN_ELEM):
1.3 schwarze 209: /* FALLTHROUGH */
210: case (MAN_BLOCK):
211: /* FALLTHROUGH */
212: case (MAN_HEAD):
213: /* FALLTHROUGH */
214: case (MAN_BODY):
1.1 kristaps 215: p = man_macronames[n->tok];
216: break;
217: case (MAN_ROOT):
218: p = "root";
219: break;
1.11 ! schwarze 220: case (MAN_TBL):
! 221: break;
1.1 kristaps 222: default:
223: abort();
224: /* NOTREACHED */
225: }
226:
1.11 ! schwarze 227: if (n->span) {
! 228: assert(NULL == p);
! 229: print_span(n->span, indent);
! 230: } else {
! 231: for (i = 0; i < indent; i++)
! 232: putchar('\t');
! 233: printf("%s (%s) %d:%d", p, t, n->line, n->pos);
! 234: }
! 235:
! 236: putchar('\n');
1.1 kristaps 237:
238: if (n->child)
239: print_man(n->child, indent + 1);
240: if (n->next)
241: print_man(n->next, indent);
1.11 ! schwarze 242: }
! 243:
! 244: static void
! 245: print_span(const struct tbl_span *sp, int indent)
! 246: {
! 247: const struct tbl_dat *dp;
! 248: int i;
! 249:
! 250: for (i = 0; i < indent; i++)
! 251: putchar('\t');
! 252:
! 253: printf("tbl: ");
! 254:
! 255: switch (sp->pos) {
! 256: case (TBL_SPAN_HORIZ):
! 257: putchar('-');
! 258: return;
! 259: case (TBL_SPAN_DHORIZ):
! 260: putchar('=');
! 261: return;
! 262: default:
! 263: break;
! 264: }
! 265:
! 266: for (dp = sp->first; dp; dp = dp->next) {
! 267: switch (dp->pos) {
! 268: case (TBL_DATA_HORIZ):
! 269: /* FALLTHROUGH */
! 270: case (TBL_DATA_NHORIZ):
! 271: putchar('-');
! 272: continue;
! 273: case (TBL_DATA_DHORIZ):
! 274: /* FALLTHROUGH */
! 275: case (TBL_DATA_NDHORIZ):
! 276: putchar('=');
! 277: continue;
! 278: default:
! 279: break;
! 280: }
! 281: printf("[%s%s]", dp->string, dp->layout ? "" : "*");
! 282: if (dp->next)
! 283: putchar(' ');
! 284: }
1.1 kristaps 285: }