ruby_rnv 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -0
  3. data/ext/rnv/extconf.rb +15 -0
  4. data/ext/rnv/ruby_rnv.c +742 -0
  5. data/ext/rnv/src/ary.c +78 -0
  6. data/ext/rnv/src/ary.h +10 -0
  7. data/ext/rnv/src/drv.c +472 -0
  8. data/ext/rnv/src/drv.h +35 -0
  9. data/ext/rnv/src/er.c +15 -0
  10. data/ext/rnv/src/er.h +16 -0
  11. data/ext/rnv/src/erbit.h +14 -0
  12. data/ext/rnv/src/ht.c +90 -0
  13. data/ext/rnv/src/ht.h +22 -0
  14. data/ext/rnv/src/ll.h +43 -0
  15. data/ext/rnv/src/m.c +60 -0
  16. data/ext/rnv/src/m.h +10 -0
  17. data/ext/rnv/src/rn.c +569 -0
  18. data/ext/rnv/src/rn.h +150 -0
  19. data/ext/rnv/src/rnc.c +1191 -0
  20. data/ext/rnv/src/rnc.h +68 -0
  21. data/ext/rnv/src/rnd.c +436 -0
  22. data/ext/rnv/src/rnd.h +25 -0
  23. data/ext/rnv/src/rnl.c +62 -0
  24. data/ext/rnv/src/rnl.h +18 -0
  25. data/ext/rnv/src/rnv.c +158 -0
  26. data/ext/rnv/src/rnv.h +30 -0
  27. data/ext/rnv/src/rnx.c +153 -0
  28. data/ext/rnv/src/rnx.h +16 -0
  29. data/ext/rnv/src/rx.c +749 -0
  30. data/ext/rnv/src/rx.h +43 -0
  31. data/ext/rnv/src/rx_cls_ranges.c +126 -0
  32. data/ext/rnv/src/rx_cls_u.c +262 -0
  33. data/ext/rnv/src/s.c +103 -0
  34. data/ext/rnv/src/s.h +32 -0
  35. data/ext/rnv/src/sc.c +62 -0
  36. data/ext/rnv/src/sc.h +26 -0
  37. data/ext/rnv/src/type.h +121 -0
  38. data/ext/rnv/src/u.c +88 -0
  39. data/ext/rnv/src/u.h +26 -0
  40. data/ext/rnv/src/xcl.c +472 -0
  41. data/ext/rnv/src/xmlc.c +20 -0
  42. data/ext/rnv/src/xmlc.h +16 -0
  43. data/ext/rnv/src/xsd.c +789 -0
  44. data/ext/rnv/src/xsd.h +27 -0
  45. data/ext/rnv/src/xsd_tm.c +100 -0
  46. data/ext/rnv/src/xsd_tm.h +15 -0
  47. data/lib/rnv.rb +2 -0
  48. data/lib/rnv/ox_sax_document.rb +84 -0
  49. data/lib/rnv/validator.rb +104 -0
  50. 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
+ }