summaryrefslogtreecommitdiffstats
path: root/roff_term.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2017-06-06 15:01:04 +0000
committerIngo Schwarze <schwarze@openbsd.org>2017-06-06 15:01:04 +0000
commit3a094373dfa33d1e287d59127a8629dde3205dd8 (patch)
tree25ebac57ab1aa54735b559fef4ca6a55dc4494e2 /roff_term.c
parent57a85465cebb415008468ba9f16a7668e9119051 (diff)
downloadmandoc-3a094373dfa33d1e287d59127a8629dde3205dd8.tar.gz
Minimal implementation of the roff(7) .ce request (center a number
of input lines without filling). Contrary to groff, high-level macros abort .ce mode for now.
Diffstat (limited to 'roff_term.c')
-rw-r--r--roff_term.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/roff_term.c b/roff_term.c
index 22af42b0..2eb72dcc 100644
--- a/roff_term.c
+++ b/roff_term.c
@@ -28,6 +28,7 @@
typedef void (*roff_term_pre_fp)(ROFF_TERM_ARGS);
static void roff_term_pre_br(ROFF_TERM_ARGS);
+static void roff_term_pre_ce(ROFF_TERM_ARGS);
static void roff_term_pre_ft(ROFF_TERM_ARGS);
static void roff_term_pre_ll(ROFF_TERM_ARGS);
static void roff_term_pre_mc(ROFF_TERM_ARGS);
@@ -37,6 +38,7 @@ static void roff_term_pre_ti(ROFF_TERM_ARGS);
static const roff_term_pre_fp roff_term_pre_acts[ROFF_MAX] = {
roff_term_pre_br, /* br */
+ roff_term_pre_ce, /* ce */
roff_term_pre_ft, /* ft */
roff_term_pre_ll, /* ll */
roff_term_pre_mc, /* mc */
@@ -65,6 +67,43 @@ roff_term_pre_br(ROFF_TERM_ARGS)
}
static void
+roff_term_pre_ce(ROFF_TERM_ARGS)
+{
+ const struct roff_node *nch;
+ size_t len, lm;
+
+ roff_term_pre_br(p, n);
+ lm = p->offset;
+ n = n->child->next;
+ while (n != NULL) {
+ nch = n;
+ len = 0;
+ do {
+ if (n->type == ROFFT_TEXT) {
+ if (len)
+ len++;
+ len += term_strlen(p, nch->string);
+ }
+ nch = nch->next;
+ } while (nch != NULL && (n->type != ROFFT_TEXT ||
+ (n->flags & NODE_LINE) == 0));
+ p->offset = len >= p->rmargin ? 0 :
+ lm + len >= p->rmargin ? p->rmargin - len :
+ (lm + p->rmargin - len) / 2;
+ while (n != nch) {
+ if (n->type == ROFFT_TEXT)
+ term_word(p, n->string);
+ else
+ roff_term_pre(p, n);
+ n = n->next;
+ }
+ p->flags |= TERMP_NOSPACE;
+ term_flushln(p);
+ }
+ p->offset = lm;
+}
+
+static void
roff_term_pre_ft(ROFF_TERM_ARGS)
{
switch (*n->child->string) {