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