]> 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 ea58a790c01345b30e5356d791b7f5d0fb93ef03..5c49dd7d4a0ec6e262f22461c6d3152102778f05 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_term.c,v 1.43 2009/07/16 13:27:24 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;
 }
 
 
@@ -1557,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) {
@@ -1580,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;
 }
 
 
@@ -1810,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;
@@ -1828,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)