]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdocterm.c
Added [almost] all list types.
[mandoc.git] / mdocterm.c
index a8a06c1288866645f19a9ddd79063674dcf1ae08..35d14168b3fc20e25d5c5b12198227d72eddabcd 100644 (file)
@@ -1,4 +1,4 @@
-       /* $Id: mdocterm.c,v 1.10 2009/02/25 12:27:37 kristaps Exp $ */
+/* $Id: mdocterm.c,v 1.12 2009/02/25 15:12:26 kristaps Exp $ */
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -44,6 +44,7 @@ enum  termstyle {
 };
 
 static void              body(struct termp *,
+                               struct termpair *,
                                const struct mdoc_meta *,
                                const struct mdoc_node *);
 static void              header(struct termp *,
@@ -54,6 +55,8 @@ static        void              footer(struct termp *,
 static void              pword(struct termp *, const char *, size_t);
 static void              pescape(struct termp *, 
                                const char *, size_t *, size_t);
+static void              nescape(struct termp *, 
+                               const char *, size_t);
 static void              chara(struct termp *, char);
 static void              stringa(struct termp *, const char *);
 static void              style(struct termp *, enum termstyle);
@@ -89,7 +92,7 @@ main(int argc, char *argv[])
                err(1, "malloc");
 
        header(&termp, mdoc_meta(mdoc));
-       body(&termp, mdoc_meta(mdoc), mdoc_node(mdoc));
+       body(&termp, NULL, mdoc_meta(mdoc), mdoc_node(mdoc));
        footer(&termp, mdoc_meta(mdoc));
 
        free(termp.buf);
@@ -200,7 +203,7 @@ flushln(struct termp *p)
         */
 
        if (p->flags & TERMP_NOBREAK) {
-               for ( ; vis <= maxvis; vis++)
+               for ( ; vis < maxvis; vis++)
                        putchar(' ');
        } else
                putchar('\n');
@@ -218,9 +221,12 @@ newln(struct termp *p)
         * vertical space.
         */
        p->flags |= TERMP_NOSPACE;
-       if (0 == p->col) 
+       if (0 == p->col) {
+               p->flags &= ~TERMP_NOLPAD;
                return;
+       }
        flushln(p);
+       p->flags &= ~TERMP_NOLPAD;
 }
 
 
@@ -285,9 +291,37 @@ style(struct termp *p, enum termstyle esc)
 }
 
 
+static void
+nescape(struct termp *p, const char *word, size_t len)
+{
+
+       switch (len) {
+       case (2):
+               if ('r' == word[0] && 'B' == word[1])
+                       chara(p, ']');
+               else if ('l' == word[0] && 'B' == word[1])
+                       chara(p, '[');
+               else if ('<' == word[0] && '-' == word[1])
+                       stringa(p, "<-");
+               else if ('-' == word[0] && '>' == word[1])
+                       stringa(p, "->");
+               else if ('l' == word[0] && 'q' == word[1])
+                       chara(p, '\"');
+               else if ('r' == word[0] && 'q' == word[1])
+                       chara(p, '\"');
+               else if ('b' == word[0] && 'u' == word[1])
+                       chara(p, 'o');
+               break;
+       default:
+               break;
+       }
+}
+
+
 static void
 pescape(struct termp *p, const char *word, size_t *i, size_t len)
 {
+       size_t           j;
 
        (*i)++;
        assert(*i < len);
@@ -296,20 +330,7 @@ pescape(struct termp *p, const char *word, size_t *i, size_t len)
                /* Two-character escapes. */
                (*i)++;
                assert(*i + 1 < len);
-
-               if ('r' == word[*i] && 'B' == word[*i + 1])
-                       chara(p, ']');
-               else if ('l' == word[*i] && 'B' == word[*i + 1])
-                       chara(p, '[');
-               else if ('<' == word[*i] && '-' == word[*i + 1])
-                       stringa(p, "<-");
-               else if ('-' == word[*i] && '>' == word[*i + 1])
-                       stringa(p, "->");
-               else if ('l' == word[*i] && 'q' == word[*i + 1])
-                       chara(p, '\"');
-               else if ('r' == word[*i] && 'q' == word[*i + 1])
-                       chara(p, '\"');
-
+               nescape(p, &word[*i], 2);
                (*i)++;
                return;
 
@@ -331,7 +352,12 @@ pescape(struct termp *p, const char *word, size_t *i, size_t len)
                }
                return;
        }
-       /* n-character escapes. */
+
+       (*i)++;
+       for (j = 0; word[*i] && ']' != word[*i]; (*i)++, j++)
+               /* Loop... */ ;
+
+       nescape(p, &word[*i - j], j);
 }
 
 
@@ -406,7 +432,8 @@ word(struct termp *p, const char *word)
 
 
 static void
-body(struct termp *p, const struct mdoc_meta *meta,
+body(struct termp *p, struct termpair *ppair,
+               const struct mdoc_meta *meta,
                const struct mdoc_node *node)
 {
        int              dochild;
@@ -415,9 +442,11 @@ body(struct termp *p, const struct mdoc_meta *meta,
        /* Pre-processing. */
 
        dochild = 1;
+       pair.ppair = ppair;
        pair.type = 0;
-       pair.offset = 0;
+       pair.offset = pair.rmargin = 0;
        pair.flag = 0;
+       pair.count = 0;
 
        if (MDOC_TEXT != node->type) {
                if (termacts[node->tok].pre)
@@ -432,7 +461,7 @@ body(struct termp *p, const struct mdoc_meta *meta,
                p->flags |= pair.flag;
 
        if (dochild && node->child)
-               body(p, meta, node->child);
+               body(p, &pair, meta, node->child);
 
        if (TERMPAIR_FLAG & pair.type)
                p->flags &= ~pair.flag;
@@ -446,7 +475,7 @@ body(struct termp *p, const struct mdoc_meta *meta,
        /* Siblings. */
 
        if (node->next)
-               body(p, meta, node->next);
+               body(p, ppair, meta, node->next);
 }