ruby_rnv 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +3 -0
- data/ext/rnv/extconf.rb +15 -0
- data/ext/rnv/ruby_rnv.c +742 -0
- data/ext/rnv/src/ary.c +78 -0
- data/ext/rnv/src/ary.h +10 -0
- data/ext/rnv/src/drv.c +472 -0
- data/ext/rnv/src/drv.h +35 -0
- data/ext/rnv/src/er.c +15 -0
- data/ext/rnv/src/er.h +16 -0
- data/ext/rnv/src/erbit.h +14 -0
- data/ext/rnv/src/ht.c +90 -0
- data/ext/rnv/src/ht.h +22 -0
- data/ext/rnv/src/ll.h +43 -0
- data/ext/rnv/src/m.c +60 -0
- data/ext/rnv/src/m.h +10 -0
- data/ext/rnv/src/rn.c +569 -0
- data/ext/rnv/src/rn.h +150 -0
- data/ext/rnv/src/rnc.c +1191 -0
- data/ext/rnv/src/rnc.h +68 -0
- data/ext/rnv/src/rnd.c +436 -0
- data/ext/rnv/src/rnd.h +25 -0
- data/ext/rnv/src/rnl.c +62 -0
- data/ext/rnv/src/rnl.h +18 -0
- data/ext/rnv/src/rnv.c +158 -0
- data/ext/rnv/src/rnv.h +30 -0
- data/ext/rnv/src/rnx.c +153 -0
- data/ext/rnv/src/rnx.h +16 -0
- data/ext/rnv/src/rx.c +749 -0
- data/ext/rnv/src/rx.h +43 -0
- data/ext/rnv/src/rx_cls_ranges.c +126 -0
- data/ext/rnv/src/rx_cls_u.c +262 -0
- data/ext/rnv/src/s.c +103 -0
- data/ext/rnv/src/s.h +32 -0
- data/ext/rnv/src/sc.c +62 -0
- data/ext/rnv/src/sc.h +26 -0
- data/ext/rnv/src/type.h +121 -0
- data/ext/rnv/src/u.c +88 -0
- data/ext/rnv/src/u.h +26 -0
- data/ext/rnv/src/xcl.c +472 -0
- data/ext/rnv/src/xmlc.c +20 -0
- data/ext/rnv/src/xmlc.h +16 -0
- data/ext/rnv/src/xsd.c +789 -0
- data/ext/rnv/src/xsd.h +27 -0
- data/ext/rnv/src/xsd_tm.c +100 -0
- data/ext/rnv/src/xsd_tm.h +15 -0
- data/lib/rnv.rb +2 -0
- data/lib/rnv/ox_sax_document.rb +84 -0
- data/lib/rnv/validator.rb +104 -0
- metadata +175 -0
data/ext/rnv/src/ary.c
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
#include "type.h"
|
2
|
+
|
3
|
+
/* $Id: ary.c,v 1.4 2004/02/25 00:00:32 dvd Exp $ */
|
4
|
+
|
5
|
+
#include "rn.h"
|
6
|
+
#include "ary.h"
|
7
|
+
|
8
|
+
/*
|
9
|
+
ary_isany::Pattern->Bool
|
10
|
+
ary_isany p =
|
11
|
+
let
|
12
|
+
isanycontent
|
13
|
+
p@(OneOrMore
|
14
|
+
(Choice
|
15
|
+
(Choice
|
16
|
+
(Element AnyName p1)
|
17
|
+
(Attribute AnyName Text))
|
18
|
+
Text)) = p == p1
|
19
|
+
isanycontent _ = False
|
20
|
+
isanymixed (OneOrMore (Choice (Element AnyName p1) Text)) = isanycontent p1
|
21
|
+
isanymixed _ = False
|
22
|
+
in
|
23
|
+
case p of
|
24
|
+
(After p1 Empty) -> isanymixed p1
|
25
|
+
(After p1 p2) -> isanymixed p1 && ary_isany p2
|
26
|
+
_ -> False
|
27
|
+
*/
|
28
|
+
|
29
|
+
static int isanycont(rnv_t *rnv, int p) {
|
30
|
+
int p0,nc,p1,p2,i,res,flat[3];
|
31
|
+
p0=p; if(!RN_P_IS(p0,RN_P_ONE_OR_MORE)) return 0;
|
32
|
+
rn_OneOrMore(p0,p1);
|
33
|
+
p0=p1; if(!RN_P_IS(p0,RN_P_CHOICE)) return 0;
|
34
|
+
rn_Choice(p0,p1,p2); flat[0]=p2;
|
35
|
+
p0=p1; if(!RN_P_IS(p0,RN_P_CHOICE)) return 0;
|
36
|
+
rn_Choice(p0,p1,p2); flat[1]=p1; flat[2]=p2;
|
37
|
+
res=0;
|
38
|
+
for(i=0;i!=3;++i) {
|
39
|
+
p0=flat[i];
|
40
|
+
switch(RN_P_TYP(p0)) {
|
41
|
+
case RN_P_ELEMENT: rn_Element(p0,nc,p1);
|
42
|
+
if(!(RN_NC_IS(nc,RN_NC_ANY_NAME)&&p==p1)) return 0;
|
43
|
+
res|=1; break;
|
44
|
+
case RN_P_ATTRIBUTE: rn_Attribute(p0,nc,p1);
|
45
|
+
if(!(RN_NC_IS(nc,RN_NC_ANY_NAME)&&p1==rnv->rn_text)) return 0;
|
46
|
+
res|=2; break;
|
47
|
+
case RN_P_TEXT: break;
|
48
|
+
default: return 0;
|
49
|
+
}
|
50
|
+
}
|
51
|
+
return res==3;
|
52
|
+
}
|
53
|
+
|
54
|
+
static int isanymix(rnv_t *rnv, int p) {
|
55
|
+
int p0,nc,p1,p2,i,res,flat[2];
|
56
|
+
p0=p; if(!RN_P_IS(p0,RN_P_ONE_OR_MORE)) return 0;
|
57
|
+
rn_OneOrMore(p0,p1);
|
58
|
+
p0=p1; if(!RN_P_IS(p0,RN_P_CHOICE)) return 0;
|
59
|
+
rn_Choice(p0,p1,p2); flat[0]=p1; flat[1]=p2;
|
60
|
+
res=0;
|
61
|
+
for(i=0;i!=2;++i) {
|
62
|
+
p0=flat[i];
|
63
|
+
switch(RN_P_TYP(p0)) {
|
64
|
+
case RN_P_ELEMENT: rn_Element(p0,nc,p1);
|
65
|
+
if(!(RN_NC_IS(nc,RN_NC_ANY_NAME)&& isanycont(rnv, p1))) return 0;
|
66
|
+
res|=1; break;
|
67
|
+
case RN_P_TEXT: break;
|
68
|
+
default: return 0;
|
69
|
+
}
|
70
|
+
}
|
71
|
+
return res==1;
|
72
|
+
}
|
73
|
+
|
74
|
+
int ary_isany(rnv_t *rnv, int p) {
|
75
|
+
int p1,p2;
|
76
|
+
if(!RN_P_IS(p,RN_P_AFTER)) return 0;
|
77
|
+
rn_After(p,p1,p2); return isanymix(rnv, p1)&&(p2==rnv->rn_empty||ary_isany(rnv, p2));
|
78
|
+
}
|
data/ext/rnv/src/ary.h
ADDED
data/ext/rnv/src/drv.c
ADDED
@@ -0,0 +1,472 @@
|
|
1
|
+
#include "type.h"
|
2
|
+
|
3
|
+
/* $Id: drv.c,v 1.41 2004/03/13 13:28:02 dvd Exp $ */
|
4
|
+
|
5
|
+
#include "xmlc.h" /*xmlc_white_space*/
|
6
|
+
#include "m.h"
|
7
|
+
#include "s.h" /*s_tokcmpn*/
|
8
|
+
#include "ht.h"
|
9
|
+
#include "rn.h"
|
10
|
+
#include "xsd.h"
|
11
|
+
#include "ll.h"
|
12
|
+
#include "erbit.h"
|
13
|
+
#include "er.h"
|
14
|
+
#include "drv.h"
|
15
|
+
|
16
|
+
struct dtl {
|
17
|
+
int uri;
|
18
|
+
int (*equal)(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, char *typ,char *val,char *s,int n);
|
19
|
+
int (*allows)(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, char *typ,char *ps,char *s,int n);
|
20
|
+
};
|
21
|
+
|
22
|
+
#define LEN_DTL DRV_LEN_DTL
|
23
|
+
#define LEN_M DRV_LEN_M
|
24
|
+
#define PRIME_M DRV_PRIME_M
|
25
|
+
#define LIM_M DRV_LIM_M
|
26
|
+
|
27
|
+
#define M_SIZE 5
|
28
|
+
|
29
|
+
#define M_STO 0
|
30
|
+
#define M_STC 1
|
31
|
+
#define M_ATT 2
|
32
|
+
#define M_TXT 3
|
33
|
+
#define M_END 4
|
34
|
+
#define M_SET(p) drv_st->memo[drv_st->i_m][M_SIZE-1]=p
|
35
|
+
#define M_RET(m) drv_st->memo[m][M_SIZE-1]
|
36
|
+
|
37
|
+
#define err(msg) (*rnv->verror_handler)(rnv,erno|ERBIT_DRV,msg"\n",ap);
|
38
|
+
void drv_default_verror_handler(rnv_t *rnv, int erno,va_list ap) {
|
39
|
+
if(erno&ERBIT_XSD) {
|
40
|
+
xsd_default_verror_handler(rnv, erno&~ERBIT_XSD,ap);
|
41
|
+
} else {
|
42
|
+
switch(erno) {
|
43
|
+
case DRV_ER_NODTL: err("no datatype library for URI '%s'"); break;
|
44
|
+
default: assert(0);
|
45
|
+
}
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
static void error_handler(rnv_t *rnv,int erno,...) {
|
50
|
+
va_list ap; va_start(ap,erno); (*rnv->drv_verror_handler)(rnv, erno,ap); va_end(ap);
|
51
|
+
}
|
52
|
+
|
53
|
+
static void verror_handler_xsd(rnv_t *rnv, int erno,va_list ap) {drv_default_verror_handler(rnv,erno|ERBIT_XSD,ap);}
|
54
|
+
|
55
|
+
static void new_memo(rnv_t *rnv, drv_st_t *drv_st, int typ) {
|
56
|
+
if(rnv->drv_compact) ht_deli(&drv_st->ht_m,drv_st->i_m);
|
57
|
+
drv_st->memo[drv_st->i_m][0]=typ;
|
58
|
+
}
|
59
|
+
|
60
|
+
static int equal_m(void *user, int m1,int m2) {
|
61
|
+
drv_st_t *drv_st = (drv_st_t *)user;
|
62
|
+
int *me1=drv_st->memo[m1],*me2=drv_st->memo[m2];
|
63
|
+
return (me1[0]==me2[0])&&(me1[1]==me2[1])&&(me1[2]==me2[2])&&(me1[3]==me2[3]);
|
64
|
+
}
|
65
|
+
static int hash_m(void *user, int m) {
|
66
|
+
drv_st_t *drv_st = (drv_st_t *)user;
|
67
|
+
int *me=drv_st->memo[m];
|
68
|
+
return ((me[0]&0x7)|((me[1]^me[2]^me[3])<<3))*PRIME_M;
|
69
|
+
}
|
70
|
+
|
71
|
+
static int newStartTagOpen(rnv_t *rnv, drv_st_t *drv_st, int p,int uri,int name) {
|
72
|
+
int *me=drv_st->memo[drv_st->i_m];
|
73
|
+
new_memo(rnv, drv_st, M_STO);
|
74
|
+
me[1]=p; me[2]=uri; me[3]=name;
|
75
|
+
return ht_get(&drv_st->ht_m,drv_st->i_m);
|
76
|
+
}
|
77
|
+
|
78
|
+
static int newAttributeOpen(rnv_t *rnv, drv_st_t *drv_st, int p,int uri,int name) {
|
79
|
+
int *me=drv_st->memo[drv_st->i_m];
|
80
|
+
new_memo(rnv, drv_st, M_ATT);
|
81
|
+
me[1]=p; me[2]=uri; me[3]=name;
|
82
|
+
return ht_get(&drv_st->ht_m,drv_st->i_m);
|
83
|
+
}
|
84
|
+
|
85
|
+
static int newStartTagClose(rnv_t *rnv, drv_st_t *drv_st, int p) {
|
86
|
+
int *me=drv_st->memo[drv_st->i_m];
|
87
|
+
new_memo(rnv, drv_st, M_STC);
|
88
|
+
me[1]=p; me[2]=me[3]=0;
|
89
|
+
return ht_get(&drv_st->ht_m,drv_st->i_m);
|
90
|
+
}
|
91
|
+
|
92
|
+
static int newMixedText(rnv_t *rnv, drv_st_t *drv_st, int p) {
|
93
|
+
int *me=drv_st->memo[drv_st->i_m];
|
94
|
+
new_memo(rnv, drv_st, M_TXT);
|
95
|
+
me[1]=p; me[2]=me[3]=0;
|
96
|
+
return ht_get(&drv_st->ht_m,drv_st->i_m);
|
97
|
+
}
|
98
|
+
|
99
|
+
static int newEndTag(rnv_t *rnv, drv_st_t *drv_st, int p) {
|
100
|
+
int *me=drv_st->memo[drv_st->i_m];
|
101
|
+
new_memo(rnv, drv_st, M_END);
|
102
|
+
me[1]=p; me[2]=me[3]=0;
|
103
|
+
return ht_get(&drv_st->ht_m,drv_st->i_m);
|
104
|
+
}
|
105
|
+
|
106
|
+
static void accept_m(rnv_t *rnv, drv_st_t *drv_st) {
|
107
|
+
if(ht_get(&drv_st->ht_m,drv_st->i_m)!=-1) {
|
108
|
+
if(rnv->drv_compact) ht_del(&drv_st->ht_m,drv_st->i_m); else return;
|
109
|
+
}
|
110
|
+
ht_put(&drv_st->ht_m,drv_st->i_m++);
|
111
|
+
if(rnv->drv_compact&&drv_st->i_m==LIM_M) drv_st->i_m=0;
|
112
|
+
if(drv_st->i_m==drv_st->len_m) drv_st->memo=(int(*)[M_SIZE])m_stretch(drv_st->memo,drv_st->len_m=2*drv_st->i_m,drv_st->i_m,sizeof(int[M_SIZE]));
|
113
|
+
}
|
114
|
+
|
115
|
+
static int fallback_equal(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, char *typ,char *val,char *s,int n) {return 1;}
|
116
|
+
static int fallback_allows(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, char *typ,char *ps,char *s,int n) {return 1;}
|
117
|
+
|
118
|
+
static int builtin_equal(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, char *typ,char *val,char *s,int n) {
|
119
|
+
int dt=rn_newDatatype(rnv, rn_st, 0,typ-rnv->rn_string);
|
120
|
+
if(dt==rnv->rn_dt_string) return s_cmpn(val,s,n)==0;
|
121
|
+
else if(dt==rnv->rn_dt_token) return s_tokcmpn(val,s,n)==0;
|
122
|
+
else assert(0);
|
123
|
+
return 0;
|
124
|
+
}
|
125
|
+
|
126
|
+
static int builtin_allows(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, char *typ,char *ps,char *s,int n) {return 1;}
|
127
|
+
|
128
|
+
static void windup(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st);
|
129
|
+
|
130
|
+
void drv_init(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, rx_st_t *rx_st) {
|
131
|
+
rnv->drv_verror_handler=&drv_default_verror_handler;
|
132
|
+
rn_init(rnv, rn_st);
|
133
|
+
rx_st->rnv = rnv;
|
134
|
+
xsd_init(rx_st);
|
135
|
+
rnv->xsd_verror_handler=&verror_handler_xsd;
|
136
|
+
drv_st->memo=(int (*)[M_SIZE])m_alloc(drv_st->len_m=LEN_M,sizeof(int[M_SIZE]));
|
137
|
+
drv_st->dtl=(struct dtl*)m_alloc(drv_st->len_dtl=LEN_DTL,sizeof(struct dtl));
|
138
|
+
drv_st->ht_m.user = drv_st;
|
139
|
+
ht_init(&drv_st->ht_m,LEN_M,&hash_m,&equal_m);
|
140
|
+
windup(rnv, drv_st, rn_st);
|
141
|
+
}
|
142
|
+
|
143
|
+
static int emb_xsd_allows(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, char *typ,char *ps,char *s,int n) {
|
144
|
+
return xsd_allows(rx_st, typ,ps,s,n);
|
145
|
+
}
|
146
|
+
|
147
|
+
static int emb_xsd_equal(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, char *typ,char *val,char *s,int n) {
|
148
|
+
return xsd_equal(rx_st, typ,val,s,n);
|
149
|
+
}
|
150
|
+
|
151
|
+
static void windup(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st) {
|
152
|
+
drv_st->i_m=0; drv_st->n_dtl=0;
|
153
|
+
drv_add_dtl(rnv, drv_st, rn_st, rnv->rn_string+0,&fallback_equal,&fallback_allows); /* guard at 0 */
|
154
|
+
drv_add_dtl(rnv, drv_st, rn_st, rnv->rn_string+0,&builtin_equal,&builtin_allows);
|
155
|
+
drv_add_dtl(rnv, drv_st, rn_st, rnv->rn_string+rnv->rn_xsd_uri,&emb_xsd_equal,&emb_xsd_allows);
|
156
|
+
}
|
157
|
+
|
158
|
+
void drv_clear(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st) {
|
159
|
+
ht_clear(&drv_st->ht_m);
|
160
|
+
windup(rnv, drv_st, rn_st);
|
161
|
+
}
|
162
|
+
|
163
|
+
void drv_add_dtl(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, char *suri,int (*equal)(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, char *typ,char *val,char *s,int n),int (*allows)(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, char *typ,char *ps,char *s,int n)) {
|
164
|
+
if(drv_st->n_dtl==drv_st->len_dtl) drv_st->dtl=(struct dtl *)m_stretch(drv_st->dtl,drv_st->len_dtl=drv_st->n_dtl*2,drv_st->n_dtl,sizeof(struct dtl));
|
165
|
+
drv_st->dtl[drv_st->n_dtl].uri=rn_newString(rnv, rn_st, suri);
|
166
|
+
drv_st->dtl[drv_st->n_dtl].equal=equal;
|
167
|
+
drv_st->dtl[drv_st->n_dtl].allows=allows;
|
168
|
+
++drv_st->n_dtl;
|
169
|
+
}
|
170
|
+
|
171
|
+
static struct dtl *getdtl(rnv_t *rnv, drv_st_t *drv_st, int uri) {
|
172
|
+
int i;
|
173
|
+
drv_st->dtl[0].uri=uri; i=drv_st->n_dtl;
|
174
|
+
while(drv_st->dtl[--i].uri!=uri);
|
175
|
+
if(i==0) error_handler(rnv, DRV_ER_NODTL,rnv->rn_string+uri);
|
176
|
+
return drv_st->dtl+i;
|
177
|
+
}
|
178
|
+
|
179
|
+
static int ncof(rnv_t *rnv, int nc,int uri,int name) {
|
180
|
+
int uri2,name2,nc1,nc2;
|
181
|
+
switch(RN_NC_TYP(nc)) {
|
182
|
+
case RN_NC_QNAME: rn_QName(nc,uri2,name2); return uri2==uri&&name2==name;
|
183
|
+
case RN_NC_NSNAME: rn_NsName(nc,uri2); return uri2==uri;
|
184
|
+
case RN_NC_ANY_NAME: return 1;
|
185
|
+
case RN_NC_EXCEPT: rn_NameClassExcept(nc,nc1,nc2); return ncof(rnv, nc1,uri,name)&&!ncof(rnv, nc2,uri,name);
|
186
|
+
case RN_NC_CHOICE: rn_NameClassChoice(nc,nc1,nc2); return ncof(rnv, nc1,uri,name)||ncof(rnv, nc2,uri,name);
|
187
|
+
default: assert(0);
|
188
|
+
}
|
189
|
+
return 0;
|
190
|
+
}
|
191
|
+
|
192
|
+
static int apply_after(rnv_t *rnv, rn_st_t *rn_st, int (*f)(rnv_t *rnv, rn_st_t *rn_st, int q1,int q2),int p1,int p0) {
|
193
|
+
int p11,p12;
|
194
|
+
switch(RN_P_TYP(p1)) {
|
195
|
+
case RN_P_NOT_ALLOWED: case RN_P_EMPTY: case RN_P_TEXT:
|
196
|
+
case RN_P_INTERLEAVE: case RN_P_GROUP: case RN_P_ONE_OR_MORE:
|
197
|
+
case RN_P_LIST: case RN_P_DATA: case RN_P_DATA_EXCEPT: case RN_P_VALUE:
|
198
|
+
case RN_P_ATTRIBUTE: case RN_P_ELEMENT:
|
199
|
+
return rnv->rn_notAllowed;
|
200
|
+
case RN_P_CHOICE: rn_Choice(p1,p11,p12); return rn_choice(rnv, rn_st, apply_after(rnv, rn_st, f,p11,p0),apply_after(rnv, rn_st, f,p12,p0));
|
201
|
+
case RN_P_AFTER: rn_After(p1,p11,p12); return rn_after(rnv, rn_st, p11,(*f)(rnv, rn_st, p12,p0));
|
202
|
+
default: assert(0);
|
203
|
+
}
|
204
|
+
return 0;
|
205
|
+
}
|
206
|
+
|
207
|
+
static int start_tag_open(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p,int uri,int name,int recover) {
|
208
|
+
int nc,p1,p2,m,ret=0;
|
209
|
+
if(!recover) {
|
210
|
+
m=newStartTagOpen(rnv, drv_st, p,uri,name);
|
211
|
+
if(m!=-1) return M_RET(m);
|
212
|
+
}
|
213
|
+
switch(RN_P_TYP(p)) {
|
214
|
+
case RN_P_NOT_ALLOWED: case RN_P_EMPTY: case RN_P_TEXT:
|
215
|
+
case RN_P_LIST: case RN_P_DATA: case RN_P_DATA_EXCEPT: case RN_P_VALUE:
|
216
|
+
case RN_P_ATTRIBUTE:
|
217
|
+
ret=rnv->rn_notAllowed;
|
218
|
+
break;
|
219
|
+
case RN_P_CHOICE: rn_Choice(p,p1,p2);
|
220
|
+
ret=rn_choice(rnv, rn_st, start_tag_open(rnv, drv_st, rn_st, p1,uri,name,recover),start_tag_open(rnv, drv_st, rn_st, p2,uri,name,recover));
|
221
|
+
break;
|
222
|
+
case RN_P_ELEMENT: rn_Element(p,nc,p1);
|
223
|
+
ret=ncof(rnv, nc,uri,name)?rn_after(rnv, rn_st, p1,rnv->rn_empty):rnv->rn_notAllowed;
|
224
|
+
break;
|
225
|
+
case RN_P_INTERLEAVE: rn_Interleave(p,p1,p2);
|
226
|
+
ret=rn_choice(
|
227
|
+
rnv, rn_st, apply_after(rnv, rn_st, &rn_ileave,start_tag_open(rnv, drv_st, rn_st, p1,uri,name,recover),p2),
|
228
|
+
apply_after(rnv, rn_st, &rn_ileave,start_tag_open(rnv, drv_st, rn_st, p2,uri,name,recover),p1));
|
229
|
+
break;
|
230
|
+
case RN_P_GROUP: rn_Group(p,p1,p2);
|
231
|
+
{ int p11=apply_after(rnv, rn_st, &rn_group,start_tag_open(rnv, drv_st, rn_st, p1,uri,name,recover),p2);
|
232
|
+
ret=(rn_nullable(p1)||recover)?rn_choice(rnv, rn_st, p11,start_tag_open(rnv, drv_st, rn_st, p2,uri,name,recover)):p11;
|
233
|
+
} break;
|
234
|
+
case RN_P_ONE_OR_MORE: rn_OneOrMore(p,p1);
|
235
|
+
ret=apply_after(rnv, rn_st, &rn_group,start_tag_open(rnv, drv_st, rn_st, p1,uri,name,recover),rn_choice(rnv, rn_st, p,rnv->rn_empty));
|
236
|
+
break;
|
237
|
+
case RN_P_AFTER: rn_After(p,p1,p2);
|
238
|
+
ret=apply_after(rnv, rn_st, &rn_after,start_tag_open(rnv, drv_st, rn_st, p1,uri,name,recover),p2);
|
239
|
+
break;
|
240
|
+
default: assert(0);
|
241
|
+
}
|
242
|
+
if(!recover) {
|
243
|
+
newStartTagOpen(rnv, drv_st, p,uri,name); M_SET(ret);
|
244
|
+
accept_m(rnv, drv_st);
|
245
|
+
}
|
246
|
+
return ret;
|
247
|
+
}
|
248
|
+
|
249
|
+
int drv_start_tag_open(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p,char *suri,char *sname) {return start_tag_open(rnv, drv_st, rn_st, p,rn_newString(rnv, rn_st, suri),rn_newString(rnv, rn_st, sname),0);}
|
250
|
+
int drv_start_tag_open_recover(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p,char *suri,char *sname) {return start_tag_open(rnv, drv_st, rn_st, p,rn_newString(rnv, rn_st, suri),rn_newString(rnv, rn_st, sname),1);}
|
251
|
+
|
252
|
+
static int puorg_rn(rnv_t *rnv, rn_st_t *rn_st, int p2,int p1) {return rn_group(rnv, rn_st, p1,p2);}
|
253
|
+
|
254
|
+
static int attribute_open(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p,int uri,int name) {
|
255
|
+
int nc,p1,p2,m,ret=0;
|
256
|
+
m=newAttributeOpen(rnv, drv_st, p,uri,name);
|
257
|
+
if(m!=-1) return M_RET(m);
|
258
|
+
switch(RN_P_TYP(p)) {
|
259
|
+
case RN_P_NOT_ALLOWED: case RN_P_EMPTY: case RN_P_TEXT:
|
260
|
+
case RN_P_LIST: case RN_P_DATA: case RN_P_DATA_EXCEPT: case RN_P_VALUE:
|
261
|
+
case RN_P_ELEMENT:
|
262
|
+
ret=rnv->rn_notAllowed;
|
263
|
+
break;
|
264
|
+
case RN_P_CHOICE: rn_Choice(p,p1,p2);
|
265
|
+
ret=rn_choice(rnv, rn_st, attribute_open(rnv, drv_st, rn_st, p1,uri,name),attribute_open(rnv, drv_st, rn_st, p2,uri,name));
|
266
|
+
break;
|
267
|
+
case RN_P_ATTRIBUTE: rn_Attribute(p,nc,p1);
|
268
|
+
ret=ncof(rnv, nc,uri,name)?rn_after(rnv, rn_st, p1,rnv->rn_empty):rnv->rn_notAllowed;
|
269
|
+
break;
|
270
|
+
case RN_P_INTERLEAVE: rn_Interleave(p,p1,p2);
|
271
|
+
ret=rn_choice(
|
272
|
+
rnv, rn_st, apply_after(rnv, rn_st, &rn_ileave,attribute_open(rnv, drv_st, rn_st, p1,uri,name),p2),
|
273
|
+
apply_after(rnv, rn_st, &rn_ileave,attribute_open(rnv, drv_st, rn_st, p2,uri,name),p1));
|
274
|
+
break;
|
275
|
+
case RN_P_GROUP: rn_Group(p,p1,p2);
|
276
|
+
ret=rn_choice(
|
277
|
+
rnv, rn_st, apply_after(rnv, rn_st, &rn_group,attribute_open(rnv, drv_st, rn_st, p1,uri,name),p2),
|
278
|
+
apply_after(rnv, rn_st, &puorg_rn,attribute_open(rnv, drv_st, rn_st, p2,uri,name),p1));
|
279
|
+
break;
|
280
|
+
case RN_P_ONE_OR_MORE: rn_OneOrMore(p,p1);
|
281
|
+
ret=apply_after(rnv, rn_st, &rn_group,attribute_open(rnv, drv_st, rn_st, p1,uri,name),rn_choice(rnv, rn_st, p,rnv->rn_empty));
|
282
|
+
break;
|
283
|
+
case RN_P_AFTER: rn_After(p,p1,p2);
|
284
|
+
ret=apply_after(rnv, rn_st, &rn_after,attribute_open(rnv, drv_st, rn_st, p1,uri,name),p2);
|
285
|
+
break;
|
286
|
+
default: assert(0);
|
287
|
+
}
|
288
|
+
newAttributeOpen(rnv, drv_st, p,uri,name); M_SET(ret);
|
289
|
+
accept_m(rnv, drv_st);
|
290
|
+
return ret;
|
291
|
+
}
|
292
|
+
|
293
|
+
int drv_attribute_open(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p,char *suri,char *sname) {return attribute_open(rnv, drv_st, rn_st, p,rn_newString(rnv, rn_st, suri),rn_newString(rnv, rn_st, sname));}
|
294
|
+
int drv_attribute_open_recover(int p,char *suri,char *sname) {return p;}
|
295
|
+
|
296
|
+
extern int drv_attribute_close(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p) {return drv_end_tag(rnv, drv_st, rn_st, p);}
|
297
|
+
extern int drv_attribute_close_recover(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p) {return drv_end_tag_recover(rnv, drv_st, rn_st, p);}
|
298
|
+
|
299
|
+
static int start_tag_close(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p,int recover) {
|
300
|
+
int p1,p2,ret=0,m;
|
301
|
+
if(!recover) {
|
302
|
+
m=newStartTagClose(rnv, drv_st, p);
|
303
|
+
if(m!=-1) return M_RET(m);
|
304
|
+
}
|
305
|
+
switch(RN_P_TYP(p)) {
|
306
|
+
case RN_P_NOT_ALLOWED: case RN_P_EMPTY: case RN_P_TEXT:
|
307
|
+
case RN_P_LIST: case RN_P_DATA: case RN_P_DATA_EXCEPT: case RN_P_VALUE:
|
308
|
+
case RN_P_ELEMENT:
|
309
|
+
ret=p;
|
310
|
+
break;
|
311
|
+
case RN_P_CHOICE: rn_Choice(p,p1,p2);
|
312
|
+
ret=rn_choice(rnv, rn_st, start_tag_close(rnv, drv_st, rn_st, p1,recover),start_tag_close(rnv, drv_st, rn_st, p2,recover));
|
313
|
+
break;
|
314
|
+
case RN_P_INTERLEAVE: rn_Interleave(p,p1,p2);
|
315
|
+
ret=rn_ileave(rnv, rn_st, start_tag_close(rnv, drv_st, rn_st, p1,recover),start_tag_close(rnv, drv_st, rn_st, p2,recover));
|
316
|
+
break;
|
317
|
+
case RN_P_GROUP: rn_Group(p,p1,p2);
|
318
|
+
ret=rn_group(rnv, rn_st, start_tag_close(rnv, drv_st, rn_st, p1,recover),start_tag_close(rnv, drv_st, rn_st, p2,recover));
|
319
|
+
break;
|
320
|
+
case RN_P_ONE_OR_MORE: rn_OneOrMore(p,p1);
|
321
|
+
ret=rn_one_or_more(rnv, rn_st, start_tag_close(rnv, drv_st, rn_st, p1,recover));
|
322
|
+
break;
|
323
|
+
case RN_P_ATTRIBUTE:
|
324
|
+
ret=recover?rnv->rn_empty:rnv->rn_notAllowed;
|
325
|
+
break;
|
326
|
+
case RN_P_AFTER: rn_After(p,p1,p2);
|
327
|
+
ret=rn_after(rnv, rn_st, start_tag_close(rnv, drv_st, rn_st, p1,recover),p2);
|
328
|
+
break;
|
329
|
+
default: assert(0);
|
330
|
+
}
|
331
|
+
if(!recover) {
|
332
|
+
newStartTagClose(rnv, drv_st, p); M_SET(ret);
|
333
|
+
accept_m(rnv, drv_st);
|
334
|
+
}
|
335
|
+
return ret;
|
336
|
+
}
|
337
|
+
int drv_start_tag_close(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p) {return start_tag_close(rnv, drv_st, rn_st, p,0);}
|
338
|
+
int drv_start_tag_close_recover(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p) {return start_tag_close(rnv, drv_st, rn_st, p,1);}
|
339
|
+
|
340
|
+
static int text(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, drv_st_t *drv_st, int p,char *s,int n);
|
341
|
+
static int list(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, drv_st_t *drv_st, int p,char *s,int n) {
|
342
|
+
char *end=s+n,*sp;
|
343
|
+
for(;;) {
|
344
|
+
while(s!=end&&xmlc_white_space(*s)) ++s;
|
345
|
+
sp=s;
|
346
|
+
while(sp!=end&&!xmlc_white_space(*sp)) ++sp;
|
347
|
+
if(s==end) break;
|
348
|
+
p=text(rnv, rn_st, rx_st, drv_st, p,s,sp-s);
|
349
|
+
s=sp;
|
350
|
+
}
|
351
|
+
return p;
|
352
|
+
}
|
353
|
+
|
354
|
+
static int text(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, drv_st_t *drv_st, int p,char *s,int n) { /* matches text, including whitespace */
|
355
|
+
int p1,p2,dt,ps,lib,typ,val,ret=0;
|
356
|
+
switch(RN_P_TYP(p)) {
|
357
|
+
case RN_P_NOT_ALLOWED: case RN_P_EMPTY:
|
358
|
+
case RN_P_ATTRIBUTE: case RN_P_ELEMENT:
|
359
|
+
ret=rnv->rn_notAllowed;
|
360
|
+
break;
|
361
|
+
case RN_P_TEXT:
|
362
|
+
ret=p;
|
363
|
+
break;
|
364
|
+
case RN_P_AFTER: rn_After(p,p1,p2);
|
365
|
+
ret=rn_after(rnv, rn_st, text(rnv, rn_st, rx_st, drv_st, p1,s,n),p2);
|
366
|
+
break;
|
367
|
+
case RN_P_CHOICE: rn_Choice(p,p1,p2);
|
368
|
+
ret=rn_choice(rnv, rn_st, text(rnv, rn_st, rx_st, drv_st, p1,s,n),text(rnv, rn_st, rx_st, drv_st, p2,s,n));
|
369
|
+
break;
|
370
|
+
case RN_P_INTERLEAVE: rn_Interleave(p,p1,p2);
|
371
|
+
ret=rn_choice(rnv, rn_st, rn_ileave(rnv, rn_st, text(rnv, rn_st, rx_st, drv_st, p1,s,n),p2),rn_ileave(rnv, rn_st, p1,text(rnv, rn_st, rx_st, drv_st, p2,s,n)));
|
372
|
+
break;
|
373
|
+
case RN_P_GROUP: rn_Group(p,p1,p2);
|
374
|
+
{ int p11=rn_group(rnv, rn_st, text(rnv, rn_st, rx_st, drv_st, p1,s,n),p2);
|
375
|
+
ret=rn_nullable(p1)?rn_choice(rnv, rn_st, p11,text(rnv, rn_st, rx_st, drv_st, p2,s,n)):p11;
|
376
|
+
} break;
|
377
|
+
case RN_P_ONE_OR_MORE: rn_OneOrMore(p,p1);
|
378
|
+
ret=rn_group(rnv, rn_st, text(rnv, rn_st, rx_st, drv_st, p1,s,n),rn_choice(rnv, rn_st, p,rnv->rn_empty));
|
379
|
+
break;
|
380
|
+
case RN_P_LIST: rn_List(p,p1);
|
381
|
+
ret=rn_nullable(list(rnv, rn_st, rx_st, drv_st, p1,s,n))?rnv->rn_empty:rnv->rn_notAllowed;
|
382
|
+
break;
|
383
|
+
case RN_P_DATA: rn_Data(p,dt,ps); rn_Datatype(dt,lib,typ);
|
384
|
+
ret=getdtl(rnv, drv_st, lib)->allows(rnv,rn_st,rx_st,rnv->rn_string+typ,rnv->rn_string+ps,s,n)?rnv->rn_empty:rnv->rn_notAllowed;
|
385
|
+
break;
|
386
|
+
case RN_P_DATA_EXCEPT: rn_DataExcept(p,p1,p2);
|
387
|
+
ret=text(rnv, rn_st, rx_st, drv_st, p1,s,n)==rnv->rn_empty&&!rn_nullable(text(rnv, rn_st, rx_st, drv_st, p2,s,n))?rnv->rn_empty:rnv->rn_notAllowed;
|
388
|
+
break;
|
389
|
+
case RN_P_VALUE: rn_Value(p,dt,val); rn_Datatype(dt,lib,typ);
|
390
|
+
ret=getdtl(rnv, drv_st, lib)->equal(rnv,rn_st,rx_st, rnv->rn_string+typ,rnv->rn_string+val,s,n)?rnv->rn_empty:rnv->rn_notAllowed;
|
391
|
+
break;
|
392
|
+
default: assert(0);
|
393
|
+
}
|
394
|
+
return ret;
|
395
|
+
}
|
396
|
+
|
397
|
+
static int textws(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, drv_st_t *drv_st, int p,char *s,int n) {
|
398
|
+
int p1=text(rnv, rn_st, rx_st, drv_st, p,s,n),ws=1;
|
399
|
+
char *end=s+n;
|
400
|
+
while(s!=end) {if(!xmlc_white_space(*s)) {ws=0; break;} ++s;}
|
401
|
+
return ws?rn_choice(rnv, rn_st, p,p1):p1;
|
402
|
+
}
|
403
|
+
int drv_text(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, drv_st_t *drv_st, int p,char *s,int n) {return textws(rnv, rn_st, rx_st, drv_st, p,s,n);}
|
404
|
+
int drv_text_recover(int p,char *s,int n) {return p;}
|
405
|
+
|
406
|
+
static int mixed_text(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p) { /* matches text in mixed context */
|
407
|
+
int p1,p2,ret=0,m;
|
408
|
+
m=newMixedText(rnv, drv_st, p);
|
409
|
+
if(m!=-1) return M_RET(m);
|
410
|
+
switch(RN_P_TYP(p)) {
|
411
|
+
case RN_P_NOT_ALLOWED: case RN_P_EMPTY:
|
412
|
+
case RN_P_ATTRIBUTE: case RN_P_ELEMENT:
|
413
|
+
case RN_P_LIST: case RN_P_DATA: case RN_P_DATA_EXCEPT: case RN_P_VALUE:
|
414
|
+
ret=rnv->rn_notAllowed;
|
415
|
+
break;
|
416
|
+
case RN_P_TEXT:
|
417
|
+
ret=p;
|
418
|
+
break;
|
419
|
+
case RN_P_AFTER: rn_After(p,p1,p2);
|
420
|
+
ret=rn_after(rnv, rn_st, mixed_text(rnv, drv_st, rn_st, p1),p2);
|
421
|
+
break;
|
422
|
+
case RN_P_CHOICE: rn_Choice(p,p1,p2);
|
423
|
+
ret=rn_choice(rnv, rn_st, mixed_text(rnv, drv_st, rn_st, p1),mixed_text(rnv, drv_st, rn_st, p2));
|
424
|
+
break;
|
425
|
+
case RN_P_INTERLEAVE: rn_Interleave(p,p1,p2);
|
426
|
+
ret=rn_choice(rnv, rn_st, rn_ileave(rnv, rn_st, mixed_text(rnv, drv_st, rn_st, p1),p2),rn_ileave(rnv, rn_st, p1,mixed_text(rnv, drv_st, rn_st, p2)));
|
427
|
+
break;
|
428
|
+
case RN_P_GROUP: rn_Group(p,p1,p2);
|
429
|
+
{ int p11=rn_group(rnv, rn_st, mixed_text(rnv, drv_st, rn_st, p1),p2);
|
430
|
+
ret=rn_nullable(p1)?rn_choice(rnv, rn_st, p11,mixed_text(rnv, drv_st, rn_st, p2)):p11;
|
431
|
+
} break;
|
432
|
+
case RN_P_ONE_OR_MORE: rn_OneOrMore(p,p1);
|
433
|
+
ret=rn_group(rnv, rn_st, mixed_text(rnv, drv_st, rn_st, p1),rn_choice(rnv, rn_st, p,rnv->rn_empty));
|
434
|
+
break;
|
435
|
+
default: assert(0);
|
436
|
+
}
|
437
|
+
newMixedText(rnv, drv_st, p); M_SET(ret);
|
438
|
+
accept_m(rnv, drv_st);
|
439
|
+
return ret;
|
440
|
+
}
|
441
|
+
int drv_mixed_text(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p) {return mixed_text(rnv, drv_st, rn_st, p);}
|
442
|
+
int drv_mixed_text_recover(int p) {return p;}
|
443
|
+
|
444
|
+
static int end_tag(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p,int recover) {
|
445
|
+
int p1,p2,ret=0,m;
|
446
|
+
if(!recover) {
|
447
|
+
m=newEndTag(rnv, drv_st, p);
|
448
|
+
if(m!=-1) return M_RET(m);
|
449
|
+
}
|
450
|
+
switch(RN_P_TYP(p)) {
|
451
|
+
case RN_P_NOT_ALLOWED: case RN_P_EMPTY: case RN_P_TEXT:
|
452
|
+
case RN_P_INTERLEAVE: case RN_P_GROUP: case RN_P_ONE_OR_MORE:
|
453
|
+
case RN_P_LIST: case RN_P_DATA: case RN_P_DATA_EXCEPT: case RN_P_VALUE:
|
454
|
+
case RN_P_ATTRIBUTE: case RN_P_ELEMENT:
|
455
|
+
ret=rnv->rn_notAllowed;
|
456
|
+
break;
|
457
|
+
case RN_P_CHOICE: rn_Choice(p,p1,p2);
|
458
|
+
ret=rn_choice(rnv, rn_st, end_tag(rnv, drv_st, rn_st, p1,recover),end_tag(rnv, drv_st, rn_st, p2,recover));
|
459
|
+
break;
|
460
|
+
case RN_P_AFTER: rn_After(p,p1,p2);
|
461
|
+
ret=(rn_nullable(p1)||recover)?p2:rnv->rn_notAllowed;
|
462
|
+
break;
|
463
|
+
default: assert(0);
|
464
|
+
}
|
465
|
+
if(!recover) {
|
466
|
+
newEndTag(rnv, drv_st, p); M_SET(ret);
|
467
|
+
accept_m(rnv, drv_st);
|
468
|
+
}
|
469
|
+
return ret;
|
470
|
+
}
|
471
|
+
int drv_end_tag(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p) {return end_tag(rnv, drv_st, rn_st, p,0);}
|
472
|
+
int drv_end_tag_recover(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p) {return end_tag(rnv, drv_st, rn_st, p,1);}
|