ruby_rnv 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -0
  3. data/ext/rnv/extconf.rb +15 -0
  4. data/ext/rnv/ruby_rnv.c +742 -0
  5. data/ext/rnv/src/ary.c +78 -0
  6. data/ext/rnv/src/ary.h +10 -0
  7. data/ext/rnv/src/drv.c +472 -0
  8. data/ext/rnv/src/drv.h +35 -0
  9. data/ext/rnv/src/er.c +15 -0
  10. data/ext/rnv/src/er.h +16 -0
  11. data/ext/rnv/src/erbit.h +14 -0
  12. data/ext/rnv/src/ht.c +90 -0
  13. data/ext/rnv/src/ht.h +22 -0
  14. data/ext/rnv/src/ll.h +43 -0
  15. data/ext/rnv/src/m.c +60 -0
  16. data/ext/rnv/src/m.h +10 -0
  17. data/ext/rnv/src/rn.c +569 -0
  18. data/ext/rnv/src/rn.h +150 -0
  19. data/ext/rnv/src/rnc.c +1191 -0
  20. data/ext/rnv/src/rnc.h +68 -0
  21. data/ext/rnv/src/rnd.c +436 -0
  22. data/ext/rnv/src/rnd.h +25 -0
  23. data/ext/rnv/src/rnl.c +62 -0
  24. data/ext/rnv/src/rnl.h +18 -0
  25. data/ext/rnv/src/rnv.c +158 -0
  26. data/ext/rnv/src/rnv.h +30 -0
  27. data/ext/rnv/src/rnx.c +153 -0
  28. data/ext/rnv/src/rnx.h +16 -0
  29. data/ext/rnv/src/rx.c +749 -0
  30. data/ext/rnv/src/rx.h +43 -0
  31. data/ext/rnv/src/rx_cls_ranges.c +126 -0
  32. data/ext/rnv/src/rx_cls_u.c +262 -0
  33. data/ext/rnv/src/s.c +103 -0
  34. data/ext/rnv/src/s.h +32 -0
  35. data/ext/rnv/src/sc.c +62 -0
  36. data/ext/rnv/src/sc.h +26 -0
  37. data/ext/rnv/src/type.h +121 -0
  38. data/ext/rnv/src/u.c +88 -0
  39. data/ext/rnv/src/u.h +26 -0
  40. data/ext/rnv/src/xcl.c +472 -0
  41. data/ext/rnv/src/xmlc.c +20 -0
  42. data/ext/rnv/src/xmlc.h +16 -0
  43. data/ext/rnv/src/xsd.c +789 -0
  44. data/ext/rnv/src/xsd.h +27 -0
  45. data/ext/rnv/src/xsd_tm.c +100 -0
  46. data/ext/rnv/src/xsd_tm.h +15 -0
  47. data/lib/rnv.rb +2 -0
  48. data/lib/rnv/ox_sax_document.rb +84 -0
  49. data/lib/rnv/validator.rb +104 -0
  50. 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
@@ -0,0 +1,10 @@
1
+ #include "type.h"
2
+
3
+ /* $Id: ary.h,v 1.1 2004/01/05 13:00:17 dvd Exp $ */
4
+
5
+ #ifndef ARY_H
6
+ #define ARY_H 1
7
+
8
+ extern int ary_isany(rnv_t *rnv, int p);
9
+
10
+ #endif
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);}