-/* $Id: mdoc_state.c,v 1.7 2017/05/05 13:17:55 schwarze Exp $ */
+/* $Id: mdoc_state.c,v 1.17 2020/06/22 19:20:40 schwarze Exp $ */
/*
* Copyright (c) 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
*
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+#include "config.h"
+
#include <sys/types.h>
#include <assert.h>
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "roff.h"
#include "mdoc.h"
#include "libmandoc.h"
+#include "roff_int.h"
#include "libmdoc.h"
#define STATE_ARGS struct roff_man *mdoc, struct roff_node *n
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 - MDOC_Dd] = {
+static const state_handler state_handlers[MDOC_MAX - MDOC_Dd] = {
NULL, /* Dd */
NULL, /* Dt */
NULL, /* Os */
NULL, /* Ss */
NULL, /* Pp */
NULL, /* D1 */
- state_dl, /* Dl */
- state_bd, /* Bd */
+ NULL, /* Dl */
+ NULL, /* Bd */
NULL, /* Ed */
state_bl, /* Bl */
NULL, /* El */
NULL, /* En */
NULL, /* Dx */
NULL, /* %Q */
- NULL, /* sp */
NULL, /* %U */
NULL, /* Ta */
+ NULL, /* Tg */
};
-static const state_handler *const state_handlers = __state_handlers - MDOC_Dd;
void
return;
assert(n->tok >= MDOC_Dd && n->tok < MDOC_MAX);
- if ( ! (mdoc_macros[n->tok].flags & MDOC_PROLOGUE))
+ 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);
}
-void
-mdoc_state_reset(struct roff_man *mdoc)
-{
-
- roff_setreg(mdoc->roff, "nS", 0, '=');
- mdoc->flags = 0;
-}
-
-static void
-state_bd(STATE_ARGS)
-{
- enum mdocargt arg;
-
- if (n->type != ROFFT_HEAD &&
- (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;
-
- 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;
- switch(n->parent->args->argv[0].arg) {
- case MDOC_Diag:
- n->norm->Bl.type = LIST_diag;
- break;
- case MDOC_Column:
- n->norm->Bl.type = LIST_column;
- break;
- default:
- break;
- }
-}
-
-static void
-state_dl(STATE_ARGS)
-{
-
- switch (n->type) {
- case ROFFT_HEAD:
- mdoc->flags |= MDOC_LITERAL;
- break;
- case ROFFT_BODY:
- mdoc->flags &= ~MDOC_LITERAL;
- break;
- default:
- break;
+ 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;
+ }
}
}