ruby_rnv 0.3.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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"
@@ -28,10 +27,10 @@
28
27
  #define M_SET(p) drv_st->memo[drv_st->i_m][M_SIZE-1]=p
29
28
  #define M_RET(m) drv_st->memo[m][M_SIZE-1]
30
29
 
31
- #define err(msg) (*rnv->verror_handler)(rnv,erno|ERBIT_DRV,msg"\n",ap);
32
- 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) {
33
32
  if(erno&ERBIT_XSD) {
34
- xsd_default_verror_handler(rnv, erno&~ERBIT_XSD,ap);
33
+ xsd_default_verror_handler(data, erno&~ERBIT_XSD,handler, ap);
35
34
  } else {
36
35
  switch(erno) {
37
36
  case DRV_ER_NODTL: err("no datatype library for URI '%s'"); break;
@@ -40,14 +39,12 @@ void drv_default_verror_handler(rnv_t *rnv, int erno,va_list ap) {
40
39
  }
41
40
  }
42
41
 
43
- static void error_handler(rnv_t *rnv,int erno,...) {
44
- 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);
45
44
  }
46
45
 
47
- static void verror_handler_xsd(rnv_t *rnv, int erno,va_list ap) {drv_default_verror_handler(rnv,erno|ERBIT_XSD,ap);}
48
-
49
- static void new_memo(rnv_t *rnv, drv_st_t *drv_st, int typ) {
50
- 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);
51
48
  drv_st->memo[drv_st->i_m][0]=typ;
52
49
  }
53
50
 
@@ -62,47 +59,47 @@ static int hash_m(void *user, int m) {
62
59
  return ((me[0]&0x7)|((me[1]^me[2]^me[3])<<3))*PRIME_M;
63
60
  }
64
61
 
65
- 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) {
66
63
  int *me=drv_st->memo[drv_st->i_m];
67
- new_memo(rnv, drv_st, M_STO);
64
+ new_memo(drv_st, M_STO);
68
65
  me[1]=p; me[2]=uri; me[3]=name;
69
66
  return ht_get(&drv_st->ht_m,drv_st->i_m);
70
67
  }
71
68
 
72
- 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) {
73
70
  int *me=drv_st->memo[drv_st->i_m];
74
- new_memo(rnv, drv_st, M_ATT);
71
+ new_memo(drv_st, M_ATT);
75
72
  me[1]=p; me[2]=uri; me[3]=name;
76
73
  return ht_get(&drv_st->ht_m,drv_st->i_m);
77
74
  }
78
75
 
79
- static int newStartTagClose(rnv_t *rnv, drv_st_t *drv_st, int p) {
76
+ static int newStartTagClose(drv_st_t *drv_st, int p) {
80
77
  int *me=drv_st->memo[drv_st->i_m];
81
- new_memo(rnv, drv_st, M_STC);
78
+ new_memo(drv_st, M_STC);
82
79
  me[1]=p; me[2]=me[3]=0;
83
80
  return ht_get(&drv_st->ht_m,drv_st->i_m);
84
81
  }
85
82
 
86
- static int newMixedText(rnv_t *rnv, drv_st_t *drv_st, int p) {
83
+ static int newMixedText(drv_st_t *drv_st, int p) {
87
84
  int *me=drv_st->memo[drv_st->i_m];
88
- new_memo(rnv, drv_st, M_TXT);
85
+ new_memo(drv_st, M_TXT);
89
86
  me[1]=p; me[2]=me[3]=0;
90
87
  return ht_get(&drv_st->ht_m,drv_st->i_m);
91
88
  }
92
89
 
93
- static int newEndTag(rnv_t *rnv, drv_st_t *drv_st, int p) {
90
+ static int newEndTag(drv_st_t *drv_st, int p) {
94
91
  int *me=drv_st->memo[drv_st->i_m];
95
- new_memo(rnv, drv_st, M_END);
92
+ new_memo(drv_st, M_END);
96
93
  me[1]=p; me[2]=me[3]=0;
97
94
  return ht_get(&drv_st->ht_m,drv_st->i_m);
98
95
  }
99
96
 
100
- static void accept_m(rnv_t *rnv, drv_st_t *drv_st) {
97
+ static void accept_m(drv_st_t *drv_st) {
101
98
  if(ht_get(&drv_st->ht_m,drv_st->i_m)!=-1) {
102
- 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;
103
100
  }
104
101
  ht_put(&drv_st->ht_m,drv_st->i_m++);
105
- 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;
106
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]));
107
104
  }
108
105
 
@@ -119,39 +116,46 @@ static int builtin_equal(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, int uri, ch
119
116
 
120
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;}
121
118
 
122
- 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
+ }
123
126
 
124
127
  void drv_init(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, rx_st_t *rx_st) {
125
- rnv->drv_verror_handler=&drv_default_verror_handler;
126
- rn_init(rnv, rn_st);
127
- rx_st->rnv = rnv;
128
+ rx_st->verror_handler = &verror_default_handler;
129
+ drv_st->verror_handler = &verror_default_handler;
130
+
128
131
  xsd_init(rx_st);
129
- 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
+
130
137
  drv_st->memo=(int (*)[M_SIZE])m_alloc(drv_st->len_m=LEN_M,sizeof(int[M_SIZE]));
131
138
  drv_st->dtl=(struct dtl*)m_alloc(drv_st->len_dtl=LEN_DTL,sizeof(struct dtl));
132
139
  drv_st->ht_m.user = drv_st;
133
140
  ht_init(&drv_st->ht_m,LEN_M,&hash_m,&equal_m);
134
- windup(rnv, drv_st, rn_st);
135
- }
136
141
 
137
- 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) {
138
- return xsd_allows(rx_st, typ,ps,s,n);
139
- }
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);
140
146
 
141
- 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) {
142
- return xsd_equal(rx_st, typ,val,s,n);
143
- }
144
-
145
- static void windup(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st) {
146
- drv_st->i_m=0; drv_st->n_dtl=0;
147
- drv_add_dtl(rnv, drv_st, rn_st, rnv->rn_string+0,&fallback_equal,&fallback_allows); /* guard at 0 */
148
- drv_add_dtl(rnv, drv_st, rn_st, rnv->rn_string+0,&builtin_equal,&builtin_allows);
149
- 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;
150
150
  }
151
151
 
152
- void drv_clear(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st) {
153
- ht_clear(&drv_st->ht_m);
154
- 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);
155
159
  }
156
160
 
157
161
  void drv_add_dtl(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, char *suri,
@@ -168,7 +172,7 @@ static struct dtl *getdtl(rnv_t *rnv, drv_st_t *drv_st, int uri) {
168
172
  int i;
169
173
  drv_st->dtl[0].uri=uri; i=drv_st->n_dtl;
170
174
  while(drv_st->dtl[--i].uri!=uri);
171
- 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);
172
176
  return drv_st->dtl+i;
173
177
  }
174
178
 
@@ -203,7 +207,7 @@ static int apply_after(rnv_t *rnv, rn_st_t *rn_st, int (*f)(rnv_t *rnv, rn_st_t
203
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) {
204
208
  int nc,p1,p2,m,ret=0;
205
209
  if(!recover) {
206
- m=newStartTagOpen(rnv, drv_st, p,uri,name);
210
+ m=newStartTagOpen(drv_st, p,uri,name);
207
211
  if(m!=-1) return M_RET(m);
208
212
  }
209
213
  switch(RN_P_TYP(p)) {
@@ -236,8 +240,8 @@ static int start_tag_open(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p,in
236
240
  default: assert(0);
237
241
  }
238
242
  if(!recover) {
239
- newStartTagOpen(rnv, drv_st, p,uri,name); M_SET(ret);
240
- accept_m(rnv, drv_st);
243
+ newStartTagOpen(drv_st, p,uri,name); M_SET(ret);
244
+ accept_m(drv_st);
241
245
  }
242
246
  return ret;
243
247
  }
@@ -249,7 +253,7 @@ static int puorg_rn(rnv_t *rnv, rn_st_t *rn_st, int p2,int p1) {return rn_group(
249
253
 
250
254
  static int attribute_open(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p,int uri,int name) {
251
255
  int nc,p1,p2,m,ret=0;
252
- m=newAttributeOpen(rnv, drv_st, p,uri,name);
256
+ m=newAttributeOpen(drv_st, p,uri,name);
253
257
  if(m!=-1) return M_RET(m);
254
258
  switch(RN_P_TYP(p)) {
255
259
  case RN_P_NOT_ALLOWED: case RN_P_EMPTY: case RN_P_TEXT:
@@ -281,8 +285,8 @@ static int attribute_open(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p,in
281
285
  break;
282
286
  default: assert(0);
283
287
  }
284
- newAttributeOpen(rnv, drv_st, p,uri,name); M_SET(ret);
285
- accept_m(rnv, drv_st);
288
+ newAttributeOpen(drv_st, p,uri,name); M_SET(ret);
289
+ accept_m(drv_st);
286
290
  return ret;
287
291
  }
288
292
 
@@ -295,7 +299,7 @@ extern int drv_attribute_close_recover(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn
295
299
  static int start_tag_close(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p,int recover) {
296
300
  int p1,p2,ret=0,m;
297
301
  if(!recover) {
298
- m=newStartTagClose(rnv, drv_st, p);
302
+ m=newStartTagClose(drv_st, p);
299
303
  if(m!=-1) return M_RET(m);
300
304
  }
301
305
  switch(RN_P_TYP(p)) {
@@ -325,8 +329,8 @@ static int start_tag_close(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p,i
325
329
  default: assert(0);
326
330
  }
327
331
  if(!recover) {
328
- newStartTagClose(rnv, drv_st, p); M_SET(ret);
329
- accept_m(rnv, drv_st);
332
+ newStartTagClose(drv_st, p); M_SET(ret);
333
+ accept_m(drv_st);
330
334
  }
331
335
  return ret;
332
336
  }
@@ -377,7 +381,18 @@ static int text(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, drv_st_t *drv_st, in
377
381
  ret=rn_nullable(list(rnv, rn_st, rx_st, drv_st, p1,s,n))?rnv->rn_empty:rnv->rn_notAllowed;
378
382
  break;
379
383
  case RN_P_DATA: rn_Data(p,dt,ps); rn_Datatype(dt,lib,typ);
384
+ int i;
385
+ // avoid dtl called multiple times for same data
386
+ for(i = 0;i<drv_st->n_dtl_cb;i++) {
387
+ if(drv_st->dtl_cb[i].p == p)
388
+ ret = drv_st->dtl_cb[i].ret;
389
+ }
390
+ if(!ret) {
380
391
  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;
392
+ drv_st->dtl_cb[drv_st->n_dtl_cb].p = p;
393
+ drv_st->dtl_cb[drv_st->n_dtl_cb].ret = ret;
394
+ drv_st->n_dtl_cb++;
395
+ }
381
396
  break;
382
397
  case RN_P_DATA_EXCEPT: rn_DataExcept(p,p1,p2);
383
398
  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;
@@ -391,6 +406,7 @@ static int text(rnv_t *rnv, rn_st_t *rn_st, rx_st_t *rx_st, drv_st_t *drv_st, in
391
406
  }
392
407
 
393
408
  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) {
409
+ drv_st->n_dtl_cb = 0;
394
410
  int p1=text(rnv, rn_st, rx_st, drv_st, p,s,n),ws=1;
395
411
  char *end=s+n;
396
412
  while(s!=end) {if(!xmlc_white_space(*s)) {ws=0; break;} ++s;}
@@ -401,7 +417,7 @@ int drv_text_recover(int p,char *s,int n) {return p;}
401
417
 
402
418
  static int mixed_text(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p) { /* matches text in mixed context */
403
419
  int p1,p2,ret=0,m;
404
- m=newMixedText(rnv, drv_st, p);
420
+ m=newMixedText(drv_st, p);
405
421
  if(m!=-1) return M_RET(m);
406
422
  switch(RN_P_TYP(p)) {
407
423
  case RN_P_NOT_ALLOWED: case RN_P_EMPTY:
@@ -430,8 +446,8 @@ static int mixed_text(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p) { /*
430
446
  break;
431
447
  default: assert(0);
432
448
  }
433
- newMixedText(rnv, drv_st, p); M_SET(ret);
434
- accept_m(rnv, drv_st);
449
+ newMixedText(drv_st, p); M_SET(ret);
450
+ accept_m(drv_st);
435
451
  return ret;
436
452
  }
437
453
  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);}
@@ -440,7 +456,7 @@ int drv_mixed_text_recover(int p) {return p;}
440
456
  static int end_tag(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p,int recover) {
441
457
  int p1,p2,ret=0,m;
442
458
  if(!recover) {
443
- m=newEndTag(rnv, drv_st, p);
459
+ m=newEndTag(drv_st, p);
444
460
  if(m!=-1) return M_RET(m);
445
461
  }
446
462
  switch(RN_P_TYP(p)) {
@@ -459,8 +475,8 @@ static int end_tag(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int p,int recov
459
475
  default: assert(0);
460
476
  }
461
477
  if(!recover) {
462
- newEndTag(rnv, drv_st, p); M_SET(ret);
463
- accept_m(rnv, drv_st);
478
+ newEndTag(drv_st, p); M_SET(ret);
479
+ accept_m(drv_st);
464
480
  }
465
481
  return ret;
466
482
  }
data/ext/rnv/src/drv.h CHANGED
@@ -15,10 +15,11 @@ struct dtl {
15
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
16
  };
17
17
 
18
- extern void drv_default_verror_handler(rnv_t *rnv, int erno,va_list ap);
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);
19
19
 
20
20
  extern void drv_init(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, rx_st_t *rx_st);
21
- 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);
22
23
 
23
24
  /* Expat passes character data unterminated. Hence functions that can deal with cdata expect the length of the data */
24
25
  extern void drv_add_dtl(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, char *suri,
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) {
data/ext/rnv/src/rn.h CHANGED
@@ -142,7 +142,7 @@ extern void rn_add_psval(rnv_t *rnv, rn_st_t *rn_st, char *s);
142
142
  extern void rn_end_ps(rnv_t *rnv, rn_st_t *rn_st);
143
143
 
144
144
  extern void rn_init(rnv_t *rnv, rn_st_t *rn_st);
145
- extern void rn_clear(rnv_t *rnv, rn_st_t *rn_st);
145
+ extern void rn_dispose(rn_st_t *rn_st);
146
146
 
147
147
  extern void rn_compress(rnv_t *rnv, rn_st_t *rn_st, int *starts,int n);
148
148
  extern int rn_compress_last(rnv_t *rnv, rn_st_t *rn_st, int start);
data/ext/rnv/src/rnc.c CHANGED
@@ -1,7 +1,4 @@
1
- #include "type.h"
2
-
3
1
  /* $Id: rnc.c,v 1.74 2004/08/18 19:10:51 dvd Exp $ */
4
-
5
2
  #include <fcntl.h> /* open, close */
6
3
  #include <sys/types.h>
7
4
  #include <unistd.h> /* open,read,close */
@@ -9,6 +6,8 @@
9
6
  #include <errno.h> /*errno*/
10
7
  #include <assert.h> /*assert*/
11
8
 
9
+ #include "type.h"
10
+
12
11
  #include "u.h"
13
12
  #include "xmlc.h"
14
13
  #include "m.h"
@@ -75,9 +74,9 @@ static char *kwdtab[NKWD]={
75
74
  #define SYM_DOCUMENTATION 41 /* ## */
76
75
  #define SYM_LITERAL 42
77
76
 
78
- #define err(msg) (*rnv->verror_handler)(rnv,erno|ERBIT_RNC,"%s:%i:%i: error: "msg"\n",ap)
79
- #define warn(msg) (*rnv->verror_handler)(rnv,erno|ERBIT_RNC,"%s:%i:%i: warning: "msg"\n",ap)
80
- void rnc_default_verror_handler(rnv_t *rnv, int erno,va_list ap) {
77
+ #define err(msg) (*handler)(data,erno|ERBIT_RNC,"%s:%i:%i: error: "msg"\n",ap)
78
+ #define warn(msg) (*handler)(data,erno|ERBIT_RNC,"%s:%i:%i: warning: "msg"\n",ap)
79
+ void rnc_default_verror_handler(void *data, int erno, int (*handler)(void *data, int erno,char *format, va_list ap), va_list ap) {
81
80
  switch(erno) {
82
81
  case RNC_ER_IO: err("I/O error: %s\n"); break;
83
82
  case RNC_ER_UTF: err("invalid UTF-8 sequence"); break;
@@ -171,6 +170,9 @@ static void rnc_source_init(struct rnc_source *sp,char *fn) {
171
170
  sp->cur=0;
172
171
  for(i=0;i!=2;++i) sp->sym[i].s=(char*)m_alloc(
173
172
  sp->sym[i].slen=BUFSIZE,sizeof(char));
173
+
174
+ if(!sp->verror_handler)
175
+ sp->verror_handler= &verror_default_handler;
174
176
  }
175
177
 
176
178
  static int rnc_read(struct rnc_source *sp) {
@@ -201,20 +203,29 @@ int rnc_errors(struct rnc_source *sp) {
201
203
  #define DE_CHOICE 8
202
204
  #define DE_ILEAVE 16
203
205
 
204
- void rnc_init(rnv_t *rnv, rnc_st_t *rnc_st, rn_st_t *rn_st) {
205
- memset(rnc_st, 0, sizeof(rnc_st_t));
206
- rnv->rnc_verror_handler=&rnc_default_verror_handler;
207
- rn_init(rnv, rn_st);
206
+ void rnc_init(rnc_st_t *rnc_st) {
207
+ rnc_st->verror_handler = &verror_default_handler;
208
208
  rnc_st->len_p=LEN_P; rnc_st->path=(char*)m_alloc(rnc_st->len_p,sizeof(char));
209
209
  /* initialize scopes */
210
210
  sc_init(&rnc_st->nss); sc_init(&rnc_st->dts); sc_init(&rnc_st->defs); sc_init(&rnc_st->refs); sc_init(&rnc_st->prefs);
211
211
  }
212
212
 
213
- void rnc_clear(void) {}
213
+ void rnc_dispose(rnc_st_t *rnc_st) {
214
+ if (rnc_st->path)
215
+ m_free(rnc_st->path);
216
+
217
+ sc_dispose(&rnc_st->nss);
218
+ sc_dispose(&rnc_st->dts);
219
+ sc_dispose(&rnc_st->defs);
220
+ sc_dispose(&rnc_st->refs);
221
+ sc_dispose(&rnc_st->prefs);
222
+
223
+ m_free(rnc_st);
224
+ }
214
225
 
215
226
  static void error(int force,struct rnc_source *sp,int erno,...) {
216
227
  if(force || sp->line != sp->prevline) {
217
- va_list ap; va_start(ap,erno); sp->rnv->rnc_verror_handler(sp->rnv, erno,ap); va_end(ap);
228
+ va_list ap; va_start(ap,erno); rnc_default_verror_handler(sp->user_data, erno, sp->verror_handler, ap); va_end(ap);
218
229
  sp->prevline=sp->line;
219
230
  }
220
231
  sp->flags|=SRC_ERRORS;
@@ -222,7 +233,7 @@ static void error(int force,struct rnc_source *sp,int erno,...) {
222
233
 
223
234
  static void warning(int force,struct rnc_source *sp,int erno,...) {
224
235
  if(force || sp->line != sp->prevline) {
225
- va_list ap; va_start(ap,erno); sp->rnv->rnc_verror_handler(sp->rnv, erno,ap); va_end(ap);
236
+ va_list ap; va_start(ap,erno); rnc_default_verror_handler(sp->user_data, erno,sp->verror_handler, ap); va_end(ap);
226
237
  }
227
238
  }
228
239
 
@@ -902,7 +913,8 @@ static void add_well_known_nss(rnv_t *rnv, rnc_st_t *rnc_st, rn_st_t *rn_st, int
902
913
  static int file(rnv_t *rnv, rnc_st_t *rnc_st, rn_st_t *rn_st, struct rnc_source *sp,int nsuri) {
903
914
  int ret=0;
904
915
  struct rnc_source src;
905
- src.rnv = rnv;
916
+ src.verror_handler = rnv->verror_handler;
917
+ src.user_data = rnv->user_data;
906
918
  add_well_known_nss(rnv, rnc_st, rn_st, nsuri);
907
919
  if(rnc_open(&src,rnc_st->path)!=-1) {
908
920
  ret=topLevel(rnv, rnc_st, rn_st, &src);
@@ -1107,6 +1119,7 @@ static void include(rnv_t *rnv, rnc_st_t *rnc_st, rn_st_t *rn_st, struct rnc_sou
1107
1119
  nsuri=inherit(rnv, rnc_st, rn_st, sp);
1108
1120
  sc_open(&rnc_st->nss); open_scope(rnc_st, sp);
1109
1121
  if(file(rnv, rnc_st, rn_st, sp,nsuri)!=-1) error(1,sp,RNC_ER_NOTGR,sp->fn,CUR(sp).line,CUR(sp).col);
1122
+ sc_close(&rnc_st->nss);
1110
1123
  sc_lock(&rnc_st->defs);
1111
1124
  if(CUR(sp).sym==SYM_LCUR) {
1112
1125
  getsym(sp);
@@ -1114,7 +1127,6 @@ static void include(rnv_t *rnv, rnc_st_t *rnc_st, rn_st_t *rn_st, struct rnc_sou
1114
1127
  chk_skip_get(sp,SYM_RCUR);
1115
1128
  }
1116
1129
  fold_scope(rnv, rnc_st, rn_st, sp);
1117
- sc_close(&rnc_st->nss);
1118
1130
  }
1119
1131
  }
1120
1132
 
@@ -1154,7 +1166,7 @@ static int topLevel(rnv_t *rnv, rnc_st_t *rnc_st, rn_st_t *rn_st, struct rnc_sou
1154
1166
  getsym(sp); getsym(sp);
1155
1167
  while(decl(rnv, rn_st, rnc_st, sp));
1156
1168
  if((is_grammar=(CUR(sp).sym==SYM_GRAMMAR))) {
1157
- chk_get(sp,SYM_LCUR);
1169
+ getsym(sp);chk_get(sp,SYM_LCUR);
1158
1170
  }
1159
1171
  if(grammarContent(rnv, rn_st, rnc_st, sp)) {
1160
1172
  while(grammarContent(rnv, rn_st, rnc_st, sp));