]> git.cameronkatri.com Git - mandoc.git/commitdiff
Special characters, e.g. \(ae, are now correctly rendered in the current font decoration.
authorKristaps Dzonsons <kristaps@bsd.lv>
Wed, 17 Jun 2009 18:42:42 +0000 (18:42 +0000)
committerKristaps Dzonsons <kristaps@bsd.lv>
Wed, 17 Jun 2009 18:42:42 +0000 (18:42 +0000)
mdoc_term.c
term.c

index 5f12c5d6d672e618ecf69f01f99f58bac564283a..2f55a2e0e316a5637b0fb49a104d90ab651e0190 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_term.c,v 1.14 2009/06/16 19:45:51 kristaps Exp $ */
+/*     $Id: mdoc_term.c,v 1.15 2009/06/17 18:42:42 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -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 3dabeffaebe4709abd63fce916049981fc9bfdbf..935b29e384217f629844a7e62795c508c24b51d4 100644 (file)
--- a/term.c
+++ b/term.c
@@ -1,4 +1,4 @@
-/*     $Id: term.c,v 1.78 2009/06/11 10:34:32 kristaps Exp $ */
+/*     $Id: term.c,v 1.79 2009/06/17 18:42:42 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -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,60 +519,17 @@ 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;
 }
 
 
-/*
- * 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
@@ -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);
+}