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