aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/term.c
diff options
context:
space:
mode:
Diffstat (limited to 'term.c')
-rw-r--r--term.c60
1 files changed, 58 insertions, 2 deletions
diff --git a/term.c b/term.c
index 266c49e7..afd5951a 100644
--- a/term.c
+++ b/term.c
@@ -1,4 +1,4 @@
-/* $Id: term.c,v 1.261 2017/06/01 19:05:37 schwarze Exp $ */
+/* $Id: term.c,v 1.262 2017/06/02 19:21:23 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010-2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -404,7 +404,7 @@ term_word(struct termp *p, const char *word)
const char nbrsp[2] = { ASCII_NBRSP, 0 };
const char *seq, *cp;
int sz, uc;
- size_t ssz;
+ size_t csz, lsz, ssz;
enum mandoc_esc esc;
if ( ! (TERMP_NOSPACE & p->flags)) {
@@ -510,6 +510,62 @@ term_word(struct termp *p, const char *word)
}
}
continue;
+ case ESCAPE_HLINE:
+ if (a2roffsu(seq, &su, SCALE_EM) == 0)
+ continue;
+ uc = term_hspan(p, &su) / 24;
+ if (uc <= 0) {
+ if (p->rmargin <= p->offset)
+ continue;
+ lsz = p->rmargin - p->offset;
+ } else
+ lsz = uc;
+ while (sz &&
+ strchr(" %&()*+-./0123456789:<=>", *seq)) {
+ seq++;
+ sz--;
+ }
+ if (sz && strchr("cifMmnPpuv", *seq)) {
+ seq++;
+ sz--;
+ }
+ if (sz == 0)
+ uc = -1;
+ else if (*seq == '\\') {
+ seq++;
+ esc = mandoc_escape(&seq, &cp, &sz);
+ switch (esc) {
+ case ESCAPE_UNICODE:
+ uc = mchars_num2uc(cp + 1, sz - 1);
+ break;
+ case ESCAPE_NUMBERED:
+ uc = mchars_num2char(cp, sz);
+ break;
+ case ESCAPE_SPECIAL:
+ uc = mchars_spec2cp(cp, sz);
+ break;
+ default:
+ uc = -1;
+ break;
+ }
+ } else
+ uc = *seq;
+ if (uc < 0x20 || (uc > 0x7E && uc < 0xA0))
+ uc = '_';
+ if (p->enc == TERMENC_ASCII) {
+ cp = ascii_uc2str(uc);
+ csz = term_strlen(p, cp);
+ ssz = strlen(cp);
+ } else
+ csz = (*p->width)(p, uc);
+ while (lsz >= csz) {
+ if (p->enc == TERMENC_ASCII)
+ encode(p, cp, ssz);
+ else
+ encode1(p, uc);
+ lsz -= csz;
+ }
+ continue;
case ESCAPE_SKIPCHAR:
p->flags |= TERMP_BACKAFTER;
continue;