ruby_rnv 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +3 -0
- data/ext/rnv/extconf.rb +15 -0
- data/ext/rnv/ruby_rnv.c +742 -0
- data/ext/rnv/src/ary.c +78 -0
- data/ext/rnv/src/ary.h +10 -0
- data/ext/rnv/src/drv.c +472 -0
- data/ext/rnv/src/drv.h +35 -0
- data/ext/rnv/src/er.c +15 -0
- data/ext/rnv/src/er.h +16 -0
- data/ext/rnv/src/erbit.h +14 -0
- data/ext/rnv/src/ht.c +90 -0
- data/ext/rnv/src/ht.h +22 -0
- data/ext/rnv/src/ll.h +43 -0
- data/ext/rnv/src/m.c +60 -0
- data/ext/rnv/src/m.h +10 -0
- data/ext/rnv/src/rn.c +569 -0
- data/ext/rnv/src/rn.h +150 -0
- data/ext/rnv/src/rnc.c +1191 -0
- data/ext/rnv/src/rnc.h +68 -0
- data/ext/rnv/src/rnd.c +436 -0
- data/ext/rnv/src/rnd.h +25 -0
- data/ext/rnv/src/rnl.c +62 -0
- data/ext/rnv/src/rnl.h +18 -0
- data/ext/rnv/src/rnv.c +158 -0
- data/ext/rnv/src/rnv.h +30 -0
- data/ext/rnv/src/rnx.c +153 -0
- data/ext/rnv/src/rnx.h +16 -0
- data/ext/rnv/src/rx.c +749 -0
- data/ext/rnv/src/rx.h +43 -0
- data/ext/rnv/src/rx_cls_ranges.c +126 -0
- data/ext/rnv/src/rx_cls_u.c +262 -0
- data/ext/rnv/src/s.c +103 -0
- data/ext/rnv/src/s.h +32 -0
- data/ext/rnv/src/sc.c +62 -0
- data/ext/rnv/src/sc.h +26 -0
- data/ext/rnv/src/type.h +121 -0
- data/ext/rnv/src/u.c +88 -0
- data/ext/rnv/src/u.h +26 -0
- data/ext/rnv/src/xcl.c +472 -0
- data/ext/rnv/src/xmlc.c +20 -0
- data/ext/rnv/src/xmlc.h +16 -0
- data/ext/rnv/src/xsd.c +789 -0
- data/ext/rnv/src/xsd.h +27 -0
- data/ext/rnv/src/xsd_tm.c +100 -0
- data/ext/rnv/src/xsd_tm.h +15 -0
- data/lib/rnv.rb +2 -0
- data/lib/rnv/ox_sax_document.rb +84 -0
- data/lib/rnv/validator.rb +104 -0
- metadata +175 -0
data/ext/rnv/src/rnd.h
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
/* $Id: rnd.h,v 1.11 2004/01/02 20:27:23 dvd Exp $ */
|
2
|
+
|
3
|
+
#include <stdarg.h>
|
4
|
+
#include "type.h"
|
5
|
+
|
6
|
+
#ifndef RND_H
|
7
|
+
#define RND_H 1
|
8
|
+
|
9
|
+
#define RND_ER_LOOPST 0
|
10
|
+
#define RND_ER_LOOPEL 1
|
11
|
+
#define RND_ER_CTYPE 2
|
12
|
+
#define RND_ER_BADSTART 3
|
13
|
+
#define RND_ER_BADMORE 4
|
14
|
+
#define RND_ER_BADEXPT 5
|
15
|
+
#define RND_ER_BADLIST 6
|
16
|
+
#define RND_ER_BADATTR 7
|
17
|
+
|
18
|
+
extern void rnd_default_verror_handler(rnv_t *rnv, int erno,va_list ap);
|
19
|
+
|
20
|
+
extern void rnd_init(rnv_t *rnv, rnd_st_t *rnd_st, rn_st_t *rn_st);
|
21
|
+
extern void rnd_clear(void);
|
22
|
+
|
23
|
+
extern int rnd_fixup(rnv_t *rnv, rnd_st_t *rnd_st, rn_st_t *rn_st, int start);
|
24
|
+
|
25
|
+
#endif
|
data/ext/rnv/src/rnl.c
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
#include "type.h"
|
2
|
+
|
3
|
+
/* $Id: rnl.c,v 1.2 2004/01/15 23:47:45 dvd Exp $ */
|
4
|
+
|
5
|
+
#include <stdarg.h>
|
6
|
+
#include "erbit.h"
|
7
|
+
#include "rn.h"
|
8
|
+
#include "rnc.h"
|
9
|
+
#include "rnd.h"
|
10
|
+
#include "rnl.h"
|
11
|
+
|
12
|
+
void rnl_default_verror_handler(rnv_t *rnv, int erno,va_list ap) {
|
13
|
+
if(erno&ERBIT_RNC) {
|
14
|
+
rnc_default_verror_handler(rnv, erno&~ERBIT_RNC,ap);
|
15
|
+
} else if(erno&ERBIT_RND) {
|
16
|
+
rnd_default_verror_handler(rnv, erno&~ERBIT_RND,ap);
|
17
|
+
}
|
18
|
+
}
|
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;
|
25
|
+
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
|
+
}
|
31
|
+
|
32
|
+
void rnl_clear(void) {}
|
33
|
+
|
34
|
+
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
|
+
int start=-1;
|
36
|
+
if(!rnc_errors(sp)) start=rnc_parse(rnv, rnc_st, rn_st, sp); rnc_close(sp);
|
37
|
+
if(!rnc_errors(sp)&&(start=rnd_fixup(rnv, rnd_st, rn_st, start))) {
|
38
|
+
start=rn_compress_last(rnv, rn_st, start);
|
39
|
+
} else start=0;
|
40
|
+
return start;
|
41
|
+
}
|
42
|
+
|
43
|
+
int rnl_fn(rnv_t *rnv, rnc_st_t *rnc_st, rn_st_t *rn_st, rnd_st_t *rnd_st, char *fn) {
|
44
|
+
struct rnc_source src;
|
45
|
+
src.rnv = rnv;
|
46
|
+
rnc_open(&src,fn);
|
47
|
+
return load(rnv, rnc_st, rn_st, rnd_st, &src);
|
48
|
+
}
|
49
|
+
|
50
|
+
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
|
+
struct rnc_source src;
|
52
|
+
src.rnv = rnv;
|
53
|
+
rnc_bind(&src,fn,fd);
|
54
|
+
return load(rnv, rnc_st, rn_st, rnd_st, &src);
|
55
|
+
}
|
56
|
+
|
57
|
+
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
|
+
struct rnc_source src;
|
59
|
+
src.rnv = rnv;
|
60
|
+
rnc_stropen(&src,fn,s,len);
|
61
|
+
return load(rnv, rnc_st, rn_st, rnd_st, &src);
|
62
|
+
}
|
data/ext/rnv/src/rnl.h
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
/* $Id: rnl.h,v 1.1 2004/01/10 14:25:05 dvd Exp $ */
|
2
|
+
|
3
|
+
#ifndef RNL_H
|
4
|
+
#define RNL_H 1
|
5
|
+
|
6
|
+
#include <stdarg.h>
|
7
|
+
#include "type.h"
|
8
|
+
|
9
|
+
extern void rnl_default_verror_handler(rnv_t *rnv, int erno,va_list ap);
|
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);
|
13
|
+
|
14
|
+
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
|
+
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);
|
16
|
+
extern 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);
|
17
|
+
|
18
|
+
#endif
|
data/ext/rnv/src/rnv.c
ADDED
@@ -0,0 +1,158 @@
|
|
1
|
+
#include "type.h"
|
2
|
+
|
3
|
+
/* $Id: rnv.c,v 1.69 2004/01/28 23:21:24 dvd Exp $ */
|
4
|
+
|
5
|
+
#include <string.h> /*strncpy,strrchr*/
|
6
|
+
#include <assert.h>
|
7
|
+
#include "m.h"
|
8
|
+
#include "xmlc.h" /*xmlc_white_space*/
|
9
|
+
#include "erbit.h"
|
10
|
+
#include "drv.h"
|
11
|
+
#include "er.h"
|
12
|
+
#include "rnv.h"
|
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) {
|
16
|
+
if(erno&ERBIT_DRV) {
|
17
|
+
drv_default_verror_handler(rnv, erno&~ERBIT_DRV,ap);
|
18
|
+
} else {
|
19
|
+
switch(erno) {
|
20
|
+
case RNV_ER_ELEM: err("element %s^%s not allowed"); break;
|
21
|
+
case RNV_ER_AKEY: err("attribute %s^%s not allowed"); break;
|
22
|
+
case RNV_ER_AVAL: err("attribute %s^%s with invalid value \"%s\""); break;
|
23
|
+
case RNV_ER_EMIS: err("incomplete content"); break;
|
24
|
+
case RNV_ER_AMIS: err("missing attributes of %s^%s"); break;
|
25
|
+
case RNV_ER_UFIN: err("unfinished content of element %s^%s"); break;
|
26
|
+
case RNV_ER_TEXT: err("invalid data or text not allowed"); break;
|
27
|
+
case RNV_ER_NOTX: err("text not allowed"); break;
|
28
|
+
default: assert(0);
|
29
|
+
}
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
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);
|
35
|
+
}
|
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
|
+
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;
|
42
|
+
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
|
+
}
|
50
|
+
|
51
|
+
static void windup(void) {
|
52
|
+
}
|
53
|
+
|
54
|
+
static char *qname_open(char **surip,char **snamep,char *name) {
|
55
|
+
char *sep;
|
56
|
+
if((sep=strrchr(name,':'))) {
|
57
|
+
*snamep=sep+1; *surip=name; *sep='\0';
|
58
|
+
} else {
|
59
|
+
*snamep=name; while(*name) ++name; *surip=name;
|
60
|
+
}
|
61
|
+
return sep; /* NULL if no namespace */
|
62
|
+
}
|
63
|
+
|
64
|
+
static void qname_close(char *sep) {if(sep) *sep=':';}
|
65
|
+
|
66
|
+
static int whitespace(char *text,int n_txt) {
|
67
|
+
char *s=text,*end=text+n_txt;
|
68
|
+
for(;;) {
|
69
|
+
if(s==end) return 1;
|
70
|
+
if(!xmlc_white_space(*(s++))) return 0;
|
71
|
+
}
|
72
|
+
}
|
73
|
+
|
74
|
+
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_txt,int mixed) {
|
75
|
+
int ok=1;
|
76
|
+
if(mixed) {
|
77
|
+
if(!whitespace(text,n_txt)) {
|
78
|
+
*curp=drv_mixed_text(rnv, drv_st, rn_st, *prevp=*curp);
|
79
|
+
if(*curp==rnv->rn_notAllowed) { ok=0;
|
80
|
+
*curp=drv_mixed_text_recover(*prevp);
|
81
|
+
error_handler(rnv, RNV_ER_NOTX);
|
82
|
+
}
|
83
|
+
}
|
84
|
+
} else {
|
85
|
+
*curp=drv_text(rnv, rn_st, rx_st, drv_st, *prevp=*curp,text,n_txt);
|
86
|
+
if(*curp==rnv->rn_notAllowed) { ok=0;
|
87
|
+
*curp=drv_text_recover(*prevp,text,n_txt);
|
88
|
+
error_handler(rnv, RNV_ER_TEXT);
|
89
|
+
}
|
90
|
+
}
|
91
|
+
return ok;
|
92
|
+
}
|
93
|
+
|
94
|
+
int rnv_start_tag_open(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int *curp,int *prevp,char *name) {
|
95
|
+
int ok=1; char *suri,*sname,*sep;
|
96
|
+
sep=qname_open(&suri,&sname,name);
|
97
|
+
*curp=drv_start_tag_open(rnv, drv_st, rn_st, *prevp=*curp,suri,sname);
|
98
|
+
if(*curp==rnv->rn_notAllowed) { ok=0;
|
99
|
+
*curp=drv_start_tag_open_recover(rnv, drv_st, rn_st, *prevp,suri,sname);
|
100
|
+
error_handler(rnv, *curp==rnv->rn_notAllowed?RNV_ER_ELEM:RNV_ER_EMIS,suri,sname);
|
101
|
+
}
|
102
|
+
qname_close(sep);
|
103
|
+
return ok;
|
104
|
+
}
|
105
|
+
|
106
|
+
int rnv_attribute(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 *val) {
|
107
|
+
int ok=1; char *suri,*sname,*sep;
|
108
|
+
sep=qname_open(&suri,&sname,name);
|
109
|
+
*curp=drv_attribute_open(rnv, drv_st, rn_st, *prevp=*curp,suri,sname);
|
110
|
+
if(*curp==rnv->rn_notAllowed) { ok=0;
|
111
|
+
*curp=drv_attribute_open_recover(*prevp,suri,sname);
|
112
|
+
error_handler(rnv, RNV_ER_AKEY,suri,sname);
|
113
|
+
} else {
|
114
|
+
*curp=drv_text(rnv, rn_st, rx_st, drv_st, *prevp=*curp,(char*)val,strlen(val));
|
115
|
+
if(*curp==rnv->rn_notAllowed || (*curp=drv_attribute_close(rnv, drv_st, rn_st, *prevp=*curp))==rnv->rn_notAllowed) { ok=0;
|
116
|
+
*curp=drv_attribute_close_recover(rnv, drv_st, rn_st, *prevp);
|
117
|
+
error_handler(rnv, RNV_ER_AVAL,suri,sname,val);
|
118
|
+
}
|
119
|
+
}
|
120
|
+
qname_close(sep);
|
121
|
+
return ok;
|
122
|
+
}
|
123
|
+
|
124
|
+
int rnv_start_tag_close(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int *curp,int *prevp,char *name) {
|
125
|
+
int ok=1; char *suri,*sname,*sep;
|
126
|
+
*curp=drv_start_tag_close(rnv, drv_st, rn_st, *prevp=*curp);
|
127
|
+
if(*curp==rnv->rn_notAllowed) { ok=0;
|
128
|
+
*curp=drv_start_tag_close_recover(rnv, drv_st, rn_st, *prevp);
|
129
|
+
sep=qname_open(&suri,&sname,name);
|
130
|
+
error_handler(rnv, RNV_ER_AMIS,suri,sname);
|
131
|
+
qname_close(sep);
|
132
|
+
}
|
133
|
+
return ok;
|
134
|
+
}
|
135
|
+
|
136
|
+
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) {
|
137
|
+
int ok=1;
|
138
|
+
ok=rnv_start_tag_open(rnv, drv_st, rn_st, curp,prevp,name)&&ok;
|
139
|
+
while(*curp!=rnv->rn_notAllowed) {
|
140
|
+
if(!(*attrs)) break;
|
141
|
+
ok = rnv_attribute(rnv, drv_st, rn_st, rx_st, curp,prevp,*attrs,*(attrs+1))&&ok;
|
142
|
+
attrs+=2;
|
143
|
+
}
|
144
|
+
if(*curp!=rnv->rn_notAllowed) ok=rnv_start_tag_close(rnv, drv_st, rn_st, curp,prevp,name)&&ok;
|
145
|
+
return ok;
|
146
|
+
}
|
147
|
+
|
148
|
+
int rnv_end_tag(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int *curp,int *prevp,char *name) {
|
149
|
+
int ok=1; char *suri,*sname,*sep;
|
150
|
+
*curp=drv_end_tag(rnv, drv_st, rn_st, *prevp=*curp);
|
151
|
+
if(*curp==rnv->rn_notAllowed) { ok=0;
|
152
|
+
sep=qname_open(&suri,&sname,name);
|
153
|
+
error_handler(rnv, RNV_ER_UFIN,suri,sname);
|
154
|
+
qname_close(sep);
|
155
|
+
*curp=drv_end_tag_recover(rnv, drv_st, rn_st, *prevp);
|
156
|
+
}
|
157
|
+
return ok;
|
158
|
+
}
|
data/ext/rnv/src/rnv.h
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
/* $Id: rnv.h,v 1.7 2004/01/09 10:19:39 dvd Exp $ */
|
2
|
+
|
3
|
+
#include <stdarg.h>
|
4
|
+
#include "type.h"
|
5
|
+
|
6
|
+
#ifndef RNV_H
|
7
|
+
#define RNV_H 1
|
8
|
+
|
9
|
+
#define RNV_ER_ELEM 0
|
10
|
+
#define RNV_ER_AKEY 1
|
11
|
+
#define RNV_ER_AVAL 2
|
12
|
+
#define RNV_ER_EMIS 3
|
13
|
+
#define RNV_ER_AMIS 4
|
14
|
+
#define RNV_ER_UFIN 5
|
15
|
+
#define RNV_ER_TEXT 6
|
16
|
+
#define RNV_ER_NOTX 7
|
17
|
+
|
18
|
+
extern void rnv_default_verror_handler(rnv_t *rnv, int erno,va_list ap);
|
19
|
+
|
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);
|
22
|
+
|
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
|
+
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);
|
25
|
+
extern int rnv_start_tag_open(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int *curp,int *prevp,char *name);
|
26
|
+
extern int rnv_attribute(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 *val);
|
27
|
+
extern int rnv_start_tag_close(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int *curp,int *prevp,char *name);
|
28
|
+
extern int rnv_end_tag(rnv_t *rnv, drv_st_t *drv_st, rn_st_t *rn_st, int *curp,int *prevp,char *name);
|
29
|
+
|
30
|
+
#endif
|
data/ext/rnv/src/rnx.c
ADDED
@@ -0,0 +1,153 @@
|
|
1
|
+
#include "type.h"
|
2
|
+
|
3
|
+
/* $Id: rnx.c,v 1.24 2004/02/25 00:00:32 dvd Exp $ */
|
4
|
+
|
5
|
+
#include <stdlib.h> /*NULL*/
|
6
|
+
#include <string.h> /*strcat*/
|
7
|
+
#include "m.h"
|
8
|
+
#include "s.h"
|
9
|
+
#include "rn.h"
|
10
|
+
#include "ll.h"
|
11
|
+
#include "rnx.h"
|
12
|
+
|
13
|
+
#define LEN_EXP RNX_LEN_EXP
|
14
|
+
#define LIM_EXP RNX_LIM_EXP
|
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));
|
18
|
+
}
|
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) {
|
23
|
+
int p1,p2,px=0,i;
|
24
|
+
if(req && rn_nullable(p)) return;
|
25
|
+
switch(RN_P_TYP(p)) {
|
26
|
+
case RN_P_ERROR: break;
|
27
|
+
case RN_P_NOT_ALLOWED: break;
|
28
|
+
case RN_P_EMPTY: break;
|
29
|
+
case RN_P_TEXT: px=p; break;
|
30
|
+
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;
|
32
|
+
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;
|
34
|
+
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;
|
38
|
+
case RN_P_DATA: px=p; break;
|
39
|
+
case RN_P_DATA_EXCEPT: rn_DataExcept(p,p1,p2);
|
40
|
+
expected(rnv, rnx_st, p1,first,req); break;
|
41
|
+
case RN_P_VALUE: px=p; break;
|
42
|
+
case RN_P_ATTRIBUTE: px=p; break;
|
43
|
+
case RN_P_ELEMENT: px=p; break;
|
44
|
+
case RN_P_AFTER: rn_After(p,p1,p2);
|
45
|
+
expected(rnv, rnx_st, p1,first,req); if(rn_nullable(p1)) px=p; break;
|
46
|
+
case RN_P_REF: break;
|
47
|
+
default: assert(0);
|
48
|
+
}
|
49
|
+
if(px&&(first||RN_P_IS(px,RN_P_ATTRIBUTE))) {
|
50
|
+
for(i=0;i!=rnv->rnx_n_exp;++i) {
|
51
|
+
if(rnv->rnx_exp[i]==px) {px=0; break;}
|
52
|
+
}
|
53
|
+
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));
|
55
|
+
rnv->rnx_exp[rnv->rnx_n_exp++]=px;
|
56
|
+
}
|
57
|
+
}
|
58
|
+
}
|
59
|
+
void rnx_expected(rnv_t *rnv, rnx_st_t *rnx_st, int p,int req) {
|
60
|
+
if(req) {
|
61
|
+
if(rnx_st->len_exp>LIM_EXP) {
|
62
|
+
m_free(rnv->rnx_exp);
|
63
|
+
rnv->rnx_exp=(int*)m_alloc(rnx_st->len_exp=LIM_EXP,sizeof(int));
|
64
|
+
}
|
65
|
+
rnv->rnx_n_exp=0;
|
66
|
+
}
|
67
|
+
expected(rnv, rnx_st, p,1,req);
|
68
|
+
}
|
69
|
+
|
70
|
+
char *rnx_p2str(rnv_t *rnv, int p) {
|
71
|
+
char *s=NULL,*s1;
|
72
|
+
int dt,ps,val,nc,p1;
|
73
|
+
switch(RN_P_TYP(p)) {
|
74
|
+
case RN_P_ERROR: s=s_clone("error"); break;
|
75
|
+
case RN_P_NOT_ALLOWED: s=s_clone("notAllowed"); break;
|
76
|
+
case RN_P_EMPTY: s=s_clone("empty"); break;
|
77
|
+
case RN_P_TEXT: s=s_clone("text"); break;
|
78
|
+
case RN_P_CHOICE: s=s_clone("choice (|)"); break;
|
79
|
+
case RN_P_INTERLEAVE: s=s_clone("interleave (&)"); break;
|
80
|
+
case RN_P_GROUP: s=s_clone("group (,)"); break;
|
81
|
+
case RN_P_ONE_OR_MORE: s=s_clone("one or more (+)"); break;
|
82
|
+
case RN_P_LIST: s=s_clone("list"); break;
|
83
|
+
case RN_P_DATA: rn_Data(p,dt,ps);
|
84
|
+
s1=rnx_nc2str(rnv, dt);
|
85
|
+
s=(char*)m_alloc(strlen("data ")+1+strlen(s1),sizeof(char));
|
86
|
+
strcpy(s,"data "); strcat(s,s1);
|
87
|
+
m_free(s1);
|
88
|
+
break;
|
89
|
+
case RN_P_DATA_EXCEPT: s=s_clone("dataExcept (-)"); break;
|
90
|
+
case RN_P_VALUE: rn_Value(p,dt,val);
|
91
|
+
s1=rnx_nc2str(rnv, dt);
|
92
|
+
s=(char*)m_alloc(strlen("value \"\" ")+1+strlen(s1)+strlen(rnv->rn_string+val),sizeof(char));
|
93
|
+
strcpy(s,"value "); strcat(s,s1); strcat(s," \""); strcat(s,rnv->rn_string+val); strcat(s,"\"");
|
94
|
+
m_free(s1);
|
95
|
+
break;
|
96
|
+
case RN_P_ATTRIBUTE: rn_Attribute(p,nc,p1);
|
97
|
+
s1=rnx_nc2str(rnv, nc);
|
98
|
+
s=(char*)m_alloc(strlen("attribute ")+1+strlen(s1),sizeof(char));
|
99
|
+
strcpy(s,"attribute "); strcat(s,s1);
|
100
|
+
m_free(s1);
|
101
|
+
break;
|
102
|
+
case RN_P_ELEMENT: rn_Element(p,nc,p1);
|
103
|
+
s1=rnx_nc2str(rnv, nc);
|
104
|
+
s=(char*)m_alloc(strlen("element ")+1+strlen(s1),sizeof(char));
|
105
|
+
strcpy(s,"element "); strcat(s,s1);
|
106
|
+
m_free(s1);
|
107
|
+
break;
|
108
|
+
case RN_P_REF: s=s_clone("ref"); break;
|
109
|
+
case RN_P_AFTER: s=s_clone("after"); break;
|
110
|
+
default: assert(0);
|
111
|
+
}
|
112
|
+
return s;
|
113
|
+
}
|
114
|
+
|
115
|
+
char *rnx_nc2str(rnv_t *rnv, int nc) {
|
116
|
+
char *s=NULL,*s1,*s2;
|
117
|
+
int nc1,nc2,uri,name;
|
118
|
+
switch(RN_NC_TYP(nc)) {
|
119
|
+
case RN_NC_ERROR: s=s_clone("?"); break;
|
120
|
+
case RN_NC_NSNAME:
|
121
|
+
rn_NsName(nc,uri);
|
122
|
+
s=(char*)m_alloc(strlen(rnv->rn_string+uri)+3,sizeof(char));
|
123
|
+
strcpy(s,rnv->rn_string+uri); strcat(s,":*");
|
124
|
+
break;
|
125
|
+
case RN_NC_QNAME:
|
126
|
+
rn_QName(nc,uri,name);
|
127
|
+
s=(char*)m_alloc(strlen(rnv->rn_string+uri)+strlen(rnv->rn_string+name)+2,sizeof(char));
|
128
|
+
strcpy(s,rnv->rn_string+uri); strcat(s,"^"); strcat(s,rnv->rn_string+name);
|
129
|
+
break;
|
130
|
+
case RN_NC_ANY_NAME: s=s_clone("*"); break;
|
131
|
+
case RN_NC_EXCEPT:
|
132
|
+
rn_NameClassExcept(nc,nc1,nc2);
|
133
|
+
s1=rnx_nc2str(rnv, nc1); s2=rnx_nc2str(rnv, nc2);
|
134
|
+
s=(char*)m_alloc(strlen(s1)+strlen(s2)+2,sizeof(char));
|
135
|
+
strcpy(s,s1); strcat(s,"-"); strcat(s,s2);
|
136
|
+
m_free(s1); m_free(s2);
|
137
|
+
break;
|
138
|
+
case RN_NC_CHOICE:
|
139
|
+
rn_NameClassChoice(nc,nc1,nc2);
|
140
|
+
s1=rnx_nc2str(rnv, nc1); s2=rnx_nc2str(rnv, nc2);
|
141
|
+
s=(char*)m_alloc(strlen(s1)+strlen(s2)+2,sizeof(char));
|
142
|
+
strcpy(s,s1); strcat(s,"|"); strcat(s,s2);
|
143
|
+
m_free(s1); m_free(s2);
|
144
|
+
break;
|
145
|
+
case RN_NC_DATATYPE:
|
146
|
+
rn_Datatype(nc,uri,name);
|
147
|
+
s=(char*)m_alloc(strlen(rnv->rn_string+uri)+strlen(rnv->rn_string+name)+2,sizeof(char));
|
148
|
+
strcpy(s,rnv->rn_string+uri); strcat(s,"^"); strcat(s,rnv->rn_string+name);
|
149
|
+
break;
|
150
|
+
default: assert(0);
|
151
|
+
}
|
152
|
+
return s;
|
153
|
+
}
|