ruby_rnv 0.3.0 → 0.5.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/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;