]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_state.c
If man(7) next-line scope is open and the line ends with \c,
[mandoc.git] / mdoc_state.c
index 061092ce3db2fe6ff71baba38f39b66579b4bc3d..eaf2051147f6f0bf24cc8f2e5b81297402d03071 100644 (file)
@@ -1,6 +1,6 @@
-/*     $Id: mdoc_state.c,v 1.1 2015/10/20 02:01:32 schwarze Exp $ */
+/*     $Id: mdoc_state.c,v 1.10 2018/08/17 20:33:38 schwarze Exp $ */
 /*
- * Copyright (c) 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -16,6 +16,7 @@
  */
 #include <sys/types.h>
 
+#include <assert.h>
 #include <stdlib.h>
 #include <string.h>
 
 typedef        void    (*state_handler)(STATE_ARGS);
 
 static void     state_bd(STATE_ARGS);
+static void     state_bl(STATE_ARGS);
 static void     state_dl(STATE_ARGS);
 static void     state_sh(STATE_ARGS);
 static void     state_sm(STATE_ARGS);
 
-static const state_handler state_handlers[MDOC_MAX] = {
-       NULL,           /* Ap */
+static const state_handler state_handlers[MDOC_MAX - MDOC_Dd] = {
        NULL,           /* Dd */
        NULL,           /* Dt */
        NULL,           /* Os */
@@ -46,11 +47,12 @@ static      const state_handler state_handlers[MDOC_MAX] = {
        state_dl,       /* Dl */
        state_bd,       /* Bd */
        NULL,           /* Ed */
-       NULL,           /* Bl */
+       state_bl,       /* Bl */
        NULL,           /* El */
        NULL,           /* It */
        NULL,           /* Ad */
        NULL,           /* An */
+       NULL,           /* Ap */
        NULL,           /* Ar */
        NULL,           /* Cd */
        NULL,           /* Cm */
@@ -153,11 +155,8 @@ static     const state_handler state_handlers[MDOC_MAX] = {
        NULL,           /* En */
        NULL,           /* Dx */
        NULL,           /* %Q */
-       NULL,           /* br */
-       NULL,           /* sp */
        NULL,           /* %U */
        NULL,           /* Ta */
-       NULL,           /* ll */
 };
 
 
@@ -166,13 +165,14 @@ mdoc_state(struct roff_man *mdoc, struct roff_node *n)
 {
        state_handler handler;
 
-       if (n->tok == TOKEN_NONE)
+       if (n->tok == TOKEN_NONE || n->tok < ROFF_MAX)
                return;
 
-       if ( ! (mdoc_macros[n->tok].flags & MDOC_PROLOGUE))
+       assert(n->tok >= MDOC_Dd && n->tok < MDOC_MAX);
+       if ((mdoc_macro(n->tok)->flags & MDOC_PROLOGUE) == 0)
                mdoc->flags |= MDOC_PBODY;
 
-       handler = state_handlers[n->tok];
+       handler = state_handlers[n->tok - MDOC_Dd];
        if (*handler)
                (*handler)(mdoc, n);
 }
@@ -194,6 +194,9 @@ state_bd(STATE_ARGS)
            (n->type != ROFFT_BODY || n->end != ENDBODY_NOT))
                return;
 
+       if (n->parent->args == NULL)
+               return;
+
        arg = n->parent->args->argv[0].arg;
        if (arg != MDOC_Literal && arg != MDOC_Unfilled)
                return;
@@ -201,6 +204,30 @@ state_bd(STATE_ARGS)
        state_dl(mdoc, n);
 }
 
+static void
+state_bl(STATE_ARGS)
+{
+       struct mdoc_arg *args;
+       size_t           i;
+
+       if (n->type != ROFFT_HEAD || n->parent->args == NULL)
+               return;
+
+       args = n->parent->args;
+       for (i = 0; i < args->argc; i++) {
+               switch(args->argv[i].arg) {
+               case MDOC_Diag:
+                       n->norm->Bl.type = LIST_diag;
+                       return;
+               case MDOC_Column:
+                       n->norm->Bl.type = LIST_column;
+                       return;
+               default:
+                       break;
+               }
+       }
+}
+
 static void
 state_dl(STATE_ARGS)
 {
@@ -226,7 +253,7 @@ state_sh(STATE_ARGS)
        if (n->type != ROFFT_HEAD)
                return;
 
-       if ( ! (n->flags & MDOC_VALID)) {
+       if ( ! (n->flags & NODE_VALID)) {
                secname = NULL;
                deroff(&secname, n);