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

Annotation of mandoc/validate.c, Revision 1.17

1.17    ! kristaps    1: /* $Id: validate.c,v 1.16 2009/01/05 14:14:04 kristaps Exp $ */
1.1       kristaps    2: /*
                      3:  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
                      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
                      7:  * above copyright notice and this permission notice appear in all
                      8:  * copies.
                      9:  *
                     10:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
                     11:  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
                     12:  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
                     13:  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
                     14:  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
                     15:  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
                     16:  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
                     17:  * PERFORMANCE OF THIS SOFTWARE.
                     18:  */
                     19: #include <assert.h>
1.8       kristaps   20: #include <stdlib.h>
1.1       kristaps   21:
                     22: #include "private.h"
                     23:
1.2       kristaps   24:
1.17    ! kristaps   25: typedef        int     (*v_pre)(struct mdoc *, int, int,
1.14      kristaps   26:                        int, const struct mdoc_arg *);
1.17    ! kristaps   27: typedef        int     (*v_post)(struct mdoc *, int, int);
1.14      kristaps   28:
                     29:
                     30: struct valids {
1.17    ! kristaps   31:        v_pre    pre;
        !            32:        v_post  *post;
1.14      kristaps   33: };
1.1       kristaps   34:
1.11      kristaps   35:
1.17    ! kristaps   36: static int     pre_sh(struct mdoc *, int, int,
1.14      kristaps   37:                        int, const struct mdoc_arg *);
1.17    ! kristaps   38: static int     post_headchild_err_ge1(struct mdoc *, int, int);
        !            39: static int     post_headchild_err_le8(struct mdoc *, int, int);
        !            40: static int     post_bodychild_warn_ge1(struct mdoc *, int, int);
        !            41:
        !            42: static v_post  posts_sh[] = { post_headchild_err_ge1,
        !            43:                        post_bodychild_warn_ge1,
        !            44:                        post_headchild_err_le8, NULL };
1.9       kristaps   45:
1.12      kristaps   46:
1.9       kristaps   47: const  struct valids mdoc_valids[MDOC_MAX] = {
1.17    ! kristaps   48:        { NULL, NULL }, /* \" */
        !            49:        { NULL, NULL }, /* Dd */ /* TODO */
        !            50:        { NULL, NULL }, /* Dt */ /* TODO */
        !            51:        { NULL, NULL }, /* Os */ /* TODO */
        !            52:        { pre_sh, posts_sh }, /* Sh */ /* FIXME: preceding Pp. */
        !            53:        { NULL, NULL }, /* Ss */ /* FIXME: preceding Pp. */
        !            54:        { NULL, NULL }, /* Pp */
        !            55:        { NULL, NULL }, /* D1 */
        !            56:        { NULL, NULL }, /* Dl */
        !            57:        { NULL, NULL }, /* Bd */ /* FIXME: preceding Pp. */
        !            58:        { NULL, NULL }, /* Ed */
        !            59:        { NULL, NULL }, /* Bl */ /* FIXME: preceding Pp. */
        !            60:        { NULL, NULL }, /* El */
        !            61:        { NULL, NULL }, /* It */
        !            62:        { NULL, NULL }, /* Ad */
        !            63:        { NULL, NULL }, /* An */
        !            64:        { NULL, NULL }, /* Ar */
        !            65:        { NULL, NULL }, /* Cd */
        !            66:        { NULL, NULL }, /* Cm */
        !            67:        { NULL, NULL }, /* Dv */
        !            68:        { NULL, NULL }, /* Er */
        !            69:        { NULL, NULL }, /* Ev */
        !            70:        { NULL, NULL }, /* Ex */
        !            71:        { NULL, NULL }, /* Fa */
        !            72:        { NULL, NULL }, /* Fd */
        !            73:        { NULL, NULL }, /* Fl */
        !            74:        { NULL, NULL }, /* Fn */
        !            75:        { NULL, NULL }, /* Ft */
        !            76:        { NULL, NULL }, /* Ic */
        !            77:        { NULL, NULL }, /* In */
        !            78:        { NULL, NULL }, /* Li */
        !            79:        { NULL, NULL }, /* Nd */
        !            80:        { NULL, NULL }, /* Nm */
        !            81:        { NULL, NULL }, /* Op */
        !            82:        { NULL, NULL }, /* Ot */
        !            83:        { NULL, NULL }, /* Pa */
        !            84:        { NULL, NULL }, /* Rv */
        !            85:        { NULL, NULL }, /* St */
        !            86:        { NULL, NULL }, /* Va */
        !            87:        { NULL, NULL }, /* Vt */
        !            88:        { NULL, NULL }, /* Xr */
        !            89:        { NULL, NULL }, /* %A */
        !            90:        { NULL, NULL }, /* %B */
        !            91:        { NULL, NULL }, /* %D */
        !            92:        { NULL, NULL }, /* %I */
        !            93:        { NULL, NULL }, /* %J */
        !            94:        { NULL, NULL }, /* %N */
        !            95:        { NULL, NULL }, /* %O */
        !            96:        { NULL, NULL }, /* %P */
        !            97:        { NULL, NULL }, /* %R */
        !            98:        { NULL, NULL }, /* %T */
        !            99:        { NULL, NULL }, /* %V */
        !           100:        { NULL, NULL }, /* Ac */
        !           101:        { NULL, NULL }, /* Ao */
        !           102:        { NULL, NULL }, /* Aq */
        !           103:        { NULL, NULL }, /* At */ /* FIXME */
        !           104:        { NULL, NULL }, /* Bc */
        !           105:        { NULL, NULL }, /* Bf */
        !           106:        { NULL, NULL }, /* Bo */
        !           107:        { NULL, NULL }, /* Bq */
        !           108:        { NULL, NULL }, /* Bsx */
        !           109:        { NULL, NULL }, /* Bx */
        !           110:        { NULL, NULL }, /* Db */
        !           111:        { NULL, NULL }, /* Dc */
        !           112:        { NULL, NULL }, /* Do */
        !           113:        { NULL, NULL }, /* Dq */
        !           114:        { NULL, NULL }, /* Ec */
        !           115:        { NULL, NULL }, /* Ef */ /* -symbolic, etc. */
        !           116:        { NULL, NULL }, /* Em */
        !           117:        { NULL, NULL }, /* Eo */
        !           118:        { NULL, NULL }, /* Fx */
        !           119:        { NULL, NULL }, /* Ms */
        !           120:        { NULL, NULL }, /* No */
        !           121:        { NULL, NULL }, /* Ns */
        !           122:        { NULL, NULL }, /* Nx */
        !           123:        { NULL, NULL }, /* Ox */
        !           124:        { NULL, NULL }, /* Pc */
        !           125:        { NULL, NULL }, /* Pf */ /* 2 or more arguments */
        !           126:        { NULL, NULL }, /* Po */
        !           127:        { NULL, NULL }, /* Pq */ /* FIXME: ignore following Sh/Ss */
        !           128:        { NULL, NULL }, /* Qc */
        !           129:        { NULL, NULL }, /* Ql */
        !           130:        { NULL, NULL }, /* Qo */
        !           131:        { NULL, NULL }, /* Qq */
        !           132:        { NULL, NULL }, /* Re */
        !           133:        { NULL, NULL }, /* Rs */
        !           134:        { NULL, NULL }, /* Sc */
        !           135:        { NULL, NULL }, /* So */
        !           136:        { NULL, NULL }, /* Sq */
        !           137:        { NULL, NULL }, /* Sm */
        !           138:        { NULL, NULL }, /* Sx */
        !           139:        { NULL, NULL }, /* Sy */
        !           140:        { NULL, NULL }, /* Tn */
        !           141:        { NULL, NULL }, /* Ux */
        !           142:        { NULL, NULL }, /* Xc */
        !           143:        { NULL, NULL }, /* Xo */
        !           144:        { NULL, NULL }, /* Fo */
        !           145:        { NULL, NULL }, /* Fc */
        !           146:        { NULL, NULL }, /* Oo */
        !           147:        { NULL, NULL }, /* Oc */
        !           148:        { NULL, NULL }, /* Bk */
        !           149:        { NULL, NULL }, /* Ek */
        !           150:        { NULL, NULL }, /* Bt */
        !           151:        { NULL, NULL }, /* Hf */
        !           152:        { NULL, NULL }, /* Fr */
        !           153:        { NULL, NULL }, /* Ud */
1.9       kristaps  154: };
1.6       kristaps  155:
                    156:
                    157: static int
1.17    ! kristaps  158: post_bodychild_warn_ge1(struct mdoc *mdoc, int tok, int pos)
1.6       kristaps  159: {
                    160:
1.17    ! kristaps  161:        if (MDOC_BODY != mdoc->last->type)
1.8       kristaps  162:                return(1);
1.17    ! kristaps  163:        if (mdoc->last->child)
1.9       kristaps  164:                return(1);
1.1       kristaps  165:
1.17    ! kristaps  166:        return(mdoc_warn(mdoc, tok, pos, WARN_ARGS_GE1));
1.8       kristaps  167: }
1.1       kristaps  168:
                    169:
1.8       kristaps  170: static int
1.17    ! kristaps  171: post_headchild_err_ge1(struct mdoc *mdoc, int tok, int pos)
1.8       kristaps  172: {
1.1       kristaps  173:
1.17    ! kristaps  174:        if (MDOC_HEAD != mdoc->last->type)
1.9       kristaps  175:                return(1);
1.17    ! kristaps  176:        if (mdoc->last->child)
1.9       kristaps  177:                return(1);
                    178:        return(mdoc_err(mdoc, tok, pos, ERR_ARGS_GE1));
1.1       kristaps  179: }
                    180:
                    181:
1.9       kristaps  182: static int
1.17    ! kristaps  183: post_headchild_err_le8(struct mdoc *mdoc, int tok, int pos)
1.14      kristaps  184: {
1.17    ! kristaps  185:        int               i;
1.14      kristaps  186:        struct mdoc_node *n;
                    187:
1.17    ! kristaps  188:        if (MDOC_HEAD != mdoc->last->type)
1.14      kristaps  189:                return(1);
1.17    ! kristaps  190:        for (i = 0, n = mdoc->last->child; n; n = n->next, i++)
        !           191:                /* Do nothing. */ ;
        !           192:        if (i <= 8)
1.11      kristaps  193:                return(1);
1.17    ! kristaps  194:        return(mdoc_err(mdoc, tok, pos, ERR_ARGS_LE8));
1.14      kristaps  195: }
                    196:
                    197:
                    198: static int
1.17    ! kristaps  199: pre_sh(struct mdoc *mdoc, int tok, int pos,
1.14      kristaps  200:                int argc, const struct mdoc_arg *argv)
                    201: {
                    202:
                    203:        return(1);
1.11      kristaps  204: }
                    205:
                    206:
1.17    ! kristaps  207: int
        !           208: mdoc_valid_pre(struct mdoc *mdoc, int tok, int pos,
1.11      kristaps  209:                int argc, const struct mdoc_arg *argv)
                    210: {
                    211:
1.17    ! kristaps  212:        if (NULL == mdoc_valids[tok].pre)
1.11      kristaps  213:                return(1);
1.17    ! kristaps  214:        return((*mdoc_valids[tok].pre)(mdoc, tok, pos, argc, argv));
1.11      kristaps  215: }
                    216:
                    217:
1.17    ! kristaps  218: int
        !           219: mdoc_valid_post(struct mdoc *mdoc, int pos)
1.11      kristaps  220: {
1.17    ! kristaps  221:        v_post          *p;
        !           222:        int              t;
1.11      kristaps  223:
1.17    ! kristaps  224:        switch (mdoc->last->type) {
        !           225:        case (MDOC_BODY):
        !           226:                t = mdoc->last->data.body.tok;
        !           227:                break;
        !           228:        case (MDOC_ELEM):
        !           229:                t = mdoc->last->data.elem.tok;
        !           230:                break;
        !           231:        case (MDOC_BLOCK):
        !           232:                t = mdoc->last->data.block.tok;
        !           233:                break;
        !           234:        case (MDOC_HEAD):
        !           235:                t = mdoc->last->data.head.tok;
        !           236:                break;
        !           237:        default:
1.8       kristaps  238:                return(1);
                    239:        }
1.14      kristaps  240:
1.17    ! kristaps  241:        if (NULL == mdoc_valids[t].post)
1.9       kristaps  242:                return(1);
1.8       kristaps  243:
1.17    ! kristaps  244:        for (p = mdoc_valids[t].post; *p; p++)
        !           245:                if ( ! (*p)(mdoc, t, pos))
        !           246:                        return(0);
1.11      kristaps  247:
1.14      kristaps  248:        return(1);
1.11      kristaps  249: }
1.14      kristaps  250:

CVSweb