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/rx.h
CHANGED
@@ -19,16 +19,15 @@
|
|
19
19
|
#define RX_ER_DNUOB 10
|
20
20
|
#define RX_ER_NOTRC 11
|
21
21
|
|
22
|
-
|
23
|
-
//extern int rx_compact;
|
24
|
-
|
25
|
-
extern void rx_default_verror_handler(rnv_t *rnv, int erno,va_list ap);
|
22
|
+
extern void rx_default_verror_handler(void *data, int erno, int (*handler)(void *data, int erno,char *format, va_list ap), va_list ap);
|
26
23
|
|
27
24
|
extern void rx_init(rx_st_t *rx_st);
|
28
25
|
extern void rx_clear(rx_st_t *rx_st);
|
29
26
|
|
27
|
+
extern void rx_dispose(rx_st_t *rx_st);
|
28
|
+
|
30
29
|
/* just compiles the expression to check the syntax */
|
31
|
-
extern int rx_check(
|
30
|
+
extern int rx_check(rx_st_t *rx_st, char *rx);
|
32
31
|
|
33
32
|
/*
|
34
33
|
returns positive value if the s[0..n] ~= rx, 0 if not, -1 on regex error;
|
@@ -36,8 +35,8 @@ extern int rx_check(rnv_t *rnv, rx_st_t *rx_st, char *rx);
|
|
36
35
|
rmatch replaces white space in s with 0x20,
|
37
36
|
cmatch collapses white space.
|
38
37
|
*/
|
39
|
-
extern int rx_match(
|
40
|
-
extern int rx_rmatch(
|
41
|
-
extern int rx_cmatch(
|
38
|
+
extern int rx_match(rx_st_t *rx_st, char *rx,char *s,int n);
|
39
|
+
extern int rx_rmatch(rx_st_t *rx_st, char *rx,char *s,int n);
|
40
|
+
extern int rx_cmatch(rx_st_t *rx_st, char *rx,char *s,int n);
|
42
41
|
|
43
42
|
#endif
|
data/ext/rnv/src/sc.c
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
/* $Id: sc.c,v 1.16 2004/03/13 13:28:02 dvd Exp $ */
|
2
2
|
|
3
|
+
#include <stdlib.h> /*NULL*/
|
3
4
|
#include <assert.h> /*assert*/
|
4
5
|
#include "m.h"
|
5
6
|
#include "ll.h"
|
@@ -20,6 +21,10 @@ void sc_init(struct sc_stack *stp) {
|
|
20
21
|
windup(stp);
|
21
22
|
}
|
22
23
|
|
24
|
+
void sc_dispose(struct sc_stack *stp) {
|
25
|
+
m_free(stp->tab); stp->tab = NULL;
|
26
|
+
}
|
27
|
+
|
23
28
|
void sc_clear(struct sc_stack *stp) {
|
24
29
|
windup(stp);
|
25
30
|
}
|
data/ext/rnv/src/sc.h
CHANGED
data/ext/rnv/src/type.h
CHANGED
@@ -20,14 +20,54 @@ typedef struct rn_st
|
|
20
20
|
int len_nc;
|
21
21
|
int len_s;
|
22
22
|
int adding_ps;
|
23
|
+
|
23
24
|
} rn_st_t;
|
24
25
|
|
26
|
+
struct rnc_cym {
|
27
|
+
char *s; int slen;
|
28
|
+
int line,col;
|
29
|
+
int sym;
|
30
|
+
};
|
31
|
+
|
32
|
+
struct rnc_source {
|
33
|
+
int flags;
|
34
|
+
char *fn; int fd;
|
35
|
+
char *buf; int i,n;
|
36
|
+
int complete;
|
37
|
+
int line,col,prevline/*when error reported*/;
|
38
|
+
int u,v,w; int nx;
|
39
|
+
int cur;
|
40
|
+
struct rnc_cym sym[2];
|
41
|
+
|
42
|
+
int (*verror_handler)(void *data, int erno, char *format, va_list ap);
|
43
|
+
void *user_data;
|
44
|
+
};
|
45
|
+
|
46
|
+
typedef struct rnc_st
|
47
|
+
{
|
48
|
+
int len_p;
|
49
|
+
char *path;
|
50
|
+
struct sc_stack nss;
|
51
|
+
struct sc_stack dts;
|
52
|
+
struct sc_stack defs;
|
53
|
+
struct sc_stack refs;
|
54
|
+
struct sc_stack prefs;
|
55
|
+
|
56
|
+
int (*verror_handler)(void *data, int erno, char *format, va_list ap);
|
57
|
+
void *user_data;
|
58
|
+
|
59
|
+
} rnc_st_t;
|
60
|
+
|
25
61
|
typedef struct rnd_st
|
26
62
|
{
|
27
63
|
int len_f;
|
28
64
|
int n_f;
|
29
65
|
int *flat;
|
30
66
|
int errors;
|
67
|
+
|
68
|
+
int (*verror_handler)(void *data, int erno, char *format, va_list ap);
|
69
|
+
void *user_data;
|
70
|
+
|
31
71
|
} rnd_st_t;
|
32
72
|
|
33
73
|
typedef struct rnv rnv_t;
|
@@ -58,25 +98,18 @@ typedef struct rx_st
|
|
58
98
|
int (*memo)[3];
|
59
99
|
int (*r2p)[2];
|
60
100
|
|
61
|
-
|
62
|
-
rnv_t *rnv;
|
63
|
-
} rx_st_t;
|
101
|
+
int rx_compact;
|
64
102
|
|
65
|
-
|
66
|
-
|
67
|
-
int len_exp;
|
68
|
-
} rnx_st_t;
|
103
|
+
int (*verror_handler)(void *data, int erno, char *format, va_list ap);
|
104
|
+
void *user_data;
|
69
105
|
|
70
|
-
|
106
|
+
} rx_st_t;
|
107
|
+
|
108
|
+
typedef struct dtl_cb
|
71
109
|
{
|
72
|
-
int
|
73
|
-
|
74
|
-
|
75
|
-
struct sc_stack dts;
|
76
|
-
struct sc_stack defs;
|
77
|
-
struct sc_stack refs;
|
78
|
-
struct sc_stack prefs;
|
79
|
-
} rnc_st_t;
|
110
|
+
int p;
|
111
|
+
int ret;
|
112
|
+
} dtl_cb_t;
|
80
113
|
|
81
114
|
typedef struct drv_st
|
82
115
|
{
|
@@ -87,6 +120,15 @@ typedef struct drv_st
|
|
87
120
|
int len_m;
|
88
121
|
struct hashtable ht_m;
|
89
122
|
int (*memo)[5];
|
123
|
+
|
124
|
+
dtl_cb_t dtl_cb[256];
|
125
|
+
int n_dtl_cb;
|
126
|
+
|
127
|
+
int drv_compact;
|
128
|
+
|
129
|
+
int (*verror_handler)(void *data, int erno, char *format, va_list ap);
|
130
|
+
void *user_data;
|
131
|
+
|
90
132
|
} drv_st_t;
|
91
133
|
|
92
134
|
typedef struct rnv
|
@@ -100,22 +142,13 @@ typedef struct rnv
|
|
100
142
|
int rn_dt_string;
|
101
143
|
int rn_dt_token;
|
102
144
|
int rn_xsd_uri;
|
103
|
-
|
145
|
+
|
104
146
|
int rnx_n_exp;
|
105
147
|
int *rnx_exp;
|
106
|
-
int
|
107
|
-
|
108
|
-
int (*verror_handler)(rnv_t *rnv, int erno, char *format,va_list ap);
|
109
|
-
void (*drv_verror_handler)(rnv_t *rnv, int erno, va_list ap);
|
110
|
-
void (*rnc_verror_handler)(rnv_t *rnv, int erno, va_list ap);
|
111
|
-
void (*rnd_verror_handler)(rnv_t *rnv, int erno, va_list ap);
|
112
|
-
void (*rnl_verror_handler)(rnv_t *rnv, int erno, va_list ap);
|
113
|
-
void (*rnv_verror_handler)(rnv_t *rnv, int erno, va_list ap);
|
114
|
-
void (*rx_verror_handler)(rnv_t *rnv, int erno, va_list ap);
|
115
|
-
void (*xsd_verror_handler)(rnv_t *rnv, int erno, va_list ap);
|
148
|
+
int rnx_len_exp;
|
116
149
|
|
150
|
+
int (*verror_handler)(void *data, int erno, char *format,va_list ap);
|
117
151
|
void *user_data;
|
118
|
-
|
119
152
|
} rnv_t;
|
120
153
|
|
121
154
|
#endif // TYPE_H
|
data/ext/rnv/src/xcl.c
CHANGED
@@ -68,7 +68,7 @@ static int mixed = 0;
|
|
68
68
|
static char *xgfile = NULL, *xgpos = NULL;
|
69
69
|
|
70
70
|
#define err(msg) (*rnv->verror_handler)(rnv,erno,msg "\n", ap);
|
71
|
-
static void verror_handler(rnv_t *rnv, xcl_st_t *xcl_st,
|
71
|
+
static void verror_handler(rnv_t *rnv, xcl_st_t *xcl_st, int erno, va_list ap)
|
72
72
|
{
|
73
73
|
if (erno & ERBIT_RNL)
|
74
74
|
{
|
@@ -94,7 +94,7 @@ static void verror_handler(rnv_t *rnv, xcl_st_t *xcl_st, rnx_st_t *rnx_st, int e
|
|
94
94
|
char *s;
|
95
95
|
while (req--)
|
96
96
|
{
|
97
|
-
rnx_expected(rnv,
|
97
|
+
rnx_expected(rnv, xcl_st->previous, req);
|
98
98
|
if (i == rnv->rnx_n_exp)
|
99
99
|
continue;
|
100
100
|
if (rnv->rnx_n_exp > xcl_st->nexp)
|
@@ -129,18 +129,18 @@ static void verror_handler(rnv_t *rnv, xcl_st_t *xcl_st, rnx_st_t *rnx_st, int e
|
|
129
129
|
}
|
130
130
|
}
|
131
131
|
|
132
|
-
static void verror_handler_rnl(rnv_t *rnv, xcl_st_t *xcl_st,
|
133
|
-
static void verror_handler_rnv(rnv_t *rnv, xcl_st_t *xcl_st,
|
132
|
+
static void verror_handler_rnl(rnv_t *rnv, xcl_st_t *xcl_st, int erno, va_list ap) { verror_handler(rnv, xcl_st, erno | ERBIT_RNL, ap); }
|
133
|
+
static void verror_handler_rnv(rnv_t *rnv, xcl_st_t *xcl_st, int erno, va_list ap) { verror_handler(rnv, xcl_st, erno | ERBIT_RNV, ap); }
|
134
134
|
|
135
135
|
static void windup(xcl_st_t *xcl_st);
|
136
|
-
static void init(rnv_t *rnv, xcl_st_t *xcl_st, rn_st_t *rn_st,
|
136
|
+
static void init(rnv_t *rnv, xcl_st_t *xcl_st, rn_st_t *rn_st, rnc_st_t *rnc_st, rnd_st_t *rnd_st, drv_st_t *drv_st, rx_st_t *rx_st)
|
137
137
|
{
|
138
138
|
rnv->verror_handler=&verror_default_handler;
|
139
|
-
rnl_init(rnv, rn_st, rnd_st
|
139
|
+
rnl_init(rnv, rnc_st, rn_st, rnd_st);
|
140
140
|
//rnl_verror_handler = &verror_handler_rnl;
|
141
141
|
rnv_init(rnv, drv_st, rn_st, rx_st);
|
142
142
|
//rnv_verror_handler = &verror_handler_rnv;
|
143
|
-
rnx_init(rnv
|
143
|
+
rnx_init(rnv);
|
144
144
|
xcl_st->text = (char *)m_alloc(xcl_st->len_txt = LEN_T, sizeof(char));
|
145
145
|
windup(xcl_st);
|
146
146
|
}
|
@@ -162,11 +162,11 @@ static void windup(xcl_st_t *xcl_st)
|
|
162
162
|
xcl_st->lastline = xcl_st->lastcol = -1;
|
163
163
|
}
|
164
164
|
|
165
|
-
static void error_handler(rnv_t *rnv, xcl_st_t *xcl_st,
|
165
|
+
static void error_handler(rnv_t *rnv, xcl_st_t *xcl_st, int erno, ...)
|
166
166
|
{
|
167
167
|
va_list ap;
|
168
168
|
va_start(ap, erno);
|
169
|
-
verror_handler(rnv, xcl_st,
|
169
|
+
verror_handler(rnv, xcl_st, erno, ap);
|
170
170
|
va_end(ap);
|
171
171
|
}
|
172
172
|
|
@@ -258,14 +258,14 @@ static void processingInstruction(void *userData,
|
|
258
258
|
}
|
259
259
|
}
|
260
260
|
|
261
|
-
static int pipeout(rnv_t *rnv, xcl_st_t *xcl_st,
|
261
|
+
static int pipeout(rnv_t *rnv, xcl_st_t *xcl_st, void *buf, int len)
|
262
262
|
{
|
263
263
|
int ofs = 0, iw, lenw = len;
|
264
264
|
for (;;)
|
265
265
|
{
|
266
266
|
if ((iw = write(1, (char *)buf + ofs, lenw)) == -1)
|
267
267
|
{
|
268
|
-
error_handler(rnv, xcl_st,
|
268
|
+
error_handler(rnv, xcl_st, XCL_ER_IO, strerror(errno));
|
269
269
|
return 0;
|
270
270
|
}
|
271
271
|
ofs += iw;
|
@@ -275,7 +275,7 @@ static int pipeout(rnv_t *rnv, xcl_st_t *xcl_st, rnx_st_t *rnx_st, void *buf, in
|
|
275
275
|
}
|
276
276
|
}
|
277
277
|
|
278
|
-
static int process(rnv_t *rnv, xcl_st_t *xcl_st,
|
278
|
+
static int process(rnv_t *rnv, xcl_st_t *xcl_st, int fd)
|
279
279
|
{
|
280
280
|
void *buf;
|
281
281
|
int len;
|
@@ -285,11 +285,11 @@ static int process(rnv_t *rnv, xcl_st_t *xcl_st, rnx_st_t *rnx_st, int fd)
|
|
285
285
|
len = read(fd, buf, BUFSIZE);
|
286
286
|
if (len < 0)
|
287
287
|
{
|
288
|
-
error_handler(rnv, xcl_st,
|
288
|
+
error_handler(rnv, xcl_st, XCL_ER_IO, xcl_st->xml, strerror(errno));
|
289
289
|
goto ERROR;
|
290
290
|
}
|
291
291
|
if (xcl_st->peipe)
|
292
|
-
xcl_st->peipe = xcl_st->peipe && pipeout(rnv, xcl_st,
|
292
|
+
xcl_st->peipe = xcl_st->peipe && pipeout(rnv, xcl_st, buf, len);
|
293
293
|
if (!XML_ParseBuffer(expat, len, len == 0))
|
294
294
|
goto PARSE_ERROR;
|
295
295
|
if (len == 0)
|
@@ -298,9 +298,9 @@ static int process(rnv_t *rnv, xcl_st_t *xcl_st, rnx_st_t *rnx_st, int fd)
|
|
298
298
|
return xcl_st->ok;
|
299
299
|
|
300
300
|
PARSE_ERROR:
|
301
|
-
error_handler(rnv, xcl_st,
|
301
|
+
error_handler(rnv, xcl_st, XCL_ER_XML, XML_ErrorString(XML_GetErrorCode(expat)));
|
302
302
|
while (xcl_st->peipe && (len = read(fd, buf, BUFSIZE)) != 0)
|
303
|
-
xcl_st->peipe = xcl_st->peipe && pipeout(rnv, xcl_st,
|
303
|
+
xcl_st->peipe = xcl_st->peipe && pipeout(rnv, xcl_st, buf, len);
|
304
304
|
ERROR:
|
305
305
|
return 0;
|
306
306
|
}
|
@@ -308,11 +308,11 @@ ERROR:
|
|
308
308
|
static int externalEntityRef(XML_Parser p, const char *context,
|
309
309
|
const char *base, const char *systemId, const char *publicId)
|
310
310
|
{
|
311
|
-
//error_handler(rnv, xcl_st,
|
311
|
+
//error_handler(rnv, xcl_st, XCL_ER_XENT);
|
312
312
|
return 1;
|
313
313
|
}
|
314
314
|
|
315
|
-
static void validate(rnv_t *rnv, xcl_st_t *xcl_st, drv_st_t *drv_st, rn_st_t *rn_st,
|
315
|
+
static void validate(rnv_t *rnv, xcl_st_t *xcl_st, drv_st_t *drv_st, rn_st_t *rn_st, int fd)
|
316
316
|
{
|
317
317
|
xcl_st->previous = xcl_st->current = xcl_st->start;
|
318
318
|
expat = XML_ParserCreateNS(NULL, ':');
|
@@ -322,7 +322,7 @@ static void validate(rnv_t *rnv, xcl_st_t *xcl_st, drv_st_t *drv_st, rn_st_t *rn
|
|
322
322
|
XML_SetExternalEntityRefHandler(expat, &externalEntityRef);
|
323
323
|
XML_SetProcessingInstructionHandler(expat, &processingInstruction);
|
324
324
|
XML_SetUserData(expat, xcl_st);
|
325
|
-
xcl_st->ok = process(rnv, xcl_st,
|
325
|
+
xcl_st->ok = process(rnv, xcl_st, fd);
|
326
326
|
XML_ParserFree(expat);
|
327
327
|
}
|
328
328
|
|
@@ -334,7 +334,6 @@ int main(int argc, char **argv)
|
|
334
334
|
rnv_t *rnv;
|
335
335
|
rn_st_t *rn_st;
|
336
336
|
rnc_st_t *rnc_st;
|
337
|
-
rnx_st_t *rnx_st;
|
338
337
|
drv_st_t *drv_st;
|
339
338
|
rx_st_t *rx_st;
|
340
339
|
rnd_st_t *rnd_st;
|
@@ -343,7 +342,6 @@ int main(int argc, char **argv)
|
|
343
342
|
rnv = malloc(sizeof(rnv_t));
|
344
343
|
rn_st = malloc(sizeof(rn_st_t));
|
345
344
|
rnc_st = malloc(sizeof(rnc_st_t));
|
346
|
-
rnx_st = malloc(sizeof(rnx_st_t));
|
347
345
|
drv_st = malloc(sizeof(drv_st_t));
|
348
346
|
rx_st = malloc(sizeof(rx_st_t));
|
349
347
|
rnd_st = malloc(sizeof(rnd_st_t));
|
@@ -354,7 +352,7 @@ int main(int argc, char **argv)
|
|
354
352
|
xcl_st->rn_st = rn_st;
|
355
353
|
xcl_st->rx_st = rx_st;
|
356
354
|
|
357
|
-
init(rnv, xcl_st, rn_st, rnc_st, rnd_st,
|
355
|
+
init(rnv, xcl_st, rn_st, rnc_st, rnd_st, drv_st, rx_st);
|
358
356
|
|
359
357
|
xcl_st->peipe = 0;
|
360
358
|
xcl_st->verbose = 1;
|
@@ -378,8 +376,8 @@ int main(int argc, char **argv)
|
|
378
376
|
xcl_st->nexp = atoi(*(++argv));
|
379
377
|
goto END_OF_OPTIONS;
|
380
378
|
case 's':
|
381
|
-
|
382
|
-
|
379
|
+
drv_st->drv_compact = 1;
|
380
|
+
rx_st->rx_compact = 1;
|
383
381
|
break;
|
384
382
|
case 'p':
|
385
383
|
xcl_st->peipe = 1;
|
@@ -439,7 +437,7 @@ int main(int argc, char **argv)
|
|
439
437
|
}
|
440
438
|
if (xcl_st->verbose)
|
441
439
|
(*er_printf)("%s\n", xcl_st->xml);
|
442
|
-
validate(rnv, xcl_st, drv_st, rn_st,
|
440
|
+
validate(rnv, xcl_st, drv_st, rn_st, fd);
|
443
441
|
close(fd);
|
444
442
|
clear(xcl_st);
|
445
443
|
} while (*(++argv));
|
@@ -451,7 +449,7 @@ int main(int argc, char **argv)
|
|
451
449
|
if (!xcl_st->rnck)
|
452
450
|
{
|
453
451
|
xcl_st->xml = "stdin";
|
454
|
-
validate(rnv, xcl_st, drv_st, rn_st,
|
452
|
+
validate(rnv, xcl_st, drv_st, rn_st, 0);
|
455
453
|
clear(xcl_st);
|
456
454
|
if (!xcl_st->ok && xcl_st->verbose)
|
457
455
|
(*er_printf)("error: invalid input\n");
|
@@ -462,7 +460,6 @@ int main(int argc, char **argv)
|
|
462
460
|
free(rnv);
|
463
461
|
free(rn_st);
|
464
462
|
free(rnc_st);
|
465
|
-
free(rnx_st);
|
466
463
|
free(drv_st);
|
467
464
|
free(rx_st);
|
468
465
|
free(rnd_st);
|
data/ext/rnv/src/xsd.c
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
#include "type.h"
|
2
|
-
|
3
1
|
/* $Id: xsd.c,v 1.47 2005/01/06 21:04:06 dvd Exp $ */
|
4
2
|
|
5
3
|
#include <limits.h> /*INT_MAX*/
|
@@ -7,6 +5,9 @@
|
|
7
5
|
#include <string.h> /*strlen*/
|
8
6
|
#include <math.h> /*HUGE_VAL*/
|
9
7
|
#include <assert.h>
|
8
|
+
|
9
|
+
#include "type.h"
|
10
|
+
|
10
11
|
#include "u.h"
|
11
12
|
#include "xmlc.h"
|
12
13
|
#include "s.h"
|
@@ -16,11 +17,10 @@
|
|
16
17
|
#include "er.h"
|
17
18
|
#include "xsd.h"
|
18
19
|
|
19
|
-
#define err(msg) (*
|
20
|
-
void xsd_default_verror_handler(
|
21
|
-
(*er_printf)("XML Schema datatypes: ");
|
20
|
+
#define err(msg) (*handler)(data,erno|ERBIT_XSD,"XML Schema datatypes: "msg"\n",ap)
|
21
|
+
void xsd_default_verror_handler(void *data, int erno, int (*handler)(void *data, int erno,char *format, va_list ap), va_list ap) {
|
22
22
|
if(erno&ERBIT_RX) {
|
23
|
-
rx_default_verror_handler(
|
23
|
+
rx_default_verror_handler(data, erno&~ERBIT_RX,handler,ap);
|
24
24
|
} else {
|
25
25
|
switch(erno) {
|
26
26
|
case XSD_ER_TYP: err("unknown type %s"); break;
|
@@ -36,24 +36,11 @@ void xsd_default_verror_handler(rnv_t *rnv, int erno,va_list ap) {
|
|
36
36
|
}
|
37
37
|
|
38
38
|
static void error_handler(rx_st_t *rx_st, int erno,...) {
|
39
|
-
va_list ap; va_start(ap,erno); (
|
39
|
+
va_list ap; va_start(ap,erno); xsd_default_verror_handler(rx_st->user_data,erno,rx_st->verror_handler,ap); va_end(ap);
|
40
40
|
}
|
41
41
|
|
42
|
-
static void verror_handler_rx(rnv_t *rnv, int erno,va_list ap) {xsd_default_verror_handler(rnv,erno|ERBIT_RX,ap);}
|
43
|
-
|
44
|
-
static void windup(void);
|
45
42
|
void xsd_init(rx_st_t *rx_st) {
|
46
|
-
rx_st->rnv->xsd_verror_handler = &xsd_default_verror_handler;
|
47
43
|
rx_init(rx_st);
|
48
|
-
rx_st->rnv->rx_verror_handler=&verror_handler_rx;
|
49
|
-
windup();
|
50
|
-
}
|
51
|
-
|
52
|
-
void xsd_clear(void) {
|
53
|
-
windup();
|
54
|
-
}
|
55
|
-
|
56
|
-
static void windup(void) {
|
57
44
|
}
|
58
45
|
|
59
46
|
#define FCT_ENUMERATION 0
|
@@ -81,7 +68,7 @@ static char *fcttab[NFCT]={
|
|
81
68
|
#define WS_REPLACE 1
|
82
69
|
#define WS_COLLAPSE 2
|
83
70
|
|
84
|
-
static int (*match[])(
|
71
|
+
static int (*match[])(rx_st_t *rx_st, char *r,char *s,int n)={&rx_match, &rx_rmatch,&rx_cmatch};
|
85
72
|
|
86
73
|
#define TYP_ENTITIES 0
|
87
74
|
#define TYP_ENTITY 1
|
@@ -327,7 +314,7 @@ struct facets {
|
|
327
314
|
#define PAT_MONTH0 "(0[1-9]|1[0-2])"
|
328
315
|
#define PAT_DAY0 "([0-2][0-9]|3[01])"
|
329
316
|
#define PAT_YEAR "-?"PAT_YEAR0 PAT_ZONE"?"
|
330
|
-
#define PAT_MONTH "--"PAT_MONTH0
|
317
|
+
#define PAT_MONTH "--"PAT_MONTH0 PAT_ZONE"?"
|
331
318
|
#define PAT_DAY "---"PAT_DAY0 PAT_ZONE"?"
|
332
319
|
#define PAT_YEAR_MONTH "-?"PAT_YEAR0"-"PAT_MONTH0 PAT_ZONE"?"
|
333
320
|
#define PAT_MONTH_DAY "--"PAT_MONTH0"-"PAT_DAY0 PAT_ZONE"?"
|
@@ -661,7 +648,7 @@ int xsd_allows(rx_st_t *rx_st, char *typ,char *ps,char *s,int n) {
|
|
661
648
|
default: assert(0);
|
662
649
|
}
|
663
650
|
|
664
|
-
while(fct.npat--) ok=ok&&match[fct.whiteSpace](rx_st
|
651
|
+
while(fct.npat--) ok=ok&&match[fct.whiteSpace](rx_st, fct.pattern[fct.npat],s,n);
|
665
652
|
|
666
653
|
if(fct.set&(1<<FCT_LENGTH)) ok=ok&&length==fct.length;
|
667
654
|
if(fct.set&(1<<FCT_MAX_LENGTH)) ok=ok&&length<=fct.maxLength;
|