ruby_rnv 0.2.2 → 0.4.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.
data/ext/rnv/src/ary.c CHANGED
@@ -1,6 +1,5 @@
1
- #include "type.h"
2
-
3
1
  /* $Id: ary.c,v 1.4 2004/02/25 00:00:32 dvd Exp $ */
2
+ #include "type.h"
4
3
 
5
4
  #include "rn.h"
6
5
  #include "ary.h"
data/ext/rnv/src/drv.c CHANGED
@@ -1,6 +1,5 @@
1
- #include "type.h"
2
-
3
1
  /* $Id: drv.c,v 1.41 2004/03/13 13:28:02 dvd Exp $ */
2
+ #include "type.h"
4
3
 
5
4
  #include "xmlc.h" /*xmlc_white_space*/
6
5
  #include "m.h"
@@ -13,12 +12,6 @@
13
12
  #include "er.h"
14
13
  #include "drv.h"
15
14
 
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
15
  #define LEN_DTL DRV_LEN_DTL
23
16
  #define LEN_M DRV_LEN_M
24
17
  #define PRIME_M DRV_PRIME_M
@@ -34,10 +27,10 @@ struct dtl {
34
27
  #define M_SET(p) drv_st->memo[drv_st->i_m][M_SIZE-1]=p
35
28
  #define M_RET(m) drv_st->memo[m][M_SIZE-1]
36
29
 
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) {
30
+ #define err(msg) (*handler)(data,erno|ERBIT_DRV,msg"\n",ap);
31
+ void drv_default_verror_handler(void *data, int erno, int (*handler)(void *data, int erno,char *format, va_list ap), va_list ap) {
39
32
  if(erno&ERBIT_XSD) {
40
- xsd_default_verror_handler(rnv, erno&~ERBIT_XSD,ap);
33
+ xsd_default_verror_handler(data, erno&~ERBIT_XSD,handler, ap);
41
34
  } else {
42
35
  switch(erno) {
43
36
  case DRV_ER_NODTL: err("no datatype library for URI '%s'"); break;
@@ -46,14 +39,12 @@ void drv_default_verror_handler(rnv_t *rnv, int erno,va_list ap) {
46
39
  }
47
40
  }
48
41
 
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);
42
+ static void error_handler(drv_st_t *drv_st,int erno,...) {
43
+ va_list ap; va_start(ap,erno); drv_default_verror_handler(drv_st->user_data, erno, drv_st->verror_handler, ap); va_end(ap);
51
44
  }
52
45
 
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);
46
+ static void new_memo(drv_st_t *drv_st, int typ) {
47
+ if(drv_st->drv_compact) ht_deli(&drv_st->ht_m,drv_st->i_m);
57
48
  drv_st->memo[drv_st->i_m][0]=typ;
58
49
  }
59
50
 
@@ -68,54 +59,54 @@ static int hash_m(void *user, int m) {
68
59
  return ((me[0]&0x7)|((me[1]^me[2]^me[3])<<3))*PRIME_M;
69
60
  }
70
61
 
71
- static int newStartTagOpen(rnv_t *rnv, drv_st_t *drv_st, int p,int uri,int name) {
62
+ static int newStartTagOpen(drv_st_t *drv_st, int p,int uri,int name) {
72
63
  int *me=drv_st->memo[drv_st->i_m];
73
- new_memo(rnv, drv_st, M_STO);
64
+ new_memo(drv_st, M_STO);
74
65
  me[1]=p; me[2]=uri; me[3]=name;
75
66
  return ht_get(&drv_st->ht_m,drv_st->i_m);
76
67
  }
77
68
 
78
- static int newAttributeOpen(rnv_t *rnv, drv_st_t *drv_st, int p,int uri,int name) {
69
+ static int newAttributeOpen(drv_st_t *drv_st, int p,int uri,int name) {
79
70
  int *me=drv_st->memo[drv_st->i_m];
80
- new_memo(rnv, drv_st, M_ATT);
71
+ new_memo(drv_st, M_ATT);
81
72
  me[1]=p; me[2]=uri; me[3]=name;
82
73
  return ht_get(&drv_st->ht_m,drv_st->i_m);
83
74
  }
84
75
 
85
- static int newStartTagClose(rnv_t *rnv, drv_st_t *drv_st, int p) {
76
+ static int newStartTagClose(drv_st_t *drv_st, int p) {
86
77
  int *me=drv_st->memo[drv_st->i_m];
87
- new_memo(rnv, drv_st, M_STC);
78
+ new_memo(drv_st, M_STC);
88
79
  me[1]=p; me[2]=me[3]=0;
89
80
  return ht_get(&drv_st->ht_m,drv_st->i_m);
90
81
  }
91
82
 
92
- static int newMixedText(rnv_t *rnv, drv_st_t *drv_st, int p) {
83
+ static int newMixedText(drv_st_t *drv_st, int p) {
93
84
  int *me=drv_st->memo[drv_st->i_m];
94
- new_memo(rnv, drv_st, M_TXT);
85
+ new_memo(drv_st, M_TXT);
95
86
  me[1]=p; me[2]=me[3]=0;
96
87
  return ht_get(&drv_st->ht_m,drv_st->i_m);
97
88
  }
98
89
 
99
- static int newEndTag(rnv_t *rnv, drv_st_t *drv_st, int p) {
90
+ static int newEndTag(drv_st_t *drv_st, int p) {
100
91
  int *me=drv_st->memo[drv_st->i_m];
101
- new_memo(rnv, drv_st, M_END);
92
+ new_memo(drv_st, M_END);
102
93
  me[1]=p; me[2]=me[3]=0;
103
94
  return ht_get(&drv_st->ht_m,drv_st->i_m);
104
95
  }
105
96
 
106
- static void accept_m(rnv_t *rnv, drv_st_t *drv_st) {
97
+ static void accept_m(drv_st_t *drv_st) {
107
98
  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;
99
+ if(drv_st->drv_compact) ht_del(&drv_st->ht_m,drv_st->i_m); else return;
109
100
  }
110
101
  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;
102
+ if(drv_st->drv_compact&&drv_st->i_m==LIM_M) drv_st->i_m=0;
112
103
  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
104
  }
114
105
 
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;}
106
+ static int fallback_equal(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, int uri, char *typ,char *val,char *s,int n) {return 1;}
107
+ static int fallback_allows(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, int uri, char *typ,char *ps,char *s,int n) {return 1;}
117
108
 
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) {
109
+ static int builtin_equal(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, int uri, char *typ,char *val,char *s,int n) {
119
110
  int dt=rn_newDatatype(rnv, rn_st, 0,typ-rnv->rn_string);
120
111
  if(dt==rnv->rn_dt_string) return s_cmpn(val,s,n)==0;
121
112
  else if(dt==rnv->rn_dt_token) return s_tokcmpn(val,s,n)==0;
@@ -123,44 +114,53 @@ static int builtin_equal(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, char *typ,c
123
114
  return 0;
124
115
  }
125
116
 
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;}
117
+ static int builtin_allows(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, int uri, char *typ,char *ps,char *s,int n) {return 1;}
127
118
 
128
- static void windup(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st);
119
+ static int emb_xsd_allows(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, int uri, char *typ,char *ps,char *s,int n) {
120
+ return xsd_allows(rx_st, typ,ps,s,n);
121
+ }
122
+
123
+ static int emb_xsd_equal(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, int uri, char *typ,char *val,char *s,int n) {
124
+ return xsd_equal(rx_st, typ,val,s,n);
125
+ }
129
126
 
130
127
  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;
128
+ rx_st->verror_handler = &verror_default_handler;
129
+ drv_st->verror_handler = &verror_default_handler;
130
+
134
131
  xsd_init(rx_st);
135
- rnv->xsd_verror_handler=&verror_handler_xsd;
132
+
133
+ if(rnv->verror_handler)
134
+ rx_st->verror_handler = rnv->verror_handler;
135
+ rx_st->user_data = rnv->user_data;
136
+
136
137
  drv_st->memo=(int (*)[M_SIZE])m_alloc(drv_st->len_m=LEN_M,sizeof(int[M_SIZE]));
137
138
  drv_st->dtl=(struct dtl*)m_alloc(drv_st->len_dtl=LEN_DTL,sizeof(struct dtl));
138
139
  drv_st->ht_m.user = drv_st;
139
140
  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
141
 
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
- }
142
+ drv_st->i_m=0; drv_st->n_dtl=0;
143
+ drv_add_dtl(rnv, drv_st, rn_st, rnv->rn_string+0,&fallback_equal,&fallback_allows); /* guard at 0 */
144
+ drv_add_dtl(rnv, drv_st, rn_st, rnv->rn_string+0,&builtin_equal,&builtin_allows);
145
+ drv_add_dtl(rnv, drv_st, rn_st, rnv->rn_string+rnv->rn_xsd_uri,&emb_xsd_equal,&emb_xsd_allows);
150
146
 
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);
147
+ if(rnv->verror_handler)
148
+ drv_st->verror_handler = rnv->verror_handler;
149
+ drv_st->user_data = rnv->user_data;
156
150
  }
157
151
 
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);
152
+ void drv_dispose(drv_st_t *drv_st) {
153
+ if (drv_st->memo)
154
+ m_free(drv_st->memo);
155
+ if (drv_st->dtl)
156
+ m_free(drv_st->dtl);
157
+ ht_dispose(&drv_st->ht_m);
158
+ m_free(drv_st);
161
159
  }
162
160
 
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)) {
161
+ void drv_add_dtl(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, char *suri,
162
+ int (*equal)(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, int uri, char *typ,char *val,char *s,int n),
163
+ int (*allows)(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, int uri, char *typ,char *ps,char *s,int n)) {
164
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
165
  drv_st->dtl[drv_st->n_dtl].uri=rn_newString(rnv, rn_st, suri);
166
166
  drv_st->dtl[drv_st->n_dtl].equal=equal;
@@ -172,7 +172,7 @@ static struct dtl *getdtl(rnv_t *rnv, drv_st_t *drv_st, int uri) {
172
172
  int i;
173
173
  drv_st->dtl[0].uri=uri; i=drv_st->n_dtl;
174
174
  while(drv_st->dtl[--i].uri!=uri);
175
- if(i==0) error_handler(rnv, DRV_ER_NODTL,rnv->rn_string+uri);
175
+ if(i==0) error_handler(drv_st, DRV_ER_NODTL,rnv->rn_string+uri);
176
176
  return drv_st->dtl+i;
177
177
  }
178
178
 
@@ -207,7 +207,7 @@ static int apply_after(rnv_t *rnv, rn_st_t *rn_st, int (*f)(rnv_t *rnv, rn_st_t
207
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
208
  int nc,p1,p2,m,ret=0;
209
209
  if(!recover) {
210
- m=newStartTagOpen(rnv, drv_st, p,uri,name);
210
+ m=newStartTagOpen(drv_st, p,uri,name);
211
211
  if(m!=-1) return M_RET(m);
212
212
  }
213
213
  switch(RN_P_TYP(p)) {
@@ -240,8 +240,8 @@ static int start_tag_open(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p,in
240
240
  default: assert(0);
241
241
  }
242
242
  if(!recover) {
243
- newStartTagOpen(rnv, drv_st, p,uri,name); M_SET(ret);
244
- accept_m(rnv, drv_st);
243
+ newStartTagOpen(drv_st, p,uri,name); M_SET(ret);
244
+ accept_m(drv_st);
245
245
  }
246
246
  return ret;
247
247
  }
@@ -253,7 +253,7 @@ static int puorg_rn(rnv_t *rnv, rn_st_t *rn_st, int p2,int p1) {return rn_group(
253
253
 
254
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
255
  int nc,p1,p2,m,ret=0;
256
- m=newAttributeOpen(rnv, drv_st, p,uri,name);
256
+ m=newAttributeOpen(drv_st, p,uri,name);
257
257
  if(m!=-1) return M_RET(m);
258
258
  switch(RN_P_TYP(p)) {
259
259
  case RN_P_NOT_ALLOWED: case RN_P_EMPTY: case RN_P_TEXT:
@@ -285,8 +285,8 @@ static int attribute_open(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p,in
285
285
  break;
286
286
  default: assert(0);
287
287
  }
288
- newAttributeOpen(rnv, drv_st, p,uri,name); M_SET(ret);
289
- accept_m(rnv, drv_st);
288
+ newAttributeOpen(drv_st, p,uri,name); M_SET(ret);
289
+ accept_m(drv_st);
290
290
  return ret;
291
291
  }
292
292
 
@@ -299,7 +299,7 @@ extern int drv_attribute_close_recover(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn
299
299
  static int start_tag_close(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p,int recover) {
300
300
  int p1,p2,ret=0,m;
301
301
  if(!recover) {
302
- m=newStartTagClose(rnv, drv_st, p);
302
+ m=newStartTagClose(drv_st, p);
303
303
  if(m!=-1) return M_RET(m);
304
304
  }
305
305
  switch(RN_P_TYP(p)) {
@@ -329,8 +329,8 @@ static int start_tag_close(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p,i
329
329
  default: assert(0);
330
330
  }
331
331
  if(!recover) {
332
- newStartTagClose(rnv, drv_st, p); M_SET(ret);
333
- accept_m(rnv, drv_st);
332
+ newStartTagClose(drv_st, p); M_SET(ret);
333
+ accept_m(drv_st);
334
334
  }
335
335
  return ret;
336
336
  }
@@ -381,13 +381,13 @@ static int text(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, drv_st_t *drv_st, in
381
381
  ret=rn_nullable(list(rnv, rn_st, rx_st, drv_st, p1,s,n))?rnv->rn_empty:rnv->rn_notAllowed;
382
382
  break;
383
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;
384
+ ret=getdtl(rnv, drv_st, lib)->allows(rnv,rn_st,rx_st, lib, rnv->rn_string+typ,rnv->rn_string+ps,s,n)?rnv->rn_empty:rnv->rn_notAllowed;
385
385
  break;
386
386
  case RN_P_DATA_EXCEPT: rn_DataExcept(p,p1,p2);
387
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
388
  break;
389
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;
390
+ ret=getdtl(rnv, drv_st, lib)->equal(rnv,rn_st,rx_st, lib, rnv->rn_string+typ,rnv->rn_string+val,s,n)?rnv->rn_empty:rnv->rn_notAllowed;
391
391
  break;
392
392
  default: assert(0);
393
393
  }
@@ -405,7 +405,7 @@ int drv_text_recover(int p,char *s,int n) {return p;}
405
405
 
406
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
407
  int p1,p2,ret=0,m;
408
- m=newMixedText(rnv, drv_st, p);
408
+ m=newMixedText(drv_st, p);
409
409
  if(m!=-1) return M_RET(m);
410
410
  switch(RN_P_TYP(p)) {
411
411
  case RN_P_NOT_ALLOWED: case RN_P_EMPTY:
@@ -434,8 +434,8 @@ static int mixed_text(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p) { /*
434
434
  break;
435
435
  default: assert(0);
436
436
  }
437
- newMixedText(rnv, drv_st, p); M_SET(ret);
438
- accept_m(rnv, drv_st);
437
+ newMixedText(drv_st, p); M_SET(ret);
438
+ accept_m(drv_st);
439
439
  return ret;
440
440
  }
441
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);}
@@ -444,7 +444,7 @@ int drv_mixed_text_recover(int p) {return p;}
444
444
  static int end_tag(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p,int recover) {
445
445
  int p1,p2,ret=0,m;
446
446
  if(!recover) {
447
- m=newEndTag(rnv, drv_st, p);
447
+ m=newEndTag(drv_st, p);
448
448
  if(m!=-1) return M_RET(m);
449
449
  }
450
450
  switch(RN_P_TYP(p)) {
@@ -463,8 +463,8 @@ static int end_tag(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p,int recov
463
463
  default: assert(0);
464
464
  }
465
465
  if(!recover) {
466
- newEndTag(rnv, drv_st, p); M_SET(ret);
467
- accept_m(rnv, drv_st);
466
+ newEndTag(drv_st, p); M_SET(ret);
467
+ accept_m(drv_st);
468
468
  }
469
469
  return ret;
470
470
  }
data/ext/rnv/src/drv.h CHANGED
@@ -9,13 +9,22 @@
9
9
 
10
10
  #define DRV_ER_NODTL 0
11
11
 
12
- extern void drv_default_verror_handler(rnv_t *rnv, int erno,va_list ap);
12
+ struct dtl {
13
+ int uri;
14
+ int (*equal)(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, int uri, char *typ,char *val,char *s,int n);
15
+ int (*allows)(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, int uri, char *typ,char *ps,char *s,int n);
16
+ };
17
+
18
+ extern void drv_default_verror_handler(void *data, int erno, int (*handler)(void *data, int erno,char *format, va_list ap), va_list ap);
13
19
 
14
20
  extern void drv_init(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, rx_st_t *rx_st);
15
- extern void drv_clear(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st);
21
+
22
+ extern void drv_dispose(drv_st_t *drv_st);
16
23
 
17
24
  /* Expat passes character data unterminated. Hence functions that can deal with cdata expect the length of the data */
18
- extern 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));
25
+ extern void drv_add_dtl(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, char *suri,
26
+ int (*equal)(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, int uri, char *typ,char *val,char *s,int n),
27
+ int (*allows)(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, int uri, char *typ,char *ps,char *s,int n));
19
28
 
20
29
  extern int drv_start_tag_open(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p,char *suri,char *sname);
21
30
  extern 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);
data/ext/rnv/src/er.c CHANGED
@@ -12,4 +12,4 @@ int er_default_printf(char *format,...) {
12
12
  return ret;
13
13
  }
14
14
  int er_default_vprintf(char *format,va_list ap) {return vfprintf(stderr,format,ap);}
15
- int verror_default_handler(rnv_t *rnv, int erno, char *format,va_list ap) {return vfprintf(stderr,format,ap);}
15
+ int verror_default_handler(void *data, int erno, char *format,va_list ap) {return vfprintf(stderr,format,ap);}
data/ext/rnv/src/er.h CHANGED
@@ -11,6 +11,6 @@ extern int (*er_vprintf)(char *format,va_list ap);
11
11
 
12
12
  extern int er_default_printf(char *format,...);
13
13
  extern int er_default_vprintf(char *format,va_list ap);
14
- extern int verror_default_handler(rnv_t *rnv, int erno, char *format,va_list ap);
14
+ extern int verror_default_handler(void *data, int erno, char *format,va_list ap);
15
15
 
16
16
  #endif
data/ext/rnv/src/erbit.h CHANGED
@@ -6,9 +6,12 @@
6
6
  #define ERBIT_RNC 0x01000
7
7
  #define ERBIT_RND 0x02000
8
8
  #define ERBIT_RNL 0x04000
9
+
9
10
  #define ERBIT_RX 0x08000
10
11
  #define ERBIT_XSD 0x10000
11
12
  #define ERBIT_DRV 0x20000
12
13
  #define ERBIT_RNV 0x40000
13
14
 
15
+ #define ERBIT_DTL 0x80000
16
+
14
17
  #endif
data/ext/rnv/src/rn.c CHANGED
@@ -1,8 +1,9 @@
1
- #include "type.h"
2
-
3
1
  /* $Id: rn.c,v 1.62 2004/03/13 14:12:11 dvd Exp $ */
4
2
 
5
3
  #include <string.h> /* strcmp,strlen,strcpy*/
4
+
5
+ #include "type.h"
6
+
6
7
  #include "m.h"
7
8
  #include "s.h" /* s_hval */
8
9
  #include "ht.h"
@@ -276,10 +277,7 @@ static int equal_p(void *user, int p1,int p2);
276
277
  static int equal_nc(void *user, int nc1,int nc2);
277
278
  static int equal_s(void *user, int s1,int s2);
278
279
 
279
- static void windup(rnv_t *rnv, rn_st_t *rn_st);
280
-
281
280
  void rn_init(rnv_t *rnv, rn_st_t *rn_st) {
282
- memset(rn_st, 0, sizeof(rn_st_t));
283
281
  rnv->rn_pattern=(int *)m_alloc(rn_st->len_p=P_AVG_SIZE*LEN_P,sizeof(int));
284
282
  rnv->rn_nameclass=(int *)m_alloc(rn_st->len_nc=NC_AVG_SIZE*LEN_NC,sizeof(int));
285
283
  rnv->rn_string=(char*)m_alloc(rn_st->len_s=S_AVG_SIZE*LEN_S,sizeof(char));
@@ -289,27 +287,27 @@ void rn_init(rnv_t *rnv, rn_st_t *rn_st) {
289
287
  ht_init(&rn_st->ht_p,LEN_P,&hash_p,&equal_p);
290
288
  ht_init(&rn_st->ht_nc,LEN_NC,&hash_nc,&equal_nc);
291
289
  ht_init(&rn_st->ht_s,LEN_S,&hash_s,&equal_s);
292
- windup(rnv, rn_st);
293
- }
294
-
295
- void rn_clear(rnv_t *rnv, rn_st_t *rn_st) {
296
- ht_clear(&rn_st->ht_p); ht_clear(&rn_st->ht_nc); ht_clear(&rn_st->ht_s);
297
- windup(rnv, rn_st);
298
- }
299
-
300
- static void windup(rnv_t *rnv, rn_st_t *rn_st) {
301
- rn_st->i_p=rn_st->i_nc=rn_st->i_s=0;
302
- rn_st->adding_ps=0;
303
- rnv->rn_pattern[0]=RN_P_ERROR; accept_p(rnv, rn_st);
304
- rnv->rn_nameclass[0]=RN_NC_ERROR; accept_nc(rnv, rn_st);
305
- rn_newString(rnv, rn_st, "");
306
- rnv->rn_notAllowed=rn_newNotAllowed(rnv, rn_st);
307
- rnv->rn_empty=rn_newEmpty(rnv, rn_st);
308
- rnv->rn_text=rn_newText(rnv, rn_st);
309
- rn_st->BASE_P=rn_st->i_p;
310
- rnv->rn_dt_string=rn_newDatatype(rnv, rn_st, 0,rn_newString(rnv, rn_st, "string"));
311
- rnv->rn_dt_token=rn_newDatatype(rnv, rn_st, 0,rn_newString(rnv, rn_st, "token"));
312
- rnv->rn_xsd_uri=rn_newString(rnv, rn_st, "http://www.w3.org/2001/XMLSchema-datatypes");
290
+
291
+ rn_st->i_p=rn_st->i_nc=rn_st->i_s=0;
292
+ rn_st->adding_ps=0;
293
+ rnv->rn_pattern[0]=RN_P_ERROR; accept_p(rnv, rn_st);
294
+ rnv->rn_nameclass[0]=RN_NC_ERROR; accept_nc(rnv, rn_st);
295
+ rn_newString(rnv, rn_st, "");
296
+ rnv->rn_notAllowed=rn_newNotAllowed(rnv, rn_st);
297
+ rnv->rn_empty=rn_newEmpty(rnv, rn_st);
298
+ rnv->rn_text=rn_newText(rnv, rn_st);
299
+ rn_st->BASE_P=rn_st->i_p;
300
+ rnv->rn_dt_string=rn_newDatatype(rnv, rn_st, 0,rn_newString(rnv, rn_st, "string"));
301
+ rnv->rn_dt_token=rn_newDatatype(rnv, rn_st, 0,rn_newString(rnv, rn_st, "token"));
302
+ rnv->rn_xsd_uri=rn_newString(rnv, rn_st, "http://www.w3.org/2001/XMLSchema-datatypes");
303
+ }
304
+
305
+ void rn_dispose(rn_st_t *rn_st) {
306
+ ht_dispose(&rn_st->ht_p);
307
+ ht_dispose(&rn_st->ht_nc);
308
+ ht_dispose(&rn_st->ht_s);
309
+
310
+ m_free(rn_st);
313
311
  }
314
312
 
315
313
  static int hash_p(void *user, int p) {