]> 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 96c3d51d2bddf9be99104712174bfaab92fe2e6c..e103eb980068d028f121a5f7033e2c99acbdbbf7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_action.c,v 1.60 2010/05/17 23:57:06 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>
  *
@@ -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
@@ -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)
@@ -942,83 +968,24 @@ pre_offset(PRE_ARGS)
 static int
 pre_bl(PRE_ARGS)
 {
-       int              pos;
-
-       if (MDOC_BLOCK != n->type) {
-               assert(n->parent);
-               assert(MDOC_BLOCK == n->parent->type);
-               assert(MDOC_Bl == n->parent->tok);
-               assert(LIST__NONE != n->parent->data.list);
-               n->data.list = n->parent->data.list;
-               return(1);
-       }
-
-       assert(LIST__NONE == n->data.list);
-
-       for (pos = 0; pos < (int)n->args->argc; pos++) {
-               switch (n->args->argv[pos].arg) {
-               case (MDOC_Bullet):
-                       n->data.list = LIST_bullet;
-                       break;
-               case (MDOC_Dash):
-                       n->data.list = LIST_dash;
-                       break;
-               case (MDOC_Enum):
-                       n->data.list = LIST_enum;
-                       break;
-               case (MDOC_Hyphen):
-                       n->data.list = LIST_hyphen;
-                       break;
-               case (MDOC_Item):
-                       n->data.list = LIST_item;
-                       break;
-               case (MDOC_Tag):
-                       n->data.list = LIST_tag;
-                       break;
-               case (MDOC_Diag):
-                       n->data.list = LIST_diag;
-                       break;
-               case (MDOC_Hang):
-                       n->data.list = LIST_hang;
-                       break;
-               case (MDOC_Ohang):
-                       n->data.list = LIST_ohang;
-                       break;
-               case (MDOC_Inset):
-                       n->data.list = LIST_inset;
-                       break;
-               case (MDOC_Column):
-                       n->data.list = LIST_column;
-                       break;
-               default:
-                       break;
-               }
-               if (LIST__NONE != n->data.list)
-                       break;
-       }
 
-       assert(LIST__NONE != n->data.list);
-       return(pre_offset(m, n));
+       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);
 }