Annotation of mandoc/tree.c, Revision 1.8
1.8 ! kristaps 1: /* $Id: mdoctree.c,v 1.8 2009/03/16 23:37:28 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"
25:
1.8 ! kristaps 26: static void tree_body(const struct mdoc_node *, int);
! 27:
! 28:
! 29: int
! 30: tree_run(void *arg, const struct mdoc *mdoc)
! 31: {
! 32:
! 33: tree_body(mdoc_node(mdoc), 0);
! 34: return(1);
! 35: }
1.2 kristaps 36:
1.1 kristaps 37:
38: static void
1.8 ! kristaps 39: tree_body(const struct mdoc_node *n, int indent)
1.1 kristaps 40: {
41: const char *p, *t;
42: int i, j;
43: size_t argc, sz;
44: char **params;
1.8 ! kristaps 45: struct mdoc_argv *argv;
1.1 kristaps 46:
47: argv = NULL;
48: argc = sz = 0;
49: params = NULL;
50:
1.2 kristaps 51: switch (n->type) {
52: case (MDOC_ROOT):
53: t = "root";
54: break;
55: case (MDOC_BLOCK):
56: t = "block";
57: break;
58: case (MDOC_HEAD):
59: t = "block-head";
60: break;
61: case (MDOC_BODY):
62: t = "block-body";
63: break;
64: case (MDOC_TAIL):
65: t = "block-tail";
66: break;
67: case (MDOC_ELEM):
68: t = "elem";
69: break;
70: case (MDOC_TEXT):
71: t = "text";
72: break;
73: default:
74: abort();
75: /* NOTREACHED */
76: }
1.1 kristaps 77:
78: switch (n->type) {
79: case (MDOC_TEXT):
1.8 ! kristaps 80: p = n->string;
1.1 kristaps 81: break;
82: case (MDOC_BODY):
83: p = mdoc_macronames[n->tok];
84: break;
85: case (MDOC_HEAD):
86: p = mdoc_macronames[n->tok];
87: break;
88: case (MDOC_TAIL):
89: p = mdoc_macronames[n->tok];
90: break;
91: case (MDOC_ELEM):
92: p = mdoc_macronames[n->tok];
1.8 ! kristaps 93: if (n->args) {
! 94: argv = n->args->argv;
! 95: argc = n->args->argc;
! 96: }
1.1 kristaps 97: break;
98: case (MDOC_BLOCK):
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_ROOT):
106: p = "root";
107: break;
108: default:
109: abort();
110: /* NOTREACHED */
111: }
112:
113: for (i = 0; i < indent; i++)
1.8 ! kristaps 114: (void)printf(" ");
! 115: (void)printf("%s (%s)", p, t);
1.1 kristaps 116:
117: for (i = 0; i < (int)argc; i++) {
1.8 ! kristaps 118: (void)printf(" -%s", mdoc_argnames[argv[i].arg]);
1.1 kristaps 119: if (argv[i].sz > 0)
1.8 ! kristaps 120: (void)printf(" [");
1.1 kristaps 121: for (j = 0; j < (int)argv[i].sz; j++)
1.8 ! kristaps 122: (void)printf(" [%s]", argv[i].value[j]);
1.1 kristaps 123: if (argv[i].sz > 0)
1.8 ! kristaps 124: (void)printf(" ]");
1.1 kristaps 125: }
126:
127: for (i = 0; i < (int)sz; i++)
1.8 ! kristaps 128: (void)printf(" [%s]", params[i]);
1.1 kristaps 129:
1.8 ! kristaps 130: (void)printf(" %d:%d\n", n->line, n->pos);
1.1 kristaps 131:
132: if (n->child)
1.8 ! kristaps 133: tree_body(n->child, indent + 1);
1.1 kristaps 134: if (n->next)
1.8 ! kristaps 135: tree_body(n->next, indent);
1.1 kristaps 136: }
1.2 kristaps 137:
CVSweb