=================================================================== RCS file: /cvs/mandoc/tree.c,v retrieving revision 1.88 retrieving revision 1.92 diff -u -p -r1.88 -r1.92 --- mandoc/tree.c 2020/04/07 22:56:02 1.88 +++ mandoc/tree.c 2022/01/12 04:54:05 1.92 @@ -1,7 +1,7 @@ -/* $Id: tree.c,v 1.88 2020/04/07 22:56:02 schwarze Exp $ */ +/* $Id: tree.c,v 1.92 2022/01/12 04:54:05 schwarze Exp $ */ /* - * Copyright (c) 2013-2015, 2017-2020 Ingo Schwarze * Copyright (c) 2008, 2009, 2011, 2014 Kristaps Dzonsons + * Copyright (c) 2013-2015, 2017-2022 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -36,6 +36,7 @@ #include "eqn.h" #include "main.h" +static void print_attr(const struct roff_node *); static void print_box(const struct eqn_box *, int); static void print_cellt(enum tbl_cellt); static void print_man(const struct roff_node *, int); @@ -191,38 +192,8 @@ print_mdoc(const struct roff_node *n, int indent) if (argv[i].sz > 0) printf(" ]"); } - - putchar(' '); - if (n->flags & NODE_DELIMO) - putchar('('); - if (n->flags & NODE_LINE) - putchar('*'); - printf("%d:%d", n->line, n->pos + 1); - if (n->flags & NODE_DELIMC) - putchar(')'); - if (n->flags & NODE_EOS) - putchar('.'); - if (n->flags & NODE_ID) { - printf(" ID"); - if (n->string != NULL) - printf("=%s", n->string); - } - if (n->flags & NODE_HREF) { - printf(" HREF"); - if (n->string != NULL && (n->flags & NODE_ID) == 0) - printf("=%s", n->string); - } - if (n->flags & NODE_BROKEN) - printf(" BROKEN"); - if (n->flags & NODE_NOFILL) - printf(" NOFILL"); - if (n->flags & NODE_NOSRC) - printf(" NOSRC"); - if (n->flags & NODE_NOPRT) - printf(" NOPRT"); - putchar('\n'); + print_attr(n); } - if (n->eqn) print_box(n->eqn->first, indent + 4); if (n->child) @@ -303,24 +274,9 @@ print_man(const struct roff_node *n, int indent) } else { for (i = 0; i < indent; i++) putchar(' '); - printf("%s (%s) ", p, t); - if (n->flags & NODE_LINE) - putchar('*'); - printf("%d:%d", n->line, n->pos + 1); - if (n->flags & NODE_DELIMC) - putchar(')'); - if (n->flags & NODE_EOS) - putchar('.'); - if (n->flags & NODE_ID) { - printf(" ID"); - if (n->string != NULL) - printf("=%s", n->string); - } - if (n->flags & NODE_NOFILL) - printf(" NOFILL"); - putchar('\n'); + printf("%s (%s)", p, t); + print_attr(n); } - if (n->eqn) print_box(n->eqn->first, indent + 4); if (n->child) @@ -331,6 +287,40 @@ print_man(const struct roff_node *n, int indent) } static void +print_attr(const struct roff_node *n) +{ + putchar(' '); + if (n->flags & NODE_DELIMO) + putchar('('); + if (n->flags & NODE_LINE) + putchar('*'); + printf("%d:%d", n->line, n->pos + 1); + if (n->flags & NODE_DELIMC) + putchar(')'); + if (n->flags & NODE_EOS) + putchar('.'); + if (n->flags & NODE_ID) { + printf(" ID"); + if (n->flags & NODE_HREF) + printf("=HREF"); + } else if (n->flags & NODE_HREF) + printf(" HREF"); + else if (n->tag != NULL) + printf(" STRAYTAG"); + if (n->tag != NULL) + printf("=%s", n->tag); + if (n->flags & NODE_BROKEN) + printf(" BROKEN"); + if (n->flags & NODE_NOFILL) + printf(" NOFILL"); + if (n->flags & NODE_NOSRC) + printf(" NOSRC"); + if (n->flags & NODE_NOPRT) + printf(" NOPRT"); + putchar('\n'); +} + +static void print_box(const struct eqn_box *ep, int indent) { int i; @@ -481,10 +471,30 @@ print_span(const struct tbl_span *sp, int indent) else { printf("%d", cp->col); print_cellt(dp->layout->pos); - if (cp->flags & TBL_CELL_BOLD) + switch (cp->font) { + case ESCAPE_FONTROMAN: + break; + case ESCAPE_FONTBOLD: putchar('b'); - if (cp->flags & TBL_CELL_ITALIC) + break; + case ESCAPE_FONTITALIC: putchar('i'); + break; + case ESCAPE_FONTBI: + fputs("bi", stdout); + break; + case ESCAPE_FONTCR: + putchar('c'); + break; + case ESCAPE_FONTCB: + fputs("cb", stdout); + break; + case ESCAPE_FONTCI: + fputs("ci", stdout); + break; + default: + abort(); + } if (cp->flags & TBL_CELL_TALIGN) putchar('t'); if (cp->flags & TBL_CELL_UP) @@ -499,12 +509,16 @@ print_span(const struct tbl_span *sp, int indent) putchar('x'); } switch (dp->pos) { - case TBL_DATA_HORIZ: case TBL_DATA_NHORIZ: - putchar('-'); + putchar('\\'); + /* FALLTHROUGH */ + case TBL_DATA_HORIZ: + putchar('_'); break; - case TBL_DATA_DHORIZ: case TBL_DATA_NDHORIZ: + putchar('\\'); + /* FALLTHROUGH */ + case TBL_DATA_DHORIZ: putchar('='); break; default: