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.
- 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 +103 -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;
|