pocxxeci 0.30.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of pocxxeci might be problematic. Click here for more details.

Files changed (160) hide show
  1. package/LICENSE +19 -0
  2. package/Makefile +18 -0
  3. package/README.md +52 -0
  4. package/binding.gyp +81 -0
  5. package/index.d.ts +273 -0
  6. package/index.js +45 -0
  7. package/lib/bindings.js +1 -0
  8. package/lib/document.js +122 -0
  9. package/lib/element.js +82 -0
  10. package/lib/sax_parser.js +38 -0
  11. package/package.json +70 -0
  12. package/src/html_document.cc +7 -0
  13. package/src/html_document.h +18 -0
  14. package/src/libxmljs.cc +252 -0
  15. package/src/libxmljs.h +53 -0
  16. package/src/xml_attribute.cc +173 -0
  17. package/src/xml_attribute.h +40 -0
  18. package/src/xml_comment.cc +117 -0
  19. package/src/xml_comment.h +30 -0
  20. package/src/xml_document.cc +810 -0
  21. package/src/xml_document.h +67 -0
  22. package/src/xml_element.cc +565 -0
  23. package/src/xml_element.h +61 -0
  24. package/src/xml_namespace.cc +158 -0
  25. package/src/xml_namespace.h +39 -0
  26. package/src/xml_node.cc +761 -0
  27. package/src/xml_node.h +73 -0
  28. package/src/xml_pi.cc +161 -0
  29. package/src/xml_pi.h +34 -0
  30. package/src/xml_sax_parser.cc +424 -0
  31. package/src/xml_sax_parser.h +73 -0
  32. package/src/xml_syntax_error.cc +66 -0
  33. package/src/xml_syntax_error.h +25 -0
  34. package/src/xml_text.cc +320 -0
  35. package/src/xml_text.h +48 -0
  36. package/src/xml_textwriter.cc +315 -0
  37. package/src/xml_textwriter.h +62 -0
  38. package/src/xml_xpath_context.cc +70 -0
  39. package/src/xml_xpath_context.h +23 -0
  40. package/vendor/libxml/Copyright +23 -0
  41. package/vendor/libxml/DOCBparser.c +305 -0
  42. package/vendor/libxml/HTMLparser.c +7287 -0
  43. package/vendor/libxml/HTMLtree.c +1200 -0
  44. package/vendor/libxml/Makefile +2983 -0
  45. package/vendor/libxml/SAX.c +180 -0
  46. package/vendor/libxml/SAX2.c +3036 -0
  47. package/vendor/libxml/buf.c +1351 -0
  48. package/vendor/libxml/buf.h +72 -0
  49. package/vendor/libxml/c14n.c +2234 -0
  50. package/vendor/libxml/catalog.c +3828 -0
  51. package/vendor/libxml/chvalid.c +336 -0
  52. package/vendor/libxml/config.h +294 -0
  53. package/vendor/libxml/config.h.gch +0 -0
  54. package/vendor/libxml/debugXML.c +3423 -0
  55. package/vendor/libxml/dict.c +1298 -0
  56. package/vendor/libxml/elfgcchack.h +17818 -0
  57. package/vendor/libxml/enc.h +32 -0
  58. package/vendor/libxml/encoding.c +3975 -0
  59. package/vendor/libxml/entities.c +1163 -0
  60. package/vendor/libxml/error.c +998 -0
  61. package/vendor/libxml/globals.c +1126 -0
  62. package/vendor/libxml/hash.c +1146 -0
  63. package/vendor/libxml/include/libxml/DOCBparser.h +96 -0
  64. package/vendor/libxml/include/libxml/HTMLparser.h +306 -0
  65. package/vendor/libxml/include/libxml/HTMLtree.h +147 -0
  66. package/vendor/libxml/include/libxml/Makefile +725 -0
  67. package/vendor/libxml/include/libxml/Makefile.am +54 -0
  68. package/vendor/libxml/include/libxml/Makefile.in +725 -0
  69. package/vendor/libxml/include/libxml/SAX.h +173 -0
  70. package/vendor/libxml/include/libxml/SAX2.h +178 -0
  71. package/vendor/libxml/include/libxml/c14n.h +128 -0
  72. package/vendor/libxml/include/libxml/catalog.h +182 -0
  73. package/vendor/libxml/include/libxml/chvalid.h +230 -0
  74. package/vendor/libxml/include/libxml/debugXML.h +217 -0
  75. package/vendor/libxml/include/libxml/dict.h +79 -0
  76. package/vendor/libxml/include/libxml/encoding.h +245 -0
  77. package/vendor/libxml/include/libxml/entities.h +151 -0
  78. package/vendor/libxml/include/libxml/globals.h +508 -0
  79. package/vendor/libxml/include/libxml/hash.h +236 -0
  80. package/vendor/libxml/include/libxml/list.h +137 -0
  81. package/vendor/libxml/include/libxml/nanoftp.h +163 -0
  82. package/vendor/libxml/include/libxml/nanohttp.h +81 -0
  83. package/vendor/libxml/include/libxml/parser.h +1243 -0
  84. package/vendor/libxml/include/libxml/parserInternals.h +644 -0
  85. package/vendor/libxml/include/libxml/pattern.h +100 -0
  86. package/vendor/libxml/include/libxml/relaxng.h +217 -0
  87. package/vendor/libxml/include/libxml/schemasInternals.h +958 -0
  88. package/vendor/libxml/include/libxml/schematron.h +142 -0
  89. package/vendor/libxml/include/libxml/threads.h +89 -0
  90. package/vendor/libxml/include/libxml/tree.h +1311 -0
  91. package/vendor/libxml/include/libxml/uri.h +94 -0
  92. package/vendor/libxml/include/libxml/valid.h +458 -0
  93. package/vendor/libxml/include/libxml/xinclude.h +129 -0
  94. package/vendor/libxml/include/libxml/xlink.h +189 -0
  95. package/vendor/libxml/include/libxml/xmlIO.h +368 -0
  96. package/vendor/libxml/include/libxml/xmlautomata.h +146 -0
  97. package/vendor/libxml/include/libxml/xmlerror.h +945 -0
  98. package/vendor/libxml/include/libxml/xmlexports.h +77 -0
  99. package/vendor/libxml/include/libxml/xmlmemory.h +224 -0
  100. package/vendor/libxml/include/libxml/xmlmodule.h +57 -0
  101. package/vendor/libxml/include/libxml/xmlreader.h +428 -0
  102. package/vendor/libxml/include/libxml/xmlregexp.h +222 -0
  103. package/vendor/libxml/include/libxml/xmlsave.h +88 -0
  104. package/vendor/libxml/include/libxml/xmlschemas.h +246 -0
  105. package/vendor/libxml/include/libxml/xmlschemastypes.h +151 -0
  106. package/vendor/libxml/include/libxml/xmlstring.h +140 -0
  107. package/vendor/libxml/include/libxml/xmlunicode.h +202 -0
  108. package/vendor/libxml/include/libxml/xmlversion.h +484 -0
  109. package/vendor/libxml/include/libxml/xmlwin32version.h +239 -0
  110. package/vendor/libxml/include/libxml/xmlwriter.h +488 -0
  111. package/vendor/libxml/include/libxml/xpath.h +564 -0
  112. package/vendor/libxml/include/libxml/xpathInternals.h +632 -0
  113. package/vendor/libxml/include/libxml/xpointer.h +114 -0
  114. package/vendor/libxml/include/win32config.h +122 -0
  115. package/vendor/libxml/include/wsockcompat.h +54 -0
  116. package/vendor/libxml/legacy.c +1343 -0
  117. package/vendor/libxml/libxml.h +134 -0
  118. package/vendor/libxml/list.c +779 -0
  119. package/vendor/libxml/nanoftp.c +2118 -0
  120. package/vendor/libxml/nanohttp.c +1899 -0
  121. package/vendor/libxml/parser.c +15553 -0
  122. package/vendor/libxml/parserInternals.c +2164 -0
  123. package/vendor/libxml/pattern.c +2621 -0
  124. package/vendor/libxml/relaxng.c +11101 -0
  125. package/vendor/libxml/rngparser.c +1595 -0
  126. package/vendor/libxml/runsuite.c +1157 -0
  127. package/vendor/libxml/save.h +36 -0
  128. package/vendor/libxml/schematron.c +1787 -0
  129. package/vendor/libxml/threads.c +1049 -0
  130. package/vendor/libxml/timsort.h +601 -0
  131. package/vendor/libxml/tree.c +10183 -0
  132. package/vendor/libxml/trio.c +6895 -0
  133. package/vendor/libxml/trio.h +230 -0
  134. package/vendor/libxml/triodef.h +228 -0
  135. package/vendor/libxml/trionan.c +914 -0
  136. package/vendor/libxml/trionan.h +84 -0
  137. package/vendor/libxml/triop.h +150 -0
  138. package/vendor/libxml/triostr.c +2112 -0
  139. package/vendor/libxml/triostr.h +144 -0
  140. package/vendor/libxml/uri.c +2561 -0
  141. package/vendor/libxml/valid.c +7138 -0
  142. package/vendor/libxml/xinclude.c +2657 -0
  143. package/vendor/libxml/xlink.c +183 -0
  144. package/vendor/libxml/xmlIO.c +4135 -0
  145. package/vendor/libxml/xmlcatalog.c +624 -0
  146. package/vendor/libxml/xmllint.c +3796 -0
  147. package/vendor/libxml/xmlmemory.c +1163 -0
  148. package/vendor/libxml/xmlmodule.c +468 -0
  149. package/vendor/libxml/xmlreader.c +6033 -0
  150. package/vendor/libxml/xmlregexp.c +8271 -0
  151. package/vendor/libxml/xmlsave.c +2735 -0
  152. package/vendor/libxml/xmlschemas.c +29173 -0
  153. package/vendor/libxml/xmlschemastypes.c +6276 -0
  154. package/vendor/libxml/xmlstring.c +1050 -0
  155. package/vendor/libxml/xmlunicode.c +3179 -0
  156. package/vendor/libxml/xmlwriter.c +4738 -0
  157. package/vendor/libxml/xpath.c +14734 -0
  158. package/vendor/libxml/xpointer.c +2969 -0
  159. package/vendor/libxml/xzlib.c +815 -0
  160. package/vendor/libxml/xzlib.h +19 -0
@@ -0,0 +1,1595 @@
1
+ /**
2
+ * rngparser.c: parser for the Relax-NG compact syntax.
3
+ *
4
+ * Based on:
5
+ * RELAX NG Compact Syntax
6
+ * Committee Specification 21 November 2002
7
+ * http://www.oasis-open.org/committees/relax-ng/compact-20021121.html
8
+ *
9
+ * See Copyright for the status of this software.
10
+ *
11
+ * Daniel Veillard <veillard@redhat.com>
12
+ */
13
+
14
+ #include <string.h>
15
+
16
+ #include <libxml/parser.h>
17
+ #include <libxml/parserInternals.h>
18
+ #include <libxml/relaxng.h>
19
+ #include <libxml/dict.h>
20
+
21
+ #define TODO \
22
+ xmlGenericError(xmlGenericErrorContext, \
23
+ "Unimplemented block at %s:%d\n", \
24
+ __FILE__, __LINE__);
25
+
26
+ #define MAX_TOKEN 10
27
+
28
+ typedef enum {
29
+ CRNG_NONE = 0,
30
+ CRNG_OP = 1,
31
+ CRNG_KEYWORD,
32
+ CRNG_IDENTIFIER,
33
+ CRNG_LITERAL_SEGMENT,
34
+ CRNG_CNAME,
35
+ CRNG_QNAME,
36
+ CRNG_NSNAME,
37
+ CRNG_DOCUMENTATION
38
+ } xmlCRNGTokType;
39
+
40
+ typedef enum {
41
+ CRNG_OKAY = 0,
42
+ CRNG_MEMORY_ERROR,
43
+ CRNG_INVALID_CHAR_ERROR,
44
+ CRNG_END_ERROR,
45
+ CRNG_ENCODING_ERROR
46
+ } xmlCRNGError;
47
+
48
+ typedef enum {
49
+ XML_CRNG_ERROR = -1,
50
+ XML_CRNG_OK = 0,
51
+ XML_CRNG_EOF = 1
52
+ } xmlCRelaxNGParserState;
53
+
54
+ typedef struct _token _token;
55
+ typedef _token *tokenPtr;
56
+ struct _token {
57
+ xmlCRNGTokType toktype;
58
+ int toklen;
59
+ const xmlChar *token;
60
+ const xmlChar *prefix;
61
+ };
62
+
63
+ typedef struct _xmlCRelaxNGParserCtxt xmlCRelaxNGParserCtxt;
64
+ typedef xmlCRelaxNGParserCtxt *xmlCRelaxNGParserCtxtPtr;
65
+ struct _xmlCRelaxNGParserCtxt {
66
+ void *userData; /* user specific data block */
67
+ xmlRelaxNGValidityErrorFunc error; /* the callback in case of errors */
68
+ xmlRelaxNGValidityWarningFunc warning;/* the callback in case of warning */
69
+ xmlRelaxNGValidErr err;
70
+
71
+ const xmlChar *compact;
72
+ const xmlChar *end;
73
+ const xmlChar *cur;
74
+ int isElem;
75
+ int lineno;
76
+ const xmlChar *linestart;
77
+ const char *filename;
78
+
79
+ int nbTokens;
80
+ int firstToken;
81
+ _token tokens[MAX_TOKEN];
82
+ int totalToken;
83
+
84
+ xmlCRelaxNGParserState state;
85
+
86
+ int nbErrors;
87
+
88
+ xmlDocPtr res; /* the result */
89
+ xmlNodePtr ins; /* the current insertion node */
90
+
91
+ xmlNsPtr nsDef;
92
+ tokenPtr token;
93
+
94
+ xmlHashTablePtr namespaces;
95
+ xmlHashTablePtr datatypes;
96
+
97
+ /*
98
+ * dictionary and keywords
99
+ */
100
+ xmlDictPtr dict;
101
+ const xmlChar *key_attribute;
102
+ const xmlChar *key_default;
103
+ const xmlChar *key_datatypes;
104
+ const xmlChar *key_div;
105
+ const xmlChar *key_element;
106
+ const xmlChar *key_empty;
107
+ const xmlChar *key_external;
108
+ const xmlChar *key_grammar;
109
+ const xmlChar *key_include;
110
+ const xmlChar *key_inherit;
111
+ const xmlChar *key_list;
112
+ const xmlChar *key_mixed;
113
+ const xmlChar *key_namespace;
114
+ const xmlChar *key_notAllowed;
115
+ const xmlChar *key_parent;
116
+ const xmlChar *key_start;
117
+ const xmlChar *key_string;
118
+ const xmlChar *key_text;
119
+ const xmlChar *key_token;
120
+ const xmlChar *key_equal;
121
+ const xmlChar *key_orequal;
122
+ const xmlChar *key_andequal;
123
+ const xmlChar *key_combine;
124
+ const xmlChar *key_or;
125
+ const xmlChar *key_comma;
126
+ const xmlChar *key_and;
127
+ const xmlChar *key_choice;
128
+ const xmlChar *key_group;
129
+ const xmlChar *key_interleave;
130
+ const xmlChar *key_ref;
131
+ const xmlChar *key_define;
132
+
133
+ /* results */
134
+ xmlDocPtr doc; /* the resulting doc */
135
+ xmlNodePtr insert; /* the insertion point */
136
+ xmlAttrPtr attrs; /* pending attributes */
137
+ };
138
+
139
+ static const xmlChar *xmlCRelaxNGInherit = BAD_CAST "Inherit string";
140
+ static const xmlChar *xmlCRelaxNGDefault = BAD_CAST "Default string";
141
+
142
+ #define CUR_CHAR(l) xmlXPathCurrentChar(ctxt, &l)
143
+ /**
144
+ * IS_BLANK:
145
+ * @c: an UNICODE value (int)
146
+ *
147
+ * Macro to check the following production in the XML spec:
148
+ *
149
+ * [3] S ::= (#x20 | #x9 | #xD | #xA)+
150
+ */
151
+ #ifndef IS_BLANK
152
+ #define IS_BLANK(c) (((c) == 0x20) || ((c) == 0x09) || ((c) == 0xA) || \
153
+ ((c) == 0x0D))
154
+ #endif
155
+ #define IS_SEPARATOR(c) (((c) == 0x20) || ((c) == 0x09) || ((c) == 0xA) || \
156
+ ((c) == 0x0D) || (c == '#'))
157
+
158
+ #define CRNG_ERROR0(X) \
159
+ { xmlCRNGErr(ctxt, X, NULL); return(0); }
160
+ #define CRNG_ERROR(X) \
161
+ { xmlCRNGErr(ctxt, X, NULL); }
162
+
163
+ #define CRNG_MEM_ERROR0() \
164
+ { xmlCRNGErr(ctxt, CRNG_MEMORY_ERROR, NULL); return(0); }
165
+ #define CRNG_MEM_ERROR() \
166
+ { xmlCRNGErr(ctxt, CRNG_MEMORY_ERROR, NULL); }
167
+
168
+ #define ERROR(str) xmlCRNGErr(ctxt, 0, str);
169
+
170
+ static void
171
+ xmlCRNGErr(xmlCRelaxNGParserCtxtPtr ctxt, int err_no, const char *err_msg) {
172
+ const xmlChar *cur;
173
+ xmlChar buffer[150];
174
+ int i, l;
175
+
176
+ if (ctxt != NULL) {
177
+ if (ctxt->filename != NULL)
178
+ fprintf(stderr, "%s:%d ", ctxt->filename, ctxt->lineno);
179
+ }
180
+ if (err_msg != NULL) {
181
+ fprintf(stderr, "error: %s\n", err_msg);
182
+ } else if (err_no != 0)
183
+ fprintf(stderr, "error %d\n", err_no);
184
+ cur = ctxt->cur;
185
+ while ((*cur != '\n') && (*cur != '\r') && (ctxt->cur - cur < 80)) cur--;
186
+ l = ctxt->cur - cur;
187
+ cur++;
188
+ for (i = 0; i < 100;i++) {
189
+ if ((*cur == '\n') || (*cur == '\r')) break;
190
+ buffer[i] = *cur++;
191
+ }
192
+ buffer[i] = 0;
193
+ fprintf(stderr, "%s\n", buffer);
194
+ for (i = 0; i < l;i++) buffer[i] = ' ';
195
+ buffer[i++] = '^';
196
+ buffer[i++] = 0;
197
+ fprintf(stderr, "%s\n", buffer);
198
+ }
199
+
200
+ /**
201
+ * IS_OP
202
+ * @c: an UNICODE value (int)
203
+ *
204
+ * Macro to check for operator value
205
+ */
206
+ #ifndef IS_OP
207
+ #define IS_OP(c) (((c) == ',') || ((c) == '&') || ((c) == '|') || \
208
+ ((c) == '?') || ((c) == '-') || ((c) == '*') || \
209
+ ((c) == '{') || ((c) == '}') || ((c) == '(') || \
210
+ ((c) == ')') || ((c) == '+') || ((c) == '=') || \
211
+ ((c) == ':'))
212
+ #endif
213
+
214
+ static int
215
+ xmlCRNGIsKeyword(xmlCRelaxNGParserCtxtPtr ctxt, const xmlChar *str) {
216
+ if ((str == ctxt->key_attribute) ||
217
+ (str == ctxt->key_default) ||
218
+ (str == ctxt->key_datatypes) ||
219
+ (str == ctxt->key_div) ||
220
+ (str == ctxt->key_element) ||
221
+ (str == ctxt->key_empty) ||
222
+ (str == ctxt->key_external) ||
223
+ (str == ctxt->key_grammar) ||
224
+ (str == ctxt->key_include) ||
225
+ (str == ctxt->key_inherit) ||
226
+ (str == ctxt->key_list) ||
227
+ (str == ctxt->key_mixed) ||
228
+ (str == ctxt->key_namespace) ||
229
+ (str == ctxt->key_notAllowed) ||
230
+ (str == ctxt->key_parent) ||
231
+ (str == ctxt->key_start) ||
232
+ (str == ctxt->key_string) ||
233
+ (str == ctxt->key_text) ||
234
+ (str == ctxt->key_token))
235
+ return(1);
236
+ return(0);
237
+
238
+ }
239
+
240
+ /*
241
+ * xmlCRNGNextToken:
242
+ * ctxt: a compact RNG parser context
243
+ *
244
+ * Scan the schema to get the next token
245
+ *
246
+ * Return 0 if success and -1 in case of error
247
+ */
248
+
249
+ static int
250
+ xmlCRNGNextToken(xmlCRelaxNGParserCtxtPtr ctxt) {
251
+ const xmlChar *cur;
252
+ tokenPtr token;
253
+
254
+ if (ctxt == NULL) return(-1);
255
+ if (ctxt->nbTokens >= MAX_TOKEN) return(-1);
256
+ token = &(ctxt->tokens[(ctxt->firstToken + ctxt->nbTokens) % MAX_TOKEN]);
257
+ token->toktype = CRNG_NONE;
258
+
259
+ if (ctxt->cur == NULL) {
260
+ ctxt->cur = ctxt->compact;
261
+ }
262
+ retry:
263
+ if (ctxt->cur >= ctxt->end) {
264
+ ctxt->state = XML_CRNG_EOF;
265
+ return(-1);
266
+ }
267
+ while ((ctxt->cur < ctxt->end) &&
268
+ (IS_BLANK(*ctxt->cur))) ctxt->cur++;
269
+ if (ctxt->cur >= ctxt->end) {
270
+ ctxt->state = XML_CRNG_EOF;
271
+ return(-1);
272
+ }
273
+ if (*ctxt->cur == '#') {
274
+ cur = ctxt->cur;
275
+ cur++;
276
+ while ((cur < ctxt->end) && (*cur != '\n') && (*cur != '\r'))
277
+ cur++;
278
+ ctxt->cur = cur;
279
+ goto retry;
280
+ } else if (*ctxt->cur == '"') {
281
+ /* string, check for '"""' */
282
+ ctxt->cur++;
283
+ if (ctxt->cur >= ctxt->end) goto eof;
284
+ cur = ctxt->cur;
285
+ if ((ctxt->end - ctxt->end > 2) &&
286
+ (*cur == '"') && (cur[1] == '"')) {
287
+ TODO
288
+ } else {
289
+ while ((cur < ctxt->end) && (*cur != '"')) cur++;
290
+ if (cur >= ctxt->end) goto eof;
291
+ token->toklen = cur - ctxt->cur;
292
+ token->token = xmlDictLookup(ctxt->dict, ctxt->cur, token->toklen);
293
+ token->toktype = CRNG_LITERAL_SEGMENT;
294
+ token->prefix = NULL;
295
+ cur++;
296
+ ctxt->cur = cur;
297
+ }
298
+ } else if (*ctxt->cur == '\'') {
299
+ /* string, check for "'''" */
300
+ TODO
301
+ } else if ((IS_OP(*ctxt->cur)) || (*ctxt->cur == ':')) {
302
+ cur = ctxt->cur;
303
+ cur++;
304
+ if ((cur < ctxt->end) &&
305
+ (((*cur == '=') &&
306
+ ((*ctxt->cur == '|') || (*ctxt->cur == '&'))) ||
307
+ ((*cur == '*') && (*ctxt->cur == ':')))) {
308
+ token->toklen = 2;
309
+ } else {
310
+ token->toklen = 1;
311
+ }
312
+ token->token = xmlDictLookup(ctxt->dict, ctxt->cur, token->toklen);
313
+ token->toktype = CRNG_OP;
314
+ token->prefix = NULL;
315
+ ctxt->cur += token->toklen;
316
+ } else {
317
+ int escape = 0;
318
+
319
+ cur = ctxt->cur;
320
+ if (*cur == '\\') {
321
+ escape = 1;
322
+ cur++;
323
+ ctxt->cur++;
324
+ }
325
+ while ((cur < ctxt->end) &&
326
+ (!(IS_SEPARATOR(*cur))) && (!(IS_OP(*cur)))) cur++;
327
+
328
+ token->toklen = cur - ctxt->cur;
329
+ token->token = xmlDictLookup(ctxt->dict, ctxt->cur, token->toklen);
330
+ token->prefix = NULL;
331
+ ctxt->cur = cur;
332
+ if ((escape == 0) && (xmlCRNGIsKeyword(ctxt, token->token)))
333
+ token->toktype = CRNG_KEYWORD;
334
+ else {
335
+ token->toktype = CRNG_IDENTIFIER;
336
+ }
337
+ if (*ctxt->cur == ':') {
338
+ ctxt->cur++;
339
+ if (*ctxt->cur == '*') {
340
+ ctxt->cur++;
341
+ token->toktype = CRNG_NSNAME;
342
+ } else {
343
+ cur = ctxt->cur;
344
+ while ((cur < ctxt->end) &&
345
+ (!(IS_SEPARATOR(*cur))) && (!(IS_OP(*cur)))) cur++;
346
+ token->prefix = token->token;
347
+ token->toklen = cur - ctxt->cur;
348
+ token->token = xmlDictLookup(ctxt->dict, ctxt->cur,
349
+ token->toklen);
350
+ ctxt->cur = cur;
351
+ if (xmlValidateNCName(token->token, 0) == 0)
352
+ token->toktype = CRNG_QNAME;
353
+ else {
354
+ TODO /* sounds like an error ! */
355
+ token->toktype = CRNG_IDENTIFIER;
356
+ }
357
+ }
358
+ }
359
+ }
360
+ ctxt->nbTokens++;
361
+ return(0);
362
+ eof:
363
+ ctxt->state = XML_CRNG_EOF;
364
+ CRNG_ERROR(CRNG_END_ERROR);
365
+ return(-1);
366
+ }
367
+
368
+ /**
369
+ * xmlParseCRNGGetToken:
370
+ * @ctxt: a compact RNG parser context
371
+ * @no: the number of the token from 1 for the first one
372
+ * and 2, 3 ... for read-ahead
373
+ *
374
+ * Token reading interface
375
+ *
376
+ * returns a pointer to the new token, or NULL in case of error or EOF
377
+ */
378
+ static tokenPtr
379
+ xmlParseCRNGGetToken(xmlCRelaxNGParserCtxtPtr ctxt, int no) {
380
+ tokenPtr ret;
381
+ int res;
382
+
383
+ if ((no <= 0) || (no >= MAX_TOKEN)) return(NULL);
384
+ no--;
385
+ while (ctxt->nbTokens <= no) {
386
+ res = xmlCRNGNextToken(ctxt);
387
+ if (res < 0)
388
+ return(NULL);
389
+ }
390
+ ret = &(ctxt->tokens[(ctxt->firstToken + no) % MAX_TOKEN]);
391
+ return(ret);
392
+ }
393
+
394
+ /**
395
+ * xmlParseCRNGDropTokens:
396
+ * @ctxt: a compact RNG parser context
397
+ * @nr: the number of token marked as read
398
+ *
399
+ * mark a number of token as read and consumed.
400
+ *
401
+ * Returns -1 in case of error and 0 otherwise
402
+ */
403
+ static int
404
+ xmlParseCRNGDropTokens(xmlCRelaxNGParserCtxtPtr ctxt, int nr) {
405
+ if ((nr <= 0) || (nr >= MAX_TOKEN)) return(-1);
406
+ while ((ctxt->nbTokens >0) && (nr > 0)) {
407
+ ctxt->firstToken++;
408
+ nr--;
409
+ ctxt->nbTokens--;
410
+ ctxt->totalToken++;
411
+ if (ctxt->totalToken == 384)
412
+ fprintf(stderr, "found\n");
413
+ }
414
+ ctxt->firstToken = ctxt->firstToken % MAX_TOKEN;
415
+ return(0);
416
+ }
417
+
418
+ static void
419
+ xmlParseCRNGTokenize(xmlCRelaxNGParserCtxtPtr ctxt) {
420
+ tokenPtr token;
421
+
422
+ token = xmlParseCRNGGetToken(ctxt, 1);
423
+ while (token != NULL) {
424
+ switch (token->toktype) {
425
+ case CRNG_NONE: printf("none"); break;
426
+ case CRNG_OP: printf("op"); break;
427
+ case CRNG_KEYWORD: printf("keyword"); break;
428
+ case CRNG_IDENTIFIER: printf("identifier"); break;
429
+ case CRNG_LITERAL_SEGMENT: printf("literal"); break;
430
+ case CRNG_CNAME: printf("cname"); break;
431
+ case CRNG_QNAME: printf("qname"); break;
432
+ case CRNG_NSNAME: printf("nsname"); break;
433
+ case CRNG_DOCUMENTATION: printf("doc"); break;
434
+ }
435
+ printf(":%s\n", token->token);
436
+ xmlParseCRNGDropTokens(ctxt, 1);
437
+ token = xmlParseCRNGGetToken(ctxt, 1);
438
+ }
439
+ }
440
+
441
+ /**
442
+ * xmlParseCRNG_attribute:
443
+ * @ctxt: a compact RNG parser context
444
+ * @name: the attribute name
445
+ * @ns: the attribute namespace
446
+ * @value: the attribute value
447
+ *
448
+ * implements attribute of the RELAX NG Compact Syntax Appendix A
449
+ *
450
+ * Returns 0 in case of success and -1 in case of error
451
+ */
452
+ static int
453
+ xmlParseCRNG_attribute(xmlCRelaxNGParserCtxtPtr ctxt,
454
+ const xmlChar *name,
455
+ xmlNsPtr ns,
456
+ const xmlChar *value)
457
+ {
458
+ xmlAttrPtr attr;
459
+
460
+ attr = xmlNewNsPropEatName(NULL, ns, (xmlChar *) name, value);
461
+ if (attr == NULL) CRNG_MEM_ERROR0();
462
+ attr->next = ctxt->attrs;
463
+ if (ctxt->attrs != NULL)
464
+ ctxt->attrs->prev = attr;
465
+ ctxt->attrs = attr;
466
+ return(0);
467
+ }
468
+
469
+ /**
470
+ * xmlParseCRNG_bindPrefix:
471
+ * @ctxt: a compact RNG parser context
472
+ * @prefix: the namespace prefix or NULL
473
+ * @namespace: the namespace name
474
+ *
475
+ * implements bindPrefix of the RELAX NG Compact Syntax Appendix A
476
+ *
477
+ * Returns 0 in case of success and -1 in case of error
478
+ */
479
+ static int
480
+ xmlParseCRNG_bindPrefix(xmlCRelaxNGParserCtxtPtr ctxt,
481
+ const xmlChar *prefix,
482
+ const xmlChar *namespace)
483
+ {
484
+ int ret;
485
+
486
+ if ((prefix != NULL) && (xmlStrEqual(prefix, BAD_CAST "xml")) &&
487
+ (!xmlStrEqual(namespace, XML_XML_NAMESPACE))) {
488
+ ERROR("The \"xml\" prefix must be bound to \"http://www.w3.org/XML/1998/namespace\"");
489
+ return(-1);
490
+ } else if ((xmlStrEqual(namespace, XML_XML_NAMESPACE)) &&
491
+ (!xmlStrEqual(prefix, BAD_CAST "xml"))) {
492
+ ERROR("The \"http://www.w3.org/XML/1998/namespace\" name must be bound to \"xml\" prefix");
493
+ return(-1);
494
+ }
495
+ if (ctxt->namespaces == NULL)
496
+ ctxt->namespaces = xmlHashCreate(10);
497
+ if (ctxt->namespaces == NULL) {
498
+ ERROR("Failed to create namespace hash table");
499
+ return(-1);
500
+ }
501
+ if (prefix == NULL)
502
+ ret = xmlHashAddEntry(ctxt->namespaces, xmlCRelaxNGDefault,
503
+ (void *) namespace);
504
+ else
505
+ ret = xmlHashAddEntry(ctxt->namespaces, prefix,
506
+ (void *) namespace);
507
+ if (ret < 0) {
508
+ if (prefix == NULL) {
509
+ ERROR("Redefinition of default namespace");
510
+ } else {
511
+ ERROR("Redefinition of namespace");
512
+ }
513
+ return(-1);
514
+ }
515
+
516
+ return(0);
517
+ }
518
+
519
+ /**
520
+ * xmlParseCRNG_bindDatatypePrefix:
521
+ * @ctxt: a compact RNG parser context
522
+ * @prefix: the datatype prefix
523
+ * @namespace: the datatype identifier
524
+ *
525
+ * implements bindDatatypePrefix of the RELAX NG Compact Syntax Appendix A
526
+ *
527
+ * Returns 0 in case of success and -1 in case of error
528
+ */
529
+ static int
530
+ xmlParseCRNG_bindDatatypePrefix(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED,
531
+ const xmlChar *prefix,
532
+ const xmlChar *namespace)
533
+ {
534
+ int ret;
535
+
536
+ if ((prefix != NULL) && (xmlStrEqual(prefix, BAD_CAST "xsd")) &&
537
+ (!xmlStrEqual(namespace,
538
+ BAD_CAST "http://www.w3.org/2001/XMLSchema-datatypes"))) {
539
+ ERROR("The \"xsd\" prefix must be bound to \"http://www.w3.org/2001/XMLSchema-datatypes\"");
540
+ return(-1);
541
+ }
542
+ if (ctxt->datatypes == NULL)
543
+ ctxt->datatypes = xmlHashCreate(10);
544
+ if (ctxt->datatypes == NULL) {
545
+ ERROR("Failed to create namespace hash table");
546
+ return(-1);
547
+ }
548
+ ret = xmlHashAddEntry(ctxt->datatypes, prefix,
549
+ (void *) namespace);
550
+ if (ret < 0) {
551
+ ERROR("Redefinition of datatype");
552
+ return(-1);
553
+ }
554
+ return(0);
555
+ }
556
+
557
+ /**
558
+ * xmlParseCRNG_lookupPrefix:
559
+ * @ctxt: a compact RNG parser context
560
+ * @prefix: the namespace prefix or NULL
561
+ *
562
+ * implements lookupPrefix of the RELAX NG Compact Syntax Appendix A
563
+ *
564
+ * Returns the prefix in case of success or NULL in case of error
565
+ */
566
+ static const xmlChar *
567
+ xmlParseCRNG_lookupPrefix(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED,
568
+ const xmlChar *prefix)
569
+ {
570
+ const xmlChar *ret;
571
+
572
+ if (prefix == NULL)
573
+ ret = xmlHashLookup(ctxt->namespaces, xmlCRelaxNGDefault);
574
+ else
575
+ ret = xmlHashLookup(ctxt->namespaces, prefix);
576
+ return(ret);
577
+ }
578
+
579
+ /**
580
+ * xmlParseCRNG_lookupDatatypePrefix:
581
+ * @ctxt: a compact RNG parser context
582
+ * @prefix: the namespace prefix or NULL
583
+ *
584
+ * implements lookupDatatypePrefix of the RELAX NG Compact Syntax Appendix A
585
+ *
586
+ * Returns the prefix in case of success or NULL in case of error
587
+ */
588
+ static const xmlChar *
589
+ xmlParseCRNG_lookupDatatypePrefix(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED,
590
+ const xmlChar *prefix)
591
+ {
592
+ const xmlChar *ret;
593
+ ret = xmlHashLookup(ctxt->datatypes, prefix);
594
+ return(ret);
595
+ }
596
+
597
+ /**
598
+ * xmlParseCRNG_datatypeAttributes:
599
+ * @ctxt: a compact RNG parser context
600
+ * @prefix: the namespace prefix or NULL
601
+ *
602
+ * implements lookupPrefix of the RELAX NG Compact Syntax Appendix A
603
+ *
604
+ * Returns the prefix in case of success or NULL in case of error
605
+ */
606
+ static xmlAttrPtr
607
+ xmlParseCRNG_datatypeAttributes(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED,
608
+ const xmlChar *library, const xmlChar *type)
609
+ {
610
+ xmlAttrPtr lib, typ;
611
+
612
+ lib = xmlNewNsProp(NULL, NULL, BAD_CAST "datatypeLibrary", library);
613
+ if (lib == NULL) {
614
+ CRNG_MEM_ERROR();
615
+ return(NULL);
616
+ }
617
+ typ = xmlNewNsProp(NULL, NULL, BAD_CAST "type", type);
618
+ if (typ == NULL) {
619
+ CRNG_MEM_ERROR();
620
+ return(lib);
621
+ }
622
+ lib->next = typ;
623
+
624
+ return(lib);
625
+ }
626
+
627
+ /**
628
+ * xmlParseCRNG_XXX:
629
+ * @ctxt: a compact RNG parser context
630
+ *
631
+ * Parse XXX of the RELAX NG Compact Syntax Appendix A
632
+ *
633
+ * Returns 0 in case of success and -1 in case of error
634
+ */
635
+ static int
636
+ xmlParseCRNG_XXX(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED)
637
+ {
638
+ return(0);
639
+ }
640
+
641
+ static int xmlParseCRNG_pattern(xmlCRelaxNGParserCtxtPtr ctxt);
642
+ static int xmlParseCRNG_nameClass(xmlCRelaxNGParserCtxtPtr ctxt);
643
+
644
+ /**
645
+ * xmlParseCRNG_params:
646
+ * @ctxt: a compact RNG parser context
647
+ *
648
+ * Parse params of the RELAX NG Compact Syntax Appendix A
649
+ *
650
+ * Returns 0 in case of success and -1 in case of error
651
+ */
652
+ static int
653
+ xmlParseCRNG_params(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED)
654
+ {
655
+ TODO
656
+ return(0);
657
+ }
658
+
659
+ /**
660
+ * xmlParseCRNG_exceptNameClass:
661
+ * @ctxt: a compact RNG parser context
662
+ *
663
+ * Parse exceptNameClass of the RELAX NG Compact Syntax Appendix A
664
+ *
665
+ * Returns 0 in case of success and -1 in case of error
666
+ */
667
+ static int
668
+ xmlParseCRNG_exceptNameClass(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED)
669
+ {
670
+ tokenPtr token;
671
+ xmlNodePtr insert = ctxt->insert, cur;
672
+
673
+ token = xmlParseCRNGGetToken(ctxt, 1);
674
+ if ((token->toktype == CRNG_OP) &&
675
+ (token->token[0] == '-') && (token->token[1] == 0)) {
676
+ xmlParseCRNGDropTokens(ctxt, 1);
677
+ cur = xmlNewNode(NULL, BAD_CAST "except");
678
+ if (cur == NULL) CRNG_MEM_ERROR0();
679
+ if (ctxt->insert != NULL)
680
+ xmlAddChild(ctxt->insert, cur);
681
+ ctxt->insert = cur;
682
+ xmlParseCRNG_nameClass(ctxt);
683
+ }
684
+ ctxt->insert = insert;
685
+ return(0);
686
+ }
687
+
688
+ /**
689
+ * xmlParseCRNG_innerNameClass:
690
+ * @ctxt: a compact RNG parser context
691
+ *
692
+ * Parse innerNameClass of the RELAX NG Compact Syntax Appendix A
693
+ *
694
+ * Returns 0 in case of success and -1 in case of error
695
+ */
696
+ static int
697
+ xmlParseCRNG_innerNameClass(xmlCRelaxNGParserCtxtPtr ctxt)
698
+ {
699
+ tokenPtr token;
700
+ xmlNodePtr cur;
701
+
702
+ token = xmlParseCRNGGetToken(ctxt, 1);
703
+ if (token->toktype == CRNG_OP) {
704
+ if ((token->token[0] == '(') && (token->token[1] == 0)) {
705
+ xmlParseCRNGDropTokens(ctxt, 1);
706
+ xmlParseCRNG_nameClass(ctxt);
707
+ token = xmlParseCRNGGetToken(ctxt, 1);
708
+ if ((token->toktype != CRNG_OP) ||
709
+ (token->token[0] != ')') || (token->token[1] != 0)) {
710
+ ERROR("Expecting \")\" here");
711
+ }
712
+ xmlParseCRNGDropTokens(ctxt, 1);
713
+ } else if ((token->token[0] == '*') && (token->token[1] == 0)) {
714
+ xmlParseCRNGDropTokens(ctxt, 1);
715
+ cur = xmlNewNode(NULL, BAD_CAST "anyName");
716
+ if (cur == NULL) CRNG_MEM_ERROR0();
717
+ if (ctxt->insert != NULL)
718
+ xmlAddChild(ctxt->insert, cur);
719
+ ctxt->insert = cur;
720
+ xmlParseCRNG_exceptNameClass(ctxt);
721
+ } else {
722
+ TODO
723
+ }
724
+ } else if ((token->toktype == CRNG_IDENTIFIER) ||
725
+ (token->toktype == CRNG_KEYWORD)) {
726
+ cur = xmlNewNode(NULL, BAD_CAST "name");
727
+ if (cur == NULL) CRNG_MEM_ERROR0();
728
+ if (ctxt->isElem) {
729
+ xmlSetProp(cur, BAD_CAST "ns",
730
+ xmlParseCRNG_lookupPrefix(ctxt, NULL));
731
+ } else {
732
+ xmlSetProp(cur, BAD_CAST "ns", BAD_CAST "");
733
+ }
734
+ xmlNodeAddContent(cur, token->token);
735
+ if (ctxt->insert != NULL)
736
+ xmlAddChild(ctxt->insert, cur);
737
+ ctxt->insert = cur;
738
+ xmlParseCRNGDropTokens(ctxt, 1);
739
+ } else if (token->toktype == CRNG_CNAME) {
740
+ TODO
741
+ } else if (token->toktype == CRNG_NSNAME) {
742
+ cur = xmlNewNode(NULL, BAD_CAST "nsName");
743
+ if (cur == NULL) CRNG_MEM_ERROR0();
744
+ xmlSetProp(cur, BAD_CAST "ns",
745
+ xmlParseCRNG_lookupPrefix(ctxt, token->token));
746
+ if (ctxt->insert != NULL)
747
+ xmlAddChild(ctxt->insert, cur);
748
+ ctxt->insert = cur;
749
+ xmlParseCRNGDropTokens(ctxt, 1);
750
+ xmlParseCRNG_exceptNameClass(ctxt);
751
+ } else {
752
+ TODO /* probably an error */
753
+ }
754
+
755
+ return(0);
756
+ }
757
+
758
+ /**
759
+ * xmlParseCRNG_nameClass:
760
+ * @ctxt: a compact RNG parser context
761
+ *
762
+ * Parse nameClass of the RELAX NG Compact Syntax Appendix A
763
+ *
764
+ * Returns 0 in case of success and -1 in case of error
765
+ */
766
+ static int
767
+ xmlParseCRNG_nameClass(xmlCRelaxNGParserCtxtPtr ctxt)
768
+ {
769
+ tokenPtr token;
770
+ xmlNodePtr insert = ctxt->insert, last, choice;
771
+
772
+ ctxt->insert = NULL;
773
+ xmlParseCRNG_innerNameClass(ctxt);
774
+ last = ctxt->insert;
775
+ token = xmlParseCRNGGetToken(ctxt, 1);
776
+ while ((token->toktype == CRNG_OP) &&
777
+ (token->token[0] == '|') && (token->token[1] == 0)) {
778
+ choice = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_choice);
779
+ xmlParseCRNGDropTokens(ctxt, 1);
780
+ if (choice == NULL) CRNG_MEM_ERROR0();
781
+ ctxt->insert = NULL;
782
+ xmlParseCRNG_innerNameClass(ctxt);
783
+ xmlAddChild(choice, last);
784
+ xmlAddChild(choice, ctxt->insert);
785
+ last = choice;
786
+ token = xmlParseCRNGGetToken(ctxt, 1);
787
+ }
788
+ xmlAddChild(insert, last);
789
+
790
+ ctxt->insert = insert;
791
+ return(0);
792
+ }
793
+
794
+ /**
795
+ * xmlParseCRNG_patternBlock:
796
+ * @ctxt: a compact RNG parser context
797
+ *
798
+ * Parse a pattern block of the RELAX NG Compact Syntax Appendix A
799
+ *
800
+ * Returns 0 in case of success and -1 in case of error
801
+ */
802
+ static int
803
+ xmlParseCRNG_patternBlock(xmlCRelaxNGParserCtxtPtr ctxt)
804
+ {
805
+ tokenPtr token;
806
+
807
+ token = xmlParseCRNGGetToken(ctxt, 1);
808
+ if ((token->toktype != CRNG_OP) ||
809
+ (token->token[0] != '{') || (token->token[1] != 0)) {
810
+ ERROR("Expecting \"{\" here");
811
+ }
812
+ xmlParseCRNGDropTokens(ctxt, 1);
813
+ xmlParseCRNG_pattern(ctxt);
814
+ token = xmlParseCRNGGetToken(ctxt, 1);
815
+ if ((token->toktype != CRNG_OP) ||
816
+ (token->token[0] != '}') || (token->token[1] != 0)) {
817
+ ERROR("Expecting \"}\" here");
818
+ }
819
+ xmlParseCRNGDropTokens(ctxt, 1);
820
+ return(0);
821
+ }
822
+
823
+ /**
824
+ * xmlParseCRNG_datatype:
825
+ * @ctxt: a compact RNG parser context
826
+ *
827
+ * Parse datatype of the RELAX NG Compact Syntax Appendix A
828
+ *
829
+ * Returns 0 in case of success and -1 in case of error
830
+ */
831
+ static int
832
+ xmlParseCRNG_datatype(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED)
833
+ {
834
+ tokenPtr token;
835
+ xmlAttrPtr attrs = NULL;
836
+
837
+ token = xmlParseCRNGGetToken(ctxt, 1);
838
+ if (token->toktype == CRNG_KEYWORD) {
839
+ if (token->token == ctxt->key_string) {
840
+ attrs = xmlParseCRNG_datatypeAttributes(ctxt, BAD_CAST "",
841
+ token->token);
842
+ xmlParseCRNGDropTokens(ctxt, 1);
843
+ } else if (token->token == ctxt->key_token) {
844
+ attrs = xmlParseCRNG_datatypeAttributes(ctxt, BAD_CAST "",
845
+ token->token);
846
+ xmlParseCRNGDropTokens(ctxt, 1);
847
+ } else {
848
+ TODO /* probably an error */
849
+ }
850
+ } else if (token->toktype == CRNG_LITERAL_SEGMENT) {
851
+ ctxt->insert = xmlNewNode(NULL, BAD_CAST "value");
852
+ xmlParseCRNGDropTokens(ctxt, 1);
853
+ if (ctxt->insert == NULL) CRNG_MEM_ERROR0();
854
+ xmlNodeAddContent(ctxt->insert, token->token);
855
+ } else if (token->toktype == CRNG_QNAME) {
856
+ attrs = xmlParseCRNG_datatypeAttributes(ctxt,
857
+ xmlParseCRNG_lookupDatatypePrefix(ctxt, token->prefix),
858
+ token->token);
859
+ } else {
860
+ TODO
861
+ }
862
+ if (attrs != NULL) {
863
+ token = xmlParseCRNGGetToken(ctxt, 1);
864
+ if (token->toktype == CRNG_LITERAL_SEGMENT) {
865
+ ctxt->insert = xmlNewNode(NULL, BAD_CAST "value");
866
+ xmlParseCRNGDropTokens(ctxt, 1);
867
+ if (ctxt->insert == NULL) {
868
+ xmlFreePropList(attrs);
869
+ CRNG_MEM_ERROR0();
870
+ }
871
+ ctxt->insert->properties = attrs;
872
+ xmlNodeAddContent(ctxt->insert, token->token);
873
+ } else if ((token->toktype == CRNG_OP) &&
874
+ (token->token[0] == '{') && (token->token[0] == 0)) {
875
+ ctxt->insert = xmlNewNode(NULL, BAD_CAST "data");
876
+ xmlParseCRNGDropTokens(ctxt, 1);
877
+ if (ctxt->insert == NULL) {
878
+ xmlFreePropList(attrs);
879
+ CRNG_MEM_ERROR0();
880
+ }
881
+ ctxt->insert->properties = attrs;
882
+ xmlParseCRNG_params(ctxt);
883
+ } else {
884
+ ctxt->insert = xmlNewNode(NULL, BAD_CAST "data");
885
+ xmlParseCRNGDropTokens(ctxt, 1);
886
+ if (ctxt->insert == NULL) {
887
+ xmlFreePropList(attrs);
888
+ CRNG_MEM_ERROR0();
889
+ }
890
+ ctxt->insert->properties = attrs;
891
+ xmlNodeAddContent(ctxt->insert, token->token);
892
+ }
893
+ }
894
+ return(0);
895
+ }
896
+
897
+ /**
898
+ * xmlParseCRNG_primary:
899
+ * @ctxt: a compact RNG parser context
900
+ *
901
+ * Parse primary of the RELAX NG Compact Syntax Appendix A
902
+ *
903
+ * Returns 0 in case of success and -1 in case of error
904
+ */
905
+ static int
906
+ xmlParseCRNG_primary(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED)
907
+ {
908
+ tokenPtr token;
909
+
910
+ token = xmlParseCRNGGetToken(ctxt, 1);
911
+ if (token == NULL)
912
+ return(0);
913
+ if (token->toktype == CRNG_KEYWORD) {
914
+ if (token->token == ctxt->key_element) {
915
+ ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token);
916
+ xmlParseCRNGDropTokens(ctxt, 1);
917
+ if (ctxt->insert == NULL) CRNG_MEM_ERROR0();
918
+ ctxt->isElem = 1;
919
+ xmlParseCRNG_nameClass(ctxt);
920
+ xmlParseCRNG_patternBlock(ctxt);
921
+ } else if (token->token == ctxt->key_attribute) {
922
+ ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token);
923
+ xmlParseCRNGDropTokens(ctxt, 1);
924
+ if (ctxt->insert == NULL) CRNG_MEM_ERROR0();
925
+ ctxt->isElem = 0;
926
+ xmlParseCRNG_nameClass(ctxt);
927
+ xmlParseCRNG_patternBlock(ctxt);
928
+ } else if (token->token == ctxt->key_mixed) {
929
+ ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token);
930
+ xmlParseCRNGDropTokens(ctxt, 1);
931
+ if (ctxt->insert == NULL) CRNG_MEM_ERROR0();
932
+ xmlParseCRNG_patternBlock(ctxt);
933
+ } else if (token->token == ctxt->key_list) {
934
+ ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token);
935
+ xmlParseCRNGDropTokens(ctxt, 1);
936
+ if (ctxt->insert == NULL) CRNG_MEM_ERROR0();
937
+ xmlParseCRNG_patternBlock(ctxt);
938
+ } else if (token->token == ctxt->key_empty) {
939
+ ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token);
940
+ xmlParseCRNGDropTokens(ctxt, 1);
941
+ if (ctxt->insert == NULL) CRNG_MEM_ERROR0();
942
+ } else if (token->token == ctxt->key_notAllowed) {
943
+ ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token);
944
+ xmlParseCRNGDropTokens(ctxt, 1);
945
+ if (ctxt->insert == NULL) CRNG_MEM_ERROR0();
946
+ } else if (token->token == ctxt->key_text) {
947
+ ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token);
948
+ xmlParseCRNGDropTokens(ctxt, 1);
949
+ if (ctxt->insert == NULL) CRNG_MEM_ERROR0();
950
+ } else if (token->token == ctxt->key_parent) {
951
+ ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token);
952
+ xmlParseCRNGDropTokens(ctxt, 1);
953
+ if (ctxt->insert == NULL) CRNG_MEM_ERROR0();
954
+ TODO
955
+ } else if (token->token == ctxt->key_grammar) {
956
+ ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) token->token);
957
+ xmlParseCRNGDropTokens(ctxt, 1);
958
+ if (ctxt->insert == NULL) CRNG_MEM_ERROR0();
959
+ TODO
960
+ } else if (token->token == ctxt->key_external) {
961
+ ctxt->insert = xmlNewNode(NULL, BAD_CAST "externalRef");
962
+ xmlParseCRNGDropTokens(ctxt, 1);
963
+ if (ctxt->insert == NULL) CRNG_MEM_ERROR0();
964
+ TODO
965
+ } else {
966
+ TODO
967
+ }
968
+ } else if (token->toktype == CRNG_IDENTIFIER) {
969
+ ctxt->insert = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_ref);
970
+ if (ctxt->insert == NULL) CRNG_MEM_ERROR0();
971
+ xmlSetProp(ctxt->insert, BAD_CAST "name", token->token);
972
+ xmlParseCRNGDropTokens(ctxt, 1);
973
+ } else if (token->toktype == CRNG_QNAME) {
974
+ xmlParseCRNG_datatype(ctxt);
975
+ } else if (token->toktype == CRNG_LITERAL_SEGMENT) {
976
+ xmlParseCRNG_datatype(ctxt);
977
+ } else if ((token->toktype == CRNG_OP) &&
978
+ (token->token[0] == '(') && (token->token[1] == 0)) {
979
+ xmlParseCRNGDropTokens(ctxt, 1);
980
+ xmlParseCRNG_pattern(ctxt);
981
+ token = xmlParseCRNGGetToken(ctxt, 1);
982
+ if ((token->toktype != CRNG_OP) ||
983
+ (token->token[0] != ')') || (token->token[1] != 0)) {
984
+ ERROR("Expecting \")\" here");
985
+ }
986
+ xmlParseCRNGDropTokens(ctxt, 1);
987
+ }
988
+ return(0);
989
+ }
990
+
991
+ /**
992
+ * xmlParseCRNG_particle:
993
+ * @ctxt: a compact RNG parser context
994
+ *
995
+ * Parse particle of the RELAX NG Compact Syntax Appendix A
996
+ *
997
+ * Returns 0 in case of success and -1 in case of error
998
+ */
999
+ static int
1000
+ xmlParseCRNG_particle(xmlCRelaxNGParserCtxtPtr ctxt)
1001
+ {
1002
+ tokenPtr token;
1003
+ xmlNodePtr insert = ctxt->insert, res, tmp = NULL;
1004
+
1005
+ ctxt->insert = NULL;
1006
+ xmlParseCRNG_primary(ctxt);
1007
+ res = ctxt->insert;
1008
+ token = xmlParseCRNGGetToken(ctxt, 1);
1009
+ if ((token != NULL) && (token->toktype == CRNG_OP)) {
1010
+ if ((token->token[0] == '*') && (token->token[1] == 0)) {
1011
+ tmp = xmlNewNode(NULL, BAD_CAST "zeroOrMore");
1012
+ if (tmp == NULL) CRNG_MEM_ERROR0();
1013
+ } else if ((token->token[0] == '+') && (token->token[1] == 0)) {
1014
+ tmp = xmlNewNode(NULL, BAD_CAST "oneOrMore");
1015
+ if (tmp == NULL) CRNG_MEM_ERROR0();
1016
+ } else if ((token->token[0] == '?') && (token->token[1] == 0)) {
1017
+ tmp = xmlNewNode(NULL, BAD_CAST "optional");
1018
+ if (tmp == NULL) CRNG_MEM_ERROR0();
1019
+ }
1020
+ if (tmp != NULL) {
1021
+ xmlAddChild(tmp, res);
1022
+ res = tmp;
1023
+ xmlParseCRNGDropTokens(ctxt, 1);
1024
+ }
1025
+ }
1026
+ if (insert != NULL) {
1027
+ xmlAddChild(insert, res);
1028
+ ctxt->insert = insert;
1029
+ } else
1030
+ ctxt->insert = res;
1031
+ return(0);
1032
+ }
1033
+
1034
+ /**
1035
+ * xmlParseCRNG_pattern:
1036
+ * @ctxt: a compact RNG parser context
1037
+ *
1038
+ * Parse pattern of the RELAX NG Compact Syntax Appendix A
1039
+ *
1040
+ * Returns 0 in case of success and -1 in case of error
1041
+ */
1042
+ static int
1043
+ xmlParseCRNG_pattern(xmlCRelaxNGParserCtxtPtr ctxt)
1044
+ {
1045
+ tokenPtr token;
1046
+ xmlNodePtr insert = ctxt->insert, prev, grp;
1047
+
1048
+ ctxt->insert = NULL;
1049
+ xmlParseCRNG_particle(ctxt);
1050
+ prev = ctxt->insert;
1051
+ token = xmlParseCRNGGetToken(ctxt, 1);
1052
+ while ((prev != NULL) && (token != NULL) && (token->toktype == CRNG_OP)) {
1053
+ if (token->token == ctxt->key_or) {
1054
+ grp = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_choice);
1055
+ if (grp == NULL) CRNG_MEM_ERROR0();
1056
+ } else if (token->token == ctxt->key_and) {
1057
+ grp = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_interleave);
1058
+ if (grp == NULL) CRNG_MEM_ERROR0();
1059
+ } else if (token->token == ctxt->key_comma) {
1060
+ grp = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_group);
1061
+ if (grp == NULL) CRNG_MEM_ERROR0();
1062
+ } else
1063
+ break;
1064
+ xmlParseCRNGDropTokens(ctxt, 1);
1065
+ ctxt->insert = NULL;
1066
+ xmlParseCRNG_particle(ctxt);
1067
+ xmlAddChild(grp, prev);
1068
+ xmlAddChild(grp, ctxt->insert);
1069
+ prev = grp;
1070
+ token = xmlParseCRNGGetToken(ctxt, 1);
1071
+ }
1072
+ if (insert != NULL) {
1073
+ xmlAddChild(insert, prev);
1074
+ ctxt->insert = insert;
1075
+ } else {
1076
+ ctxt->insert = prev;
1077
+ }
1078
+
1079
+ return(0);
1080
+ }
1081
+
1082
+ /**
1083
+ * xmlParseCRNG_component:
1084
+ * @ctxt: a compact RNG parser context
1085
+ *
1086
+ * Parse component of the RELAX NG Compact Syntax Appendix A
1087
+ *
1088
+ * Returns 0 in case of success and -1 in case of error
1089
+ */
1090
+ static int
1091
+ xmlParseCRNG_component(xmlCRelaxNGParserCtxtPtr ctxt)
1092
+ {
1093
+ tokenPtr token, tok2;
1094
+ xmlNodePtr insert = ctxt->insert;
1095
+
1096
+ token = xmlParseCRNGGetToken(ctxt, 1);
1097
+ if (token == NULL)
1098
+ return(0);
1099
+ if (token->toktype == CRNG_KEYWORD) {
1100
+ if (token->token == ctxt->key_start) {
1101
+ xmlNodePtr start;
1102
+
1103
+ start = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_start);
1104
+ if (start == NULL) CRNG_MEM_ERROR0();
1105
+ if (ctxt->insert != NULL)
1106
+ xmlAddChild(ctxt->insert, start);
1107
+ ctxt->insert = start;
1108
+ xmlParseCRNGDropTokens(ctxt, 1);
1109
+ token = xmlParseCRNGGetToken(ctxt, 1);
1110
+
1111
+ if ((token->toktype == CRNG_OP) &&
1112
+ (token->token == ctxt->key_equal)) {
1113
+ } else if ((token->toktype == CRNG_OP) &&
1114
+ (token->token == ctxt->key_orequal)) {
1115
+ xmlParseCRNG_attribute(ctxt, ctxt->key_combine, NULL,
1116
+ BAD_CAST "choice");
1117
+ } else if ((token->toktype == CRNG_OP) &&
1118
+ (token->token == ctxt->key_andequal)) {
1119
+ xmlParseCRNG_attribute(ctxt, ctxt->key_combine, NULL,
1120
+ BAD_CAST "interleave");
1121
+ } else {
1122
+ ERROR("expecting \"=\" or \"&=\" or \"|=\" here")
1123
+ return(-1);
1124
+ }
1125
+ start->properties = ctxt->attrs;
1126
+ ctxt->attrs = NULL;
1127
+ xmlParseCRNGDropTokens(ctxt, 1);
1128
+ xmlParseCRNG_pattern(ctxt);
1129
+
1130
+ } else if (token->token == ctxt->key_include) {
1131
+ TODO
1132
+ } else if (token->token == ctxt->key_div) {
1133
+ TODO
1134
+ } else {
1135
+ return(-1);
1136
+ }
1137
+ } else if (token->toktype == CRNG_IDENTIFIER) {
1138
+ xmlNodePtr define;
1139
+ const xmlChar *identifier;
1140
+
1141
+ identifier = token->token;
1142
+ tok2 = xmlParseCRNGGetToken(ctxt, 2);
1143
+ if ((tok2->toktype == CRNG_OP) &&
1144
+ (tok2->token == ctxt->key_equal)) {
1145
+ } else if ((tok2->toktype == CRNG_OP) &&
1146
+ (tok2->token == ctxt->key_orequal)) {
1147
+ xmlParseCRNG_attribute(ctxt, ctxt->key_combine, NULL,
1148
+ BAD_CAST "choice");
1149
+ } else if ((tok2->toktype == CRNG_OP) &&
1150
+ (tok2->token == ctxt->key_andequal)) {
1151
+ xmlParseCRNG_attribute(ctxt, ctxt->key_combine, NULL,
1152
+ BAD_CAST "interleave");
1153
+ } else {
1154
+ ERROR("expecting \"=\" or \"&=\" or \"|=\" here")
1155
+ return(-1);
1156
+ }
1157
+ xmlParseCRNGDropTokens(ctxt, 2);
1158
+
1159
+ define = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_define);
1160
+ if (define == NULL) CRNG_MEM_ERROR0();
1161
+ define->properties = ctxt->attrs;
1162
+ ctxt->attrs = NULL;
1163
+ xmlSetProp(define, BAD_CAST "name", identifier);
1164
+ if (ctxt->insert != NULL)
1165
+ xmlAddChild(ctxt->insert, define);
1166
+ ctxt->insert = define;
1167
+ xmlParseCRNG_pattern(ctxt);
1168
+ } else {
1169
+ return(-1);
1170
+ }
1171
+ ctxt->insert = insert;
1172
+ return(0);
1173
+ }
1174
+
1175
+ /**
1176
+ * xmlParseCRNG_grammar:
1177
+ * @ctxt: a compact RNG parser context
1178
+ *
1179
+ * Parse grammar of the RELAX NG Compact Syntax Appendix A
1180
+ *
1181
+ * Returns 0 in case of success and -1 in case of error
1182
+ */
1183
+ static int
1184
+ xmlParseCRNG_grammar(xmlCRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED)
1185
+ {
1186
+ tokenPtr token;
1187
+ int ret;
1188
+
1189
+ token = xmlParseCRNGGetToken(ctxt, 1);
1190
+ while (token != NULL) {
1191
+ ret = xmlParseCRNG_component(ctxt);
1192
+ if (ret != 0)
1193
+ break;
1194
+ token = xmlParseCRNGGetToken(ctxt, 1);
1195
+ }
1196
+ return(0);
1197
+ }
1198
+
1199
+ /**
1200
+ * xmlParseCRNG_topLevelBody:
1201
+ * @ctxt: a compact RNG parser context
1202
+ *
1203
+ * Parse topLevelBody of the RELAX NG Compact Syntax Appendix A
1204
+ *
1205
+ * Returns 0 in case of success and -1 in case of error
1206
+ */
1207
+ static int
1208
+ xmlParseCRNG_topLevelBody(xmlCRelaxNGParserCtxtPtr ctxt)
1209
+ {
1210
+ tokenPtr token, tok2;
1211
+
1212
+ token = xmlParseCRNGGetToken(ctxt, 1);
1213
+ if (token->toktype == CRNG_KEYWORD) {
1214
+ if ((token->token == ctxt->key_start) ||
1215
+ (token->token == ctxt->key_include) ||
1216
+ (token->token == ctxt->key_div)) {
1217
+ xmlNodePtr grammar;
1218
+
1219
+ grammar = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_grammar);
1220
+ if (grammar == NULL) CRNG_MEM_ERROR0();
1221
+ xmlDocSetRootElement(ctxt->doc, grammar);
1222
+ ctxt->insert = grammar;
1223
+
1224
+ xmlParseCRNG_grammar(ctxt);
1225
+ } else {
1226
+ xmlParseCRNG_pattern(ctxt);
1227
+ }
1228
+ } else {
1229
+ tok2 = xmlParseCRNGGetToken(ctxt, 2);
1230
+ if ((tok2->toktype == CRNG_OP) &&
1231
+ ((tok2->token == ctxt->key_equal) ||
1232
+ (tok2->token == ctxt->key_orequal) ||
1233
+ (tok2->token == ctxt->key_andequal))) {
1234
+ xmlNodePtr grammar;
1235
+
1236
+ grammar = xmlNewNodeEatName(NULL, (xmlChar *) ctxt->key_grammar);
1237
+ if (grammar == NULL) CRNG_MEM_ERROR0();
1238
+ xmlDocSetRootElement(ctxt->doc, grammar);
1239
+ ctxt->insert = grammar;
1240
+
1241
+ xmlParseCRNG_grammar(ctxt);
1242
+ } else {
1243
+ xmlParseCRNG_pattern(ctxt);
1244
+ }
1245
+ }
1246
+ return(0);
1247
+ }
1248
+
1249
+ /**
1250
+ * xmlParseCRNG_namespacePrefix:
1251
+ * @ctxt: a compact RNG parser context
1252
+ *
1253
+ * Parse namespacePrefix of the RELAX NG Compact Syntax Appendix A
1254
+ *
1255
+ * Returns the prefix or NULL in case of error
1256
+ */
1257
+ static const xmlChar *
1258
+ xmlParseCRNG_namespacePrefix(xmlCRelaxNGParserCtxtPtr ctxt)
1259
+ {
1260
+ tokenPtr token;
1261
+ const xmlChar *prefix = NULL;
1262
+
1263
+ token = xmlParseCRNGGetToken(ctxt, 1);
1264
+ if (token->toktype == CRNG_IDENTIFIER) {
1265
+ prefix = token->token;
1266
+ } else if (token->toktype == CRNG_OP) {
1267
+ if ((token->token[0] == '=') && (token->token[1] == 0))
1268
+ return(NULL);
1269
+ prefix = token->token;
1270
+ } else {
1271
+ ERROR("Expecting a namespace prefix");
1272
+ return(NULL);
1273
+ }
1274
+ xmlParseCRNGDropTokens(ctxt, 1);
1275
+
1276
+ if (xmlStrEqual(prefix, BAD_CAST "xmlns")) {
1277
+ ERROR("Namespace prefix \"xmlns\" is forbidden");
1278
+ }
1279
+ return(prefix);
1280
+ }
1281
+
1282
+ /**
1283
+ * xmlParseCRNG_decl:
1284
+ * @ctxt: a compact RNG parser context
1285
+ *
1286
+ * Parse decl of the RELAX NG Compact Syntax Appendix A
1287
+ *
1288
+ * Returns 0 in case of success and -1 in case of error
1289
+ */
1290
+ static int
1291
+ xmlParseCRNG_decl(xmlCRelaxNGParserCtxtPtr ctxt)
1292
+ {
1293
+ const xmlChar *prefix = NULL;
1294
+ const xmlChar *namespace = NULL;
1295
+ tokenPtr token;
1296
+
1297
+ token = xmlParseCRNGGetToken(ctxt, 1);
1298
+ if (token->toktype != CRNG_KEYWORD) return(-1);
1299
+ if (token->token == ctxt->key_default) {
1300
+ xmlParseCRNGDropTokens(ctxt, 1);
1301
+ token = xmlParseCRNGGetToken(ctxt, 1);
1302
+ if ((token->toktype != CRNG_KEYWORD) ||
1303
+ (token->token != ctxt->key_namespace)) {
1304
+ ERROR("Expecting keyword \"namespace\" after \"default\"");
1305
+ }
1306
+ xmlParseCRNGDropTokens(ctxt, 1);
1307
+ prefix = xmlParseCRNG_namespacePrefix(ctxt);
1308
+ token = xmlParseCRNGGetToken(ctxt, 1);
1309
+ if ((token->toktype != CRNG_OP) ||
1310
+ (token->token[0] != '=') || (token->token[1] != 0)) {
1311
+ ERROR("Expecting keyword \"=\" here");
1312
+ }
1313
+ xmlParseCRNGDropTokens(ctxt, 1);
1314
+ token = xmlParseCRNGGetToken(ctxt, 1);
1315
+ if ((token->toktype == CRNG_KEYWORD) &&
1316
+ (token->token == ctxt->key_inherit)) {
1317
+ namespace = xmlCRelaxNGInherit;
1318
+ } else if (token->toktype == CRNG_LITERAL_SEGMENT) {
1319
+ namespace = token->token;
1320
+ } else {
1321
+ ERROR("Expecting an URI or \"inherit\" value");
1322
+ }
1323
+ xmlParseCRNGDropTokens(ctxt, 1);
1324
+ if (namespace != NULL) {
1325
+ if (prefix != NULL)
1326
+ xmlParseCRNG_bindPrefix(ctxt, prefix, namespace);
1327
+ xmlParseCRNG_bindPrefix(ctxt, NULL, namespace);
1328
+ }
1329
+ } else if (token->token == ctxt->key_namespace) {
1330
+ xmlParseCRNGDropTokens(ctxt, 1);
1331
+ prefix = xmlParseCRNG_namespacePrefix(ctxt);
1332
+ token = xmlParseCRNGGetToken(ctxt, 1);
1333
+ if ((token->toktype != CRNG_OP) ||
1334
+ (token->token[0] != '=') || (token->token[1] != 0)) {
1335
+ ERROR("Expecting keyword \"=\" here");
1336
+ }
1337
+ xmlParseCRNGDropTokens(ctxt, 1);
1338
+ token = xmlParseCRNGGetToken(ctxt, 1);
1339
+ if ((token->toktype == CRNG_KEYWORD) &&
1340
+ (token->token == ctxt->key_inherit)) {
1341
+ namespace = xmlCRelaxNGInherit;
1342
+ } else if (token->toktype == CRNG_LITERAL_SEGMENT) {
1343
+ namespace = token->token;
1344
+ } else {
1345
+ ERROR("Expecting an URI or \"inherit\" value");
1346
+ }
1347
+ xmlParseCRNGDropTokens(ctxt, 1);
1348
+ if (namespace != NULL)
1349
+ xmlParseCRNG_bindPrefix(ctxt, prefix, namespace);
1350
+ } else if (token->token == ctxt->key_datatypes) {
1351
+ xmlParseCRNGDropTokens(ctxt, 1);
1352
+
1353
+ token = xmlParseCRNGGetToken(ctxt, 1);
1354
+ if ((token->toktype != CRNG_KEYWORD) &&
1355
+ (token->toktype != CRNG_IDENTIFIER)) {
1356
+ ERROR("Expecting a datatype prefix identifier here");
1357
+ } else
1358
+ prefix = token->token;
1359
+ xmlParseCRNGDropTokens(ctxt, 1);
1360
+ token = xmlParseCRNGGetToken(ctxt, 1);
1361
+ if ((token->toktype != CRNG_OP) ||
1362
+ (token->token[0] != '=') || (token->token[1] != 0)) {
1363
+ ERROR("Expecting keyword \"=\" here");
1364
+ }
1365
+ xmlParseCRNGDropTokens(ctxt, 1);
1366
+ token = xmlParseCRNGGetToken(ctxt, 1);
1367
+ if (token->toktype == CRNG_LITERAL_SEGMENT) {
1368
+ namespace = token->token;
1369
+ } else {
1370
+ ERROR("Expecting a literal value for the datatype identifier");
1371
+ }
1372
+ xmlParseCRNGDropTokens(ctxt, 1);
1373
+ if ((namespace != NULL) && (prefix != NULL))
1374
+ xmlParseCRNG_bindDatatypePrefix(ctxt, prefix, namespace);
1375
+ }
1376
+
1377
+ return(0);
1378
+ }
1379
+
1380
+ /**
1381
+ * xmlParseCRNG_preamble:
1382
+ * @ctxt: a compact RNG parser context
1383
+ *
1384
+ * Parse preamble of the RELAX NG Compact Syntax Appendix A
1385
+ *
1386
+ * Returns 0 in case of success and -1 in case of error
1387
+ */
1388
+ static int
1389
+ xmlParseCRNG_preamble(xmlCRelaxNGParserCtxtPtr ctxt)
1390
+ {
1391
+ tokenPtr token;
1392
+
1393
+ token = xmlParseCRNGGetToken(ctxt, 1);
1394
+ while (token != NULL) {
1395
+ if (token == NULL) return(-1);
1396
+ if ((token->toktype == CRNG_KEYWORD) &&
1397
+ ((token->token == ctxt->key_default) ||
1398
+ (token->token == ctxt->key_namespace) ||
1399
+ (token->token == ctxt->key_datatypes))) {
1400
+ xmlParseCRNG_decl(ctxt);
1401
+ } else
1402
+ break;
1403
+ token = xmlParseCRNGGetToken(ctxt, 1);
1404
+ }
1405
+ return(0);
1406
+ }
1407
+
1408
+ /**
1409
+ * xmlParseCRNG_topLevel:
1410
+ * @ctxt: a compact RNG parser context
1411
+ *
1412
+ * Parse topLevel of the RELAX NG Compact Syntax Appendix A
1413
+ *
1414
+ * Returns 0 in case of success and -1 in case of error
1415
+ */
1416
+ static int
1417
+ xmlParseCRNG_topLevel(xmlCRelaxNGParserCtxtPtr ctxt)
1418
+ {
1419
+ xmlParseCRNG_preamble(ctxt);
1420
+ xmlParseCRNG_topLevelBody(ctxt);
1421
+ return(0);
1422
+ }
1423
+
1424
+ /**
1425
+ * xmlConvertCRNG:
1426
+ * @schemas: pointer to the text of the compact schemas
1427
+ * @len: length of the schemas in bytes (or 0)
1428
+ * @encoding: encoding indicated by the context or NULL
1429
+ *
1430
+ * Compiles the schemas into the equivalent Relax-NG XML structure
1431
+ *
1432
+ * Returns the xmlDocPtr resulting from the compilation or
1433
+ * NULL in case of error
1434
+ */
1435
+ xmlDocPtr
1436
+ xmlConvertCRNG(const char *schemas, int len, const char *encoding) {
1437
+ struct _xmlCRelaxNGParserCtxt ctxt;
1438
+ xmlDocPtr ret = NULL;
1439
+
1440
+ if (schemas == NULL) return(NULL);
1441
+ if (len <= 5) len = xmlStrlen((const unsigned char *) schemas);
1442
+ if (len <= 0) return(NULL);
1443
+
1444
+ memset(&ctxt, 0, sizeof(ctxt));
1445
+ ctxt.compact = (const unsigned char *) schemas;
1446
+ ctxt.cur = (const unsigned char *) schemas;
1447
+ ctxt.end = (const unsigned char *) &schemas[len];
1448
+ ctxt.dict = xmlDictCreate();
1449
+ if (ctxt.dict == NULL)
1450
+ return(NULL);
1451
+ ctxt.doc = xmlNewDoc(NULL);
1452
+ if (ctxt.doc == NULL) {
1453
+ xmlDictFree(ctxt.dict);
1454
+ return(NULL);
1455
+ }
1456
+ ctxt.doc->dict = ctxt.dict;
1457
+ xmlDictReference(ctxt.dict);
1458
+
1459
+ ctxt.nbTokens = 0;
1460
+ ctxt.firstToken = 0;
1461
+ ctxt.key_attribute = xmlDictLookup(ctxt.dict, BAD_CAST "attribute", -1);
1462
+ ctxt.key_default = xmlDictLookup(ctxt.dict, BAD_CAST "default", -1);
1463
+ ctxt.key_datatypes = xmlDictLookup(ctxt.dict, BAD_CAST "datatypes", -1);
1464
+ ctxt.key_div = xmlDictLookup(ctxt.dict, BAD_CAST "div", -1);
1465
+ ctxt.key_element = xmlDictLookup(ctxt.dict, BAD_CAST "element", -1);
1466
+ ctxt.key_empty = xmlDictLookup(ctxt.dict, BAD_CAST "empty", -1);
1467
+ ctxt.key_external = xmlDictLookup(ctxt.dict, BAD_CAST "external", -1);
1468
+ ctxt.key_grammar = xmlDictLookup(ctxt.dict, BAD_CAST "grammar", -1);
1469
+ ctxt.key_include = xmlDictLookup(ctxt.dict, BAD_CAST "include", -1);
1470
+ ctxt.key_inherit = xmlDictLookup(ctxt.dict, BAD_CAST "inherit", -1);
1471
+ ctxt.key_list = xmlDictLookup(ctxt.dict, BAD_CAST "list", -1);
1472
+ ctxt.key_mixed = xmlDictLookup(ctxt.dict, BAD_CAST "mixed", -1);
1473
+ ctxt.key_namespace = xmlDictLookup(ctxt.dict, BAD_CAST "namespace", -1);
1474
+ ctxt.key_notAllowed = xmlDictLookup(ctxt.dict, BAD_CAST "notAllowed", -1);
1475
+ ctxt.key_parent = xmlDictLookup(ctxt.dict, BAD_CAST "parent", -1);
1476
+ ctxt.key_start = xmlDictLookup(ctxt.dict, BAD_CAST "start", -1);
1477
+ ctxt.key_string = xmlDictLookup(ctxt.dict, BAD_CAST "string", -1);
1478
+ ctxt.key_text = xmlDictLookup(ctxt.dict, BAD_CAST "text", -1);
1479
+ ctxt.key_token = xmlDictLookup(ctxt.dict, BAD_CAST "token", -1);
1480
+ ctxt.key_equal = xmlDictLookup(ctxt.dict, BAD_CAST "=", 1);
1481
+ ctxt.key_orequal = xmlDictLookup(ctxt.dict, BAD_CAST "|=", 2);
1482
+ ctxt.key_andequal = xmlDictLookup(ctxt.dict, BAD_CAST "&=", 2);
1483
+ ctxt.key_combine = xmlDictLookup(ctxt.dict, BAD_CAST "&=", 2);
1484
+ ctxt.key_or = xmlDictLookup(ctxt.dict, BAD_CAST "|", 1);
1485
+ ctxt.key_comma = xmlDictLookup(ctxt.dict, BAD_CAST ",", 1);
1486
+ ctxt.key_and = xmlDictLookup(ctxt.dict, BAD_CAST "&", 1);
1487
+ ctxt.key_choice = xmlDictLookup(ctxt.dict, BAD_CAST "choice", -1);
1488
+ ctxt.key_group = xmlDictLookup(ctxt.dict, BAD_CAST "group", -1);
1489
+ ctxt.key_interleave = xmlDictLookup(ctxt.dict, BAD_CAST "interleave", -1);
1490
+ ctxt.key_ref = xmlDictLookup(ctxt.dict, BAD_CAST "ref", 3);
1491
+ ctxt.key_define = xmlDictLookup(ctxt.dict, BAD_CAST "define", 6);
1492
+
1493
+ /* xmlConvertCRNGTokenize(&ctxt); */
1494
+ xmlConvertCRNG_topLevel(&ctxt);
1495
+
1496
+ xmlDictFree(ctxt.dict);
1497
+
1498
+ ret = ctxt.doc;
1499
+ return(ret);
1500
+ }
1501
+
1502
+ /**
1503
+ * xmlConvertCRNGFile:
1504
+ * @URL: URL or filename for the resource
1505
+ * @encoding: encoding indicated by the context or NULL
1506
+ *
1507
+ * Compiles the schemas into the equivalent Relax-NG XML structure
1508
+ *
1509
+ * Returns the xmlDocPtr resulting from the compilation or
1510
+ * NULL in case of error
1511
+ */
1512
+ xmlDocPtr
1513
+ xmlConvertCRNGFile(const char *URL, const char *encoding) {
1514
+ }
1515
+
1516
+ #ifdef STANDALONE
1517
+ const xmlChar *schemas =
1518
+ "# RELAX NG XML syntax specified in compact syntax.\n\
1519
+ \n\
1520
+ default namespace rng = \"http://relaxng.org/ns/structure/1.0\"\n\
1521
+ namespace local = \"\"\n\
1522
+ datatypes xsd = \"http://www.w3.org/2001/XMLSchema-datatypes\"\n\
1523
+ \n\
1524
+ start = pattern\n\
1525
+ \n\
1526
+ pattern =\n\
1527
+ element element { (nameQName | nameClass), (common & pattern+) }\n\
1528
+ | element attribute { (nameQName | nameClass), (common & pattern?) }\n\
1529
+ | element group|interleave|choice|optional\n\
1530
+ |zeroOrMore|oneOrMore|list|mixed { common & pattern+ }\n\
1531
+ | element ref|parentRef { nameNCName, common }\n\
1532
+ | element empty|notAllowed|text { common }\n\
1533
+ | element data { type, param*, (common & exceptPattern?) }\n\
1534
+ | element value { commonAttributes, type?, xsd:string }\n\
1535
+ | element externalRef { href, common }\n\
1536
+ | element grammar { common & grammarContent* }\n\
1537
+ \n\
1538
+ param = element param { commonAttributes, nameNCName, xsd:string }\n\
1539
+ \n\
1540
+ exceptPattern = element except { common & pattern+ }\n\
1541
+ \n\
1542
+ grammarContent =\n\
1543
+ definition\n\
1544
+ | element div { common & grammarContent* }\n\
1545
+ | element include { href, (common & includeContent*) }\n\
1546
+ \n\
1547
+ includeContent =\n\
1548
+ definition\n\
1549
+ | element div { common & includeContent* }\n\
1550
+ \n\
1551
+ definition =\n\
1552
+ element start { combine?, (common & pattern+) }\n\
1553
+ | element define { nameNCName, combine?, (common & pattern+) }\n\
1554
+ \n\
1555
+ combine = attribute combine { \"choice\" | \"interleave\" }\n\
1556
+ \n\
1557
+ nameClass =\n\
1558
+ element name { commonAttributes, xsd:QName }\n\
1559
+ | element anyName { common & exceptNameClass? }\n\
1560
+ | element nsName { common & exceptNameClass? }\n\
1561
+ | element choice { common & nameClass+ }\n\
1562
+ \n\
1563
+ exceptNameClass = element except { common & nameClass+ }\n\
1564
+ \n\
1565
+ nameQName = attribute name { xsd:QName }\n\
1566
+ nameNCName = attribute name { xsd:NCName }\n\
1567
+ href = attribute href { xsd:anyURI }\n\
1568
+ type = attribute type { xsd:NCName }\n\
1569
+ \n\
1570
+ common = commonAttributes, foreignElement*\n\
1571
+ \n\
1572
+ commonAttributes =\n\
1573
+ attribute ns { xsd:string }?,\n\
1574
+ attribute datatypeLibrary { xsd:anyURI }?,\n\
1575
+ foreignAttribute*\n\
1576
+ \n\
1577
+ foreignElement = element * - rng:* { (anyAttribute | text | anyElement)* }\n\
1578
+ foreignAttribute = attribute * - (rng:*|local:*) { text }\n\
1579
+ anyElement = element * { (anyAttribute | text | anyElement)* }\n\
1580
+ anyAttribute = attribute * { text }\n\
1581
+ ";
1582
+
1583
+ int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
1584
+ xmlDocPtr res;
1585
+
1586
+ res = xmlConvertCRNG(schemas, -1);
1587
+ if (res != NULL) {
1588
+ xmlDocFormatDump(stdout, res, 1);
1589
+ xmlFreeDoc(res);
1590
+ }
1591
+ return(0);
1592
+ }
1593
+ #endif
1594
+ #define bottom_rngparser
1595
+ #include "elfgcchack.h"