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

Annotation of mandoc/roff_validate.c, Revision 1.16

1.16    ! schwarze    1: /*     $Id: roff_validate.c,v 1.15 2018/12/16 00:17:02 schwarze Exp $ */
1.1       schwarze    2: /*
1.10      schwarze    3:  * Copyright (c) 2010, 2017, 2018 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:
                     19: #include <assert.h>
1.13      schwarze   20: #include <stdio.h>
1.10      schwarze   21: #include <string.h>
1.1       schwarze   22:
                     23: #include "mandoc.h"
                     24: #include "roff.h"
                     25: #include "libmandoc.h"
                     26: #include "roff_int.h"
                     27:
                     28: #define        ROFF_VALID_ARGS struct roff_man *man, struct roff_node *n
                     29:
                     30: typedef        void    (*roff_valid_fp)(ROFF_VALID_ARGS);
                     31:
1.11      schwarze   32: static void      roff_valid_br(ROFF_VALID_ARGS);
1.16    ! schwarze   33: static void      roff_valid_fi(ROFF_VALID_ARGS);
1.1       schwarze   34: static void      roff_valid_ft(ROFF_VALID_ARGS);
1.16    ! schwarze   35: static void      roff_valid_nf(ROFF_VALID_ARGS);
1.11      schwarze   36: static void      roff_valid_sp(ROFF_VALID_ARGS);
1.1       schwarze   37:
                     38: static const roff_valid_fp roff_valids[ROFF_MAX] = {
1.11      schwarze   39:        roff_valid_br,  /* br */
1.7       schwarze   40:        NULL,  /* ce */
1.16    ! schwarze   41:        roff_valid_fi,  /* fi */
1.1       schwarze   42:        roff_valid_ft,  /* ft */
1.2       schwarze   43:        NULL,  /* ll */
1.6       schwarze   44:        NULL,  /* mc */
1.16    ! schwarze   45:        roff_valid_nf,  /* nf */
1.9       schwarze   46:        NULL,  /* po */
1.8       schwarze   47:        NULL,  /* rj */
1.11      schwarze   48:        roff_valid_sp,  /* sp */
1.4       schwarze   49:        NULL,  /* ta */
1.5       schwarze   50:        NULL,  /* ti */
1.1       schwarze   51: };
                     52:
                     53:
                     54: void
                     55: roff_validate(struct roff_man *man)
                     56: {
                     57:        struct roff_node        *n;
                     58:
                     59:        n = man->last;
                     60:        assert(n->tok < ROFF_MAX);
                     61:        if (roff_valids[n->tok] != NULL)
                     62:                (*roff_valids[n->tok])(man, n);
                     63: }
                     64:
                     65: static void
1.11      schwarze   66: roff_valid_br(ROFF_VALID_ARGS)
                     67: {
                     68:        struct roff_node        *np;
                     69:
1.12      schwarze   70:        if (n->next != NULL && n->next->type == ROFFT_TEXT &&
                     71:            *n->next->string == ' ') {
1.14      schwarze   72:                mandoc_msg(MANDOCERR_PAR_SKIP, n->line, n->pos,
1.12      schwarze   73:                    "br before text line with leading blank");
                     74:                roff_node_delete(man, n);
                     75:                return;
                     76:        }
1.11      schwarze   77:
                     78:        if ((np = n->prev) == NULL)
                     79:                return;
                     80:
                     81:        switch (np->tok) {
                     82:        case ROFF_br:
                     83:        case ROFF_sp:
                     84:        case MDOC_Pp:
1.14      schwarze   85:                mandoc_msg(MANDOCERR_PAR_SKIP,
1.11      schwarze   86:                    n->line, n->pos, "br after %s", roff_name[np->tok]);
                     87:                roff_node_delete(man, n);
                     88:                break;
                     89:        default:
                     90:                break;
                     91:        }
                     92: }
                     93:
                     94: static void
1.16    ! schwarze   95: roff_valid_fi(ROFF_VALID_ARGS)
        !            96: {
        !            97:        if ((man->flags & ROFF_NOFILL) == 0)
        !            98:                mandoc_msg(MANDOCERR_FI_SKIP, n->line, n->pos, "fi");
        !            99: }
        !           100:
        !           101: static void
1.1       schwarze  102: roff_valid_ft(ROFF_VALID_ARGS)
                    103: {
1.10      schwarze  104:        const char              *cp;
1.1       schwarze  105:
                    106:        if (n->child == NULL) {
                    107:                man->next = ROFF_NEXT_CHILD;
                    108:                roff_word_alloc(man, n->line, n->pos, "P");
                    109:                man->last = n;
                    110:                return;
                    111:        }
                    112:
                    113:        cp = n->child->string;
1.15      schwarze  114:        if (mandoc_font(cp, (int)strlen(cp)) != ESCAPE_ERROR)
                    115:                return;
1.14      schwarze  116:        mandoc_msg(MANDOCERR_FT_BAD, n->line, n->pos, "ft %s", cp);
1.1       schwarze  117:        roff_node_delete(man, n);
1.11      schwarze  118: }
                    119:
                    120: static void
1.16    ! schwarze  121: roff_valid_nf(ROFF_VALID_ARGS)
        !           122: {
        !           123:        if (man->flags & ROFF_NOFILL)
        !           124:                mandoc_msg(MANDOCERR_NF_SKIP, n->line, n->pos, "nf");
        !           125: }
        !           126:
        !           127: static void
1.11      schwarze  128: roff_valid_sp(ROFF_VALID_ARGS)
                    129: {
                    130:        struct roff_node        *np;
                    131:
                    132:        if ((np = n->prev) == NULL)
                    133:                return;
                    134:
                    135:        switch (np->tok) {
                    136:        case ROFF_br:
1.14      schwarze  137:                mandoc_msg(MANDOCERR_PAR_SKIP,
1.11      schwarze  138:                    np->line, np->pos, "br before sp");
                    139:                roff_node_delete(man, np);
                    140:                break;
                    141:        case MDOC_Pp:
1.14      schwarze  142:                mandoc_msg(MANDOCERR_PAR_SKIP,
1.11      schwarze  143:                    n->line, n->pos, "sp after Pp");
                    144:                roff_node_delete(man, n);
                    145:                break;
                    146:        default:
                    147:                break;
                    148:        }
1.1       schwarze  149: }

CVSweb