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.
- checksums.yaml +4 -4
- data/ext/rnv/extconf.rb +1 -1
- data/ext/rnv/ruby_rnv.c +88 -381
- data/ext/rnv/ruby_rnv.h +62 -0
- data/ext/rnv/ruby_rnv_err.c +548 -0
- data/ext/rnv/src/ary.c +1 -2
- data/ext/rnv/src/drv.c +78 -62
- data/ext/rnv/src/drv.h +3 -2
- data/ext/rnv/src/er.c +1 -1
- data/ext/rnv/src/er.h +1 -1
- data/ext/rnv/src/erbit.h +3 -0
- data/ext/rnv/src/rn.c +24 -26
- data/ext/rnv/src/rn.h +1 -1
- data/ext/rnv/src/rnc.c +28 -16
- data/ext/rnv/src/rnc.h +3 -23
- data/ext/rnv/src/rnd.c +24 -20
- data/ext/rnv/src/rnd.h +3 -2
- data/ext/rnv/src/rnl.c +24 -20
- data/ext/rnv/src/rnl.h +2 -3
- data/ext/rnv/src/rnv.c +20 -18
- data/ext/rnv/src/rnv.h +2 -2
- data/ext/rnv/src/rnx.c +15 -17
- data/ext/rnv/src/rnx.h +2 -3
- data/ext/rnv/src/rx.c +44 -32
- data/ext/rnv/src/rx.h +7 -8
- data/ext/rnv/src/sc.c +5 -0
- data/ext/rnv/src/sc.h +1 -0
- data/ext/rnv/src/type.h +61 -28
- data/ext/rnv/src/xcl.c +24 -27
- data/ext/rnv/src/xsd.c +10 -23
- data/ext/rnv/src/xsd.h +1 -2
- data/lib/rnv/data_type_library.rb +5 -7
- data/lib/rnv/error.rb +105 -3
- data/lib/rnv/validator.rb +75 -7
- metadata +4 -2
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
|
-
|
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
|
-
|
41
|
-
|
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) (*
|
19
|
-
void rnd_default_verror_handler(
|
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(
|
34
|
-
|
35
|
-
|
36
|
-
|
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(
|
42
|
-
va_list ap; va_start(ap,
|
43
|
-
|
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(
|
148
|
+
if(i==0) error_handler(rnd_st, RND_ER_LOOPST); else {
|
145
149
|
char *s=rnx_nc2str(rnv, nc);
|
146
|
-
error_handler(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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(
|
14
|
+
rnc_default_verror_handler(data, erno&~ERBIT_RNC,handler, ap);
|
15
15
|
} else if(erno&ERBIT_RND) {
|
16
|
-
rnd_default_verror_handler(
|
16
|
+
rnd_default_verror_handler(data, erno&~ERBIT_RND,handler, ap);
|
17
17
|
}
|
18
18
|
}
|
19
19
|
|
20
|
-
|
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(
|
27
|
-
|
28
|
-
|
29
|
-
|
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
|
-
|
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.
|
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.
|
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.
|
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(
|
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,
|
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) (*
|
15
|
-
void rnv_default_verror_handler(
|
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(
|
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); (
|
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->
|
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
|
-
|
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(
|
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
|
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
|
17
|
-
rnv->rnx_exp=(int*)m_alloc(
|
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
|
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,
|
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,
|
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,
|
36
|
-
case RN_P_ONE_OR_MORE: rn_OneOrMore(p,p1); expected(rnv,
|
37
|
-
case RN_P_LIST: rn_List(p,p1); expected(rnv,
|
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,
|
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,
|
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==
|
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,
|
57
|
+
void rnx_expected(rnv_t *rnv, int p,int req) {
|
60
58
|
if(req) {
|
61
|
-
if(
|
59
|
+
if(rnv->rnx_len_exp>LIM_EXP) {
|
62
60
|
m_free(rnv->rnx_exp);
|
63
|
-
rnv->rnx_exp=(int*)m_alloc(
|
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,
|
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
|
9
|
-
extern void rnx_clear(void);
|
8
|
+
extern void rnx_init(rnv_t *rnv);
|
10
9
|
|
11
|
-
extern void rnx_expected(rnv_t *rnv,
|
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) (*
|
190
|
-
void rx_default_verror_handler(
|
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); (
|
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
|
-
|
249
|
+
rx_st->verror_handler=&verror_default_handler;
|
252
250
|
|
253
|
-
|
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
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
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
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
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
|
-
|
266
|
-
|
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
|
-
|
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(
|
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(
|
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(
|
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(
|
693
|
-
int p=compile(
|
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(
|
707
|
-
int p=compile(
|
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(
|
722
|
-
int p=compile(
|
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;
|