Annotation of mandoc/validate.c, Revision 1.18
1.18 ! kristaps 1: /* $Id: validate.c,v 1.17 2009/01/07 15:53:00 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.18 ! kristaps 25: typedef int (*v_pre)(struct mdoc *, struct mdoc_node *);
! 26: typedef int (*v_post)(struct mdoc *);
1.14 kristaps 27:
28:
29: struct valids {
1.17 kristaps 30: v_pre pre;
31: v_post *post;
1.14 kristaps 32: };
1.1 kristaps 33:
1.11 kristaps 34:
1.18 ! kristaps 35: static int pre_sh(struct mdoc *, struct mdoc_node *);
! 36: static int post_headchild_err_ge1(struct mdoc *);
! 37: static int post_headchild_err_le8(struct mdoc *);
! 38: static int post_bodychild_warn_ge1(struct mdoc *);
1.17 kristaps 39:
40: static v_post posts_sh[] = { post_headchild_err_ge1,
41: post_bodychild_warn_ge1,
42: post_headchild_err_le8, NULL };
1.9 kristaps 43:
1.12 kristaps 44:
1.9 kristaps 45: const struct valids mdoc_valids[MDOC_MAX] = {
1.17 kristaps 46: { NULL, NULL }, /* \" */
47: { NULL, NULL }, /* Dd */ /* TODO */
48: { NULL, NULL }, /* Dt */ /* TODO */
49: { NULL, NULL }, /* Os */ /* TODO */
50: { pre_sh, posts_sh }, /* Sh */ /* FIXME: preceding Pp. */
51: { NULL, NULL }, /* Ss */ /* FIXME: preceding Pp. */
52: { NULL, NULL }, /* Pp */
53: { NULL, NULL }, /* D1 */
54: { NULL, NULL }, /* Dl */
55: { NULL, NULL }, /* Bd */ /* FIXME: preceding Pp. */
56: { NULL, NULL }, /* Ed */
57: { NULL, NULL }, /* Bl */ /* FIXME: preceding Pp. */
58: { NULL, NULL }, /* El */
59: { NULL, NULL }, /* It */
60: { NULL, NULL }, /* Ad */
61: { NULL, NULL }, /* An */
62: { NULL, NULL }, /* Ar */
63: { NULL, NULL }, /* Cd */
64: { NULL, NULL }, /* Cm */
65: { NULL, NULL }, /* Dv */
66: { NULL, NULL }, /* Er */
67: { NULL, NULL }, /* Ev */
68: { NULL, NULL }, /* Ex */
69: { NULL, NULL }, /* Fa */
70: { NULL, NULL }, /* Fd */
71: { NULL, NULL }, /* Fl */
72: { NULL, NULL }, /* Fn */
73: { NULL, NULL }, /* Ft */
74: { NULL, NULL }, /* Ic */
75: { NULL, NULL }, /* In */
76: { NULL, NULL }, /* Li */
77: { NULL, NULL }, /* Nd */
78: { NULL, NULL }, /* Nm */
79: { NULL, NULL }, /* Op */
80: { NULL, NULL }, /* Ot */
81: { NULL, NULL }, /* Pa */
82: { NULL, NULL }, /* Rv */
83: { NULL, NULL }, /* St */
84: { NULL, NULL }, /* Va */
85: { NULL, NULL }, /* Vt */
86: { NULL, NULL }, /* Xr */
87: { NULL, NULL }, /* %A */
88: { NULL, NULL }, /* %B */
89: { NULL, NULL }, /* %D */
90: { NULL, NULL }, /* %I */
91: { NULL, NULL }, /* %J */
92: { NULL, NULL }, /* %N */
93: { NULL, NULL }, /* %O */
94: { NULL, NULL }, /* %P */
95: { NULL, NULL }, /* %R */
96: { NULL, NULL }, /* %T */
97: { NULL, NULL }, /* %V */
98: { NULL, NULL }, /* Ac */
99: { NULL, NULL }, /* Ao */
100: { NULL, NULL }, /* Aq */
101: { NULL, NULL }, /* At */ /* FIXME */
102: { NULL, NULL }, /* Bc */
103: { NULL, NULL }, /* Bf */
104: { NULL, NULL }, /* Bo */
105: { NULL, NULL }, /* Bq */
106: { NULL, NULL }, /* Bsx */
107: { NULL, NULL }, /* Bx */
108: { NULL, NULL }, /* Db */
109: { NULL, NULL }, /* Dc */
110: { NULL, NULL }, /* Do */
111: { NULL, NULL }, /* Dq */
112: { NULL, NULL }, /* Ec */
113: { NULL, NULL }, /* Ef */ /* -symbolic, etc. */
114: { NULL, NULL }, /* Em */
115: { NULL, NULL }, /* Eo */
116: { NULL, NULL }, /* Fx */
117: { NULL, NULL }, /* Ms */
118: { NULL, NULL }, /* No */
119: { NULL, NULL }, /* Ns */
120: { NULL, NULL }, /* Nx */
121: { NULL, NULL }, /* Ox */
122: { NULL, NULL }, /* Pc */
123: { NULL, NULL }, /* Pf */ /* 2 or more arguments */
124: { NULL, NULL }, /* Po */
125: { NULL, NULL }, /* Pq */ /* FIXME: ignore following Sh/Ss */
126: { NULL, NULL }, /* Qc */
127: { NULL, NULL }, /* Ql */
128: { NULL, NULL }, /* Qo */
129: { NULL, NULL }, /* Qq */
130: { NULL, NULL }, /* Re */
131: { NULL, NULL }, /* Rs */
132: { NULL, NULL }, /* Sc */
133: { NULL, NULL }, /* So */
134: { NULL, NULL }, /* Sq */
135: { NULL, NULL }, /* Sm */
136: { NULL, NULL }, /* Sx */
137: { NULL, NULL }, /* Sy */
138: { NULL, NULL }, /* Tn */
139: { NULL, NULL }, /* Ux */
140: { NULL, NULL }, /* Xc */
141: { NULL, NULL }, /* Xo */
142: { NULL, NULL }, /* Fo */
143: { NULL, NULL }, /* Fc */
144: { NULL, NULL }, /* Oo */
145: { NULL, NULL }, /* Oc */
146: { NULL, NULL }, /* Bk */
147: { NULL, NULL }, /* Ek */
148: { NULL, NULL }, /* Bt */
149: { NULL, NULL }, /* Hf */
150: { NULL, NULL }, /* Fr */
151: { NULL, NULL }, /* Ud */
1.9 kristaps 152: };
1.6 kristaps 153:
154:
155: static int
1.18 ! kristaps 156: post_bodychild_warn_ge1(struct mdoc *mdoc)
1.6 kristaps 157: {
158:
1.17 kristaps 159: if (MDOC_BODY != mdoc->last->type)
1.8 kristaps 160: return(1);
1.17 kristaps 161: if (mdoc->last->child)
1.9 kristaps 162: return(1);
1.1 kristaps 163:
1.18 ! kristaps 164: return(mdoc_warn(mdoc, WARN_ARGS_GE1));
1.8 kristaps 165: }
1.1 kristaps 166:
167:
1.8 kristaps 168: static int
1.18 ! kristaps 169: post_headchild_err_ge1(struct mdoc *mdoc)
1.8 kristaps 170: {
1.1 kristaps 171:
1.17 kristaps 172: if (MDOC_HEAD != mdoc->last->type)
1.9 kristaps 173: return(1);
1.17 kristaps 174: if (mdoc->last->child)
1.9 kristaps 175: return(1);
1.18 ! kristaps 176: return(mdoc_err(mdoc, ERR_ARGS_GE1));
1.1 kristaps 177: }
178:
179:
1.9 kristaps 180: static int
1.18 ! kristaps 181: post_headchild_err_le8(struct mdoc *mdoc)
1.14 kristaps 182: {
1.17 kristaps 183: int i;
1.14 kristaps 184: struct mdoc_node *n;
185:
1.17 kristaps 186: if (MDOC_HEAD != mdoc->last->type)
1.14 kristaps 187: return(1);
1.17 kristaps 188: for (i = 0, n = mdoc->last->child; n; n = n->next, i++)
189: /* Do nothing. */ ;
190: if (i <= 8)
1.11 kristaps 191: return(1);
1.18 ! kristaps 192: return(mdoc_err(mdoc, ERR_ARGS_LE8));
1.14 kristaps 193: }
194:
195:
196: static int
1.18 ! kristaps 197: pre_sh(struct mdoc *mdoc, struct mdoc_node *node)
1.14 kristaps 198: {
199:
200: return(1);
1.11 kristaps 201: }
202:
203:
1.17 kristaps 204: int
1.18 ! kristaps 205: mdoc_valid_pre(struct mdoc *mdoc, struct mdoc_node *node)
1.11 kristaps 206: {
1.18 ! kristaps 207: int t;
! 208:
! 209: switch (node->type) {
! 210: case (MDOC_BODY):
! 211: t = mdoc->last->data.body.tok;
! 212: break;
! 213: case (MDOC_ELEM):
! 214: t = mdoc->last->data.elem.tok;
! 215: break;
! 216: case (MDOC_BLOCK):
! 217: t = mdoc->last->data.block.tok;
! 218: break;
! 219: case (MDOC_HEAD):
! 220: t = mdoc->last->data.head.tok;
! 221: break;
! 222: default:
! 223: return(1);
! 224: }
1.11 kristaps 225:
1.18 ! kristaps 226: if (NULL == mdoc_valids[t].pre)
1.11 kristaps 227: return(1);
1.18 ! kristaps 228: return((*mdoc_valids[t].pre)(mdoc, node));
1.11 kristaps 229: }
230:
231:
1.17 kristaps 232: int
1.18 ! kristaps 233: mdoc_valid_post(struct mdoc *mdoc)
1.11 kristaps 234: {
1.17 kristaps 235: v_post *p;
236: int t;
1.11 kristaps 237:
1.17 kristaps 238: switch (mdoc->last->type) {
239: case (MDOC_BODY):
240: t = mdoc->last->data.body.tok;
241: break;
242: case (MDOC_ELEM):
243: t = mdoc->last->data.elem.tok;
244: break;
245: case (MDOC_BLOCK):
246: t = mdoc->last->data.block.tok;
247: break;
248: case (MDOC_HEAD):
249: t = mdoc->last->data.head.tok;
250: break;
251: default:
1.8 kristaps 252: return(1);
253: }
1.14 kristaps 254:
1.17 kristaps 255: if (NULL == mdoc_valids[t].post)
1.9 kristaps 256: return(1);
1.8 kristaps 257:
1.17 kristaps 258: for (p = mdoc_valids[t].post; *p; p++)
1.18 ! kristaps 259: if ( ! (*p)(mdoc))
1.17 kristaps 260: return(0);
1.11 kristaps 261:
1.14 kristaps 262: return(1);
1.11 kristaps 263: }
1.14 kristaps 264:
CVSweb