1*7295610fSBaptiste Daroussin /* $Id: tree.c,v 1.84 2019/01/01 05:56:34 schwarze Exp $ */ 261d06d6bSBaptiste Daroussin /* 361d06d6bSBaptiste Daroussin * Copyright (c) 2008, 2009, 2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv> 4*7295610fSBaptiste Daroussin * Copyright (c) 2013-2015, 2017-2019 Ingo Schwarze <schwarze@openbsd.org> 561d06d6bSBaptiste Daroussin * 661d06d6bSBaptiste Daroussin * Permission to use, copy, modify, and distribute this software for any 761d06d6bSBaptiste Daroussin * purpose with or without fee is hereby granted, provided that the above 861d06d6bSBaptiste Daroussin * copyright notice and this permission notice appear in all copies. 961d06d6bSBaptiste Daroussin * 1061d06d6bSBaptiste Daroussin * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES 1161d06d6bSBaptiste Daroussin * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1261d06d6bSBaptiste Daroussin * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR 1361d06d6bSBaptiste Daroussin * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1461d06d6bSBaptiste Daroussin * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1561d06d6bSBaptiste Daroussin * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1661d06d6bSBaptiste Daroussin * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1761d06d6bSBaptiste Daroussin */ 1861d06d6bSBaptiste Daroussin #include "config.h" 1961d06d6bSBaptiste Daroussin 2061d06d6bSBaptiste Daroussin #include <sys/types.h> 2161d06d6bSBaptiste Daroussin 2261d06d6bSBaptiste Daroussin #include <assert.h> 2361d06d6bSBaptiste Daroussin #include <limits.h> 2461d06d6bSBaptiste Daroussin #include <stdio.h> 2561d06d6bSBaptiste Daroussin #include <stdlib.h> 2661d06d6bSBaptiste Daroussin #include <time.h> 2761d06d6bSBaptiste Daroussin 2861d06d6bSBaptiste Daroussin #include "mandoc.h" 2961d06d6bSBaptiste Daroussin #include "roff.h" 3061d06d6bSBaptiste Daroussin #include "mdoc.h" 3161d06d6bSBaptiste Daroussin #include "man.h" 32*7295610fSBaptiste Daroussin #include "tbl.h" 33*7295610fSBaptiste Daroussin #include "eqn.h" 3461d06d6bSBaptiste Daroussin #include "main.h" 3561d06d6bSBaptiste Daroussin 3661d06d6bSBaptiste Daroussin static void print_box(const struct eqn_box *, int); 3761d06d6bSBaptiste Daroussin static void print_man(const struct roff_node *, int); 3861d06d6bSBaptiste Daroussin static void print_meta(const struct roff_meta *); 3961d06d6bSBaptiste Daroussin static void print_mdoc(const struct roff_node *, int); 4061d06d6bSBaptiste Daroussin static void print_span(const struct tbl_span *, int); 4161d06d6bSBaptiste Daroussin 4261d06d6bSBaptiste Daroussin 4361d06d6bSBaptiste Daroussin void 44*7295610fSBaptiste Daroussin tree_mdoc(void *arg, const struct roff_meta *mdoc) 4561d06d6bSBaptiste Daroussin { 46*7295610fSBaptiste Daroussin print_meta(mdoc); 4761d06d6bSBaptiste Daroussin putchar('\n'); 4861d06d6bSBaptiste Daroussin print_mdoc(mdoc->first->child, 0); 4961d06d6bSBaptiste Daroussin } 5061d06d6bSBaptiste Daroussin 5161d06d6bSBaptiste Daroussin void 52*7295610fSBaptiste Daroussin tree_man(void *arg, const struct roff_meta *man) 5361d06d6bSBaptiste Daroussin { 54*7295610fSBaptiste Daroussin print_meta(man); 55*7295610fSBaptiste Daroussin if (man->hasbody == 0) 5661d06d6bSBaptiste Daroussin puts("body = empty"); 5761d06d6bSBaptiste Daroussin putchar('\n'); 5861d06d6bSBaptiste Daroussin print_man(man->first->child, 0); 5961d06d6bSBaptiste Daroussin } 6061d06d6bSBaptiste Daroussin 6161d06d6bSBaptiste Daroussin static void 6261d06d6bSBaptiste Daroussin print_meta(const struct roff_meta *meta) 6361d06d6bSBaptiste Daroussin { 6461d06d6bSBaptiste Daroussin if (meta->title != NULL) 6561d06d6bSBaptiste Daroussin printf("title = \"%s\"\n", meta->title); 6661d06d6bSBaptiste Daroussin if (meta->name != NULL) 6761d06d6bSBaptiste Daroussin printf("name = \"%s\"\n", meta->name); 6861d06d6bSBaptiste Daroussin if (meta->msec != NULL) 6961d06d6bSBaptiste Daroussin printf("sec = \"%s\"\n", meta->msec); 7061d06d6bSBaptiste Daroussin if (meta->vol != NULL) 7161d06d6bSBaptiste Daroussin printf("vol = \"%s\"\n", meta->vol); 7261d06d6bSBaptiste Daroussin if (meta->arch != NULL) 7361d06d6bSBaptiste Daroussin printf("arch = \"%s\"\n", meta->arch); 7461d06d6bSBaptiste Daroussin if (meta->os != NULL) 7561d06d6bSBaptiste Daroussin printf("os = \"%s\"\n", meta->os); 7661d06d6bSBaptiste Daroussin if (meta->date != NULL) 7761d06d6bSBaptiste Daroussin printf("date = \"%s\"\n", meta->date); 7861d06d6bSBaptiste Daroussin } 7961d06d6bSBaptiste Daroussin 8061d06d6bSBaptiste Daroussin static void 8161d06d6bSBaptiste Daroussin print_mdoc(const struct roff_node *n, int indent) 8261d06d6bSBaptiste Daroussin { 8361d06d6bSBaptiste Daroussin const char *p, *t; 8461d06d6bSBaptiste Daroussin int i, j; 8561d06d6bSBaptiste Daroussin size_t argc; 8661d06d6bSBaptiste Daroussin struct mdoc_argv *argv; 8761d06d6bSBaptiste Daroussin 8861d06d6bSBaptiste Daroussin if (n == NULL) 8961d06d6bSBaptiste Daroussin return; 9061d06d6bSBaptiste Daroussin 9161d06d6bSBaptiste Daroussin argv = NULL; 9261d06d6bSBaptiste Daroussin argc = 0; 9361d06d6bSBaptiste Daroussin t = p = NULL; 9461d06d6bSBaptiste Daroussin 9561d06d6bSBaptiste Daroussin switch (n->type) { 9661d06d6bSBaptiste Daroussin case ROFFT_ROOT: 9761d06d6bSBaptiste Daroussin t = "root"; 9861d06d6bSBaptiste Daroussin break; 9961d06d6bSBaptiste Daroussin case ROFFT_BLOCK: 10061d06d6bSBaptiste Daroussin t = "block"; 10161d06d6bSBaptiste Daroussin break; 10261d06d6bSBaptiste Daroussin case ROFFT_HEAD: 10361d06d6bSBaptiste Daroussin t = "head"; 10461d06d6bSBaptiste Daroussin break; 10561d06d6bSBaptiste Daroussin case ROFFT_BODY: 10661d06d6bSBaptiste Daroussin if (n->end) 10761d06d6bSBaptiste Daroussin t = "body-end"; 10861d06d6bSBaptiste Daroussin else 10961d06d6bSBaptiste Daroussin t = "body"; 11061d06d6bSBaptiste Daroussin break; 11161d06d6bSBaptiste Daroussin case ROFFT_TAIL: 11261d06d6bSBaptiste Daroussin t = "tail"; 11361d06d6bSBaptiste Daroussin break; 11461d06d6bSBaptiste Daroussin case ROFFT_ELEM: 11561d06d6bSBaptiste Daroussin t = "elem"; 11661d06d6bSBaptiste Daroussin break; 11761d06d6bSBaptiste Daroussin case ROFFT_TEXT: 11861d06d6bSBaptiste Daroussin t = "text"; 11961d06d6bSBaptiste Daroussin break; 12061d06d6bSBaptiste Daroussin case ROFFT_COMMENT: 12161d06d6bSBaptiste Daroussin t = "comment"; 12261d06d6bSBaptiste Daroussin break; 12361d06d6bSBaptiste Daroussin case ROFFT_TBL: 12461d06d6bSBaptiste Daroussin break; 12561d06d6bSBaptiste Daroussin case ROFFT_EQN: 12661d06d6bSBaptiste Daroussin t = "eqn"; 12761d06d6bSBaptiste Daroussin break; 12861d06d6bSBaptiste Daroussin default: 12961d06d6bSBaptiste Daroussin abort(); 13061d06d6bSBaptiste Daroussin } 13161d06d6bSBaptiste Daroussin 13261d06d6bSBaptiste Daroussin switch (n->type) { 13361d06d6bSBaptiste Daroussin case ROFFT_TEXT: 13461d06d6bSBaptiste Daroussin case ROFFT_COMMENT: 13561d06d6bSBaptiste Daroussin p = n->string; 13661d06d6bSBaptiste Daroussin break; 13761d06d6bSBaptiste Daroussin case ROFFT_BODY: 13861d06d6bSBaptiste Daroussin p = roff_name[n->tok]; 13961d06d6bSBaptiste Daroussin break; 14061d06d6bSBaptiste Daroussin case ROFFT_HEAD: 14161d06d6bSBaptiste Daroussin p = roff_name[n->tok]; 14261d06d6bSBaptiste Daroussin break; 14361d06d6bSBaptiste Daroussin case ROFFT_TAIL: 14461d06d6bSBaptiste Daroussin p = roff_name[n->tok]; 14561d06d6bSBaptiste Daroussin break; 14661d06d6bSBaptiste Daroussin case ROFFT_ELEM: 14761d06d6bSBaptiste Daroussin p = roff_name[n->tok]; 14861d06d6bSBaptiste Daroussin if (n->args) { 14961d06d6bSBaptiste Daroussin argv = n->args->argv; 15061d06d6bSBaptiste Daroussin argc = n->args->argc; 15161d06d6bSBaptiste Daroussin } 15261d06d6bSBaptiste Daroussin break; 15361d06d6bSBaptiste Daroussin case ROFFT_BLOCK: 15461d06d6bSBaptiste Daroussin p = roff_name[n->tok]; 15561d06d6bSBaptiste Daroussin if (n->args) { 15661d06d6bSBaptiste Daroussin argv = n->args->argv; 15761d06d6bSBaptiste Daroussin argc = n->args->argc; 15861d06d6bSBaptiste Daroussin } 15961d06d6bSBaptiste Daroussin break; 16061d06d6bSBaptiste Daroussin case ROFFT_TBL: 16161d06d6bSBaptiste Daroussin break; 16261d06d6bSBaptiste Daroussin case ROFFT_EQN: 16361d06d6bSBaptiste Daroussin p = "EQ"; 16461d06d6bSBaptiste Daroussin break; 16561d06d6bSBaptiste Daroussin case ROFFT_ROOT: 16661d06d6bSBaptiste Daroussin p = "root"; 16761d06d6bSBaptiste Daroussin break; 16861d06d6bSBaptiste Daroussin default: 16961d06d6bSBaptiste Daroussin abort(); 17061d06d6bSBaptiste Daroussin } 17161d06d6bSBaptiste Daroussin 17261d06d6bSBaptiste Daroussin if (n->span) { 17361d06d6bSBaptiste Daroussin assert(NULL == p && NULL == t); 17461d06d6bSBaptiste Daroussin print_span(n->span, indent); 17561d06d6bSBaptiste Daroussin } else { 17661d06d6bSBaptiste Daroussin for (i = 0; i < indent; i++) 17761d06d6bSBaptiste Daroussin putchar(' '); 17861d06d6bSBaptiste Daroussin 17961d06d6bSBaptiste Daroussin printf("%s (%s)", p, t); 18061d06d6bSBaptiste Daroussin 18161d06d6bSBaptiste Daroussin for (i = 0; i < (int)argc; i++) { 18261d06d6bSBaptiste Daroussin printf(" -%s", mdoc_argnames[argv[i].arg]); 18361d06d6bSBaptiste Daroussin if (argv[i].sz > 0) 18461d06d6bSBaptiste Daroussin printf(" ["); 18561d06d6bSBaptiste Daroussin for (j = 0; j < (int)argv[i].sz; j++) 18661d06d6bSBaptiste Daroussin printf(" [%s]", argv[i].value[j]); 18761d06d6bSBaptiste Daroussin if (argv[i].sz > 0) 18861d06d6bSBaptiste Daroussin printf(" ]"); 18961d06d6bSBaptiste Daroussin } 19061d06d6bSBaptiste Daroussin 19161d06d6bSBaptiste Daroussin putchar(' '); 192*7295610fSBaptiste Daroussin if (n->flags & NODE_DELIMO) 19361d06d6bSBaptiste Daroussin putchar('('); 194*7295610fSBaptiste Daroussin if (n->flags & NODE_LINE) 19561d06d6bSBaptiste Daroussin putchar('*'); 19661d06d6bSBaptiste Daroussin printf("%d:%d", n->line, n->pos + 1); 197*7295610fSBaptiste Daroussin if (n->flags & NODE_DELIMC) 19861d06d6bSBaptiste Daroussin putchar(')'); 199*7295610fSBaptiste Daroussin if (n->flags & NODE_EOS) 20061d06d6bSBaptiste Daroussin putchar('.'); 201*7295610fSBaptiste Daroussin if (n->flags & NODE_BROKEN) 20261d06d6bSBaptiste Daroussin printf(" BROKEN"); 203*7295610fSBaptiste Daroussin if (n->flags & NODE_NOFILL) 204*7295610fSBaptiste Daroussin printf(" NOFILL"); 205*7295610fSBaptiste Daroussin if (n->flags & NODE_NOSRC) 20661d06d6bSBaptiste Daroussin printf(" NOSRC"); 207*7295610fSBaptiste Daroussin if (n->flags & NODE_NOPRT) 20861d06d6bSBaptiste Daroussin printf(" NOPRT"); 20961d06d6bSBaptiste Daroussin putchar('\n'); 21061d06d6bSBaptiste Daroussin } 21161d06d6bSBaptiste Daroussin 21261d06d6bSBaptiste Daroussin if (n->eqn) 21361d06d6bSBaptiste Daroussin print_box(n->eqn->first, indent + 4); 21461d06d6bSBaptiste Daroussin if (n->child) 21561d06d6bSBaptiste Daroussin print_mdoc(n->child, indent + 21661d06d6bSBaptiste Daroussin (n->type == ROFFT_BLOCK ? 2 : 4)); 21761d06d6bSBaptiste Daroussin if (n->next) 21861d06d6bSBaptiste Daroussin print_mdoc(n->next, indent); 21961d06d6bSBaptiste Daroussin } 22061d06d6bSBaptiste Daroussin 22161d06d6bSBaptiste Daroussin static void 22261d06d6bSBaptiste Daroussin print_man(const struct roff_node *n, int indent) 22361d06d6bSBaptiste Daroussin { 22461d06d6bSBaptiste Daroussin const char *p, *t; 22561d06d6bSBaptiste Daroussin int i; 22661d06d6bSBaptiste Daroussin 22761d06d6bSBaptiste Daroussin if (n == NULL) 22861d06d6bSBaptiste Daroussin return; 22961d06d6bSBaptiste Daroussin 23061d06d6bSBaptiste Daroussin t = p = NULL; 23161d06d6bSBaptiste Daroussin 23261d06d6bSBaptiste Daroussin switch (n->type) { 23361d06d6bSBaptiste Daroussin case ROFFT_ROOT: 23461d06d6bSBaptiste Daroussin t = "root"; 23561d06d6bSBaptiste Daroussin break; 23661d06d6bSBaptiste Daroussin case ROFFT_ELEM: 23761d06d6bSBaptiste Daroussin t = "elem"; 23861d06d6bSBaptiste Daroussin break; 23961d06d6bSBaptiste Daroussin case ROFFT_TEXT: 24061d06d6bSBaptiste Daroussin t = "text"; 24161d06d6bSBaptiste Daroussin break; 24261d06d6bSBaptiste Daroussin case ROFFT_COMMENT: 24361d06d6bSBaptiste Daroussin t = "comment"; 24461d06d6bSBaptiste Daroussin break; 24561d06d6bSBaptiste Daroussin case ROFFT_BLOCK: 24661d06d6bSBaptiste Daroussin t = "block"; 24761d06d6bSBaptiste Daroussin break; 24861d06d6bSBaptiste Daroussin case ROFFT_HEAD: 24961d06d6bSBaptiste Daroussin t = "head"; 25061d06d6bSBaptiste Daroussin break; 25161d06d6bSBaptiste Daroussin case ROFFT_BODY: 25261d06d6bSBaptiste Daroussin t = "body"; 25361d06d6bSBaptiste Daroussin break; 25461d06d6bSBaptiste Daroussin case ROFFT_TBL: 25561d06d6bSBaptiste Daroussin break; 25661d06d6bSBaptiste Daroussin case ROFFT_EQN: 25761d06d6bSBaptiste Daroussin t = "eqn"; 25861d06d6bSBaptiste Daroussin break; 25961d06d6bSBaptiste Daroussin default: 26061d06d6bSBaptiste Daroussin abort(); 26161d06d6bSBaptiste Daroussin } 26261d06d6bSBaptiste Daroussin 26361d06d6bSBaptiste Daroussin switch (n->type) { 26461d06d6bSBaptiste Daroussin case ROFFT_TEXT: 26561d06d6bSBaptiste Daroussin case ROFFT_COMMENT: 26661d06d6bSBaptiste Daroussin p = n->string; 26761d06d6bSBaptiste Daroussin break; 26861d06d6bSBaptiste Daroussin case ROFFT_ELEM: 26961d06d6bSBaptiste Daroussin case ROFFT_BLOCK: 27061d06d6bSBaptiste Daroussin case ROFFT_HEAD: 27161d06d6bSBaptiste Daroussin case ROFFT_BODY: 27261d06d6bSBaptiste Daroussin p = roff_name[n->tok]; 27361d06d6bSBaptiste Daroussin break; 27461d06d6bSBaptiste Daroussin case ROFFT_ROOT: 27561d06d6bSBaptiste Daroussin p = "root"; 27661d06d6bSBaptiste Daroussin break; 27761d06d6bSBaptiste Daroussin case ROFFT_TBL: 27861d06d6bSBaptiste Daroussin break; 27961d06d6bSBaptiste Daroussin case ROFFT_EQN: 28061d06d6bSBaptiste Daroussin p = "EQ"; 28161d06d6bSBaptiste Daroussin break; 28261d06d6bSBaptiste Daroussin default: 28361d06d6bSBaptiste Daroussin abort(); 28461d06d6bSBaptiste Daroussin } 28561d06d6bSBaptiste Daroussin 28661d06d6bSBaptiste Daroussin if (n->span) { 28761d06d6bSBaptiste Daroussin assert(NULL == p && NULL == t); 28861d06d6bSBaptiste Daroussin print_span(n->span, indent); 28961d06d6bSBaptiste Daroussin } else { 29061d06d6bSBaptiste Daroussin for (i = 0; i < indent; i++) 29161d06d6bSBaptiste Daroussin putchar(' '); 29261d06d6bSBaptiste Daroussin printf("%s (%s) ", p, t); 293*7295610fSBaptiste Daroussin if (n->flags & NODE_LINE) 29461d06d6bSBaptiste Daroussin putchar('*'); 29561d06d6bSBaptiste Daroussin printf("%d:%d", n->line, n->pos + 1); 296*7295610fSBaptiste Daroussin if (n->flags & NODE_DELIMC) 297*7295610fSBaptiste Daroussin putchar(')'); 298*7295610fSBaptiste Daroussin if (n->flags & NODE_EOS) 29961d06d6bSBaptiste Daroussin putchar('.'); 300*7295610fSBaptiste Daroussin if (n->flags & NODE_NOFILL) 301*7295610fSBaptiste Daroussin printf(" NOFILL"); 30261d06d6bSBaptiste Daroussin putchar('\n'); 30361d06d6bSBaptiste Daroussin } 30461d06d6bSBaptiste Daroussin 30561d06d6bSBaptiste Daroussin if (n->eqn) 30661d06d6bSBaptiste Daroussin print_box(n->eqn->first, indent + 4); 30761d06d6bSBaptiste Daroussin if (n->child) 30861d06d6bSBaptiste Daroussin print_man(n->child, indent + 30961d06d6bSBaptiste Daroussin (n->type == ROFFT_BLOCK ? 2 : 4)); 31061d06d6bSBaptiste Daroussin if (n->next) 31161d06d6bSBaptiste Daroussin print_man(n->next, indent); 31261d06d6bSBaptiste Daroussin } 31361d06d6bSBaptiste Daroussin 31461d06d6bSBaptiste Daroussin static void 31561d06d6bSBaptiste Daroussin print_box(const struct eqn_box *ep, int indent) 31661d06d6bSBaptiste Daroussin { 31761d06d6bSBaptiste Daroussin int i; 31861d06d6bSBaptiste Daroussin const char *t; 31961d06d6bSBaptiste Daroussin 32061d06d6bSBaptiste Daroussin static const char *posnames[] = { 32161d06d6bSBaptiste Daroussin NULL, "sup", "subsup", "sub", 32261d06d6bSBaptiste Daroussin "to", "from", "fromto", 32361d06d6bSBaptiste Daroussin "over", "sqrt", NULL }; 32461d06d6bSBaptiste Daroussin 32561d06d6bSBaptiste Daroussin if (NULL == ep) 32661d06d6bSBaptiste Daroussin return; 32761d06d6bSBaptiste Daroussin for (i = 0; i < indent; i++) 32861d06d6bSBaptiste Daroussin putchar(' '); 32961d06d6bSBaptiste Daroussin 33061d06d6bSBaptiste Daroussin t = NULL; 33161d06d6bSBaptiste Daroussin switch (ep->type) { 33261d06d6bSBaptiste Daroussin case EQN_LIST: 33361d06d6bSBaptiste Daroussin t = "eqn-list"; 33461d06d6bSBaptiste Daroussin break; 33561d06d6bSBaptiste Daroussin case EQN_SUBEXPR: 33661d06d6bSBaptiste Daroussin t = "eqn-expr"; 33761d06d6bSBaptiste Daroussin break; 33861d06d6bSBaptiste Daroussin case EQN_TEXT: 33961d06d6bSBaptiste Daroussin t = "eqn-text"; 34061d06d6bSBaptiste Daroussin break; 34161d06d6bSBaptiste Daroussin case EQN_PILE: 34261d06d6bSBaptiste Daroussin t = "eqn-pile"; 34361d06d6bSBaptiste Daroussin break; 34461d06d6bSBaptiste Daroussin case EQN_MATRIX: 34561d06d6bSBaptiste Daroussin t = "eqn-matrix"; 34661d06d6bSBaptiste Daroussin break; 34761d06d6bSBaptiste Daroussin } 34861d06d6bSBaptiste Daroussin 34961d06d6bSBaptiste Daroussin fputs(t, stdout); 35061d06d6bSBaptiste Daroussin if (ep->pos) 35161d06d6bSBaptiste Daroussin printf(" pos=%s", posnames[ep->pos]); 35261d06d6bSBaptiste Daroussin if (ep->left) 35361d06d6bSBaptiste Daroussin printf(" left=\"%s\"", ep->left); 35461d06d6bSBaptiste Daroussin if (ep->right) 35561d06d6bSBaptiste Daroussin printf(" right=\"%s\"", ep->right); 35661d06d6bSBaptiste Daroussin if (ep->top) 35761d06d6bSBaptiste Daroussin printf(" top=\"%s\"", ep->top); 35861d06d6bSBaptiste Daroussin if (ep->bottom) 35961d06d6bSBaptiste Daroussin printf(" bottom=\"%s\"", ep->bottom); 36061d06d6bSBaptiste Daroussin if (ep->text) 36161d06d6bSBaptiste Daroussin printf(" text=\"%s\"", ep->text); 36261d06d6bSBaptiste Daroussin if (ep->font) 36361d06d6bSBaptiste Daroussin printf(" font=%d", ep->font); 36461d06d6bSBaptiste Daroussin if (ep->size != EQN_DEFSIZE) 36561d06d6bSBaptiste Daroussin printf(" size=%d", ep->size); 36661d06d6bSBaptiste Daroussin if (ep->expectargs != UINT_MAX && ep->expectargs != ep->args) 36761d06d6bSBaptiste Daroussin printf(" badargs=%zu(%zu)", ep->args, ep->expectargs); 36861d06d6bSBaptiste Daroussin else if (ep->args) 36961d06d6bSBaptiste Daroussin printf(" args=%zu", ep->args); 37061d06d6bSBaptiste Daroussin putchar('\n'); 37161d06d6bSBaptiste Daroussin 37261d06d6bSBaptiste Daroussin print_box(ep->first, indent + 4); 37361d06d6bSBaptiste Daroussin print_box(ep->next, indent); 37461d06d6bSBaptiste Daroussin } 37561d06d6bSBaptiste Daroussin 37661d06d6bSBaptiste Daroussin static void 37761d06d6bSBaptiste Daroussin print_span(const struct tbl_span *sp, int indent) 37861d06d6bSBaptiste Daroussin { 37961d06d6bSBaptiste Daroussin const struct tbl_dat *dp; 38061d06d6bSBaptiste Daroussin int i; 38161d06d6bSBaptiste Daroussin 38261d06d6bSBaptiste Daroussin for (i = 0; i < indent; i++) 38361d06d6bSBaptiste Daroussin putchar(' '); 38461d06d6bSBaptiste Daroussin 38561d06d6bSBaptiste Daroussin switch (sp->pos) { 38661d06d6bSBaptiste Daroussin case TBL_SPAN_HORIZ: 38761d06d6bSBaptiste Daroussin putchar('-'); 388*7295610fSBaptiste Daroussin putchar(' '); 389*7295610fSBaptiste Daroussin break; 39061d06d6bSBaptiste Daroussin case TBL_SPAN_DHORIZ: 39161d06d6bSBaptiste Daroussin putchar('='); 392*7295610fSBaptiste Daroussin putchar(' '); 39361d06d6bSBaptiste Daroussin break; 394*7295610fSBaptiste Daroussin default: 39561d06d6bSBaptiste Daroussin for (dp = sp->first; dp; dp = dp->next) { 39661d06d6bSBaptiste Daroussin switch (dp->pos) { 39761d06d6bSBaptiste Daroussin case TBL_DATA_HORIZ: 39861d06d6bSBaptiste Daroussin case TBL_DATA_NHORIZ: 39961d06d6bSBaptiste Daroussin putchar('-'); 400*7295610fSBaptiste Daroussin putchar(' '); 40161d06d6bSBaptiste Daroussin continue; 40261d06d6bSBaptiste Daroussin case TBL_DATA_DHORIZ: 40361d06d6bSBaptiste Daroussin case TBL_DATA_NDHORIZ: 40461d06d6bSBaptiste Daroussin putchar('='); 405*7295610fSBaptiste Daroussin putchar(' '); 40661d06d6bSBaptiste Daroussin continue; 40761d06d6bSBaptiste Daroussin default: 40861d06d6bSBaptiste Daroussin break; 40961d06d6bSBaptiste Daroussin } 41061d06d6bSBaptiste Daroussin printf("[\"%s\"", dp->string ? dp->string : ""); 411*7295610fSBaptiste Daroussin if (dp->hspans) 412*7295610fSBaptiste Daroussin printf(">%d", dp->hspans); 413*7295610fSBaptiste Daroussin if (dp->vspans) 414*7295610fSBaptiste Daroussin printf("v%d", dp->vspans); 415*7295610fSBaptiste Daroussin if (dp->layout == NULL) 41661d06d6bSBaptiste Daroussin putchar('*'); 417*7295610fSBaptiste Daroussin else if (dp->layout->pos == TBL_CELL_DOWN) 418*7295610fSBaptiste Daroussin putchar('^'); 41961d06d6bSBaptiste Daroussin putchar(']'); 42061d06d6bSBaptiste Daroussin putchar(' '); 42161d06d6bSBaptiste Daroussin } 422*7295610fSBaptiste Daroussin break; 423*7295610fSBaptiste Daroussin } 42461d06d6bSBaptiste Daroussin printf("(tbl) %d:1\n", sp->line); 42561d06d6bSBaptiste Daroussin } 426