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