]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdocterm.c
Formatting.
[mandoc.git] / mdocterm.c
index 46451789083403be41667becab71dc852b2579f2..a8a06c1288866645f19a9ddd79063674dcf1ae08 100644 (file)
@@ -1,4 +1,4 @@
-       /* $Id: mdocterm.c,v 1.4 2009/02/23 09:33:34 kristaps Exp $ */
+       /* $Id: mdocterm.c,v 1.10 2009/02/25 12:27:37 kristaps Exp $ */
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
 #include <stdlib.h>
 #include <string.h>
 
 #include <stdlib.h>
 #include <string.h>
 
+#ifndef __OpenBSD__
+#include <time.h>
+#endif
+
 #include "mmain.h"
 #include "term.h"
 
 #include "mmain.h"
 #include "term.h"
 
+#ifdef __NetBSD__
+#define xisspace(x) isspace((int)(x))
+#else
+#define        xisspace(x) isspace((x))
+#endif
+
 enum   termstyle {
        STYLE_CLEAR,
        STYLE_BOLD,
 enum   termstyle {
        STYLE_CLEAR,
        STYLE_BOLD,
@@ -61,9 +71,6 @@ main(int argc, char *argv[])
        const struct mdoc *mdoc;
        struct termp     termp;
 
        const struct mdoc *mdoc;
        struct termp     termp;
 
-       extern int       optreset;
-       extern int       optind;
-
        p = mmain_alloc();
 
        if ( ! mmain_getopt(p, argc, argv, NULL, NULL, NULL, NULL))
        p = mmain_alloc();
 
        if ( ! mmain_getopt(p, argc, argv, NULL, NULL, NULL, NULL))
@@ -136,11 +143,11 @@ flushln(struct termp *p)
                 * Count up visible word characters.  Control sequences
                 * (starting with the CSI) aren't counted. 
                 */
                 * Count up visible word characters.  Control sequences
                 * (starting with the CSI) aren't counted. 
                 */
-               assert( ! isspace(p->buf[i]));
+               assert( ! xisspace(p->buf[i]));
 
                /* LINTED */
                for (j = i, vsz = 0; j < p->col; j++) {
 
                /* LINTED */
                for (j = i, vsz = 0; j < p->col; j++) {
-                       if (isspace(p->buf[j]))
+                       if (xisspace(p->buf[j]))
                                break;
                        else if (27 == p->buf[j]) {
                                assert(j + 4 <= p->col);
                                break;
                        else if (27 == p->buf[j]) {
                                assert(j + 4 <= p->col);
@@ -166,10 +173,9 @@ flushln(struct termp *p)
                        for (j = 0; j < p->offset; j++)
                                putchar(' ');
                        vis = 0;
                        for (j = 0; j < p->offset; j++)
                                putchar(' ');
                        vis = 0;
-               } else if (vis + vsz >= maxvis) {
+               } else if (vis + vsz >= maxvis)
                        /* FIXME */
                        errx(1, "word breaks right margin");
                        /* FIXME */
                        errx(1, "word breaks right margin");
-               }
 
                /* 
                 * Write out the word and a trailing space.  Omit the
 
                /* 
                 * Write out the word and a trailing space.  Omit the
@@ -177,7 +183,7 @@ flushln(struct termp *p)
                 */
 
                for ( ; i < p->col; i++) {
                 */
 
                for ( ; i < p->col; i++) {
-                       if (isspace(p->buf[i]))
+                       if (xisspace(p->buf[i]))
                                break;
                        putchar(p->buf[i]);
                }
                                break;
                        putchar(p->buf[i]);
                }
@@ -299,6 +305,10 @@ pescape(struct termp *p, const char *word, size_t *i, size_t len)
                        stringa(p, "<-");
                else if ('-' == word[*i] && '>' == word[*i + 1])
                        stringa(p, "->");
                        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, '\"');
 
                (*i)++;
                return;
 
                (*i)++;
                return;
@@ -378,7 +388,7 @@ word(struct termp *p, const char *word)
 
        /* LINTED */
        for (j = i = 0; i < len; i++) {
 
        /* LINTED */
        for (j = i = 0; i < len; i++) {
-               if ( ! isspace(word[i])) {
+               if ( ! xisspace(word[i])) {
                        j++;
                        continue;
                }
                        j++;
                        continue;
                }
@@ -400,28 +410,38 @@ body(struct termp *p, const struct mdoc_meta *meta,
                const struct mdoc_node *node)
 {
        int              dochild;
                const struct mdoc_node *node)
 {
        int              dochild;
+       struct termpair  pair;
 
        /* Pre-processing. */
 
        dochild = 1;
 
        /* Pre-processing. */
 
        dochild = 1;
+       pair.type = 0;
+       pair.offset = 0;
+       pair.flag = 0;
 
        if (MDOC_TEXT != node->type) {
                if (termacts[node->tok].pre)
 
        if (MDOC_TEXT != node->type) {
                if (termacts[node->tok].pre)
-                       if ( ! (*termacts[node->tok].pre)(p, meta, node))
+                       if ( ! (*termacts[node->tok].pre)(p, &pair, meta, node))
                                dochild = 0;
        } else /* MDOC_TEXT == node->type */
                word(p, node->data.text.string);
 
        /* Children. */
 
                                dochild = 0;
        } else /* MDOC_TEXT == node->type */
                word(p, node->data.text.string);
 
        /* Children. */
 
+       if (TERMPAIR_FLAG & pair.type)
+               p->flags |= pair.flag;
+
        if (dochild && node->child)
                body(p, meta, node->child);
 
        if (dochild && node->child)
                body(p, meta, node->child);
 
+       if (TERMPAIR_FLAG & pair.type)
+               p->flags &= ~pair.flag;
+
        /* Post-processing. */
 
        if (MDOC_TEXT != node->type)
                if (termacts[node->tok].post)
        /* Post-processing. */
 
        if (MDOC_TEXT != node->type)
                if (termacts[node->tok].post)
-                       (*termacts[node->tok].post)(p, meta, node);
+                       (*termacts[node->tok].post)(p, &pair, meta, node);
 
        /* Siblings. */
 
 
        /* Siblings. */
 
@@ -444,10 +464,10 @@ footer(struct termp *p, const struct mdoc_meta *meta)
 
        tm = localtime(&meta->date);
 
 
        tm = localtime(&meta->date);
 
-#ifdef __linux__
-       if (0 == strftime(buf, p->rmargin, "%B %d, %Y", tm))
-#else
+#ifdef __OpenBSD__
        if (NULL == strftime(buf, p->rmargin, "%B %d, %Y", tm))
        if (NULL == strftime(buf, p->rmargin, "%B %d, %Y", tm))
+#else
+       if (0 == strftime(buf, p->rmargin, "%B %d, %Y", tm))
 #endif
                err(1, "strftime");
 
 #endif
                err(1, "strftime");