diff options
author | Ingo Schwarze <schwarze@cvs.openbsd.org> | 2011-07-07 21:10:49 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@cvs.openbsd.org> | 2011-07-07 21:10:49 +0000 |
commit | a80ef3ac507861563c0f841b3ca038b6cf007c65 (patch) | |
tree | c8f70fd4ec6620293ce55ffa1636c20aaf83ed34 /usr.bin | |
parent | aa8f00f72023e768d8aa6923f7678cd709a10702 (diff) |
As .RS may nest and may contain embedded paragraphs,
keep a stack of left margins; this fixes e.g. lynx(1).
While here, clean up some code in .TP HEAD;
it can only have text children, anyway.
From kristaps@.
Diffstat (limited to 'usr.bin')
-rw-r--r-- | usr.bin/mandoc/man_term.c | 64 |
1 files changed, 29 insertions, 35 deletions
diff --git a/usr.bin/mandoc/man_term.c b/usr.bin/mandoc/man_term.c index 77715da9e5c..faff17aa3d2 100644 --- a/usr.bin/mandoc/man_term.c +++ b/usr.bin/mandoc/man_term.c @@ -1,4 +1,4 @@ -/* $Id: man_term.c,v 1.69 2011/07/05 04:12:41 schwarze Exp $ */ +/* $Id: man_term.c,v 1.70 2011/07/07 21:10:48 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2010, 2011 Ingo Schwarze <schwarze@openbsd.org> @@ -29,29 +29,19 @@ #include "term.h" #include "main.h" -#define INDENT 7 -#define HALFINDENT 3 +#define INDENT 7 /* fixed-width char full-indent */ +#define HALFINDENT 3 /* fixed-width char half-indent */ +#define MAXMARGINS 64 /* maximum number of indented scopes */ /* FIXME: have PD set the default vspace width. */ struct mtermp { int fl; #define MANT_LITERAL (1 << 0) - /* - * Default amount to indent the left margin after leading text - * has been printed (e.g., `HP' left-indent, `TP' and `IP' body - * indent). This needs to be saved because `HP' and so on, if - * not having a specified value, must default. - * - * Note that this is the indentation AFTER the left offset, so - * the total offset is usually offset + lmargin. - */ - size_t lmargin; - /* - * The default offset, i.e., the amount between any text and the - * page boundary. - */ - size_t offset; + size_t lmargin[MAXMARGINS]; /* margins (incl. visible page) */ + int lmargincur; /* index of current margin */ + int lmarginsz; /* actual number of nested margins */ + size_t offset; /* default offset to visible page */ }; #define DECL_ARGS struct termp *p, \ @@ -160,8 +150,9 @@ terminal_man(void *arg, const struct man *man) term_begin(p, print_man_head, print_man_foot, m); p->flags |= TERMP_NOSPACE; - mt.fl = 0; - mt.lmargin = term_len(p, INDENT); + memset(&mt, 0, sizeof(struct mtermp)); + + mt.lmargin[mt.lmargincur] = term_len(p, INDENT); mt.offset = term_len(p, INDENT); if (n->child) @@ -452,7 +443,7 @@ pre_HP(DECL_ARGS) return(0); } - len = mt->lmargin; + len = mt->lmargin[mt->lmargincur]; ival = -1; /* Calculate offset. */ @@ -468,7 +459,7 @@ pre_HP(DECL_ARGS) p->rmargin = mt->offset + len; if (ival >= 0) - mt->lmargin = (size_t)ival; + mt->lmargin[mt->lmargincur] = (size_t)ival; return(1); } @@ -503,7 +494,7 @@ pre_PP(DECL_ARGS) switch (n->type) { case (MAN_BLOCK): - mt->lmargin = term_len(p, INDENT); + mt->lmargin[mt->lmargincur] = term_len(p, INDENT); print_bvspace(p, n); break; default: @@ -538,7 +529,7 @@ pre_IP(DECL_ARGS) return(1); } - len = mt->lmargin; + len = mt->lmargin[mt->lmargincur]; ival = -1; /* Calculate the offset from the optional second argument. */ @@ -559,7 +550,7 @@ pre_IP(DECL_ARGS) break; /* Set the saved left-margin. */ - mt->lmargin = (size_t)ival; + mt->lmargin[mt->lmargincur] = (size_t)ival; savelit = MANT_LITERAL & mt->fl; mt->fl &= ~MANT_LITERAL; @@ -627,18 +618,15 @@ pre_TP(DECL_ARGS) return(1); } - len = (size_t)mt->lmargin; + len = (size_t)mt->lmargin[mt->lmargincur]; ival = -1; /* Calculate offset. */ - if (NULL != (nn = n->parent->head->child)) { - while (nn && MAN_TEXT != nn->type) - nn = nn->next; - if (nn && nn->next) + if (NULL != (nn = n->parent->head->child)) + if (nn->parent->line == nn->line) if ((ival = a2width(p, nn->string)) >= 0) len = (size_t)ival; - } switch (n->type) { case (MAN_HEAD): @@ -659,9 +647,8 @@ pre_TP(DECL_ARGS) if (savelit) mt->fl |= MANT_LITERAL; - if (ival >= 0) - mt->lmargin = (size_t)ival; + mt->lmargin[mt->lmargincur] = (size_t)ival; return(0); case (MAN_BODY): @@ -706,7 +693,7 @@ pre_SS(DECL_ARGS) switch (n->type) { case (MAN_BLOCK): mt->fl &= ~MANT_LITERAL; - mt->lmargin = term_len(p, INDENT); + mt->lmargin[mt->lmargincur] = term_len(p, INDENT); mt->offset = term_len(p, INDENT); /* If following a prior empty `SS', no vspace. */ if (n->prev && MAN_SS == n->prev->tok) @@ -757,7 +744,7 @@ pre_SH(DECL_ARGS) switch (n->type) { case (MAN_BLOCK): mt->fl &= ~MANT_LITERAL; - mt->lmargin = term_len(p, INDENT); + mt->lmargin[mt->lmargincur] = term_len(p, INDENT); mt->offset = term_len(p, INDENT); /* If following a prior empty `SH', no vspace. */ if (n->prev && MAN_SH == n->prev->tok) @@ -826,6 +813,10 @@ pre_RS(DECL_ARGS) mt->offset += sz; p->offset = mt->offset; + if (++mt->lmarginsz < MAXMARGINS) + mt->lmargincur = mt->lmarginsz; + + mt->lmargin[mt->lmargincur] = mt->lmargin[mt->lmargincur - 1]; return(1); } @@ -854,6 +845,9 @@ post_RS(DECL_ARGS) mt->offset = mt->offset < sz ? 0 : mt->offset - sz; p->offset = mt->offset; + + if (--mt->lmarginsz < MAXMARGINS) + mt->lmargincur = mt->lmarginsz; } static void |