ruby_rnv 0.2.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 +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
|
+
}
|