summaryrefslogtreecommitdiffstats
path: root/man_term.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2011-09-18 21:08:34 +0000
committerIngo Schwarze <schwarze@openbsd.org>2011-09-18 21:08:34 +0000
commitc0cf1cf97e8172e517a1ef4d489d8479b588fe02 (patch)
tree779c87dca4f18405742efb7109a7305637b0e30a /man_term.c
parentacecade904605778778d42abfb4f28b5a57cea55 (diff)
downloadmandoc-c0cf1cf97e8172e517a1ef4d489d8479b588fe02.tar.gz
Support nesting of indented blocks.
This patch was originally written in July 2011 by kristaps@, i promptly committed it to OpenBSD, and then it was forgotten. Now i rediscovered it when merging 1.11.7 to OpenBSD. ok kristaps@ (on his own patch :)
Diffstat (limited to 'man_term.c')
-rw-r--r--man_term.c62
1 files changed, 28 insertions, 34 deletions
diff --git a/man_term.c b/man_term.c
index 8399381b..398271f9 100644
--- a/man_term.c
+++ b/man_term.c
@@ -33,29 +33,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, \
@@ -164,8 +154,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)
@@ -456,7 +447,7 @@ pre_HP(DECL_ARGS)
return(0);
}
- len = mt->lmargin;
+ len = mt->lmargin[mt->lmargincur];
ival = -1;
/* Calculate offset. */
@@ -472,7 +463,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);
}
@@ -507,7 +498,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:
@@ -542,7 +533,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. */
@@ -563,7 +554,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;
@@ -631,18 +622,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):
@@ -663,9 +651,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):
@@ -710,7 +697,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)
@@ -761,7 +748,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)
@@ -830,6 +817,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);
}
@@ -858,6 +849,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