[BACK]Return to mdoc_state.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Annotation of mandoc/mdoc_state.c, Revision 1.14

1.14    ! schwarze    1: /*     $Id: mdoc_state.c,v 1.13 2018/12/31 04:55:47 schwarze Exp $ */
1.1       schwarze    2: /*
1.5       schwarze    3:  * Copyright (c) 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
1.1       schwarze    4:  *
                      5:  * Permission to use, copy, modify, and distribute this software for any
                      6:  * purpose with or without fee is hereby granted, provided that the above
                      7:  * copyright notice and this permission notice appear in all copies.
                      8:  *
                      9:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
                     10:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
                     11:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
                     12:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
                     13:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
                     14:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
                     15:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     16:  */
                     17: #include <sys/types.h>
                     18:
1.6       schwarze   19: #include <assert.h>
1.11      schwarze   20: #include <stdio.h>
1.1       schwarze   21: #include <stdlib.h>
                     22: #include <string.h>
                     23:
                     24: #include "mandoc.h"
                     25: #include "roff.h"
                     26: #include "mdoc.h"
                     27: #include "libmandoc.h"
1.12      schwarze   28: #include "roff_int.h"
1.1       schwarze   29: #include "libmdoc.h"
                     30:
                     31: #define STATE_ARGS  struct roff_man *mdoc, struct roff_node *n
                     32:
                     33: typedef        void    (*state_handler)(STATE_ARGS);
                     34:
                     35: static void     state_bd(STATE_ARGS);
1.2       schwarze   36: static void     state_bl(STATE_ARGS);
1.1       schwarze   37: static void     state_dl(STATE_ARGS);
                     38: static void     state_sh(STATE_ARGS);
                     39: static void     state_sm(STATE_ARGS);
                     40:
1.10      schwarze   41: static const state_handler state_handlers[MDOC_MAX - MDOC_Dd] = {
1.1       schwarze   42:        NULL,           /* Dd */
                     43:        NULL,           /* Dt */
                     44:        NULL,           /* Os */
                     45:        state_sh,       /* Sh */
                     46:        NULL,           /* Ss */
                     47:        NULL,           /* Pp */
                     48:        NULL,           /* D1 */
                     49:        state_dl,       /* Dl */
                     50:        state_bd,       /* Bd */
                     51:        NULL,           /* Ed */
1.2       schwarze   52:        state_bl,       /* Bl */
1.1       schwarze   53:        NULL,           /* El */
                     54:        NULL,           /* It */
                     55:        NULL,           /* Ad */
                     56:        NULL,           /* An */
1.5       schwarze   57:        NULL,           /* Ap */
1.1       schwarze   58:        NULL,           /* Ar */
                     59:        NULL,           /* Cd */
                     60:        NULL,           /* Cm */
                     61:        NULL,           /* Dv */
                     62:        NULL,           /* Er */
                     63:        NULL,           /* Ev */
                     64:        NULL,           /* Ex */
                     65:        NULL,           /* Fa */
                     66:        NULL,           /* Fd */
                     67:        NULL,           /* Fl */
                     68:        NULL,           /* Fn */
                     69:        NULL,           /* Ft */
                     70:        NULL,           /* Ic */
                     71:        NULL,           /* In */
                     72:        NULL,           /* Li */
                     73:        NULL,           /* Nd */
                     74:        NULL,           /* Nm */
                     75:        NULL,           /* Op */
                     76:        NULL,           /* Ot */
                     77:        NULL,           /* Pa */
                     78:        NULL,           /* Rv */
                     79:        NULL,           /* St */
                     80:        NULL,           /* Va */
                     81:        NULL,           /* Vt */
                     82:        NULL,           /* Xr */
                     83:        NULL,           /* %A */
                     84:        NULL,           /* %B */
                     85:        NULL,           /* %D */
                     86:        NULL,           /* %I */
                     87:        NULL,           /* %J */
                     88:        NULL,           /* %N */
                     89:        NULL,           /* %O */
                     90:        NULL,           /* %P */
                     91:        NULL,           /* %R */
                     92:        NULL,           /* %T */
                     93:        NULL,           /* %V */
                     94:        NULL,           /* Ac */
                     95:        NULL,           /* Ao */
                     96:        NULL,           /* Aq */
                     97:        NULL,           /* At */
                     98:        NULL,           /* Bc */
                     99:        NULL,           /* Bf */
                    100:        NULL,           /* Bo */
                    101:        NULL,           /* Bq */
                    102:        NULL,           /* Bsx */
                    103:        NULL,           /* Bx */
                    104:        NULL,           /* Db */
                    105:        NULL,           /* Dc */
                    106:        NULL,           /* Do */
                    107:        NULL,           /* Dq */
                    108:        NULL,           /* Ec */
                    109:        NULL,           /* Ef */
                    110:        NULL,           /* Em */
                    111:        NULL,           /* Eo */
                    112:        NULL,           /* Fx */
                    113:        NULL,           /* Ms */
                    114:        NULL,           /* No */
                    115:        NULL,           /* Ns */
                    116:        NULL,           /* Nx */
                    117:        NULL,           /* Ox */
                    118:        NULL,           /* Pc */
                    119:        NULL,           /* Pf */
                    120:        NULL,           /* Po */
                    121:        NULL,           /* Pq */
                    122:        NULL,           /* Qc */
                    123:        NULL,           /* Ql */
                    124:        NULL,           /* Qo */
                    125:        NULL,           /* Qq */
                    126:        NULL,           /* Re */
                    127:        NULL,           /* Rs */
                    128:        NULL,           /* Sc */
                    129:        NULL,           /* So */
                    130:        NULL,           /* Sq */
                    131:        state_sm,       /* Sm */
                    132:        NULL,           /* Sx */
                    133:        NULL,           /* Sy */
                    134:        NULL,           /* Tn */
                    135:        NULL,           /* Ux */
                    136:        NULL,           /* Xc */
                    137:        NULL,           /* Xo */
                    138:        NULL,           /* Fo */
                    139:        NULL,           /* Fc */
                    140:        NULL,           /* Oo */
                    141:        NULL,           /* Oc */
                    142:        NULL,           /* Bk */
                    143:        NULL,           /* Ek */
                    144:        NULL,           /* Bt */
                    145:        NULL,           /* Hf */
                    146:        NULL,           /* Fr */
                    147:        NULL,           /* Ud */
                    148:        NULL,           /* Lb */
                    149:        NULL,           /* Lp */
                    150:        NULL,           /* Lk */
                    151:        NULL,           /* Mt */
                    152:        NULL,           /* Brq */
                    153:        NULL,           /* Bro */
                    154:        NULL,           /* Brc */
                    155:        NULL,           /* %C */
                    156:        NULL,           /* Es */
                    157:        NULL,           /* En */
                    158:        NULL,           /* Dx */
                    159:        NULL,           /* %Q */
                    160:        NULL,           /* %U */
                    161:        NULL,           /* Ta */
                    162: };
                    163:
                    164:
                    165: void
                    166: mdoc_state(struct roff_man *mdoc, struct roff_node *n)
                    167: {
                    168:        state_handler handler;
                    169:
1.6       schwarze  170:        if (n->tok == TOKEN_NONE || n->tok < ROFF_MAX)
1.1       schwarze  171:                return;
                    172:
1.6       schwarze  173:        assert(n->tok >= MDOC_Dd && n->tok < MDOC_MAX);
1.10      schwarze  174:        if ((mdoc_macro(n->tok)->flags & MDOC_PROLOGUE) == 0)
1.1       schwarze  175:                mdoc->flags |= MDOC_PBODY;
                    176:
1.10      schwarze  177:        handler = state_handlers[n->tok - MDOC_Dd];
1.1       schwarze  178:        if (*handler)
                    179:                (*handler)(mdoc, n);
                    180: }
                    181:
                    182: static void
                    183: state_bd(STATE_ARGS)
                    184: {
                    185:        enum mdocargt arg;
                    186:
                    187:        if (n->type != ROFFT_HEAD &&
                    188:            (n->type != ROFFT_BODY || n->end != ENDBODY_NOT))
1.3       schwarze  189:                return;
                    190:
                    191:        if (n->parent->args == NULL)
1.1       schwarze  192:                return;
                    193:
                    194:        arg = n->parent->args->argv[0].arg;
                    195:        if (arg != MDOC_Literal && arg != MDOC_Unfilled)
                    196:                return;
                    197:
                    198:        state_dl(mdoc, n);
1.2       schwarze  199: }
                    200:
                    201: static void
                    202: state_bl(STATE_ARGS)
                    203: {
1.9       schwarze  204:        struct mdoc_arg *args;
                    205:        size_t           i;
1.2       schwarze  206:
                    207:        if (n->type != ROFFT_HEAD || n->parent->args == NULL)
                    208:                return;
                    209:
1.9       schwarze  210:        args = n->parent->args;
                    211:        for (i = 0; i < args->argc; i++) {
                    212:                switch(args->argv[i].arg) {
                    213:                case MDOC_Diag:
                    214:                        n->norm->Bl.type = LIST_diag;
                    215:                        return;
                    216:                case MDOC_Column:
                    217:                        n->norm->Bl.type = LIST_column;
                    218:                        return;
                    219:                default:
                    220:                        break;
                    221:                }
1.2       schwarze  222:        }
1.1       schwarze  223: }
                    224:
                    225: static void
                    226: state_dl(STATE_ARGS)
                    227: {
                    228:
                    229:        switch (n->type) {
                    230:        case ROFFT_HEAD:
1.14    ! schwarze  231:                mdoc->flags |= ROFF_NOFILL;
1.1       schwarze  232:                break;
                    233:        case ROFFT_BODY:
1.14    ! schwarze  234:                mdoc->flags &= ~ROFF_NOFILL;
1.1       schwarze  235:                break;
                    236:        default:
                    237:                break;
                    238:        }
                    239: }
                    240:
                    241: static void
                    242: state_sh(STATE_ARGS)
                    243: {
                    244:        struct roff_node *nch;
                    245:        char             *secname;
                    246:
                    247:        if (n->type != ROFFT_HEAD)
                    248:                return;
                    249:
1.4       schwarze  250:        if ( ! (n->flags & NODE_VALID)) {
1.1       schwarze  251:                secname = NULL;
                    252:                deroff(&secname, n);
                    253:
                    254:                /*
                    255:                 * Set the section attribute for the BLOCK, HEAD,
                    256:                 * and HEAD children; the latter can only be TEXT
                    257:                 * nodes, so no recursion is needed.  For other
                    258:                 * nodes, including the .Sh BODY, this is done
                    259:                 * when allocating the node data structures, but
                    260:                 * for .Sh BLOCK and HEAD, the section is still
                    261:                 * unknown at that time.
                    262:                 */
                    263:
                    264:                n->sec = n->parent->sec = secname == NULL ?
                    265:                    SEC_CUSTOM : mdoc_a2sec(secname);
                    266:                for (nch = n->child; nch != NULL; nch = nch->next)
                    267:                        nch->sec = n->sec;
                    268:                free(secname);
                    269:        }
                    270:
                    271:        if ((mdoc->lastsec = n->sec) == SEC_SYNOPSIS) {
                    272:                roff_setreg(mdoc->roff, "nS", 1, '=');
                    273:                mdoc->flags |= MDOC_SYNOPSIS;
                    274:        } else {
                    275:                roff_setreg(mdoc->roff, "nS", 0, '=');
                    276:                mdoc->flags &= ~MDOC_SYNOPSIS;
                    277:        }
                    278: }
                    279:
                    280: static void
                    281: state_sm(STATE_ARGS)
                    282: {
                    283:
                    284:        if (n->child == NULL)
                    285:                mdoc->flags ^= MDOC_SMOFF;
                    286:        else if ( ! strcmp(n->child->string, "on"))
                    287:                mdoc->flags &= ~MDOC_SMOFF;
                    288:        else if ( ! strcmp(n->child->string, "off"))
                    289:                mdoc->flags |= MDOC_SMOFF;
                    290: }

CVSweb