aboutsummaryrefslogtreecommitdiffstatshomepage
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
commit1ab4ebe5662ad82d7ab745fdb9c8124e07630673 (patch)
tree4624a848d37ebcc20c00eb4fbebd33ed81c3b593 /roff_term.c
parent4a4657f9f40ea60d08ecfb7c12fc46e29440ff58 (diff)
downloadmandoc-1ab4ebe5662ad82d7ab745fdb9c8124e07630673.tar.gz
mandoc-1ab4ebe5662ad82d7ab745fdb9c8124e07630673.tar.zst
mandoc-1ab4ebe5662ad82d7ab745fdb9c8124e07630673.zip
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.c41
1 files changed, 40 insertions, 1 deletions
diff --git a/roff_term.c b/roff_term.c
index a4d48812..eaade486 100644
--- a/roff_term.c
+++ b/roff_term.c
@@ -1,4 +1,4 @@
-/* $Id: roff_term.c,v 1.7 2017/06/04 22:44:15 schwarze Exp $ */
+/* $Id: roff_term.c,v 1.8 2017/06/06 15:01:04 schwarze Exp $ */
/*
* Copyright (c) 2010, 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
*
@@ -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) {