ruby_rnv 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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);}