=================================================================== RCS file: /cvs/mandoc/man_term.c,v retrieving revision 1.214 retrieving revision 1.226 diff -u -p -r1.214 -r1.226 --- mandoc/man_term.c 2018/08/17 20:33:37 1.214 +++ mandoc/man_term.c 2019/01/05 00:36:50 1.226 @@ -1,7 +1,7 @@ -/* $Id: man_term.c,v 1.214 2018/08/17 20:33:37 schwarze Exp $ */ +/* $Id: man_term.c,v 1.226 2019/01/05 00:36:50 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons - * Copyright (c) 2010-2015, 2017, 2018 Ingo Schwarze + * Copyright (c) 2010-2015, 2017-2019 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 @@ -27,7 +27,6 @@ #include #include "mandoc_aux.h" -#include "mandoc.h" #include "roff.h" #include "man.h" #include "out.h" @@ -37,8 +36,6 @@ #define MAXMARGINS 64 /* maximum number of indented scopes */ struct mtermp { - int fl; -#define MANT_LITERAL (1 << 0) int lmargin[MAXMARGINS]; /* margins (incl. vis. page) */ int lmargincur; /* index of current margin */ int lmarginsz; /* actual number of nested margins */ @@ -78,8 +75,10 @@ static int pre_PP(DECL_ARGS); static int pre_RS(DECL_ARGS); static int pre_SH(DECL_ARGS); static int pre_SS(DECL_ARGS); +static int pre_SY(DECL_ARGS); static int pre_TP(DECL_ARGS); static int pre_UR(DECL_ARGS); +static int pre_abort(DECL_ARGS); static int pre_alternate(DECL_ARGS); static int pre_ign(DECL_ARGS); static int pre_in(DECL_ARGS); @@ -90,6 +89,7 @@ static void post_HP(DECL_ARGS); static void post_RS(DECL_ARGS); static void post_SH(DECL_ARGS); static void post_SS(DECL_ARGS); +static void post_SY(DECL_ARGS); static void post_TP(DECL_ARGS); static void post_UR(DECL_ARGS); @@ -99,9 +99,9 @@ static const struct man_term_act man_term_acts[MAN_MAX { pre_SS, post_SS, 0 }, /* SS */ { pre_TP, post_TP, 0 }, /* TP */ { pre_TP, post_TP, 0 }, /* TQ */ - { pre_PP, NULL, 0 }, /* LP */ + { pre_abort, NULL, 0 }, /* LP */ { pre_PP, NULL, 0 }, /* PP */ - { pre_PP, NULL, 0 }, /* P */ + { pre_abort, NULL, 0 }, /* P */ { pre_IP, post_IP, 0 }, /* IP */ { pre_HP, post_HP, 0 }, /* HP */ { NULL, NULL, 0 }, /* SM */ @@ -115,8 +115,6 @@ static const struct man_term_act man_term_acts[MAN_MAX { pre_I, NULL, 0 }, /* I */ { pre_alternate, NULL, 0 }, /* IR */ { pre_alternate, NULL, 0 }, /* RI */ - { pre_literal, NULL, 0 }, /* nf */ - { pre_literal, NULL, 0 }, /* fi */ { NULL, NULL, 0 }, /* RE */ { pre_RS, post_RS, 0 }, /* RS */ { pre_DT, NULL, 0 }, /* DT */ @@ -124,6 +122,8 @@ static const struct man_term_act man_term_acts[MAN_MAX { pre_PD, NULL, MAN_NOTEXT }, /* PD */ { pre_ign, NULL, 0 }, /* AT */ { pre_in, NULL, MAN_NOTEXT }, /* in */ + { pre_SY, post_SY, 0 }, /* SY */ + { NULL, NULL, 0 }, /* YS */ { pre_OP, NULL, 0 }, /* OP */ { pre_literal, NULL, 0 }, /* EX */ { pre_literal, NULL, 0 }, /* EE */ @@ -143,7 +143,7 @@ man_term_act(enum roff_tok tok) } void -terminal_man(void *arg, const struct roff_man *man) +terminal_man(void *arg, const struct roff_meta *man) { struct termp *p; struct roff_node *n; @@ -172,18 +172,17 @@ terminal_man(void *arg, const struct roff_man *man) !strcmp(n->child->child->string, "SYNOPSIS")) { if (n->child->next->child != NULL) print_man_nodelist(p, &mt, - n->child->next->child, - &man->meta); + n->child->next->child, man); term_newln(p); break; } n = n->next; } } else { - term_begin(p, print_man_head, print_man_foot, &man->meta); + term_begin(p, print_man_head, print_man_foot, man); p->flags |= TERMP_NOSPACE; if (n != NULL) - print_man_nodelist(p, &mt, n, &man->meta); + print_man_nodelist(p, &mt, n, man); term_end(p); } p->defindent = save_defindent; @@ -218,6 +217,12 @@ print_bvspace(struct termp *p, const struct roff_node static int +pre_abort(DECL_ARGS) +{ + abort(); +} + +static int pre_ign(DECL_ARGS) { @@ -235,14 +240,8 @@ pre_I(DECL_ARGS) static int pre_literal(DECL_ARGS) { - term_newln(p); - if (n->tok == MAN_nf || n->tok == MAN_EX) - mt->fl |= MANT_LITERAL; - else - mt->fl &= ~MANT_LITERAL; - /* * Unlike .IP and .TP, .HP does not have a HEAD. * So in case a second call to term_flushln() is needed, @@ -255,7 +254,6 @@ pre_literal(DECL_ARGS) p->flags &= ~(TERMP_NOBREAK | TERMP_BRIND); p->flags |= TERMP_NOSPACE; } - return 0; } @@ -280,7 +278,7 @@ pre_alternate(DECL_ARGS) { enum termfont font[2]; struct roff_node *nn; - int savelit, i; + int i; switch (n->tok) { case MAN_RB: @@ -310,14 +308,8 @@ pre_alternate(DECL_ARGS) default: abort(); } - - savelit = MANT_LITERAL & mt->fl; - mt->fl &= ~MANT_LITERAL; - - for (i = 0, nn = n->child; nn; nn = nn->next, i = 1 - i) { + for (i = 0, nn = n->child; nn != NULL; nn = nn->next, i = 1 - i) { term_fontrepl(p, font[i]); - if (savelit && NULL == nn->next) - mt->fl |= MANT_LITERAL; assert(nn->type == ROFFT_TEXT); term_word(p, nn->string); if (nn->flags & NODE_EOS) @@ -325,7 +317,6 @@ pre_alternate(DECL_ARGS) if (nn->next) p->flags |= TERMP_NOSPACE; } - return 0; } @@ -342,7 +333,7 @@ pre_OP(DECL_ARGS) { term_word(p, "["); - p->flags |= TERMP_NOSPACE; + p->flags |= TERMP_KEEP | TERMP_NOSPACE; if (NULL != (n = n->child)) { term_fontrepl(p, TERMFONT_BOLD); @@ -354,6 +345,7 @@ pre_OP(DECL_ARGS) } term_fontrepl(p, TERMFONT_NONE); + p->flags &= ~TERMP_KEEP; p->flags |= TERMP_NOSPACE; term_word(p, "]"); return 0; @@ -427,7 +419,10 @@ pre_HP(DECL_ARGS) return 0; } - if ( ! (MANT_LITERAL & mt->fl)) { + if (n->child == NULL) + return 0; + + if ((n->child->flags & NODE_NOFILL) == 0) { p->flags |= TERMP_NOBREAK | TERMP_BRIND; p->trailspace = 2; } @@ -500,7 +495,7 @@ pre_IP(DECL_ARGS) { struct roffsu su; const struct roff_node *nn; - int len, savelit; + int len; switch (n->type) { case ROFFT_BODY: @@ -534,16 +529,8 @@ pre_IP(DECL_ARGS) case ROFFT_HEAD: p->tcol->offset = mt->offset; p->tcol->rmargin = mt->offset + len; - - savelit = MANT_LITERAL & mt->fl; - mt->fl &= ~MANT_LITERAL; - if (n->child) print_man_node(p, mt, n->child, meta); - - if (savelit) - mt->fl |= MANT_LITERAL; - return 0; case ROFFT_BODY: p->tcol->offset = mt->offset + len; @@ -552,14 +539,12 @@ pre_IP(DECL_ARGS) default: break; } - return 1; } static void post_IP(DECL_ARGS) { - switch (n->type) { case ROFFT_HEAD: term_flushln(p); @@ -581,7 +566,7 @@ pre_TP(DECL_ARGS) { struct roffsu su; struct roff_node *nn; - int len, savelit; + int len; switch (n->type) { case ROFFT_HEAD: @@ -618,9 +603,6 @@ pre_TP(DECL_ARGS) p->tcol->offset = mt->offset; p->tcol->rmargin = mt->offset + len; - savelit = MANT_LITERAL & mt->fl; - mt->fl &= ~MANT_LITERAL; - /* Don't print same-line elements. */ nn = n->child; while (NULL != nn && 0 == (NODE_LINE & nn->flags)) @@ -630,9 +612,6 @@ pre_TP(DECL_ARGS) print_man_node(p, mt, nn, meta); nn = nn->next; } - - if (savelit) - mt->fl |= MANT_LITERAL; return 0; case ROFFT_BODY: p->tcol->offset = mt->offset + len; @@ -643,14 +622,12 @@ pre_TP(DECL_ARGS) default: break; } - return 1; } static void post_TP(DECL_ARGS) { - switch (n->type) { case ROFFT_HEAD: term_flushln(p); @@ -671,7 +648,6 @@ pre_SS(DECL_ARGS) switch (n->type) { case ROFFT_BLOCK: - mt->fl &= ~MANT_LITERAL; mt->lmargin[mt->lmargincur] = term_len(p, p->defindent); mt->offset = term_len(p, p->defindent); @@ -734,7 +710,6 @@ pre_SH(DECL_ARGS) switch (n->type) { case ROFFT_BLOCK: - mt->fl &= ~MANT_LITERAL; mt->lmargin[mt->lmargincur] = term_len(p, p->defindent); mt->offset = term_len(p, p->defindent); @@ -849,6 +824,63 @@ post_RS(DECL_ARGS) } static int +pre_SY(DECL_ARGS) +{ + const struct roff_node *nn; + int len; + + switch (n->type) { + case ROFFT_BLOCK: + if (n->prev == NULL || n->prev->tok != MAN_SY) + print_bvspace(p, n, mt->pardist); + return 1; + case ROFFT_HEAD: + case ROFFT_BODY: + break; + default: + abort(); + } + + nn = n->parent->head->child; + len = nn == NULL ? 1 : term_strlen(p, nn->string) + 1; + + switch (n->type) { + case ROFFT_HEAD: + p->tcol->offset = mt->offset; + p->tcol->rmargin = mt->offset + len; + p->flags |= TERMP_NOBREAK; + term_fontrepl(p, TERMFONT_BOLD); + break; + case ROFFT_BODY: + mt->lmargin[mt->lmargincur] = len; + p->tcol->offset = mt->offset + len; + p->tcol->rmargin = p->maxrmargin; + p->flags |= TERMP_NOSPACE; + break; + default: + abort(); + } + return 1; +} + +static void +post_SY(DECL_ARGS) +{ + switch (n->type) { + case ROFFT_HEAD: + term_flushln(p); + p->flags &= ~TERMP_NOBREAK; + break; + case ROFFT_BODY: + term_newln(p); + p->tcol->offset = mt->offset; + break; + default: + break; + } +} + +static int pre_UR(DECL_ARGS) { @@ -923,7 +955,7 @@ print_man_node(DECL_ARGS) } act = man_term_act(n->tok); - if ((act->flags & MAN_NOTEXT) == 0) + if ((act->flags & MAN_NOTEXT) == 0 && n->tok != MAN_SM) term_fontrepl(p, TERMFONT_NONE); c = 1; @@ -935,7 +967,7 @@ print_man_node(DECL_ARGS) if (act->post != NULL) (*act->post)(p, mt, n, meta); - if ((act->flags & MAN_NOTEXT) == 0) + if ((act->flags & MAN_NOTEXT) == 0 && n->tok != MAN_SM) term_fontrepl(p, TERMFONT_NONE); out: @@ -946,7 +978,7 @@ out: * -man doesn't have nested macros, we don't need to be * more specific than this. */ - if (mt->fl & MANT_LITERAL && + if (n->flags & NODE_NOFILL && ! (p->flags & (TERMP_NOBREAK | TERMP_NONEWLINE)) && (n->next == NULL || n->next->flags & NODE_LINE)) { p->flags |= TERMP_BRNEVER | TERMP_NOSPACE;