summaryrefslogtreecommitdiffstats
path: root/term.c
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 /term.c
parenta5327753a1ee02038bf3a01e3770f3d9aa24c1fa (diff)
downloadmandoc-fbd9c8d8572ef586c691fb6bcec7f325f50e6ac1.tar.gz
Special characters, e.g. \(ae, are now correctly rendered in the current font decoration.
Diffstat (limited to 'term.c')
-rw-r--r--term.c78
1 files changed, 26 insertions, 52 deletions
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);
+}