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