summaryrefslogtreecommitdiffstats
path: root/man_term.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2009-08-19 11:30:40 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2009-08-19 11:30:40 +0000
commita7d939f1559a215346a02772817702f1fd397a31 (patch)
treeff37cf1f4086bb1cbab8b89729e320ae380e09fe /man_term.c
parentaade897081e194716754b33820106010e2b0ad04 (diff)
downloadmandoc-a7d939f1559a215346a02772817702f1fd397a31.tar.gz
`RS' blocks correctly formatting in output device.
Diffstat (limited to 'man_term.c')
-rw-r--r--man_term.c107
1 files changed, 88 insertions, 19 deletions
diff --git a/man_term.c b/man_term.c
index a8aa907f..cc636e03 100644
--- a/man_term.c
+++ b/man_term.c
@@ -30,7 +30,21 @@
struct mtermp {
int fl;
#define MANT_LITERAL (1 << 0)
- int lmargin;
+ /*
+ * 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;
};
#define DECL_ARGS struct termp *p, \
@@ -54,6 +68,7 @@ static int pre_IR(DECL_ARGS);
static int pre_PP(DECL_ARGS);
static int pre_RB(DECL_ARGS);
static int pre_RI(DECL_ARGS);
+static int pre_RS(DECL_ARGS);
static int pre_SH(DECL_ARGS);
static int pre_SS(DECL_ARGS);
static int pre_TP(DECL_ARGS);
@@ -67,6 +82,7 @@ static void post_B(DECL_ARGS);
static void post_I(DECL_ARGS);
static void post_IP(DECL_ARGS);
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_TP(DECL_ARGS);
@@ -101,7 +117,7 @@ static const struct termact termacts[MAN_MAX] = {
{ pre_fi, NULL }, /* fi */
{ pre_r, NULL }, /* r */
{ NULL, NULL }, /* RE */
- { NULL, NULL }, /* RS */
+ { pre_RS, post_RS }, /* RS */
};
#ifdef __linux__
@@ -132,6 +148,7 @@ man_run(struct termp *p, const struct man *m)
mt.fl = 0;
mt.lmargin = INDENT;
+ mt.offset = INDENT;
if (man_node(m)->child)
print_body(p, &mt, man_node(m)->child, man_meta(m));
@@ -433,7 +450,7 @@ pre_HP(DECL_ARGS)
return(0);
}
- len = (size_t)mt->lmargin;
+ len = mt->lmargin;
ival = -1;
/* Calculate offset. */
@@ -445,11 +462,11 @@ pre_HP(DECL_ARGS)
if (0 == len)
len = 1;
- p->offset = INDENT;
- p->rmargin = INDENT + len;
+ p->offset = mt->offset;
+ p->rmargin = mt->offset + len;
if (ival >= 0)
- mt->lmargin = ival;
+ mt->lmargin = (size_t)ival;
return(1);
}
@@ -468,7 +485,7 @@ post_HP(DECL_ARGS)
term_flushln(p);
p->flags &= ~TERMP_NOBREAK;
p->flags &= ~TERMP_TWOSPACE;
- p->offset = INDENT;
+ p->offset = mt->offset;
p->rmargin = p->maxrmargin;
break;
default:
@@ -488,7 +505,7 @@ pre_PP(DECL_ARGS)
fmt_block_vspace(p, n);
break;
default:
- p->offset = INDENT;
+ p->offset = mt->offset;
break;
}
@@ -520,7 +537,7 @@ pre_IP(DECL_ARGS)
return(1);
}
- len = (size_t)mt->lmargin;
+ len = mt->lmargin;
ival = -1;
/* Calculate offset. */
@@ -539,20 +556,20 @@ pre_IP(DECL_ARGS)
if (0 == len)
len = 1;
- p->offset = INDENT;
- p->rmargin = INDENT + len;
+ p->offset = mt->offset;
+ p->rmargin = mt->offset + len;
if (ival < 0)
break;
/* Set the saved left-margin. */
- mt->lmargin = ival;
+ mt->lmargin = (size_t)ival;
/* Don't print the length value. */
for (nn = n->child; nn->next; nn = nn->next)
print_node(p, mt, nn, m);
return(0);
case (MAN_BODY):
- p->offset = INDENT + len;
+ p->offset = mt->offset + len;
p->rmargin = p->maxrmargin;
break;
default:
@@ -625,8 +642,8 @@ pre_TP(DECL_ARGS)
if (0 == len)
len = 1;
- p->offset = INDENT;
- p->rmargin = INDENT + len;
+ p->offset = mt->offset;
+ p->rmargin = mt->offset + len;
/* Don't print same-line elements. */
for (nn = n->child; nn; nn = nn->next)
@@ -634,11 +651,11 @@ pre_TP(DECL_ARGS)
print_node(p, mt, nn, m);
if (ival >= 0)
- mt->lmargin = ival;
+ mt->lmargin = (size_t)ival;
return(0);
case (MAN_BODY):
- p->offset = INDENT + len;
+ p->offset = mt->offset + len;
p->rmargin = p->maxrmargin;
break;
default:
@@ -679,6 +696,7 @@ pre_SS(DECL_ARGS)
switch (n->type) {
case (MAN_BLOCK):
mt->lmargin = INDENT;
+ mt->offset = INDENT;
/* If following a prior empty `SS', no vspace. */
if (n->prev && MAN_SS == n->prev->tok)
if (NULL == n->prev->body->child)
@@ -692,7 +710,7 @@ pre_SS(DECL_ARGS)
p->offset = HALFINDENT;
break;
case (MAN_BODY):
- p->offset = INDENT;
+ p->offset = mt->offset;
break;
default:
break;
@@ -729,6 +747,7 @@ pre_SH(DECL_ARGS)
switch (n->type) {
case (MAN_BLOCK):
mt->lmargin = INDENT;
+ mt->offset = INDENT;
/* If following a prior empty `SH', no vspace. */
if (n->prev && MAN_SH == n->prev->tok)
if (NULL == n->prev->body->child)
@@ -740,7 +759,7 @@ pre_SH(DECL_ARGS)
p->offset = 0;
break;
case (MAN_BODY):
- p->offset = INDENT;
+ p->offset = mt->offset;
break;
default:
break;
@@ -769,6 +788,56 @@ post_SH(DECL_ARGS)
}
+/* ARGSUSED */
+static int
+pre_RS(DECL_ARGS)
+{
+ const struct man_node *nn;
+ int ival;
+
+ switch (n->type) {
+ case (MAN_BLOCK):
+ term_newln(p);
+ return(1);
+ case (MAN_HEAD):
+ return(0);
+ default:
+ break;
+ }
+
+ if (NULL == (nn = n->parent->head->child)) {
+ mt->offset = mt->lmargin + INDENT;
+ p->offset = mt->offset;
+ return(1);
+ }
+
+ if ((ival = arg_width(nn)) < 0)
+ return(1);
+
+ mt->offset = INDENT + (size_t)ival;
+ p->offset = mt->offset;
+
+ return(1);
+}
+
+
+/* ARGSUSED */
+static void
+post_RS(DECL_ARGS)
+{
+
+ switch (n->type) {
+ case (MAN_BLOCK):
+ mt->offset = mt->lmargin = INDENT;
+ break;
+ default:
+ term_newln(p);
+ p->offset = INDENT;
+ break;
+ }
+}
+
+
static void
print_node(DECL_ARGS)
{