371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov/* $Id: mdoc_state.c,v 1.3 2015/10/30 18:53:54 schwarze Exp $ */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov/*
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * Copyright (c) 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov *
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * Permission to use, copy, modify, and distribute this software for any
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * purpose with or without fee is hereby granted, provided that the above
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * copyright notice and this permission notice appear in all copies.
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov *
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov#include <sys/types.h>
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov#include <stdlib.h>
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov#include <string.h>
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov#include "mandoc.h"
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov#include "roff.h"
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov#include "mdoc.h"
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov#include "libmandoc.h"
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov#include "libmdoc.h"
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov#define STATE_ARGS struct roff_man *mdoc, struct roff_node *n
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovtypedef void (*state_handler)(STATE_ARGS);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic void state_bd(STATE_ARGS);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic void state_bl(STATE_ARGS);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic void state_dl(STATE_ARGS);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic void state_sh(STATE_ARGS);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic void state_sm(STATE_ARGS);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic const state_handler state_handlers[MDOC_MAX] = {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ap */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Dd */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Dt */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Os */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov state_sh, /* Sh */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ss */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Pp */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* D1 */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov state_dl, /* Dl */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov state_bd, /* Bd */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ed */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov state_bl, /* Bl */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* El */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* It */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ad */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* An */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ar */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Cd */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Cm */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Dv */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Er */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ev */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ex */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Fa */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Fd */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Fl */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Fn */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ft */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ic */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* In */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Li */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Nd */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Nm */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Op */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ot */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Pa */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Rv */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* St */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Va */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Vt */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Xr */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %A */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %B */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %D */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %I */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %J */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %N */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %O */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %P */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %R */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %T */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %V */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ac */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ao */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Aq */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* At */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Bc */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Bf */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Bo */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Bq */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Bsx */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Bx */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Db */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Dc */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Do */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Dq */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ec */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ef */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Em */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Eo */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Fx */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ms */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* No */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ns */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Nx */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ox */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Pc */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Pf */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Po */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Pq */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Qc */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ql */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Qo */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Qq */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Re */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Rs */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Sc */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* So */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Sq */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov state_sm, /* Sm */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Sx */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Sy */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Tn */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ux */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Xc */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Xo */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Fo */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Fc */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Oo */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Oc */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Bk */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ek */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Bt */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Hf */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Fr */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ud */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Lb */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Lp */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Lk */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Mt */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Brq */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Bro */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Brc */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %C */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Es */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* En */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Dx */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %Q */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* br */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* sp */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* %U */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* Ta */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov NULL, /* ll */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov};
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovvoid
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovmdoc_state(struct roff_man *mdoc, struct roff_node *n)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov state_handler handler;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->tok == TOKEN_NONE)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if ( ! (mdoc_macros[n->tok].flags & MDOC_PROLOGUE))
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->flags |= MDOC_PBODY;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov handler = state_handlers[n->tok];
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (*handler)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov (*handler)(mdoc, n);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov}
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovvoid
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovmdoc_state_reset(struct roff_man *mdoc)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov roff_setreg(mdoc->roff, "nS", 0, '=');
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->flags = 0;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov}
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic void
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstate_bd(STATE_ARGS)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov enum mdocargt arg;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->type != ROFFT_HEAD &&
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov (n->type != ROFFT_BODY || n->end != ENDBODY_NOT))
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->parent->args == NULL)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov arg = n->parent->args->argv[0].arg;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (arg != MDOC_Literal && arg != MDOC_Unfilled)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov state_dl(mdoc, n);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov}
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic void
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstate_bl(STATE_ARGS)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->type != ROFFT_HEAD || n->parent->args == NULL)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov switch(n->parent->args->argv[0].arg) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov case MDOC_Diag:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n->norm->Bl.type = LIST_diag;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov break;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov case MDOC_Column:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n->norm->Bl.type = LIST_column;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov break;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov default:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov break;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov }
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov}
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic void
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstate_dl(STATE_ARGS)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov switch (n->type) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov case ROFFT_HEAD:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->flags |= MDOC_LITERAL;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov break;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov case ROFFT_BODY:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->flags &= ~MDOC_LITERAL;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov break;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov default:
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov break;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov }
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov}
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic void
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstate_sh(STATE_ARGS)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov struct roff_node *nch;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov char *secname;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->type != ROFFT_HEAD)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov return;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if ( ! (n->flags & MDOC_VALID)) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov secname = NULL;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov deroff(&secname, n);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov /*
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * Set the section attribute for the BLOCK, HEAD,
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * and HEAD children; the latter can only be TEXT
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * nodes, so no recursion is needed. For other
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * nodes, including the .Sh BODY, this is done
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * when allocating the node data structures, but
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * for .Sh BLOCK and HEAD, the section is still
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov * unknown at that time.
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov */
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov n->sec = n->parent->sec = secname == NULL ?
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov SEC_CUSTOM : mdoc_a2sec(secname);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov for (nch = n->child; nch != NULL; nch = nch->next)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov nch->sec = n->sec;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov free(secname);
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov }
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if ((mdoc->lastsec = n->sec) == SEC_SYNOPSIS) {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov roff_setreg(mdoc->roff, "nS", 1, '=');
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->flags |= MDOC_SYNOPSIS;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov } else {
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov roff_setreg(mdoc->roff, "nS", 0, '=');
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->flags &= ~MDOC_SYNOPSIS;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov }
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov}
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstatic void
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankovstate_sm(STATE_ARGS)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov{
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov if (n->child == NULL)
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->flags ^= MDOC_SMOFF;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov else if ( ! strcmp(n->child->string, "on"))
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->flags &= ~MDOC_SMOFF;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov else if ( ! strcmp(n->child->string, "off"))
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov mdoc->flags |= MDOC_SMOFF;
371584c2eae4cf827fd406ba26c14f021adaaa70Yuri Pankov}