1241675Suqs/* $Id: tree.c,v 1.47 2011/09/18 14:14:15 schwarze Exp $ */ 2241675Suqs/* 3241675Suqs * Copyright (c) 2008, 2009, 2011 Kristaps Dzonsons <kristaps@bsd.lv> 4241675Suqs * 5241675Suqs * Permission to use, copy, modify, and distribute this software for any 6241675Suqs * purpose with or without fee is hereby granted, provided that the above 7241675Suqs * copyright notice and this permission notice appear in all copies. 8241675Suqs * 9241675Suqs * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10241675Suqs * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11241675Suqs * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12241675Suqs * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13241675Suqs * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14241675Suqs * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15241675Suqs * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16241675Suqs */ 17241675Suqs#ifdef HAVE_CONFIG_H 18241675Suqs#include "config.h" 19241675Suqs#endif 20241675Suqs 21241675Suqs#include <assert.h> 22241675Suqs#include <limits.h> 23241675Suqs#include <stdio.h> 24241675Suqs#include <stdlib.h> 25241675Suqs#include <time.h> 26241675Suqs 27241675Suqs#include "mandoc.h" 28241675Suqs#include "mdoc.h" 29241675Suqs#include "man.h" 30241675Suqs#include "main.h" 31241675Suqs 32241675Suqsstatic void print_box(const struct eqn_box *, int); 33241675Suqsstatic void print_man(const struct man_node *, int); 34241675Suqsstatic void print_mdoc(const struct mdoc_node *, int); 35241675Suqsstatic void print_span(const struct tbl_span *, int); 36241675Suqs 37241675Suqs 38241675Suqs/* ARGSUSED */ 39241675Suqsvoid 40241675Suqstree_mdoc(void *arg, const struct mdoc *mdoc) 41241675Suqs{ 42241675Suqs 43241675Suqs print_mdoc(mdoc_node(mdoc), 0); 44241675Suqs} 45241675Suqs 46241675Suqs 47241675Suqs/* ARGSUSED */ 48241675Suqsvoid 49241675Suqstree_man(void *arg, const struct man *man) 50241675Suqs{ 51241675Suqs 52241675Suqs print_man(man_node(man), 0); 53241675Suqs} 54241675Suqs 55241675Suqs 56241675Suqsstatic void 57241675Suqsprint_mdoc(const struct mdoc_node *n, int indent) 58241675Suqs{ 59241675Suqs const char *p, *t; 60241675Suqs int i, j; 61241675Suqs size_t argc, sz; 62241675Suqs char **params; 63241675Suqs struct mdoc_argv *argv; 64241675Suqs 65241675Suqs argv = NULL; 66241675Suqs argc = sz = 0; 67241675Suqs params = NULL; 68241675Suqs t = p = NULL; 69241675Suqs 70241675Suqs switch (n->type) { 71241675Suqs case (MDOC_ROOT): 72241675Suqs t = "root"; 73241675Suqs break; 74241675Suqs case (MDOC_BLOCK): 75241675Suqs t = "block"; 76241675Suqs break; 77241675Suqs case (MDOC_HEAD): 78241675Suqs t = "block-head"; 79241675Suqs break; 80241675Suqs case (MDOC_BODY): 81241675Suqs if (n->end) 82241675Suqs t = "body-end"; 83241675Suqs else 84241675Suqs t = "block-body"; 85241675Suqs break; 86241675Suqs case (MDOC_TAIL): 87241675Suqs t = "block-tail"; 88241675Suqs break; 89241675Suqs case (MDOC_ELEM): 90241675Suqs t = "elem"; 91241675Suqs break; 92241675Suqs case (MDOC_TEXT): 93241675Suqs t = "text"; 94241675Suqs break; 95241675Suqs case (MDOC_TBL): 96241675Suqs /* FALLTHROUGH */ 97241675Suqs case (MDOC_EQN): 98241675Suqs break; 99241675Suqs default: 100241675Suqs abort(); 101241675Suqs /* NOTREACHED */ 102241675Suqs } 103241675Suqs 104241675Suqs switch (n->type) { 105241675Suqs case (MDOC_TEXT): 106241675Suqs p = n->string; 107241675Suqs break; 108241675Suqs case (MDOC_BODY): 109241675Suqs p = mdoc_macronames[n->tok]; 110241675Suqs break; 111241675Suqs case (MDOC_HEAD): 112241675Suqs p = mdoc_macronames[n->tok]; 113241675Suqs break; 114241675Suqs case (MDOC_TAIL): 115241675Suqs p = mdoc_macronames[n->tok]; 116241675Suqs break; 117241675Suqs case (MDOC_ELEM): 118241675Suqs p = mdoc_macronames[n->tok]; 119241675Suqs if (n->args) { 120241675Suqs argv = n->args->argv; 121241675Suqs argc = n->args->argc; 122241675Suqs } 123241675Suqs break; 124241675Suqs case (MDOC_BLOCK): 125241675Suqs p = mdoc_macronames[n->tok]; 126241675Suqs if (n->args) { 127241675Suqs argv = n->args->argv; 128241675Suqs argc = n->args->argc; 129241675Suqs } 130241675Suqs break; 131241675Suqs case (MDOC_TBL): 132241675Suqs /* FALLTHROUGH */ 133241675Suqs case (MDOC_EQN): 134241675Suqs break; 135241675Suqs case (MDOC_ROOT): 136241675Suqs p = "root"; 137241675Suqs break; 138241675Suqs default: 139241675Suqs abort(); 140241675Suqs /* NOTREACHED */ 141241675Suqs } 142241675Suqs 143241675Suqs if (n->span) { 144241675Suqs assert(NULL == p && NULL == t); 145241675Suqs print_span(n->span, indent); 146241675Suqs } else if (n->eqn) { 147241675Suqs assert(NULL == p && NULL == t); 148241675Suqs print_box(n->eqn->root, indent); 149241675Suqs } else { 150241675Suqs for (i = 0; i < indent; i++) 151241675Suqs putchar('\t'); 152241675Suqs 153241675Suqs printf("%s (%s)", p, t); 154241675Suqs 155241675Suqs for (i = 0; i < (int)argc; i++) { 156241675Suqs printf(" -%s", mdoc_argnames[argv[i].arg]); 157241675Suqs if (argv[i].sz > 0) 158241675Suqs printf(" ["); 159241675Suqs for (j = 0; j < (int)argv[i].sz; j++) 160241675Suqs printf(" [%s]", argv[i].value[j]); 161241675Suqs if (argv[i].sz > 0) 162241675Suqs printf(" ]"); 163241675Suqs } 164241675Suqs 165241675Suqs for (i = 0; i < (int)sz; i++) 166241675Suqs printf(" [%s]", params[i]); 167241675Suqs 168241675Suqs printf(" %d:%d\n", n->line, n->pos); 169241675Suqs } 170241675Suqs 171241675Suqs if (n->child) 172241675Suqs print_mdoc(n->child, indent + 1); 173241675Suqs if (n->next) 174241675Suqs print_mdoc(n->next, indent); 175241675Suqs} 176241675Suqs 177241675Suqs 178241675Suqsstatic void 179241675Suqsprint_man(const struct man_node *n, int indent) 180241675Suqs{ 181241675Suqs const char *p, *t; 182241675Suqs int i; 183241675Suqs 184241675Suqs t = p = NULL; 185241675Suqs 186241675Suqs switch (n->type) { 187241675Suqs case (MAN_ROOT): 188241675Suqs t = "root"; 189241675Suqs break; 190241675Suqs case (MAN_ELEM): 191241675Suqs t = "elem"; 192241675Suqs break; 193241675Suqs case (MAN_TEXT): 194241675Suqs t = "text"; 195241675Suqs break; 196241675Suqs case (MAN_BLOCK): 197241675Suqs t = "block"; 198241675Suqs break; 199241675Suqs case (MAN_HEAD): 200241675Suqs t = "block-head"; 201241675Suqs break; 202241675Suqs case (MAN_BODY): 203241675Suqs t = "block-body"; 204241675Suqs break; 205241675Suqs case (MAN_TAIL): 206241675Suqs t = "block-tail"; 207241675Suqs break; 208241675Suqs case (MAN_TBL): 209241675Suqs /* FALLTHROUGH */ 210241675Suqs case (MAN_EQN): 211241675Suqs break; 212241675Suqs default: 213241675Suqs abort(); 214241675Suqs /* NOTREACHED */ 215241675Suqs } 216241675Suqs 217241675Suqs switch (n->type) { 218241675Suqs case (MAN_TEXT): 219241675Suqs p = n->string; 220241675Suqs break; 221241675Suqs case (MAN_ELEM): 222241675Suqs /* FALLTHROUGH */ 223241675Suqs case (MAN_BLOCK): 224241675Suqs /* FALLTHROUGH */ 225241675Suqs case (MAN_HEAD): 226241675Suqs /* FALLTHROUGH */ 227241675Suqs case (MAN_TAIL): 228241675Suqs /* FALLTHROUGH */ 229241675Suqs case (MAN_BODY): 230241675Suqs p = man_macronames[n->tok]; 231241675Suqs break; 232241675Suqs case (MAN_ROOT): 233241675Suqs p = "root"; 234241675Suqs break; 235241675Suqs case (MAN_TBL): 236241675Suqs /* FALLTHROUGH */ 237241675Suqs case (MAN_EQN): 238241675Suqs break; 239241675Suqs default: 240241675Suqs abort(); 241241675Suqs /* NOTREACHED */ 242241675Suqs } 243241675Suqs 244241675Suqs if (n->span) { 245241675Suqs assert(NULL == p && NULL == t); 246241675Suqs print_span(n->span, indent); 247241675Suqs } else if (n->eqn) { 248241675Suqs assert(NULL == p && NULL == t); 249241675Suqs print_box(n->eqn->root, indent); 250241675Suqs } else { 251241675Suqs for (i = 0; i < indent; i++) 252241675Suqs putchar('\t'); 253241675Suqs printf("%s (%s) %d:%d\n", p, t, n->line, n->pos); 254241675Suqs } 255241675Suqs 256241675Suqs if (n->child) 257241675Suqs print_man(n->child, indent + 1); 258241675Suqs if (n->next) 259241675Suqs print_man(n->next, indent); 260241675Suqs} 261241675Suqs 262241675Suqsstatic void 263241675Suqsprint_box(const struct eqn_box *ep, int indent) 264241675Suqs{ 265241675Suqs int i; 266241675Suqs const char *t; 267241675Suqs 268241675Suqs if (NULL == ep) 269241675Suqs return; 270241675Suqs for (i = 0; i < indent; i++) 271241675Suqs putchar('\t'); 272241675Suqs 273241675Suqs t = NULL; 274241675Suqs switch (ep->type) { 275241675Suqs case (EQN_ROOT): 276241675Suqs t = "eqn-root"; 277241675Suqs break; 278241675Suqs case (EQN_LIST): 279241675Suqs t = "eqn-list"; 280241675Suqs break; 281241675Suqs case (EQN_SUBEXPR): 282241675Suqs t = "eqn-expr"; 283241675Suqs break; 284241675Suqs case (EQN_TEXT): 285241675Suqs t = "eqn-text"; 286241675Suqs break; 287241675Suqs case (EQN_MATRIX): 288241675Suqs t = "eqn-matrix"; 289241675Suqs break; 290241675Suqs } 291241675Suqs 292241675Suqs assert(t); 293241675Suqs printf("%s(%d, %d, %d, %d, %d, \"%s\", \"%s\") %s\n", 294241675Suqs t, EQN_DEFSIZE == ep->size ? 0 : ep->size, 295241675Suqs ep->pos, ep->font, ep->mark, ep->pile, 296241675Suqs ep->left ? ep->left : "", 297241675Suqs ep->right ? ep->right : "", 298241675Suqs ep->text ? ep->text : ""); 299241675Suqs 300241675Suqs print_box(ep->first, indent + 1); 301241675Suqs print_box(ep->next, indent); 302241675Suqs} 303241675Suqs 304241675Suqsstatic void 305241675Suqsprint_span(const struct tbl_span *sp, int indent) 306241675Suqs{ 307241675Suqs const struct tbl_dat *dp; 308241675Suqs int i; 309241675Suqs 310241675Suqs for (i = 0; i < indent; i++) 311241675Suqs putchar('\t'); 312241675Suqs 313241675Suqs switch (sp->pos) { 314241675Suqs case (TBL_SPAN_HORIZ): 315241675Suqs putchar('-'); 316241675Suqs return; 317241675Suqs case (TBL_SPAN_DHORIZ): 318241675Suqs putchar('='); 319241675Suqs return; 320241675Suqs default: 321241675Suqs break; 322241675Suqs } 323241675Suqs 324241675Suqs for (dp = sp->first; dp; dp = dp->next) { 325241675Suqs switch (dp->pos) { 326241675Suqs case (TBL_DATA_HORIZ): 327241675Suqs /* FALLTHROUGH */ 328241675Suqs case (TBL_DATA_NHORIZ): 329241675Suqs putchar('-'); 330241675Suqs continue; 331241675Suqs case (TBL_DATA_DHORIZ): 332241675Suqs /* FALLTHROUGH */ 333241675Suqs case (TBL_DATA_NDHORIZ): 334241675Suqs putchar('='); 335241675Suqs continue; 336241675Suqs default: 337241675Suqs break; 338241675Suqs } 339241675Suqs printf("[\"%s\"", dp->string ? dp->string : ""); 340241675Suqs if (dp->spans) 341241675Suqs printf("(%d)", dp->spans); 342241675Suqs if (NULL == dp->layout) 343241675Suqs putchar('*'); 344241675Suqs putchar(']'); 345241675Suqs putchar(' '); 346241675Suqs } 347241675Suqs 348241675Suqs printf("(tbl) %d:1\n", sp->line); 349241675Suqs} 350