ruby_rnv 0.3.1 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
data/ext/rnv/src/rnc.h CHANGED
@@ -31,30 +31,10 @@
31
31
  #define RNC_ER_NOSTART 70
32
32
  #define RNC_ER_UNDEF 71
33
33
 
34
- struct rnc_cym {
35
- char *s; int slen;
36
- int line,col;
37
- int sym;
38
- };
34
+ extern void rnc_default_verror_handler(void *data, int erno, int (*handler)(void *data, int erno,char *format, va_list ap), va_list ap);
39
35
 
40
- struct rnc_source {
41
- int flags;
42
- char *fn; int fd;
43
- char *buf; int i,n;
44
- int complete;
45
- int line,col,prevline/*when error reported*/;
46
- int u,v,w; int nx;
47
- int cur;
48
- struct rnc_cym sym[2];
49
-
50
- // FIXME: for error handlers
51
- rnv_t *rnv;
52
- };
53
-
54
- extern void rnc_default_verror_handler(rnv_t *rnv, int erno,va_list ap);
55
-
56
- extern void rnc_init(rnv_t *rnv, rnc_st_t *rnc_st, rn_st_t *rn_st);
57
- extern void rnc_clear(void);
36
+ extern void rnc_init(rnc_st_t *rnc_st);
37
+ extern void rnc_dispose(rnc_st_t *rnc_st);
58
38
 
59
39
  extern int rnc_open(struct rnc_source *sp,char *fn);
60
40
  extern int rnc_stropen(struct rnc_source *sp,char *fn,char *s,int len);
data/ext/rnv/src/rnd.c CHANGED
@@ -1,10 +1,10 @@
1
- #include "type.h"
2
-
3
1
  /* $Id: rnd.c,v 1.33 2004/02/25 00:00:32 dvd Exp $ */
4
-
5
2
  #include <stdlib.h>
6
3
  #include <assert.h>
7
4
  #include <string.h>
5
+
6
+ #include "type.h"
7
+
8
8
  #include "m.h"
9
9
  #include "rn.h"
10
10
  #include "rnx.h"
@@ -15,8 +15,8 @@
15
15
 
16
16
  #define LEN_F RND_LEN_F
17
17
 
18
- #define err(msg) (*rnv->verror_handler)(rnv,erno|ERBIT_RND,"error: "msg"\n",ap)
19
- void rnd_default_verror_handler(rnv_t *rnv, int erno,va_list ap) {
18
+ #define err(msg) (*handler)(data,erno|ERBIT_RND,"error: "msg"\n",ap)
19
+ void rnd_default_verror_handler(void *data, int erno, int (*handler)(void *data, int erno,char *format, va_list ap), va_list ap) {
20
20
  switch(erno) {
21
21
  case RND_ER_LOOPST: err("loop in start pattern"); break;
22
22
  case RND_ER_LOOPEL: err("loop in pattern for element '%s'"); break;
@@ -30,17 +30,21 @@ void rnd_default_verror_handler(rnv_t *rnv, int erno,va_list ap) {
30
30
  }
31
31
  }
32
32
 
33
- void rnd_init(rnv_t *rnv, rnd_st_t *rnd_st, rn_st_t *rn_st) {
34
- memset(rnd_st, 0, sizeof(rnd_st_t));
35
- rnv->rnd_verror_handler=&rnd_default_verror_handler;
36
- rn_init(rnv, rn_st);
33
+ void rnd_init(rnd_st_t *rnd_st) {
34
+ rnd_st->verror_handler = &verror_default_handler;
35
+ }
36
+
37
+ void rnd_dispose(rnd_st_t *rnd_st) {
38
+ if (rnd_st->flat)
39
+ m_free(rnd_st->flat);
40
+ m_free(rnd_st);
37
41
  }
38
42
 
39
43
  void rnd_clear(void) {}
40
44
 
41
- static void error_handler(rnv_t *rnv, rnd_st_t *rnd_st, int er_no,...) {
42
- va_list ap; va_start(ap,er_no);
43
- rnv->rnd_verror_handler(rnv, er_no,ap);
45
+ static void error_handler(rnd_st_t *rnd_st, int erno,...) {
46
+ va_list ap; va_start(ap,erno);
47
+ rnd_default_verror_handler(rnd_st->user_data, erno, rnd_st->verror_handler, ap);
44
48
  va_end(ap);
45
49
  ++rnd_st->errors;
46
50
  }
@@ -141,9 +145,9 @@ static void loops(rnv_t *rnv, rnd_st_t *rnd_st) {
141
145
  int i=0,p=rnd_st->flat[i],nc=-1,p1;
142
146
  for(;;) {
143
147
  if(loop(rnv, p)) {
144
- if(i==0) error_handler(rnv, rnd_st, RND_ER_LOOPST); else {
148
+ if(i==0) error_handler(rnd_st, RND_ER_LOOPST); else {
145
149
  char *s=rnx_nc2str(rnv, nc);
146
- error_handler(rnv, rnd_st,RND_ER_LOOPEL, s);
150
+ error_handler(rnd_st,RND_ER_LOOPEL, s);
147
151
  m_free(s);
148
152
  }
149
153
  }
@@ -195,7 +199,7 @@ static void ctypes(rnv_t *rnv, rnd_st_t *rnd_st) {
195
199
  ctype(rnv, p1);
196
200
  if(!rn_contentType(rnv, p1)) {
197
201
  char *s=rnx_nc2str(rnv, nc);
198
- error_handler(rnv,rnd_st,RND_ER_CTYPE, s);
202
+ error_handler(rnd_st,RND_ER_CTYPE, s);
199
203
  m_free(s);
200
204
  }
201
205
  }
@@ -328,18 +332,18 @@ static void path(rnv_t *rnv, rnd_st_t *rnd_st, int p,int nc) {
328
332
  case RN_P_INTERLEAVE: rn_Interleave(p,p1,p2); goto BINARY;
329
333
  case RN_P_GROUP: rn_Group(p,p1,p2); goto BINARY;
330
334
  case RN_P_DATA_EXCEPT: rn_DataExcept(p,p1,p2);
331
- if(bad_data_except(rnv, p2)) {char *s=rnx_nc2str(rnv, nc); error_handler(rnv,rnd_st,RND_ER_BADEXPT, s); m_free(s);}
335
+ if(bad_data_except(rnv, p2)) {char *s=rnx_nc2str(rnv, nc); error_handler(rnd_st,RND_ER_BADEXPT, s); m_free(s);}
332
336
  goto BINARY;
333
337
  BINARY: path(rnv, rnd_st, p1,nc); path(rnv, rnd_st, p2,nc); break;
334
338
 
335
339
  case RN_P_ONE_OR_MORE: rn_OneOrMore(p,p1);
336
- if(bad_one_or_more(rnv, p1,0)) {char *s=rnx_nc2str(rnv, nc); error_handler(rnv,rnd_st,RND_ER_BADMORE, s); m_free(s);}
340
+ if(bad_one_or_more(rnv, p1,0)) {char *s=rnx_nc2str(rnv, nc); error_handler(rnd_st,RND_ER_BADMORE, s); m_free(s);}
337
341
  goto UNARY;
338
342
  case RN_P_LIST: rn_List(p,p1);
339
- if(bad_list(rnv, p1)) {char *s=rnx_nc2str(rnv, nc); error_handler(rnv,rnd_st,RND_ER_BADLIST, s); m_free(s);}
343
+ if(bad_list(rnv, p1)) {char *s=rnx_nc2str(rnv, nc); error_handler(rnd_st,RND_ER_BADLIST, s); m_free(s);}
340
344
  goto UNARY;
341
345
  case RN_P_ATTRIBUTE: rn_Attribute(p,nc1,p1);
342
- if(bad_attribute(rnv, p1)) {char *s=rnx_nc2str(rnv, nc),*s1=rnx_nc2str(rnv, nc1); error_handler(rnv,rnd_st,RND_ER_BADATTR, s1,s); m_free(s1); m_free(s);}
346
+ if(bad_attribute(rnv, p1)) {char *s=rnx_nc2str(rnv, nc),*s1=rnx_nc2str(rnv, nc1); error_handler(rnd_st,RND_ER_BADATTR, s1,s); m_free(s1); m_free(s);}
343
347
  goto UNARY;
344
348
  UNARY: path(rnv, rnd_st, p1,nc); break;
345
349
 
@@ -349,7 +353,7 @@ static void path(rnv_t *rnv, rnd_st_t *rnd_st, int p,int nc) {
349
353
 
350
354
  static void paths(rnv_t *rnv, rnd_st_t *rnd_st) {
351
355
  int i,p,p1,nc;
352
- if(bad_start(rnv, rnd_st->flat[0])) error_handler(rnv,rnd_st, RND_ER_BADSTART);
356
+ if(bad_start(rnv, rnd_st->flat[0])) error_handler(rnd_st, RND_ER_BADSTART);
353
357
  for(i=0;i!=rnd_st->n_f;++i) {
354
358
  p=rnd_st->flat[i];
355
359
  if(RN_P_IS(p,RN_P_ELEMENT)) {
data/ext/rnv/src/rnd.h CHANGED
@@ -15,10 +15,11 @@
15
15
  #define RND_ER_BADLIST 6
16
16
  #define RND_ER_BADATTR 7
17
17
 
18
- extern void rnd_default_verror_handler(rnv_t *rnv, int erno,va_list ap);
18
+ extern void rnd_default_verror_handler(void *data, int erno, int (*handler)(void *data, int erno,char *format, va_list ap), va_list ap);
19
19
 
20
- extern void rnd_init(rnv_t *rnv, rnd_st_t *rnd_st, rn_st_t *rn_st);
20
+ extern void rnd_init(rnd_st_t *rnd_st);
21
21
  extern void rnd_clear(void);
22
+ extern void rnd_dispose(rnd_st_t *rnd_st);
22
23
 
23
24
  extern int rnd_fixup(rnv_t *rnv, rnd_st_t *rnd_st, rn_st_t *rn_st, int start);
24
25
 
data/ext/rnv/src/rnl.c CHANGED
@@ -1,35 +1,36 @@
1
- #include "type.h"
2
-
3
1
  /* $Id: rnl.c,v 1.2 2004/01/15 23:47:45 dvd Exp $ */
4
-
5
2
  #include <stdarg.h>
3
+
4
+ #include "type.h"
5
+
6
6
  #include "erbit.h"
7
7
  #include "rn.h"
8
8
  #include "rnc.h"
9
9
  #include "rnd.h"
10
10
  #include "rnl.h"
11
11
 
12
- void rnl_default_verror_handler(rnv_t *rnv, int erno,va_list ap) {
12
+ void rnl_default_verror_handler(void *data, int erno, int (*handler)(void *data, int erno,char *format, va_list ap), va_list ap) {
13
13
  if(erno&ERBIT_RNC) {
14
- rnc_default_verror_handler(rnv, erno&~ERBIT_RNC,ap);
14
+ rnc_default_verror_handler(data, erno&~ERBIT_RNC,handler, ap);
15
15
  } else if(erno&ERBIT_RND) {
16
- rnd_default_verror_handler(rnv, erno&~ERBIT_RND,ap);
16
+ rnd_default_verror_handler(data, erno&~ERBIT_RND,handler, ap);
17
17
  }
18
18
  }
19
19
 
20
- static void verror_handler_rnc(rnv_t *rnv, int erno,va_list ap) {rnl_default_verror_handler(rnv, erno|ERBIT_RNC,ap);}
21
- static void verror_handler_rnd(rnv_t *rnv, int erno,va_list ap) {rnl_default_verror_handler(rnv, erno|ERBIT_RND,ap);}
22
-
23
- void rnl_init(rnv_t *rnv, rn_st_t *rn_st, rnc_st_t *rnc_st, rnd_st_t *rnd_st) {
24
- rnv->rnl_verror_handler=&rnl_default_verror_handler;
20
+ void rnl_init(rnv_t *rnv, rnc_st_t *rnc_st, rn_st_t *rn_st, rnd_st_t *rnd_st) {
25
21
  rn_init(rnv, rn_st);
26
- rnc_init(rnv, rnc_st, rn_st);
27
- rnv->rnc_verror_handler=&verror_handler_rnc;
28
- rnd_init(rnv, rnd_st, rn_st);
29
- rnv->rnd_verror_handler=&verror_handler_rnd;
30
- }
22
+ rnc_init(rnc_st);
23
+
24
+ if(rnv->verror_handler)
25
+ rnc_st->verror_handler = rnv->verror_handler;
26
+ rnc_st->user_data = rnv->user_data;
31
27
 
32
- void rnl_clear(void) {}
28
+ rnd_init(rnd_st);
29
+
30
+ if(rnv->verror_handler)
31
+ rnd_st->verror_handler = rnv->verror_handler;
32
+ rnd_st->user_data = rnv->user_data;
33
+ }
33
34
 
34
35
  static int load(rnv_t *rnv, rnc_st_t *rnc_st, rn_st_t *rn_st, rnd_st_t *rnd_st, struct rnc_source *sp) {
35
36
  int start=-1;
@@ -42,21 +43,24 @@ static int load(rnv_t *rnv, rnc_st_t *rnc_st, rn_st_t *rn_st, rnd_st_t *rnd_st,
42
43
 
43
44
  int rnl_fn(rnv_t *rnv, rnc_st_t *rnc_st, rn_st_t *rn_st, rnd_st_t *rnd_st, char *fn) {
44
45
  struct rnc_source src;
45
- src.rnv = rnv;
46
+ src.verror_handler = rnv->verror_handler;
47
+ src.user_data = rnv->user_data;
46
48
  rnc_open(&src,fn);
47
49
  return load(rnv, rnc_st, rn_st, rnd_st, &src);
48
50
  }
49
51
 
50
52
  int rnl_fd(rnv_t *rnv, rnc_st_t *rnc_st, rn_st_t *rn_st, rnd_st_t *rnd_st, char *fn,int fd) {
51
53
  struct rnc_source src;
52
- src.rnv = rnv;
54
+ src.verror_handler = rnv->verror_handler;
55
+ src.user_data = rnv->user_data;
53
56
  rnc_bind(&src,fn,fd);
54
57
  return load(rnv, rnc_st, rn_st, rnd_st, &src);
55
58
  }
56
59
 
57
60
  int rnl_s(rnv_t *rnv, rnc_st_t *rnc_st, rn_st_t *rn_st, rnd_st_t *rnd_st, char *fn,char *s,int len) {
58
61
  struct rnc_source src;
59
- src.rnv = rnv;
62
+ src.verror_handler = rnv->verror_handler;
63
+ src.user_data = rnv->user_data;
60
64
  rnc_stropen(&src,fn,s,len);
61
65
  return load(rnv, rnc_st, rn_st, rnd_st, &src);
62
66
  }
data/ext/rnv/src/rnl.h CHANGED
@@ -6,10 +6,9 @@
6
6
  #include <stdarg.h>
7
7
  #include "type.h"
8
8
 
9
- extern void rnl_default_verror_handler(rnv_t *rnv, int erno,va_list ap);
9
+ extern void rnl_default_verror_handler(void *data, int erno, int (*handler)(void *data, int erno,char *format, va_list ap), va_list ap);
10
10
 
11
- extern void rnl_init(rnv_t *rnv, rn_st_t *rn_st, rnc_st_t *rnc_st, rnd_st_t *rnd_st);
12
- extern void rnl_clear(void);
11
+ extern void rnl_init(rnv_t *rnv, rnc_st_t *rnc_st, rn_st_t *rn_st, rnd_st_t *rnd_st);
13
12
 
14
13
  extern int rnl_fn(rnv_t *rnv, rnc_st_t *rnc_st, rn_st_t *rn_st, rnd_st_t *rnd_st, char *fn);
15
14
  extern int rnl_fd(rnv_t *rnv, rnc_st_t *rnc_st, rn_st_t *rn_st, rnd_st_t *rnd_st, char *fn,int fd);
data/ext/rnv/src/rnv.c CHANGED
@@ -1,9 +1,9 @@
1
- #include "type.h"
2
-
3
1
  /* $Id: rnv.c,v 1.69 2004/01/28 23:21:24 dvd Exp $ */
4
-
5
2
  #include <string.h> /*strncpy,strrchr*/
6
3
  #include <assert.h>
4
+
5
+ #include "type.h"
6
+
7
7
  #include "m.h"
8
8
  #include "xmlc.h" /*xmlc_white_space*/
9
9
  #include "erbit.h"
@@ -11,10 +11,10 @@
11
11
  #include "er.h"
12
12
  #include "rnv.h"
13
13
 
14
- #define err(msg) (*rnv->verror_handler)(rnv,erno|ERBIT_RNV,msg"\n",ap);
15
- void rnv_default_verror_handler(rnv_t *rnv, int erno,va_list ap) {
14
+ #define err(msg) (*handler)(data,erno|ERBIT_RNV,msg"\n",ap);
15
+ void rnv_default_verror_handler(void *data, int erno, int (*handler)(void *data, int erno,char *format, va_list ap), va_list ap) {
16
16
  if(erno&ERBIT_DRV) {
17
- drv_default_verror_handler(rnv, erno&~ERBIT_DRV,ap);
17
+ drv_default_verror_handler(data, erno&~ERBIT_DRV, handler, ap);
18
18
  } else {
19
19
  switch(erno) {
20
20
  case RNV_ER_ELEM: err("element %s^%s not allowed"); break;
@@ -31,24 +31,26 @@ void rnv_default_verror_handler(rnv_t *rnv, int erno,va_list ap) {
31
31
  }
32
32
 
33
33
  static void error_handler(rnv_t *rnv, int erno,...) {
34
- va_list ap; va_start(ap,erno); (*rnv->rnv_verror_handler)(rnv,erno,ap); va_end(ap);
34
+ va_list ap; va_start(ap,erno); rnv_default_verror_handler(rnv->user_data,erno,rnv->verror_handler,ap); va_end(ap);
35
35
  }
36
36
 
37
- static void verror_handler_drv(rnv_t *rnv, int erno,va_list ap) {rnv_default_verror_handler(rnv,erno|ERBIT_DRV,ap);}
38
-
39
- static void windup(void);
40
37
  void rnv_init(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, rx_st_t *rx_st) {
41
- rnv->rnv_verror_handler=&rnv_default_verror_handler;
38
+ if(!rnv->verror_handler)
39
+ rnv->verror_handler = &verror_default_handler;
42
40
  drv_init(rnv, drv_st, rn_st, rx_st);
43
- rnv->drv_verror_handler=&verror_handler_drv;
44
- windup();
45
- }
46
-
47
- void rnv_clear(void) {
48
- windup();
49
41
  }
50
42
 
51
- static void windup(void) {
43
+ void rnv_dispose(rnv_t *rnv) {
44
+ if (rnv->rn_pattern)
45
+ m_free(rnv->rn_pattern);
46
+ if (rnv->rn_nameclass)
47
+ m_free(rnv->rn_nameclass);
48
+ if (rnv->rn_string)
49
+ m_free(rnv->rn_string);
50
+ if (rnv->rnx_exp)
51
+ m_free(rnv->rnx_exp);
52
+
53
+ m_free(rnv);
52
54
  }
53
55
 
54
56
  static char *qname_open(char **surip,char **snamep,char *name) {
data/ext/rnv/src/rnv.h CHANGED
@@ -15,10 +15,10 @@
15
15
  #define RNV_ER_TEXT 6
16
16
  #define RNV_ER_NOTX 7
17
17
 
18
- extern void rnv_default_verror_handler(rnv_t *rnv, int erno,va_list ap);
18
+ extern void rnv_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 rnv_init(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, rx_st_t *rx_st);
21
- extern void rnv_clear(void);
21
+ extern void rnv_dispose(rnv_t *rnv);
22
22
 
23
23
  extern int rnv_text(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, rx_st_t *rx_st, int *curp,int *prevp,char *text,int n_t,int mixed);
24
24
  extern int rnv_start_tag(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, rx_st_t *rx_st, int *curp,int *prevp,char *name,char **attrs);
data/ext/rnv/src/rnx.c CHANGED
@@ -13,13 +13,11 @@
13
13
  #define LEN_EXP RNX_LEN_EXP
14
14
  #define LIM_EXP RNX_LIM_EXP
15
15
 
16
- void rnx_init(rnv_t *rnv, rnx_st_t *rnx_st) {
17
- rnv->rnx_exp=(int*)m_alloc(rnx_st->len_exp=LEN_EXP,sizeof(int));
16
+ void rnx_init(rnv_t *rnv) {
17
+ rnv->rnx_exp=(int*)m_alloc(rnv->rnx_len_exp=LEN_EXP,sizeof(int));
18
18
  }
19
19
 
20
- void rnx_clear(void) {}
21
-
22
- static void expected(rnv_t *rnv, rnx_st_t *rnx_st, int p,int first,int req) {
20
+ static void expected(rnv_t *rnv, int p,int first,int req) {
23
21
  int p1,p2,px=0,i;
24
22
  if(req && rn_nullable(p)) return;
25
23
  switch(RN_P_TYP(p)) {
@@ -28,21 +26,21 @@ static void expected(rnv_t *rnv, rnx_st_t *rnx_st, int p,int first,int req) {
28
26
  case RN_P_EMPTY: break;
29
27
  case RN_P_TEXT: px=p; break;
30
28
  case RN_P_CHOICE: rn_Choice(p,p1,p2);
31
- expected(rnv, rnx_st, p1,first,req); expected(rnv, rnx_st, p2,first,req); break;
29
+ expected(rnv, p1,first,req); expected(rnv, p2,first,req); break;
32
30
  case RN_P_INTERLEAVE: rn_Interleave(p,p1,p2);
33
- expected(rnv, rnx_st, p1,first,req); expected(rnv, rnx_st, p2,first,req); break;
31
+ expected(rnv, p1,first,req); expected(rnv, p2,first,req); break;
34
32
  case RN_P_GROUP: rn_Group(p,p1,p2);
35
- expected(rnv, rnx_st, p1,first,req); expected(rnv, rnx_st, p2,first&&rn_nullable(p1),req); break;
36
- case RN_P_ONE_OR_MORE: rn_OneOrMore(p,p1); expected(rnv, rnx_st, p1,first,req); break;
37
- case RN_P_LIST: rn_List(p,p1); expected(rnv, rnx_st, p1,first,req); break;
33
+ expected(rnv, p1,first,req); expected(rnv, p2,first&&rn_nullable(p1),req); break;
34
+ case RN_P_ONE_OR_MORE: rn_OneOrMore(p,p1); expected(rnv, p1,first,req); break;
35
+ case RN_P_LIST: rn_List(p,p1); expected(rnv, p1,first,req); break;
38
36
  case RN_P_DATA: px=p; break;
39
37
  case RN_P_DATA_EXCEPT: rn_DataExcept(p,p1,p2);
40
- expected(rnv, rnx_st, p1,first,req); break;
38
+ expected(rnv, p1,first,req); break;
41
39
  case RN_P_VALUE: px=p; break;
42
40
  case RN_P_ATTRIBUTE: px=p; break;
43
41
  case RN_P_ELEMENT: px=p; break;
44
42
  case RN_P_AFTER: rn_After(p,p1,p2);
45
- expected(rnv, rnx_st, p1,first,req); if(rn_nullable(p1)) px=p; break;
43
+ expected(rnv, p1,first,req); if(rn_nullable(p1)) px=p; break;
46
44
  case RN_P_REF: break;
47
45
  default: assert(0);
48
46
  }
@@ -51,20 +49,20 @@ static void expected(rnv_t *rnv, rnx_st_t *rnx_st, int p,int first,int req) {
51
49
  if(rnv->rnx_exp[i]==px) {px=0; break;}
52
50
  }
53
51
  if(px) {
54
- if(rnv->rnx_n_exp==rnx_st->len_exp) rnv->rnx_exp=(int*)m_stretch(rnv->rnx_exp,rnx_st->len_exp=2*rnv->rnx_n_exp,rnv->rnx_n_exp,sizeof(int));
52
+ if(rnv->rnx_n_exp==rnv->rnx_len_exp) rnv->rnx_exp=(int*)m_stretch(rnv->rnx_exp,rnv->rnx_len_exp=2*rnv->rnx_n_exp,rnv->rnx_n_exp,sizeof(int));
55
53
  rnv->rnx_exp[rnv->rnx_n_exp++]=px;
56
54
  }
57
55
  }
58
56
  }
59
- void rnx_expected(rnv_t *rnv, rnx_st_t *rnx_st, int p,int req) {
57
+ void rnx_expected(rnv_t *rnv, int p,int req) {
60
58
  if(req) {
61
- if(rnx_st->len_exp>LIM_EXP) {
59
+ if(rnv->rnx_len_exp>LIM_EXP) {
62
60
  m_free(rnv->rnx_exp);
63
- rnv->rnx_exp=(int*)m_alloc(rnx_st->len_exp=LIM_EXP,sizeof(int));
61
+ rnv->rnx_exp=(int*)m_alloc(rnv->rnx_len_exp=LIM_EXP,sizeof(int));
64
62
  }
65
63
  rnv->rnx_n_exp=0;
66
64
  }
67
- expected(rnv, rnx_st, p,1,req);
65
+ expected(rnv, p,1,req);
68
66
  }
69
67
 
70
68
  char *rnx_p2str(rnv_t *rnv, int p) {
data/ext/rnv/src/rnx.h CHANGED
@@ -5,10 +5,9 @@
5
5
  #ifndef RNX_H
6
6
  #define RNX_H 1
7
7
 
8
- extern void rnx_init(rnv_t *rnv, rnx_st_t *rnx_st);
9
- extern void rnx_clear(void);
8
+ extern void rnx_init(rnv_t *rnv);
10
9
 
11
- extern void rnx_expected(rnv_t *rnv, rnx_st_t *rnx_st, int p,int req);
10
+ extern void rnx_expected(rnv_t *rnv, int p,int req);
12
11
 
13
12
  extern char *rnx_p2str(rnv_t *rnv, int p);
14
13
  extern char *rnx_nc2str(rnv_t *rnv, int nc);
data/ext/rnv/src/rx.c CHANGED
@@ -1,9 +1,10 @@
1
- #include "type.h"
2
-
3
1
  /* $Id: rx.c,v 1.33 2004/02/25 00:00:32 dvd Exp $ */
4
2
 
5
3
  #include <string.h> /*strlen,strcpy,strcmp*/
6
4
  #include <assert.h>
5
+
6
+ #include "type.h"
7
+
7
8
  #include "u.h" /*u_get,u_strlen*/
8
9
  #include "xmlc.h"
9
10
  #include "m.h"
@@ -186,9 +187,8 @@ static int add_r(rx_st_t *rx_st, char *rx) {
186
187
 
187
188
  #define ERRPOS
188
189
 
189
- #define err(msg) (*rnv->verror_handler)(rnv,erno|ERBIT_RX,msg" in \"%s\" at offset %i\n",ap)
190
- void rx_default_verror_handler(rnv_t *rnv, int erno,va_list ap) {
191
- (*er_printf)("regular expressions: ");
190
+ #define err(msg) (*handler)(data, erno|ERBIT_RX,"regular expressions: "msg" in \"%s\" at offset %i\n",ap)
191
+ void rx_default_verror_handler(void *data, int erno, int (*handler)(void *data, int erno, char *format, va_list ap), va_list ap) {
192
192
  switch(erno) {
193
193
  case RX_ER_BADCH: err("bad character"); break;
194
194
  case RX_ER_UNFIN: err("unfinished expression"); break;
@@ -206,10 +206,8 @@ void rx_default_verror_handler(rnv_t *rnv, int erno,va_list ap) {
206
206
  }
207
207
  }
208
208
 
209
- //void (*rx_verror_handler)(int erno,va_list ap)=&rx_default_verror_handler;
210
-
211
209
  static void error_handler(rx_st_t *rx_st,int erno,...) {
212
- va_list ap; va_start(ap,erno); (*rx_st->rnv->rx_verror_handler)(rx_st->rnv, erno,ap); va_end(ap);
210
+ va_list ap; va_start(ap,erno); rx_default_verror_handler(rx_st->user_data, erno, rx_st->verror_handler, ap); va_end(ap);
213
211
  }
214
212
 
215
213
  #define LEN_M RX_LEN_M
@@ -248,26 +246,40 @@ static void accept_m(rx_st_t *rx_st) {
248
246
 
249
247
  static void windup(rx_st_t *rx_st);
250
248
  void rx_init(rx_st_t *rx_st) {
251
- // memset(rx_st, 0, sizeof(rx_st_t));
249
+ rx_st->verror_handler=&verror_default_handler;
252
250
 
253
- rx_st->rnv->rx_verror_handler=&rx_default_verror_handler;
251
+ rx_st->pattern=(int *)m_alloc(rx_st->len_p=P_AVG_SIZE*LEN_P,sizeof(int));
252
+ rx_st->r2p=(int (*)[2])m_alloc(rx_st->len_2=LEN_2,sizeof(int[2]));
253
+ rx_st->regex=(char*)m_alloc(rx_st->len_r=R_AVG_SIZE*LEN_R,sizeof(char));
254
+ rx_st->memo=(int (*)[M_SIZE])m_alloc(rx_st->len_m=LEN_M,sizeof(int[M_SIZE]));
254
255
 
255
- rx_st->pattern=(int *)m_alloc(rx_st->len_p=P_AVG_SIZE*LEN_P,sizeof(int));
256
- rx_st->r2p=(int (*)[2])m_alloc(rx_st->len_2=LEN_2,sizeof(int[2]));
257
- rx_st->regex=(char*)m_alloc(rx_st->len_r=R_AVG_SIZE*LEN_R,sizeof(char));
258
- rx_st->memo=(int (*)[M_SIZE])m_alloc(rx_st->len_m=LEN_M,sizeof(int[M_SIZE]));
256
+ rx_st->ht_p.user = rx_st;
257
+ rx_st->ht_2.user = rx_st;
258
+ rx_st->ht_r.user = rx_st;
259
+ rx_st->ht_m.user = rx_st;
259
260
 
260
- rx_st->ht_p.user = rx_st;
261
- rx_st->ht_2.user = rx_st;
262
- rx_st->ht_r.user = rx_st;
263
- rx_st->ht_m.user = rx_st;
261
+ ht_init(&rx_st->ht_p,LEN_P,&hash_p,&equal_p);
262
+ ht_init(&rx_st->ht_2,LEN_2,&hash_2,&equal_2);
263
+ ht_init(&rx_st->ht_r,LEN_R,&hash_r,&equal_r);
264
+ ht_init(&rx_st->ht_m,LEN_M,&hash_m,&equal_m);
264
265
 
265
- ht_init(&rx_st->ht_p,LEN_P,&hash_p,&equal_p);
266
- ht_init(&rx_st->ht_2,LEN_2,&hash_2,&equal_2);
267
- ht_init(&rx_st->ht_r,LEN_R,&hash_r,&equal_r);
268
- ht_init(&rx_st->ht_m,LEN_M,&hash_m,&equal_m);
266
+ windup(rx_st);
267
+ }
269
268
 
270
- windup(rx_st);
269
+ void rx_dispose(rx_st_t *rx_st) {
270
+ ht_dispose(&rx_st->ht_r);
271
+ ht_dispose(&rx_st->ht_p);
272
+ ht_dispose(&rx_st->ht_2);
273
+ ht_dispose(&rx_st->ht_m);
274
+ if (rx_st->regex)
275
+ m_free(rx_st->regex);
276
+ if (rx_st->pattern)
277
+ m_free(rx_st->pattern);
278
+ if (rx_st->memo)
279
+ m_free(rx_st->memo);
280
+ if (rx_st->r2p)
281
+ m_free(rx_st->r2p);
282
+ m_free(rx_st);
271
283
  }
272
284
 
273
285
  void rx_clear(rx_st_t *rx_st) {
@@ -503,11 +515,11 @@ static void bind(rx_st_t *rx_st, int r) {
503
515
  getsym(rx_st);
504
516
  }
505
517
 
506
- static int compile(rnv_t *rnv, rx_st_t *rx_st, char *rx) {
518
+ static int compile(rx_st_t *rx_st, char *rx) {
507
519
  int r=0,p=0,d_r;
508
520
  d_r=add_r(rx_st, rx);
509
521
  if((r=ht_get(&rx_st->ht_r,rx_st->i_r))==-1) {
510
- if(rnv->rx_compact&&rx_st->i_p>=P_AVG_SIZE*LIM_P) {rx_clear(rx_st); d_r=add_r(rx_st, rx);}
522
+ if(rx_st->rx_compact&&rx_st->i_p>=P_AVG_SIZE*LIM_P) {rx_clear(rx_st); d_r=add_r(rx_st, rx);}
511
523
  ht_put(&rx_st->ht_r,r=rx_st->i_r);
512
524
  rx_st->i_r+=d_r;
513
525
  bind(rx_st, r); p=expression(rx_st); if(rx_st->sym!=SYM_END) error(rx_st, RX_ER_BADCH);
@@ -687,10 +699,10 @@ static int drv(rx_st_t *rx_st, int p,int c) {
687
699
  return ret;
688
700
  }
689
701
 
690
- int rx_check(rnv_t *rnv, rx_st_t *rx_st, char *rx) {(void)compile(rnv, rx_st, rx); return !rx_st->errors;}
702
+ int rx_check(rx_st_t *rx_st, char *rx) {(void)compile(rx_st, rx); return !rx_st->errors;}
691
703
 
692
- int rx_match(rnv_t *rnv, rx_st_t *rx_st, char *rx,char *s,int n) {
693
- int p=compile(rnv, rx_st, rx);
704
+ int rx_match(rx_st_t *rx_st, char *rx,char *s,int n) {
705
+ int p=compile(rx_st, rx);
694
706
  if(!rx_st->errors) {
695
707
  char *end=s+n;
696
708
  int u;
@@ -703,8 +715,8 @@ int rx_match(rnv_t *rnv, rx_st_t *rx_st, char *rx,char *s,int n) {
703
715
  } else return 0;
704
716
  }
705
717
 
706
- int rx_rmatch(rnv_t *rnv, rx_st_t *rx_st, char *rx,char *s,int n) {
707
- int p=compile(rnv, rx_st, rx);
718
+ int rx_rmatch(rx_st_t *rx_st, char *rx,char *s,int n) {
719
+ int p=compile(rx_st, rx);
708
720
  if(!rx_st->errors) {
709
721
  char *end=s+n;
710
722
  int u;
@@ -718,8 +730,8 @@ int rx_rmatch(rnv_t *rnv, rx_st_t *rx_st, char *rx,char *s,int n) {
718
730
  } else return 0;
719
731
  }
720
732
 
721
- int rx_cmatch(rnv_t *rnv, rx_st_t *rx_st, char *rx,char *s,int n) {
722
- int p=compile(rnv, rx_st, rx);
733
+ int rx_cmatch(rx_st_t *rx_st, char *rx,char *s,int n) {
734
+ int p=compile(rx_st, rx);
723
735
  if(!rx_st->errors) {
724
736
  char *end=s+n;
725
737
  int u;