]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_action.c
Cache all of `Bd's resolved arguments into mdoc_bd, which is stashed in
[mandoc.git] / mdoc_action.c
index 0789283f4c141b408d4ab45c07072382749cc1ac..e103eb980068d028f121a5f7033e2c99acbdbbf7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_action.c,v 1.59 2010/05/17 22:11:42 kristaps Exp $ */
+/*     $Id: mdoc_action.c,v 1.67 2010/06/12 11:21:44 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -33,7 +33,7 @@
 #include "libmandoc.h"
 
 #define        POST_ARGS struct mdoc *m, struct mdoc_node *n
-#define        PRE_ARGS  struct mdoc *m, const struct mdoc_node *n
+#define        PRE_ARGS  struct mdoc *m, struct mdoc_node *n
 
 #define        NUMSIZ    32
 #define        DATESIZ   32
@@ -57,6 +57,7 @@ static        int       post_dd(POST_ARGS);
 static int       post_display(POST_ARGS);
 static int       post_dt(POST_ARGS);
 static int       post_lb(POST_ARGS);
+static int       post_li(POST_ARGS);
 static int       post_nm(POST_ARGS);
 static int       post_os(POST_ARGS);
 static int       post_pa(POST_ARGS);
@@ -102,7 +103,7 @@ static      const struct actions mdoc_actions[MDOC_MAX] = {
        { NULL, NULL }, /* Ft */ 
        { NULL, NULL }, /* Ic */ 
        { NULL, NULL }, /* In */ 
-       { NULL, NULL }, /* Li */
+       { NULL, post_li }, /* Li */
        { NULL, NULL }, /* Nd */ 
        { NULL, post_nm }, /* Nm */ 
        { NULL, NULL }, /* Op */
@@ -193,6 +194,7 @@ static      const struct actions mdoc_actions[MDOC_MAX] = {
        { NULL, NULL }, /* br */
        { NULL, NULL }, /* sp */
        { NULL, NULL }, /* %U */
+       { NULL, NULL }, /* Ta */
 };
 
 #define        RSORD_MAX 14
@@ -216,7 +218,7 @@ static      const enum mdoct rsord[RSORD_MAX] = {
 
 
 int
-mdoc_action_pre(struct mdoc *m, const struct mdoc_node *n)
+mdoc_action_pre(struct mdoc *m, struct mdoc_node *n)
 {
 
        switch (n->type) {
@@ -498,8 +500,8 @@ post_dt(POST_ARGS)
        if (NULL == (nn = n->child)) {
                /* XXX: make these macro values. */
                /* FIXME: warn about missing values. */
-               m->meta.title = mandoc_strdup("unknown");
-               m->meta.vol = mandoc_strdup("local");
+               m->meta.title = mandoc_strdup("UNKNOWN");
+               m->meta.vol = mandoc_strdup("LOCAL");
                m->meta.msec = mandoc_strdup("1");
                return(post_prol(m, n));
        }
@@ -508,12 +510,13 @@ post_dt(POST_ARGS)
         *   --> title = TITLE, volume = local, msec = 0, arch = NULL
         */
 
-       m->meta.title = mandoc_strdup(nn->string);
+       m->meta.title = mandoc_strdup
+               ('\0' == nn->string[0] ? "UNKNOWN" : nn->string);
 
        if (NULL == (nn = nn->next)) {
                /* FIXME: warn about missing msec. */
                /* XXX: make this a macro value. */
-               m->meta.vol = mandoc_strdup("local");
+               m->meta.vol = mandoc_strdup("LOCAL");
                m->meta.msec = mandoc_strdup("1");
                return(post_prol(m, n));
        }
@@ -637,11 +640,14 @@ post_bl_tagwidth(POST_ARGS)
        /* Defaults to ten ens. */
 
        sz = 10; /* XXX: make this a macro value. */
-       nn = n->body->child;
+
+       for (nn = n->body->child; nn; nn = nn->next) {
+               if (MDOC_It == nn->tok)
+                       break;
+       }
 
        if (nn) {
                assert(MDOC_BLOCK == nn->type);
-               assert(MDOC_It == nn->tok);
                nn = nn->head->child;
                if (MDOC_TEXT != nn->type) {
                        sz = mdoc_macro2len(nn->tok);
@@ -833,6 +839,27 @@ post_pa(POST_ARGS)
 }
 
 
+/*
+ * Empty `Li' macros get an empty string to make front-ends add an extra
+ * space.
+ */
+static int
+post_li(POST_ARGS)
+{
+       struct mdoc_node *np;
+
+       if (n->child)
+               return(1);
+       
+       np = n;
+       m->next = MDOC_NEXT_CHILD;
+       if ( ! mdoc_word_alloc(m, n->line, n->pos, ""))
+               return(0);
+       m->last = np;
+       return(1);
+}
+
+
 /*
  * The `Ar' macro defaults to two strings "file ..." if no value is
  * provided as an argument.
@@ -921,8 +948,7 @@ pre_offset(PRE_ARGS)
         * stipulated by mdoc.samples. 
         */
 
-       assert(n->args);
-       for (i = 0; i < (int)n->args->argc; i++) {
+       for (i = 0; n->args && i < (int)n->args->argc; i++) {
                if (MDOC_Offset != n->args->argv[i].arg) 
                        continue;
                if (n->args->argv[i].sz)
@@ -943,27 +969,23 @@ static int
 pre_bl(PRE_ARGS)
 {
 
-       return(MDOC_BLOCK == n->type ? pre_offset(m, n) : 1);
+       if (MDOC_BLOCK == n->type)
+               return(pre_offset(m, n));
+       return(1);
 }
 
 
 static int
 pre_bd(PRE_ARGS)
 {
-       int              i;
 
-       if (MDOC_BLOCK == n->type)
-               return(pre_offset(m, n));
        if (MDOC_BODY != n->type)
                return(1);
 
-       /* Enter literal context if `Bd -literal' or `-unfilled'. */
-
-       for (n = n->parent, i = 0; i < (int)n->args->argc; i++)
-               if (MDOC_Literal == n->args->argv[i].arg)
-                       m->flags |= MDOC_LITERAL;
-               else if (MDOC_Unfilled == n->args->argv[i].arg)
-                       m->flags |= MDOC_LITERAL;
+       if (DISP_literal == n->data.Bd.type)
+               m->flags |= MDOC_LITERAL;
+       if (DISP_unfilled == n->data.Bd.type)
+               m->flags |= MDOC_LITERAL;
 
        return(1);
 }