]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_term.c
Made `Cd' parseable (too many SYNOPSIS sections do this).
[mandoc.git] / mdoc_term.c
index 1a59a3a0257a304ee0ad5041a09a29804f950fc3..5c49dd7d4a0ec6e262f22461c6d3152102778f05 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_term.c,v 1.40 2009/07/14 15:49:44 kristaps Exp $ */
+/*     $Id: mdoc_term.c,v 1.47 2009/07/19 08:24:16 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -130,6 +130,7 @@ static      int       termp_ar_pre(DECL_ARGS);
 static int       termp_bd_pre(DECL_ARGS);
 static int       termp_bf_pre(DECL_ARGS);
 static int       termp_bq_pre(DECL_ARGS);
+static int       termp_br_pre(DECL_ARGS);
 static int       termp_brq_pre(DECL_ARGS);
 static int       termp_bt_pre(DECL_ARGS);
 static int       termp_cd_pre(DECL_ARGS);
@@ -163,6 +164,7 @@ static      int       termp_rs_pre(DECL_ARGS);
 static int       termp_rv_pre(DECL_ARGS);
 static int       termp_sh_pre(DECL_ARGS);
 static int       termp_sm_pre(DECL_ARGS);
+static int       termp_sp_pre(DECL_ARGS);
 static int       termp_sq_pre(DECL_ARGS);
 static int       termp_ss_pre(DECL_ARGS);
 static int       termp_sx_pre(DECL_ARGS);
@@ -292,6 +294,8 @@ static const struct termact termacts[MDOC_MAX] = {
        { NULL, NULL }, /* En */ 
        { termp_xx_pre, NULL }, /* Dx */ 
        { NULL, NULL }, /* %Q */ 
+       { termp_br_pre, NULL }, /* br */
+       { termp_sp_pre, NULL }, /* sp */ 
 };
 
 #ifdef __linux__
@@ -360,6 +364,13 @@ print_node(DECL_ARGS)
        npair.flag = 0;
        npair.count = 0;
 
+       /*
+        * Note on termpair.  This allows a pre function to set a termp
+        * flag that is automatically unset after the body, but before
+        * the post function.  Thus, if a pre uses a termpair flag, it
+        * must be reapplied in the post for use.
+        */
+
        if (MDOC_TEXT != node->type) {
                if (termacts[node->tok].pre)
                        if ( ! (*termacts[node->tok].pre)(p, &npair, meta, node))
@@ -374,6 +385,8 @@ print_node(DECL_ARGS)
        if (dochild && node->child)
                print_body(p, &npair, meta, node->child);
 
+       p->flags &= ~npair.flag;
+
        /* Post-processing. */
 
        if (MDOC_TEXT != node->type)
@@ -382,7 +395,6 @@ print_node(DECL_ARGS)
 
        p->offset = offset;
        p->rmargin = rmargin;
-       p->flags &= ~npair.flag;
 }
 
 
@@ -407,7 +419,7 @@ print_foot(struct termp *p, const struct mdoc_meta *meta)
 
        tm = localtime(&meta->date);
 
-       if (0 == strftime(buf, p->rmargin, "%B %d, %Y", tm))
+       if (0 == strftime(buf, p->rmargin, "%B %e, %Y", tm))
                err(1, "strftime");
 
        (void)strlcpy(os, meta->os, p->rmargin);
@@ -797,9 +809,6 @@ termp_it_pre(DECL_ARGS)
         */
 
        switch (type) {
-       case (MDOC_Diag):
-               term_word(p, "\\ ");
-               /* FALLTHROUGH */
        case (MDOC_Inset):
                if (MDOC_BODY == node->type) 
                        p->flags &= ~TERMP_NOSPACE;
@@ -988,6 +997,7 @@ termp_it_post(DECL_ARGS)
 
        switch (type) {
        case (MDOC_Diag):
+               term_word(p, "\\ ");
                /* FALLTHROUGH */
        case (MDOC_Item):
                /* FALLTHROUGH */
@@ -1140,13 +1150,8 @@ termp_nd_pre(DECL_ARGS)
        if (MDOC_BODY != node->type)
                return(1);
 
-       /* 
-        * XXX: signed off by jmc@openbsd.org.  This technically
-        * produces a minus sign after the Nd, which is wrong, but is
-        * consistent with the historic OpenBSD tmac file.
-        */
 #if defined(__OpenBSD__) || defined(__linux__)
-       term_word(p, "\\-");
+       term_word(p, "\\(en");
 #else
        term_word(p, "\\(em");
 #endif
@@ -1564,7 +1569,6 @@ termp_bd_pre(DECL_ARGS)
         * Ew.
         */
 
-       p->flags |= TERMP_LITERAL;
        ln = node->child ? node->child->line : 0;
 
        for (node = node->child; node; node = node->next) {
@@ -1587,10 +1591,7 @@ termp_bd_post(DECL_ARGS)
 
        if (MDOC_BODY != node->type) 
                return;
-
        term_flushln(p);
-       p->flags &= ~TERMP_LITERAL;
-       p->flags |= TERMP_NOSPACE;
 }
 
 
@@ -1817,8 +1818,9 @@ static void
 termp_in_post(DECL_ARGS)
 {
 
-       p->flags |= TERMP_NOSPACE;
+       p->flags |= TERMP_NOSPACE | ttypes[TTYPE_INCLUDE];
        term_word(p, ">");
+       p->flags &= ~ttypes[TTYPE_INCLUDE];
 
        if (SEC_SYNOPSIS != node->sec)
                return;
@@ -1835,6 +1837,37 @@ termp_in_post(DECL_ARGS)
 }
 
 
+/* ARGSUSED */
+static int
+termp_sp_pre(DECL_ARGS)
+{
+       int              i, len;
+
+       if (NULL == node->child) {
+               term_vspace(p);
+               return(0);
+       }
+
+       len = atoi(node->child->string);
+       if (0 == len)
+               term_newln(p);
+       for (i = 0; i < len; i++)
+               term_vspace(p);
+
+       return(0);
+}
+
+
+/* ARGSUSED */
+static int
+termp_br_pre(DECL_ARGS)
+{
+
+       term_newln(p);
+       return(1);
+}
+
+
 /* ARGSUSED */
 static int
 termp_brq_pre(DECL_ARGS)