aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/term.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2013-08-08 20:07:47 +0000
committerIngo Schwarze <schwarze@openbsd.org>2013-08-08 20:07:47 +0000
commitcbcd971bbd4927814d654460337a6774684b3d8f (patch)
treea16bde046faa01e1fc65164f1b20f8dc356001d7 /term.c
parentb9c9c79db57653ef779df3251313389a9fe378ec (diff)
downloadmandoc-cbcd971bbd4927814d654460337a6774684b3d8f.tar.gz
mandoc-cbcd971bbd4927814d654460337a6774684b3d8f.tar.zst
mandoc-cbcd971bbd4927814d654460337a6774684b3d8f.zip
Implement the roff(7) font-escape sequence \f(BI "bold+italic".
This improves the formatting of about 40 base manuals and reduces groff-mandoc formatting differences in base by about 5%.
Diffstat (limited to 'term.c')
-rw-r--r--term.c52
1 files changed, 23 insertions, 29 deletions
diff --git a/term.c b/term.c
index 5eef6275..4c1a8dbc 100644
--- a/term.c
+++ b/term.c
@@ -1,7 +1,7 @@
-/* $Id: term.c,v 1.208 2013/08/05 23:36:42 schwarze Exp $ */
+/* $Id: term.c,v 1.209 2013/08/08 20:07:47 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010, 2011, 2012 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010, 2011, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -480,6 +480,9 @@ term_word(struct termp *p, const char *word)
case (ESCAPE_FONTITALIC):
term_fontrepl(p, TERMFONT_UNDER);
break;
+ case (ESCAPE_FONTBI):
+ term_fontrepl(p, TERMFONT_BI);
+ break;
case (ESCAPE_FONT):
/* FALLTHROUGH */
case (ESCAPE_FONTROMAN):
@@ -541,27 +544,28 @@ encode1(struct termp *p, int c)
return;
}
- if (p->col + 4 >= p->maxcols)
- adjbuf(p, p->col + 4);
+ if (p->col + 6 >= p->maxcols)
+ adjbuf(p, p->col + 6);
f = term_fonttop(p);
- if (TERMFONT_NONE == f) {
- p->buf[p->col++] = c;
- return;
- } else if (TERMFONT_UNDER == f) {
+ if (TERMFONT_UNDER == f || TERMFONT_BI == f) {
p->buf[p->col++] = '_';
- } else
- p->buf[p->col++] = c;
-
- p->buf[p->col++] = 8;
+ p->buf[p->col++] = 8;
+ }
+ if (TERMFONT_BOLD == f || TERMFONT_BI == f) {
+ if (ASCII_HYPH == c)
+ p->buf[p->col++] = '-';
+ else
+ p->buf[p->col++] = c;
+ p->buf[p->col++] = 8;
+ }
p->buf[p->col++] = c;
}
static void
encode(struct termp *p, const char *word, size_t sz)
{
- enum termfont f;
int i, len;
if (TERMP_SKIPCHAR & p->flags) {
@@ -578,7 +582,7 @@ encode(struct termp *p, const char *word, size_t sz)
* character by character.
*/
- if (TERMFONT_NONE == (f = term_fonttop(p))) {
+ if (TERMFONT_NONE == term_fonttop(p)) {
if (p->col + len >= p->maxcols)
adjbuf(p, p->col + len);
for (i = 0; i < len; i++)
@@ -588,25 +592,15 @@ encode(struct termp *p, const char *word, size_t sz)
/* Pre-buffer, assuming worst-case. */
- if (p->col + 1 + (len * 3) >= p->maxcols)
- adjbuf(p, p->col + 1 + (len * 3));
+ if (p->col + 1 + (len * 5) >= p->maxcols)
+ adjbuf(p, p->col + 1 + (len * 5));
for (i = 0; i < len; i++) {
- if (ASCII_HYPH != word[i] &&
- ! isgraph((unsigned char)word[i])) {
- p->buf[p->col++] = word[i];
- continue;
- }
-
- if (TERMFONT_UNDER == f)
- p->buf[p->col++] = '_';
- else if (ASCII_HYPH == word[i])
- p->buf[p->col++] = '-';
+ if (ASCII_HYPH == word[i] ||
+ isgraph((unsigned char)word[i]))
+ encode1(p, word[i]);
else
p->buf[p->col++] = word[i];
-
- p->buf[p->col++] = 8;
- p->buf[p->col++] = word[i];
}
}