summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2009-06-17 18:42:42 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2009-06-17 18:42:42 +0000
commitfbd9c8d8572ef586c691fb6bcec7f325f50e6ac1 (patch)
tree87bb155fdf10d7dedd6ce37e90a6842a7c676967
parenta5327753a1ee02038bf3a01e3770f3d9aa24c1fa (diff)
downloadmandoc-fbd9c8d8572ef586c691fb6bcec7f325f50e6ac1.tar.gz
Special characters, e.g. \(ae, are now correctly rendered in the current font decoration.
-rw-r--r--mdoc_term.c9
-rw-r--r--term.c78
2 files changed, 33 insertions, 54 deletions
diff --git a/mdoc_term.c b/mdoc_term.c
index cf6a8b50..c91ffb29 100644
--- a/mdoc_term.c
+++ b/mdoc_term.c
@@ -714,7 +714,7 @@ termp_it_pre(DECL_ARGS)
{
const struct mdoc_node *bl, *n;
char buf[7];
- int i, type, keys[3], vals[3];
+ int i, type, keys[3], vals[3], sv;
size_t width, offset;
if (MDOC_BLOCK == node->type)
@@ -898,17 +898,20 @@ termp_it_pre(DECL_ARGS)
/*
* The dash, hyphen, bullet and enum lists all have a special
- * HEAD character. Print it now.
+ * HEAD character (temporarily bold, in some cases).
*/
+ sv = p->flags;
if (MDOC_HEAD == node->type)
switch (type) {
case (MDOC_Bullet):
+ p->flags |= TERMP_BOLD;
term_word(p, "\\[bu]");
break;
case (MDOC_Dash):
/* FALLTHROUGH */
case (MDOC_Hyphen):
+ p->flags |= TERMP_BOLD;
term_word(p, "\\-");
break;
case (MDOC_Enum):
@@ -921,6 +924,8 @@ termp_it_pre(DECL_ARGS)
break;
}
+ p->flags = sv; /* Restore saved flags. */
+
/*
* If we're not going to process our children, indicate so here.
*/
diff --git a/term.c b/term.c
index 1e1ea8fc..5a9cf342 100644
--- a/term.c
+++ b/term.c
@@ -37,8 +37,7 @@ static void term_pescape(struct termp *,
static void term_nescape(struct termp *,
const char *, size_t);
static void term_chara(struct termp *, char);
-static void term_stringa(struct termp *,
- const char *, size_t);
+static void term_encodea(struct termp *, char);
static int term_isopendelim(const char *, int);
static int term_isclosedelim(const char *, int);
@@ -407,10 +406,11 @@ term_nescape(struct termp *p, const char *word, size_t len)
{
const char *rhs;
size_t sz;
+ int i;
- if (NULL == (rhs = term_a2ascii(p->symtab, word, len, &sz)))
- return;
- term_stringa(p, rhs, sz);
+ if ((rhs = term_a2ascii(p->symtab, word, len, &sz)))
+ for (i = 0; i < (int)sz; i++)
+ term_encodea(p, rhs[i]);
}
@@ -519,25 +519,11 @@ term_pword(struct termp *p, const char *word, int len)
* before the word.
*/
- for (i = 0; i < len; i++) {
- if ('\\' == word[i]) {
+ for (i = 0; i < len; i++)
+ if ('\\' == word[i])
term_pescape(p, word, &i, len);
- continue;
- }
-
- if (TERMP_STYLE & p->flags) {
- if (TERMP_BOLD & p->flags) {
- term_chara(p, word[i]);
- term_chara(p, 8);
- }
- if (TERMP_UNDER & p->flags) {
- term_chara(p, '_');
- term_chara(p, 8);
- }
- }
-
- term_chara(p, word[i]);
- }
+ else
+ term_encodea(p, word[i]);
if (term_isopendelim(word, len))
p->flags |= TERMP_NOSPACE;
@@ -545,35 +531,6 @@ term_pword(struct termp *p, const char *word, int len)
/*
- * Like term_chara() but for arbitrary-length buffers. Resize the
- * buffer by a factor of two (if the buffer is less than that) or the
- * buffer's size.
- */
-static void
-term_stringa(struct termp *p, const char *c, size_t sz)
-{
- size_t s;
-
- if (0 == sz)
- return;
-
- assert(c);
- if (p->col + sz >= p->maxcols) {
- if (0 == p->maxcols)
- p->maxcols = 256;
- s = sz > p->maxcols * 2 ? sz : p->maxcols * 2;
- p->buf = realloc(p->buf, s);
- if (NULL == p->buf)
- err(1, "realloc");
- p->maxcols = s;
- }
-
- (void)memcpy(&p->buf[(int)p->col], c, sz);
- p->col += sz;
-}
-
-
-/*
* Insert a single character into the line-buffer. If the buffer's
* space is exceeded, then allocate more space by doubling the buffer
* size.
@@ -595,3 +552,20 @@ term_chara(struct termp *p, char c)
p->buf[(int)(p->col)++] = c;
}
+
+static void
+term_encodea(struct termp *p, char c)
+{
+
+ if (TERMP_STYLE & p->flags) {
+ if (TERMP_BOLD & p->flags) {
+ term_chara(p, c);
+ term_chara(p, 8);
+ }
+ if (TERMP_UNDER & p->flags) {
+ term_chara(p, '_');
+ term_chara(p, 8);
+ }
+ }
+ term_chara(p, c);
+}