xmlschemastypes.c revision e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2
14255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/*
24255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * schemastypes.c : implementation of the XML Schema Datatypes
34255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *             definition and validity checking
44255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
54255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * See Copyright for the status of this software.
64255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
74255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Daniel Veillard <veillard@redhat.com>
84255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
94255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define IN_LIBXML
114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include "libxml.h"
124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#ifdef LIBXML_SCHEMAS_ENABLED
144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <string.h>
164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/xmlmemory.h>
174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/parser.h>
184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/parserInternals.h>
194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/hash.h>
204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/valid.h>
2196a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard#include <libxml/xpath.h>
2296a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard#include <libxml/uri.h>
234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/xmlschemas.h>
254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/schemasInternals.h>
264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/xmlschemastypes.h>
274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
28070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#ifdef HAVE_MATH_H
29070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#include <math.h>
30070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#endif
31070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define DEBUG
334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define TODO 								\
354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlGenericError(xmlGenericErrorContext,				\
364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    "Unimplemented block at %s:%d\n",				\
374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard            __FILE__, __LINE__);
384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define XML_SCHEMAS_NAMESPACE_NAME \
404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    (const xmlChar *)"http://www.w3.org/2001/XMLSchema"
414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardtypedef enum {
434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    XML_SCHEMAS_UNKNOWN = 0,
444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    XML_SCHEMAS_STRING,
458bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_NORMSTRING,
464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    XML_SCHEMAS_DECIMAL,
47070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    XML_SCHEMAS_TIME,
48070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    XML_SCHEMAS_GDAY,
49070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    XML_SCHEMAS_GMONTH,
50070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    XML_SCHEMAS_GMONTHDAY,
51070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    XML_SCHEMAS_GYEAR,
52070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    XML_SCHEMAS_GYEARMONTH,
53070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    XML_SCHEMAS_DATE,
54070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    XML_SCHEMAS_DATETIME,
55070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    XML_SCHEMAS_DURATION,
5684d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard    XML_SCHEMAS_FLOAT,
5784d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard    XML_SCHEMAS_DOUBLE,
58c5a70f264550ee39da267e81dccd95508ed367ddDaniel Veillard    XML_SCHEMAS_BOOLEAN,
598bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_TOKEN,
608bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_LANGUAGE,
618bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_NMTOKEN,
628bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_NMTOKENS,
638bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_NAME,
648bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_QNAME,
658bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_NCNAME,
668bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_ID,
678bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_IDREF,
688bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_IDREFS,
698bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_ENTITY,
708bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_ENTITIES,
718bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_NOTATION,
728bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_ANYURI,
738bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_INTEGER,
748bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_NPINTEGER,
758bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_NINTEGER,
768bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_NNINTEGER,
778bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_PINTEGER,
7896a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard    XML_SCHEMAS_INT,
798bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_UINT,
808bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_LONG,
818bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_ULONG,
828bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_SHORT,
838bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_USHORT,
848bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_BYTE,
858bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    XML_SCHEMAS_UBYTE
864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} xmlSchemaValType;
874255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
885f704afe98c584b7188aa0e4fbc9d9e68e0d7b1bDaniel Veillardstatic unsigned long powten[10] = {
894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    1, 10, 100, 1000, 10000, 100000, 1000000, 10000000L,
904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    100000000L, 1000000000L
914255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard};
924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
93070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* Date value */
94070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef struct _xmlSchemaValDate xmlSchemaValDate;
95070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef xmlSchemaValDate *xmlSchemaValDatePtr;
96070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstruct _xmlSchemaValDate {
97070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long		year;
98070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	mon	:4;	/* 1 <=  mon    <= 12   */
99070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	day	:5;	/* 1 <=  day    <= 31   */
100070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	hour	:5;	/* 0 <=  hour   <= 23   */
101070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	min	:6;	/* 0 <=  min    <= 59	*/
102070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    double		sec;
103070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int			tz_flag	:1;	/* is tzo explicitely set? */
104070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int			tzo	:11;	/* -1440 <= tzo <= 1440 */
105070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard};
106070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
107070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* Duration value */
108070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef struct _xmlSchemaValDuration xmlSchemaValDuration;
109070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef xmlSchemaValDuration *xmlSchemaValDurationPtr;
110070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstruct _xmlSchemaValDuration {
111070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long	        mon;		/* mon stores years also */
112070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long        	day;
113070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    double		sec;            /* sec stores min and hour also */
114070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard};
115070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardtypedef struct _xmlSchemaValDecimal xmlSchemaValDecimal;
1174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardtypedef xmlSchemaValDecimal *xmlSchemaValDecimalPtr;
1184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstruct _xmlSchemaValDecimal {
1194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    /* would use long long but not portable */
120e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long lo;
121e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long mi;
122e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long hi;
1234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    unsigned int extra;
1245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    unsigned int sign:1;
1254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    int frac:7;
1264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    int total:8;
1274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard};
1284255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
129e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardtypedef struct _xmlSchemaValQName xmlSchemaValQName;
130e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardtypedef xmlSchemaValQName *xmlSchemaValQNamePtr;
131e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstruct _xmlSchemaValQName {
132e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    xmlChar *name;
133e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    xmlChar *uri;
134e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard};
135e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
1364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstruct _xmlSchemaVal {
1374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValType type;
1384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    union {
1395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	xmlSchemaValDecimal     decimal;
140070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xmlSchemaValDate        date;
141070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xmlSchemaValDuration    dur;
142e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	xmlSchemaValQName	qname;
14384d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard	float			f;
14484d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard	double			d;
145c5a70f264550ee39da267e81dccd95508ed367ddDaniel Veillard	int			b;
146c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	xmlChar                *str;
1474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    } value;
1484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard};
1494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
1504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int xmlSchemaTypesInitialized = 0;
1514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlHashTablePtr xmlSchemaTypesBank = NULL;
1524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
153c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard/*
154c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * Basic types
155c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */
1564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeStringDef = NULL;
1574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnyTypeDef = NULL;
1584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnySimpleTypeDef = NULL;
1594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDecimalDef = NULL;
160070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDatetimeDef = NULL;
1614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDateDef = NULL;
162070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeTimeDef = NULL;
163070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGYearDef = NULL;
164070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGYearMonthDef = NULL;
165070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGDayDef = NULL;
166070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGMonthDayDef = NULL;
167070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGMonthDef = NULL;
168070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDurationDef = NULL;
16984d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeFloatDef = NULL;
170c5a70f264550ee39da267e81dccd95508ed367ddDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeBooleanDef = NULL;
17184d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDoubleDef = NULL;
172e5b110b3844d58ff4bea56bcb699144f6fbe0b83Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnyURIDef = NULL;
1734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
1744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/*
175c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * Derived types
176c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */
177c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypePositiveIntegerDef = NULL;
178c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNonPositiveIntegerDef = NULL;
179c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNegativeIntegerDef = NULL;
180c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNonNegativeIntegerDef = NULL;
181c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIntegerDef = NULL;
182c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeLongDef = NULL;
183c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIntDef = NULL;
184c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeShortDef = NULL;
185c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeByteDef = NULL;
186c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedLongDef = NULL;
187c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedIntDef = NULL;
188c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedShortDef = NULL;
189c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedByteDef = NULL;
1908bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNormStringDef = NULL;
1918bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeTokenDef = NULL;
1928bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeLanguageDef = NULL;
1938bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNameDef = NULL;
1948bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeQNameDef = NULL;
195e5b110b3844d58ff4bea56bcb699144f6fbe0b83Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNCNameDef = NULL;
1968bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdDef = NULL;
1978bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdrefDef = NULL;
1988bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdrefsDef = NULL;
199a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeEntityDef = NULL;
200a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeEntitiesDef = NULL;
201e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNotationDef = NULL;
2028bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNmtokenDef = NULL;
2038bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNmtokensDef = NULL;
204c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard
205c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard/*
2064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitBasicType:
2074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name:  the type name
2088bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard * @type:  the value type associated
2094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
2104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Initialize one default type
2114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
2124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr
2138bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel VeillardxmlSchemaInitBasicType(const char *name, xmlSchemaValType type) {
2144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypePtr ret;
2154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
2164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType));
2174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (ret == NULL) {
2184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	xmlGenericError(xmlGenericErrorContext,
2194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		"Could not initilize type %s: out of memory\n", name);
2204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(NULL);
2214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
2224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    memset(ret, 0, sizeof(xmlSchemaType));
2234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    ret->name = xmlStrdup((const xmlChar *)name);
2244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    ret->type = XML_SCHEMA_TYPE_BASIC;
2258bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    ret->flags = type;
2264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    ret->contentType = XML_SCHEMA_CONTENT_BASIC;
2274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlHashAddEntry2(xmlSchemaTypesBank, ret->name,
2284255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	             XML_SCHEMAS_NAMESPACE_NAME, ret);
2294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return(ret);
2304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
2314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
2324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/*
2334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitTypes:
2344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
2354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Initialize the default XML Schemas type library
2364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
2374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid
2386560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel VeillardxmlSchemaInitTypes(void)
2396560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard{
2404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized != 0)
2416560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        return;
2424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypesBank = xmlHashCreate(40);
2436560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard
244c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard    /*
245c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard     * primitive datatypes
246c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard     */
2478bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeStringDef = xmlSchemaInitBasicType("string",
2486560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                    XML_SCHEMAS_STRING);
2498bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeAnyTypeDef = xmlSchemaInitBasicType("anyType",
2506560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                     XML_SCHEMAS_UNKNOWN);
2518bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeAnySimpleTypeDef = xmlSchemaInitBasicType("anySimpleType",
2526560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                           XML_SCHEMAS_UNKNOWN);
2538bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDecimalDef = xmlSchemaInitBasicType("decimal",
2546560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                     XML_SCHEMAS_DECIMAL);
2558bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDateDef = xmlSchemaInitBasicType("date",
2566560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                  XML_SCHEMAS_DATE);
2578bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDatetimeDef = xmlSchemaInitBasicType("dateTime",
2586560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                      XML_SCHEMAS_DATETIME);
2598bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeTimeDef = xmlSchemaInitBasicType("time",
2606560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                  XML_SCHEMAS_TIME);
2618bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGYearDef = xmlSchemaInitBasicType("gYear",
2626560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                   XML_SCHEMAS_GYEAR);
2638bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGYearMonthDef = xmlSchemaInitBasicType("gYearMonth",
2646560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                        XML_SCHEMAS_GYEARMONTH);
2658bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGMonthDef = xmlSchemaInitBasicType("gMonth",
2666560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                    XML_SCHEMAS_GMONTH);
2678bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGMonthDayDef = xmlSchemaInitBasicType("gMonthDay",
2686560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                       XML_SCHEMAS_GMONTHDAY);
2698bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGDayDef = xmlSchemaInitBasicType("gDay",
2706560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                  XML_SCHEMAS_GDAY);
2718bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDurationDef = xmlSchemaInitBasicType("duration",
2726560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                      XML_SCHEMAS_DURATION);
2738bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float",
2746560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                   XML_SCHEMAS_FLOAT);
2758bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double",
2766560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                    XML_SCHEMAS_DOUBLE);
2778bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeBooleanDef = xmlSchemaInitBasicType("boolean",
2786560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                     XML_SCHEMAS_BOOLEAN);
2798bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeAnyURIDef = xmlSchemaInitBasicType("anyURI",
2806560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                    XML_SCHEMAS_ANYURI);
2814255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
282c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard    /*
283c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard     * derived datatypes
284c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard     */
2858bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeIntegerDef = xmlSchemaInitBasicType("integer",
2866560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                     XML_SCHEMAS_INTEGER);;
2876560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeNonPositiveIntegerDef =
2886560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        xmlSchemaInitBasicType("nonPositiveInteger",
2896560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                               XML_SCHEMAS_NPINTEGER);;
2906560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeNegativeIntegerDef =
2916560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        xmlSchemaInitBasicType("negativeInteger", XML_SCHEMAS_NINTEGER);;
2926560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeLongDef =
2936560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        xmlSchemaInitBasicType("long", XML_SCHEMAS_LONG);;
2946560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeIntDef = xmlSchemaInitBasicType("int", XML_SCHEMAS_INT);;
2958bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeShortDef = xmlSchemaInitBasicType("short",
2966560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                   XML_SCHEMAS_SHORT);;
2978bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeByteDef = xmlSchemaInitBasicType("byte",
2986560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                  XML_SCHEMAS_BYTE);;
2996560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeNonNegativeIntegerDef =
3006560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        xmlSchemaInitBasicType("nonNegativeInteger",
3016560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                               XML_SCHEMAS_NNINTEGER);
3026560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedLongDef =
3036560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        xmlSchemaInitBasicType("unsignedLong", XML_SCHEMAS_ULONG);;
3046560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedIntDef =
3056560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        xmlSchemaInitBasicType("unsignedInt", XML_SCHEMAS_UINT);;
3066560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedShortDef =
307e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        xmlSchemaInitBasicType("unsignedShort", XML_SCHEMAS_USHORT);;
3086560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedByteDef =
3096560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        xmlSchemaInitBasicType("unsignedByte", XML_SCHEMAS_UBYTE);;
3106560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypePositiveIntegerDef =
3116560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        xmlSchemaInitBasicType("positiveInteger", XML_SCHEMAS_PINTEGER);
3128bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard
3138bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeNormStringDef = xmlSchemaInitBasicType("normalizedString",
3146560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                        XML_SCHEMAS_NORMSTRING);
3158bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeTokenDef = xmlSchemaInitBasicType("token",
3166560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                   XML_SCHEMAS_TOKEN);
3178bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeLanguageDef = xmlSchemaInitBasicType("language",
3186560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                      XML_SCHEMAS_LANGUAGE);
3196560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeIdDef = xmlSchemaInitBasicType("ID", XML_SCHEMAS_ID);
3208bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeIdrefDef = xmlSchemaInitBasicType("IDREF",
3216560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                   XML_SCHEMAS_IDREF);
3228bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeIdrefsDef = xmlSchemaInitBasicType("IDREFS",
3236560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                    XML_SCHEMAS_IDREFS);
324a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    xmlSchemaTypeEntityDef = xmlSchemaInitBasicType("ENTITY",
3256560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                    XML_SCHEMAS_ENTITY);
326a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    xmlSchemaTypeEntitiesDef = xmlSchemaInitBasicType("ENTITIES",
3276560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                      XML_SCHEMAS_ENTITIES);
328e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    xmlSchemaTypeNotationDef = xmlSchemaInitBasicType("NOTATION",
329e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard                                                    XML_SCHEMAS_NOTATION);
3308bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeNameDef = xmlSchemaInitBasicType("Name",
3316560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                  XML_SCHEMAS_NAME);
3328bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeQNameDef = xmlSchemaInitBasicType("QName",
3336560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                   XML_SCHEMAS_QNAME);
3348bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeNCNameDef = xmlSchemaInitBasicType("NCName",
3356560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                    XML_SCHEMAS_NCNAME);
3368bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeNmtokenDef = xmlSchemaInitBasicType("NMTOKEN",
3376560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                     XML_SCHEMAS_NMTOKEN);
3388bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeNmtokensDef = xmlSchemaInitBasicType("NMTOKENS",
3396560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                                                      XML_SCHEMAS_NMTOKENS);
3404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypesInitialized = 1;
3414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
3424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
3434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
3444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCleanupTypes:
3454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
3464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library
3474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
3484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid
3494255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCleanupTypes(void) {
3504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
3514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return;
3524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlHashFree(xmlSchemaTypesBank, (xmlHashDeallocator) xmlSchemaFreeType);
3534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypesInitialized = 0;
3544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
3554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
3564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
3574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaNewValue:
3584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type:  the value type
3594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
3604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Allocate a new simple type value
3614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
3624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns a pointer to the new value or NULL in case of error
3634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
3644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaValPtr
3654255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaNewValue(xmlSchemaValType type) {
3664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValPtr value;
3674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
3684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    value = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal));
3694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (value == NULL) {
3704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(NULL);
3714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
3724255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    memset(value, 0, sizeof(xmlSchemaVal));
3734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    value->type = type;
3744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return(value);
3754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
3764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
3774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
3784255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaFreeValue:
3794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value:  the value to free
3804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
3814255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library
3824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
3834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid
3844255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaFreeValue(xmlSchemaValPtr value) {
3854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (value == NULL)
3864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return;
387c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    switch (value->type) {
388c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_STRING:
389c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NORMSTRING:
390c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_TOKEN:
391c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_LANGUAGE:
392c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NMTOKEN:
393c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NMTOKENS:
394c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NAME:
395c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NCNAME:
396c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ID:
397c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_IDREF:
398c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_IDREFS:
399c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ENTITY:
400c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ENTITIES:
401c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NOTATION:
402c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ANYURI:
403c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (value->value.str != NULL)
404c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		xmlFree(value->value.str);
405c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    break;
406e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_QNAME:
407e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    if (value->value.qname.uri != NULL)
408e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		xmlFree(value->value.qname.uri);
409e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    if (value->value.qname.name != NULL)
410e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		xmlFree(value->value.qname.name);
411e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    break;
412c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	default:
413c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    break;
414c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
4154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlFree(value);
4164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
4174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
4184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
4194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaGetPredefinedType:
4204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name: the type name
4214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @ns:  the URI of the namespace usually "http://www.w3.org/2001/XMLSchema"
4224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
4234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Lookup a type in the default XML Schemas type library
4244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
4254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns the type if found, NULL otherwise
4264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
4274255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaTypePtr
4284255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaGetPredefinedType(const xmlChar *name, const xmlChar *ns) {
4294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
4304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	xmlSchemaInitTypes();
4314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (name == NULL)
4324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(NULL);
4334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return((xmlSchemaTypePtr) xmlHashLookup2(xmlSchemaTypesBank, name, ns));
4344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
435070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
436070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/****************************************************************
437070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
438070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *		Convenience macros and functions		*
439070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
440070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/
441070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
442070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_TZO_CHAR(c)						\
443070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	((c == 0) || (c == 'Z') || (c == '+') || (c == '-'))
444070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
445070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_YEAR(yr)          (yr != 0)
446070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MONTH(mon)        ((mon >= 1) && (mon <= 12))
447070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* VALID_DAY should only be used when month is unknown */
448070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DAY(day)          ((day >= 1) && (day <= 31))
449070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_HOUR(hr)          ((hr >= 0) && (hr <= 23))
450070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MIN(min)          ((min >= 0) && (min <= 59))
451070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_SEC(sec)          ((sec >= 0) && (sec < 60))
452070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TZO(tzo)          ((tzo > -1440) && (tzo < 1440))
453070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_LEAP(y)						\
454070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
455070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
456070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic const long daysInMonth[12] =
457070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
458070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic const long daysInMonthLeap[12] =
459070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
460070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
4615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MAX_DAYINMONTH(yr,mon)                                  \
4625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1])
4635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
464070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MDAY(dt)						\
465070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(IS_LEAP(dt->year) ?				        \
466070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (dt->day <= daysInMonthLeap[dt->mon - 1]) :	        \
467070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (dt->day <= daysInMonth[dt->mon - 1]))
468070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
469070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATE(dt)						\
470070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_YEAR(dt->year) && VALID_MONTH(dt->mon) && VALID_MDAY(dt))
471070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
472070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TIME(dt)						\
473070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_HOUR(dt->hour) && VALID_MIN(dt->min) &&		\
474070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 VALID_SEC(dt->sec) && VALID_TZO(dt->tzo))
475070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
476070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATETIME(dt)					\
477070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_DATE(dt) && VALID_TIME(dt))
478070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
479070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_MIN            (60)
480070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_HOUR           (60 * SECS_PER_MIN)
481070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_DAY            (24 * SECS_PER_HOUR)
482070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
4835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInYearByMonth[12] =
4845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
4855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInLeapYearByMonth[12] =
4865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };
4875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
4885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DAY_IN_YEAR(day, month, year)				\
4895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ((IS_LEAP(year) ?					\
4905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                dayInLeapYearByMonth[month - 1] :		\
4915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                dayInYearByMonth[month - 1]) + day)
4925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
4935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#ifdef DEBUG
4945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt)                                                  \
4955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlGenericError(xmlGenericErrorContext,                             \
4965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        "type=%o %04ld-%02u-%02uT%02u:%02u:%03f",                       \
4975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->type,dt->value.date.year,dt->value.date.mon,                \
4985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->value.date.day,dt->value.date.hour,dt->value.date.min,      \
4995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->value.date.sec);                                            \
5005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dt->value.date.tz_flag)                                         \
5015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (dt->value.date.tzo != 0)                                    \
5025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmlGenericError(xmlGenericErrorContext,                     \
5035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                "%+05d\n",dt->value.date.tzo);                          \
5045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else                                                            \
5055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmlGenericError(xmlGenericErrorContext, "Z\n");             \
5065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else                                                                \
5075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        xmlGenericError(xmlGenericErrorContext,"\n")
5085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#else
5095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt)
5105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#endif
5115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
512070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
513070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGYear:
514070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
515070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
516070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
517070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gYear without time zone and fills in the appropriate
518070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
519070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gYear. It is supposed that @dt->year is big enough to contain
520070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * the year.
521070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
522070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
523070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
524070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
525070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) {
526070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str, *firstChar;
527070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int isneg = 0, digcnt = 0;
528070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
529070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (((*cur < '0') || (*cur > '9')) &&
530070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(*cur != '-') && (*cur != '+'))
531070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
532070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
533070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur == '-') {
534070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	isneg = 1;
535070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
536070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
537070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
538070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    firstChar = cur;
539070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
540070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    while ((*cur >= '0') && (*cur <= '9')) {
541070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->year = dt->year * 10 + (*cur - '0');
542070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
543070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	digcnt++;
544070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
545070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
546070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* year must be at least 4 digits (CCYY); over 4
547070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * digits cannot have a leading zero. */
548070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0')))
549070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
550070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
551070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (isneg)
552070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->year = - dt->year;
553070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
554070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (!VALID_YEAR(dt->year))
555070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
556070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
557070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
558070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
559070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
560070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
561070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
562070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_2_DIGITS:
563070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the integer to fill in
564070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
565070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer
566070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
567070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a 2-digits integer and updates @num with the value. @cur is
568070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer.
569070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and
570070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
571070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
572070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_2_DIGITS(num, cur, invalid)			\
573070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if ((cur[0] < '0') || (cur[0] > '9') ||			\
574070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (cur[1] < '0') || (cur[1] > '9'))			\
575070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    invalid = 1;					\
576070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	else							\
577070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    num = (cur[0] - '0') * 10 + (cur[1] - '0');		\
578070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur += 2;
579070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
580070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
581070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_FLOAT:
582070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the double to fill in
583070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
584070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer
585070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
586070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float and updates @num with the value. @cur is
587070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the float. The float must have a
588070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2-digits integer part and may or may not have a decimal part.
589070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and
590070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
591070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
592070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_FLOAT(num, cur, invalid)				\
593070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(num, cur, invalid);			\
594070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!invalid && (*cur == '.')) {			\
595070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    double mult = 1;				        \
596070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    cur++;						\
597070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((*cur < '0') || (*cur > '9'))			\
598070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		invalid = 1;					\
599070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
600070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		mult /= 10;					\
601070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num += (*cur - '0') * mult;			\
602070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		cur++;						\
603070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }							\
604070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
605070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
606070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
607070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGMonth:
608070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
609070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
610070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
611070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gMonth without time zone and fills in the appropriate
612070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
613070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gMonth.
614070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
615070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
616070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
617070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
618070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) {
619070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
620070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
621070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
622070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_2_DIGITS(dt->mon, cur, ret);
623070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
624070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
625070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
626070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (!VALID_MONTH(dt->mon))
627070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
628070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
629070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
630070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
631070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
632070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
633070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
634070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGDay:
635070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
636070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
637070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
638070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gDay without time zone and fills in the appropriate
639070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
640070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay.
641070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
642070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
643070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
644070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
645070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) {
646070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
647070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
648070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
649070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_2_DIGITS(dt->day, cur, ret);
650070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
651070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
652070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
653070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (!VALID_DAY(dt->day))
654070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
655070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
656070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
657070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
658070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
659070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
660070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
661070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTime:
662070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
663070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
664070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
665070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:time without time zone and fills in the appropriate
666070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * fields of the @dt structure. @str is updated to point just after the
667070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:time.
668070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, values of @dt fields are undefined.
669070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
670070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
671070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
672070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
673070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) {
674070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
675070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int hour = 0; /* use temp var in case str is not xs:time */
676070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
677070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
678070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_2_DIGITS(hour, cur, ret);
679070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
680070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
681070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
682070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != ':')
683070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
684070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
685070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
686070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* the ':' insures this string is xs:time */
687070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dt->hour = hour;
688070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
689070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_2_DIGITS(dt->min, cur, ret);
690070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
691070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
692070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
693070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != ':')
694070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
695070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
696070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
697070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_FLOAT(dt->sec, cur, ret);
698070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
699070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
700070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
701070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (!VALID_TIME(dt))
702070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
703070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
704070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
705070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
706070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
707070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
708070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
709070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTimeZone:
710070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
711070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
712070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
713070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a time zone without time zone and fills in the appropriate
714070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
715070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * time zone.
716070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
717070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
718070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
719070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
720070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) {
721070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
722070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
723070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
724070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (str == NULL)
725070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
726070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
727070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    switch (*cur) {
728070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case 0:
729070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tz_flag = 0;
730070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = 0;
731070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
732070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
733070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case 'Z':
734070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tz_flag = 1;
735070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = 0;
736070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
737070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
738070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
739070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case '+':
740070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case '-': {
741070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	int isneg = 0, tmp = 0;
742070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	isneg = (*cur == '-');
743070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
744070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
745070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
746070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(tmp, cur, ret);
747070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
748070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return ret;
749070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_HOUR(tmp))
750070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
751070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
752070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (*cur != ':')
753070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 1;
754070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
755070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
756070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = tmp * 60;
757070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
758070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(tmp, cur, ret);
759070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
760070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return ret;
761070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_MIN(tmp))
762070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
763070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
764070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo += tmp;
765070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (isneg)
766070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    dt->tzo = - dt->tzo;
767070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
768070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_TZO(dt->tzo))
769070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
770070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
7715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	dt->tz_flag = 1;
772070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
773070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard      }
774070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    default:
775070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
776070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
777070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
778070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
779070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
780070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
781070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
782070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/****************************************************************
783070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
784070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *	XML Schema Dates/Times Datatypes Handling		*
785070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
786070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/
787070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
788070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
789070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_DIGITS:
790070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the integer to fill in
791070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
792070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag
793070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
794070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a digits integer and updates @num with the value. @cur is
795070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer.
796070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and
797070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
798070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
799070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_DIGITS(num, cur, num_type)	                \
800070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if ((*cur < '0') || (*cur > '9'))			\
801070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    num_type = -1;					\
802070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else                                                    \
803070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
804070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	        num = num * 10 + (*cur - '0');		        \
805070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	        cur++;                                          \
806070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            }
807070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
808070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
809070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_NUM:
810070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the double to fill in
811070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
812070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag
813070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
814070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float or integer and updates @num with the value. @cur is
815070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the number. If the number is a float,
816070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * then it must have an integer part and a decimal part; @num_type will
817070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * be set to 1. If there is no decimal part, @num_type is set to zero.
818070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and
819070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
820070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
821070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_NUM(num, cur, num_type)				\
822070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        num = 0;                                                \
823070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_DIGITS(num, cur, num_type);	                \
824070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!num_type && (*cur == '.')) {			\
825070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    double mult = 1;				        \
826070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    cur++;						\
827070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((*cur < '0') || (*cur > '9'))			\
828070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num_type = -1;					\
829070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else                                                \
830070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                num_type = 1;                                   \
831070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
832070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		mult /= 10;					\
833070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num += (*cur - '0') * mult;			\
834070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		cur++;						\
835070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }							\
836070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
837070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
838070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
8395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDates:
840070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @type: the predefined type
841070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dateTime:  string to analyze
842070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val:  the return computed value
843070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
844070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @dateTime conforms to the lexical space of one of the date types.
845070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val.
846070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
847070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
848070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *         and -1 in case of internal or API error.
849070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
850070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
851dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateDates (xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
852118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	                const xmlChar *dateTime, xmlSchemaValPtr *val) {
853070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmlSchemaValPtr dt;
854070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret;
855070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = dateTime;
856070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
857070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define RETURN_TYPE_IF_VALID(t)					\
858070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (IS_TZO_CHAR(*cur)) {					\
859070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur);	\
860070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret == 0) {						\
861070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (*cur != 0)					\
862070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		goto error;					\
863070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    dt->type = t;					\
864070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (val != NULL)                                    \
865070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                *val = dt;                                      \
86680b19092f24410a6b869abf519227686e8f207caDaniel Veillard            else						\
86780b19092f24410a6b869abf519227686e8f207caDaniel Veillard		xmlSchemaFreeValue(dt);				\
868070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 0;						\
869070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}							\
870070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
871070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
872070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dateTime == NULL)
873070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
874070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
875070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((*cur != '-') && (*cur < '0') && (*cur > '9'))
876070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
877070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
878070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN);
879070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dt == NULL)
880070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
881070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
882070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((cur[0] == '-') && (cur[1] == '-')) {
883070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/*
884070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * It's an incomplete date (xs:gMonthDay, xs:gMonth or
885070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * xs:gDay)
886070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 */
887070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur += 2;
888070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
889070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/* is it an xs:gDay? */
890070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (*cur == '-') {
891070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	  ++cur;
892070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
893070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret != 0)
894070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		goto error;
895070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
896070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY);
897070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
898070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    goto error;
899070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
900070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
901070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/*
902070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * it should be an xs:gMonthDay or xs:gMonth
903070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 */
904070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur);
905070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
906070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    goto error;
907070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
908070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (*cur != '-')
909070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    goto error;
910070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
911070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
912070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/* is it an xs:gMonth? */
913070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (*cur == '-') {
914070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    cur++;
915070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH);
916070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    goto error;
917070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
918070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
919070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/* it should be an xs:gMonthDay */
920070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
921070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
922070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    goto error;
923070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
924070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY);
925070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
926070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
927070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
928070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
929070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /*
930070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * It's a right-truncated date or an xs:time.
931070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * Try to parse an xs:time then fallback on right-truncated dates.
932070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     */
933070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((*cur >= '0') && (*cur <= '9')) {
934070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseTime(&(dt->value.date), &cur);
935070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret == 0) {
936070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    /* it's an xs:time */
937070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_TIME);
938070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
939070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
940070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
941070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* fallback on date parsing */
942070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur = dateTime;
943070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
944070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGYear(&(dt->value.date), &cur);
945070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
946070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
947070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
948070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:gYear? */
949070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEAR);
950070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
951070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != '-')
952070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
953070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
954070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
955070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur);
956070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
957070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
958070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
959070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:gYearMonth? */
960070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEARMONTH);
961070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
962070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != '-')
963070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
964070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
965070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
966070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
967070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((ret != 0) || !VALID_DATE((&(dt->value.date))))
968070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
969070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
970070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:date? */
971070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_DATE);
972070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
973070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != 'T')
974070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
975070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
976070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
977070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* it should be an xs:dateTime */
978070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseTime(&(dt->value.date), &cur);
979070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
980070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
981070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
982070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur);
983070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((ret != 0) || (*cur != 0) || !VALID_DATETIME((&(dt->value.date))))
984070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
985070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
986070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dt->type = XML_SCHEMAS_DATETIME;
987070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
988070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (val != NULL)
989070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        *val = dt;
99080b19092f24410a6b869abf519227686e8f207caDaniel Veillard    else
99180b19092f24410a6b869abf519227686e8f207caDaniel Veillard	xmlSchemaFreeValue(dt);
992070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
993070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
994070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
995070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror:
996070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dt != NULL)
997070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	xmlSchemaFreeValue(dt);
998070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 1;
999070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1000070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1001070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
10025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDuration:
1003070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @type: the predefined type
1004070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @duration:  string to analyze
1005070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val:  the return computed value
1006070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1007070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @duration conforms to the lexical space of the duration type.
1008070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val.
1009070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1010070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
1011070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *         and -1 in case of internal or API error.
1012070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1013070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1014dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
1015118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	                   const xmlChar *duration, xmlSchemaValPtr *val) {
1016070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar  *cur = duration;
1017070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmlSchemaValPtr dur;
1018070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int isneg = 0;
1019070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int seq = 0;
1020070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1021070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (duration == NULL)
1022070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1023070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1024070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur == '-') {
1025070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        isneg = 1;
1026070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        cur++;
1027070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1028070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1029070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* duration must start with 'P' (after sign) */
1030070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur++ != 'P')
1031070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1032070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
103380b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (*cur == 0)
103480b19092f24410a6b869abf519227686e8f207caDaniel Veillard	return 1;
103580b19092f24410a6b869abf519227686e8f207caDaniel Veillard
1036070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION);
1037070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dur == NULL)
1038070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1039070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1040070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    while (*cur != 0) {
1041070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        double         num;
1042070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        int            num_type = 0;  /* -1 = invalid, 0 = int, 1 = floating */
1043070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        const xmlChar  desig[] = {'Y', 'M', 'D', 'H', 'M', 'S'};
1044070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        const double   multi[] = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0};
1045070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1046070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* input string should be empty or invalid date/time item */
1047070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (seq >= sizeof(desig))
1048070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1049070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1050070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* T designator must be present for time items */
1051070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (*cur == 'T') {
1052070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (seq <= 3) {
1053070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                seq = 3;
1054070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                cur++;
1055070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            } else
1056070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 1;
1057070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        } else if (seq == 3)
1058070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1059070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1060070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* parse the number portion of the item */
1061070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        PARSE_NUM(num, cur, num_type);
1062070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1063070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if ((num_type == -1) || (*cur == 0))
1064070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1065070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1066070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* update duration based on item type */
1067070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        while (seq < sizeof(desig)) {
1068070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (*cur == desig[seq]) {
1069070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1070070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                /* verify numeric type; only seconds can be float */
1071070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                if ((num_type != 0) && (seq < (sizeof(desig)-1)))
1072070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    goto error;
1073070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1074070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                switch (seq) {
1075070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    case 0:
1076070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.mon = (long)num * 12;
1077070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1078070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    case 1:
1079070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.mon += (long)num;
1080070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1081070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    default:
1082070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        /* convert to seconds using multiplier */
1083070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.sec += num * multi[seq];
1084070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        seq++;
1085070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1086070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                }
1087070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1088070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                break;          /* exit loop */
1089070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            }
1090070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            /* no date designators found? */
1091070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (++seq == 3)
1092070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                goto error;
1093070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        }
1094070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        cur++;
1095070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1096070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1097070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (isneg) {
1098070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.mon = -dur->value.dur.mon;
1099070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.day = -dur->value.dur.day;
1100070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.sec = -dur->value.dur.sec;
1101070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1102070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1103070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (val != NULL)
1104070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        *val = dur;
110580b19092f24410a6b869abf519227686e8f207caDaniel Veillard    else
110680b19092f24410a6b869abf519227686e8f207caDaniel Veillard	xmlSchemaFreeValue(dur);
1107070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1108070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1109070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1110070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror:
1111070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dur != NULL)
1112070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	xmlSchemaFreeValue(dur);
1113070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 1;
1114070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1115070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1116a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard/**
1117a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * xmlSchemaStrip:
1118a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * @value: a value
1119a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *
1120a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Removes the leading and ending spaces of a string
1121a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *
1122a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the new string or NULL if no change was required.
1123a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard */
1124a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlChar *
1125a1a9d0410000cc69874e53e438b250037d3e14cdDaniel VeillardxmlSchemaStrip(const xmlChar *value) {
1126a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    const xmlChar *start = value, *end, *f;
1127a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard
1128a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if (value == NULL) return(NULL);
1129a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    while ((*start != 0) && (IS_BLANK(*start))) start++;
1130a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end = start;
1131a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    while (*end != 0) end++;
1132a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    f = end;
1133a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end--;
1134a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    while ((end > start) && (IS_BLANK(*end))) end--;
1135a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end++;
1136a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if ((start == value) && (f == end)) return(NULL);
1137a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    return(xmlStrndup(start, end - start));
1138a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard}
113996a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard
114096a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard/**
1141b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCollapseString:
1142b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: a value
1143b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
1144b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Removes and normalize white spaces in the string
1145b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
1146b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns the new string or NULL if no change was required.
1147b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
1148b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic xmlChar *
1149b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCollapseString(const xmlChar *value) {
1150b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    const xmlChar *start = value, *end, *f;
1151b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    xmlChar *g;
1152b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    int col = 0;
1153b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1154b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (value == NULL) return(NULL);
1155b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    while ((*start != 0) && (IS_BLANK(*start))) start++;
1156b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    end = start;
1157b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    while (*end != 0) {
1158b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if ((*end == ' ') && (IS_BLANK(end[1]))) {
1159b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    col = end - start;
1160b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    break;
1161b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	} else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) {
1162b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    col = end - start;
1163b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    break;
1164b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	}
1165b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end++;
1166b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1167b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (col == 0) {
1168b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	f = end;
1169b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end--;
1170b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	while ((end > start) && (IS_BLANK(*end))) end--;
1171b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end++;
1172b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if ((start == value) && (f == end)) return(NULL);
1173b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(xmlStrndup(start, end - start));
1174b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1175b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    start = xmlStrdup(start);
1176b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (start == NULL) return(NULL);
1177b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    g = (xmlChar *) (start + col);
1178b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    end = g;
1179b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    while (*end != 0) {
1180b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (IS_BLANK(*end)) {
1181b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    end++;
1182b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    while (IS_BLANK(*end)) end++;
1183b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (*end != 0)
1184b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		*g++ = ' ';
1185b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	} else
1186b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    *g++ = *end++;
1187b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1188b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    *g = 0;
1189b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return((xmlChar *) start);
1190b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
1191b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1192b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
119328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * xmlSchemaValAtomicListNode:
119428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @type: the predefined atomic type for a token in the list
119528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @value: the list value to check
119628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @ret:  the return computed value
119728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @node:  the node containing the value
119828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *
119928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Check that a value conforms to the lexical space of the predefined
120028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * list type. if true a value is computed and returned in @ret.
120128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *
1202a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the number of items if this validates, a negative error code
1203a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *         number otherwise
120428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */
120528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillardstatic int
120628c52ab518d34a36fd8da6870a5850088f129a6aDaniel VeillardxmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value,
120728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	                   xmlSchemaValPtr *ret, xmlNodePtr node) {
120828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    xmlChar *val, *cur, *endval;
120928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    int nb_values = 0;
1210580ced8ee28ecd99374da9383897678e4ba6c358Daniel Veillard    int tmp = 0;
121128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard
121228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (value == NULL) {
121328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	return(-1);
121428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
121528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    val = xmlStrdup(value);
121628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (val == NULL) {
121728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	return(-1);
121828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
121928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    cur = val;
122028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    /*
122128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard     * Split the list
122228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard     */
1223a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    while (IS_BLANK(*cur)) *cur++ = 0;
122428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while (*cur != 0) {
122528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	if (IS_BLANK(*cur)) {
122628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    *cur = 0;
122728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    cur++;
122828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    while (IS_BLANK(*cur)) *cur++ = 0;
122928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	} else {
123028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    nb_values++;
123128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    cur++;
123228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    while ((*cur != 0) && (!IS_BLANK(*cur))) cur++;
123328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	}
123428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
123528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (nb_values == 0) {
123628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	if (ret != NULL) {
123728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    TODO
123828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	}
123928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	xmlFree(val);
1240a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard	return(nb_values);
124128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
124228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    endval = cur;
124328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    cur = val;
124428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while ((*cur == 0) && (cur != endval)) cur++;
124528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while (cur != endval) {
124628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node);
124728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	if (tmp != 0)
124828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    break;
124928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	while (*cur != 0) cur++;
125028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	while ((*cur == 0) && (cur != endval)) cur++;
125128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
125228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    xmlFree(val);
125328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (ret != NULL) {
125428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	TODO
125528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
1256a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if (tmp == 0)
1257a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard	return(nb_values);
1258a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    return(-1);
125928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard}
126028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard
126128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard/**
1262e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * xmlSchemaParseUInt:
1263e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @str: pointer to the string R/W
1264e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @llo: pointer to the low result
1265e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lmi: pointer to the mid result
1266e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lhi: pointer to the high result
1267e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *
1268e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Parse an unsigned long into 3 fields.
1269e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *
1270e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Returns the number of chars parsed or -1 if overflow of the capacity
1271e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard */
1272e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic int
1273e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel VeillardxmlSchemaParseUInt(const xmlChar **str, unsigned long *llo,
1274e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	           unsigned long *lmi, unsigned long *lhi) {
1275e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long lo = 0, mi = 0, hi = 0;
1276e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    const xmlChar *tmp, *cur = *str;
1277e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    int ret = 0, i = 0;
1278e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
1279e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (*cur == '0') {
1280e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	ret++;
1281e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	cur++;
1282e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1283e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    tmp = cur;
1284e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) {
1285e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	i++;tmp++;ret++;
1286e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1287e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (i > 24) {
1288e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	*str = tmp;
1289e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	return(-1);
1290e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1291e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 16) {
1292e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	hi = hi * 10 + (*cur++ - '0');
1293e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	i--;
1294e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1295e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 8) {
1296e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	mi = mi * 10 + (*cur++ - '0');
1297e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	i--;
1298e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1299e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 0) {
1300e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	lo = lo * 10 + (*cur++ - '0');
1301e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	i--;
1302e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1303e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
1304e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *str = cur;
1305e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *llo = lo;
1306e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *lmi = mi;
1307e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *lhi = hi;
1308e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    return(ret);
1309e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard}
1310e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
1311e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard/**
1312b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValAtomicType:
13134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type: the predefined type
13144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to check
13154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val:  the return computed value
1316c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @node:  the node containing the value
1317b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * flags:  flags to control the vlidation
13184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
1319b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the atomic type.
13204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * if true a value is computed and returned in @val.
13214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
13224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
13234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *         and -1 in case of internal or API error.
13244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
1325b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int
1326b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar *value,
1327b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	               xmlSchemaValPtr *val, xmlNodePtr node, int flags) {
13284255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValPtr v;
1329b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    xmlChar *norm = NULL;
133096a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard    int ret;
13314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
13324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
13334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(-1);
13344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (type == NULL)
13354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(-1);
13365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
13374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (val != NULL)
13384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	*val = NULL;
1339b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if ((flags == 0) && (value != NULL)) {
1340b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if ((type->flags != XML_SCHEMAS_STRING) &&
1341b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    (type->flags != XML_SCHEMAS_NORMSTRING)) {
1342b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    norm = xmlSchemaCollapseString(value);
1343b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (norm != NULL)
1344b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		value = norm;
1345c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	}
1346b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1347b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1348b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    switch (type->flags) {
1349b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_UNKNOWN:
1350b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (type == xmlSchemaTypeAnyTypeDef)
1351b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		goto return0;
1352b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    goto error;
1353b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_STRING:
1354b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    goto return0;
1355b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NORMSTRING:
1356b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    TODO
1357b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    goto return0;
1358b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DECIMAL: {
1359b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    const xmlChar *cur = value, *tmp;
1360b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    int frac = 0, len, neg = 0;
1361b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    unsigned long base = 0;
1362b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (cur == NULL)
1363b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		goto return1;
1364b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (*cur == '+')
1365b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		cur++;
1366b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    else if (*cur == '-') {
1367b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		neg = 1;
1368b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		cur++;
1369b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
13704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    tmp = cur;
13714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {
13724255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		base = base * 10 + (*cur - '0');
13734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		cur++;
13744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    }
1375b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    len = cur - tmp;
1376b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (*cur == '.') {
1377b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		cur++;
1378b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		tmp = cur;
1379b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		while ((*cur >= '0') && (*cur <= '9')) {
1380b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    base = base * 10 + (*cur - '0');
1381b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    cur++;
1382b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		}
1383b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		frac = cur - tmp;
13844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    }
1385b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (*cur != 0)
1386b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		goto return1;
1387b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (val != NULL) {
1388b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL);
1389b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (v != NULL) {
1390e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    v->value.decimal.lo = base;
1391b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    v->value.decimal.sign = neg;
1392b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    v->value.decimal.frac = frac;
1393b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    v->value.decimal.total = frac + len;
1394b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    *val = v;
1395b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		}
13964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    }
1397b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    goto return0;
13984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	}
1399b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_TIME:
1400b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GDAY:
1401b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GMONTH:
1402b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GMONTHDAY:
1403b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GYEAR:
1404b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GYEARMONTH:
1405b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DATE:
1406b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DATETIME:
1407b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    ret = xmlSchemaValidateDates(type, value, val);
1408b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    break;
1409b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DURATION:
1410b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    ret = xmlSchemaValidateDuration(type, value, val);
1411b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    break;
1412b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_FLOAT:
1413b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DOUBLE: {
1414b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    const xmlChar *cur = value;
1415b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    int neg = 0;
1416b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (cur == NULL)
1417b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		goto return1;
1418b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) {
1419b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		cur += 3;
1420b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (*cur != 0)
1421b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    goto return1;
1422b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (val != NULL) {
1423b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    if (type == xmlSchemaTypeFloatDef) {
1424b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
1425b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			if (v != NULL) {
1426b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			    v->value.f = (float) xmlXPathNAN;
1427b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			} else {
1428b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			    xmlSchemaFreeValue(v);
1429b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			    goto error;
1430b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			}
1431b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    } else {
1432b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
1433b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			if (v != NULL) {
1434b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			    v->value.d = xmlXPathNAN;
1435b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			} else {
1436b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			    xmlSchemaFreeValue(v);
1437b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			    goto error;
1438b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			}
1439b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    }
1440b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    *val = v;
1441b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		}
1442b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		goto return0;
14434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    }
1444b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (*cur == '-') {
1445b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		neg = 1;
1446b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		cur++;
144791a1325beb87de8fde190157a545504632c169feDaniel Veillard	    }
1448b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) {
1449b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		cur += 3;
1450b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (*cur != 0)
1451b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    goto return1;
1452b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (val != NULL) {
1453b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    if (type == xmlSchemaTypeFloatDef) {
1454b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
1455b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			if (v != NULL) {
1456b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			    if (neg)
1457b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard				v->value.f = (float) xmlXPathNINF;
1458b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			    else
1459b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard				v->value.f = (float) xmlXPathPINF;
1460b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			} else {
1461b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			    xmlSchemaFreeValue(v);
1462b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			    goto error;
1463b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			}
1464b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    } else {
1465b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
1466b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			if (v != NULL) {
1467b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			    if (neg)
1468b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard				v->value.d = xmlXPathNINF;
1469b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			    else
1470b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard				v->value.d = xmlXPathPINF;
1471b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			} else {
1472b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			    xmlSchemaFreeValue(v);
1473b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			    goto error;
1474b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			}
1475b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    }
1476b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    *val = v;
1477b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		}
1478b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		goto return0;
147996a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard	    }
1480b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if ((neg == 0) && (*cur == '+'))
1481b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		cur++;
1482b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-'))
1483b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		goto return1;
1484b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {
1485b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		cur++;
1486b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
1487b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (*cur == '.') {
1488b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		cur++;
1489b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		while ((*cur >= '0') && (*cur <= '9'))
1490b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    cur++;
1491b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
1492b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if ((*cur == 'e') || (*cur == 'E')) {
1493b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		cur++;
1494b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if ((*cur == '-') || (*cur == '+'))
1495b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    cur++;
1496b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		while ((*cur >= '0') && (*cur <= '9'))
1497b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    cur++;
1498ef2e4ec1a2acce1cba59885b83cc167fd66bd890Daniel Veillard	    }
149996a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard	    if (*cur != 0)
1500b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		goto return1;
150196a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard	    if (val != NULL) {
150296a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		if (type == xmlSchemaTypeFloatDef) {
150396a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		    v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
150496a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		    if (v != NULL) {
1505b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			if (sscanf((const char *)value, "%f", &(v->value.f))==1) {
1506b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			    *val = v;
1507b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			} else {
1508b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			    xmlGenericError(xmlGenericErrorContext,
1509b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard				    "failed to scanf float %s\n", value);
1510b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			    xmlSchemaFreeValue(v);
1511b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			    goto return1;
1512b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			}
151396a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		    } else {
1514b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			goto error;
151596a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		    }
151696a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		} else {
151796a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		    v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
151896a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		    if (v != NULL) {
1519b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			if (sscanf((const char *)value, "%lf", &(v->value.d))==1) {
1520b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			    *val = v;
1521b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			} else {
1522b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			    xmlGenericError(xmlGenericErrorContext,
1523b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard				    "failed to scanf double %s\n", value);
1524b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			    xmlSchemaFreeValue(v);
1525b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			    goto return1;
1526b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			}
152796a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		    } else {
1528b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			goto error;
152996a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		    }
153096a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		}
153196a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard	    }
1532b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    goto return0;
153396a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard	}
1534b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_BOOLEAN: {
1535b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    const xmlChar *cur = value;
1536b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1537b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if ((cur[0] == '0') && (cur[1] == 0))
1538b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		ret = 0;
1539b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    else if ((cur[0] == '1') && (cur[1] == 0))
1540b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		ret = 1;
1541b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    else if ((cur[0] == 't') && (cur[1] == 'r') && (cur[2] == 'u') &&
1542b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		     (cur[3] == 'e') && (cur[4] == 0))
1543b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		ret = 1;
1544b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    else if ((cur[0] == 'f') && (cur[1] == 'a') && (cur[2] == 'l') &&
1545b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		     (cur[3] == 's') && (cur[4] == 'e') && (cur[5] == 0))
1546b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		ret = 0;
1547b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    else
1548b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		goto return1;
1549b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (val != NULL) {
1550b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN);
1551b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (v != NULL) {
1552b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    v->value.b = ret;
1553b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    *val = v;
1554b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		} else {
1555b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    goto error;
1556b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		}
1557b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
1558b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    goto return0;
155984d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard	}
1560b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_TOKEN: {
1561b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    const xmlChar *cur = value;
1562b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1563b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (IS_BLANK(*cur))
1564b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		goto return1;
1565b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1566b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    while (*cur != 0) {
1567b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
1568b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    goto return1;
1569b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		} else if (*cur == ' ') {
1570b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    cur++;
1571b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    if (*cur == 0)
1572b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			goto return1;
1573b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    if (*cur == ' ')
1574b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			goto return1;
1575b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		} else {
1576b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    cur++;
1577b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		}
1578b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
157996a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard	    if (val != NULL) {
1580b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN);
1581b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (v != NULL) {
1582b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    v->value.str = xmlStrdup(value);
1583b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    *val = v;
158496a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		} else {
1585b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    goto error;
1586b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		}
1587b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
1588b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    goto return0;
1589b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	}
1590b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_LANGUAGE:
1591b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (xmlCheckLanguageID(value) == 1) {
1592b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (val != NULL) {
1593b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE);
159496a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		    if (v != NULL) {
1595b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			v->value.str = xmlStrdup(value);
1596b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			*val = v;
159796a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		    } else {
1598b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			goto error;
159996a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		    }
160096a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		}
1601b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		goto return0;
160296a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard	    }
1603b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    goto return1;
1604b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NMTOKEN:
1605b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (xmlValidateNMToken(value, 1) == 0) {
1606b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (val != NULL) {
1607b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN);
1608b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    if (v != NULL) {
1609b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			v->value.str = xmlStrdup(value);
161096a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard			*val = v;
161196a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		    } else {
1612b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			goto error;
161396a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		    }
161496a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		}
1615b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		goto return0;
1616b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
1617b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    goto return1;
1618b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NMTOKENS:
1619b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef,
1620b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard					     value, val, node);
1621b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (ret > 0)
1622b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		ret = 0;
1623b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    else
1624b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		ret = 1;
1625b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    goto done;
1626b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NAME:
1627b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    ret = xmlValidateName(value, 1);
1628b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if ((ret == 0) && (val != NULL)) {
1629b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		TODO;
1630b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
1631b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    goto done;
1632e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_QNAME: {
1633e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    xmlChar *uri = NULL;
1634e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    xmlChar *local = NULL;
1635e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
1636b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    ret = xmlValidateQName(value, 1);
1637e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    if ((ret == 0) && (node != NULL)) {
1638e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		xmlChar *prefix;
1639e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		local = xmlSplitQName2(value, &prefix);
1640e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (prefix != NULL) {
1641e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    xmlNsPtr ns;
1642e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
1643e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    ns = xmlSearchNs(node->doc, node, prefix);
1644e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    if (ns == NULL)
1645e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			ret = 1;
1646e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    else if (val != NULL)
1647e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			uri = xmlStrdup(ns->href);
1648e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		}
1649e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((local != NULL) && ((val == NULL) || (ret != 0)))
1650e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    xmlFree(local);
1651e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (prefix != NULL)
1652e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    xmlFree(prefix);
1653e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    }
1654b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if ((ret == 0) && (val != NULL)) {
1655e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		v = xmlSchemaNewValue(XML_SCHEMAS_QNAME);
1656e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (v != NULL) {
1657e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    if (local != NULL)
1658e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			v->value.qname.name = local;
1659e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    else
1660e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			v->value.qname.name = xmlStrdup(value);
1661e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    if (uri != NULL)
1662e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			v->value.qname.uri = uri;
1663e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
1664e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    *val = v;
1665e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		} else {
1666e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    if (local != NULL)
1667e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			xmlFree(local);
1668e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    if (uri != NULL)
1669e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			xmlFree(uri);
1670e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    goto error;
1671e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		}
1672b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
1673b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    goto done;
1674e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	}
1675b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NCNAME:
1676b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    ret = xmlValidateNCName(value, 1);
1677b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if ((ret == 0) && (val != NULL)) {
1678b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME);
167996a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		if (v != NULL) {
1680b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    v->value.str = xmlStrdup(value);
1681b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    *val = v;
1682b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		} else {
1683b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    goto error;
1684b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		}
1685b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
1686b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    goto done;
1687b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_ID:
1688b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    ret = xmlValidateNCName(value, 1);
1689b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if ((ret == 0) && (val != NULL)) {
1690b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		TODO;
1691b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
1692b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if ((ret == 0) && (node != NULL) &&
1693b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		(node->type == XML_ATTRIBUTE_NODE)) {
1694b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		xmlAttrPtr attr = (xmlAttrPtr) node;
1695b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		/*
1696b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		 * NOTE: the IDness might have already be declared in the DTD
1697b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		 */
1698b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (attr->atype != XML_ATTRIBUTE_ID) {
1699b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    xmlIDPtr res;
1700b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    xmlChar *strip;
1701b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1702b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    strip = xmlSchemaStrip(value);
1703b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    if (strip != NULL) {
1704b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			res = xmlAddID(NULL, node->doc, strip, attr);
1705b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			xmlFree(strip);
1706b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    } else
1707b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			res = xmlAddID(NULL, node->doc, value, attr);
1708b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    if (res == NULL) {
1709b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			ret = 2;
171096a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		    } else {
1711b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard			attr->atype = XML_ATTRIBUTE_ID;
171296a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		    }
171396a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard		}
171484d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard	    }
1715b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    goto done;
1716b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_IDREF:
1717b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    ret = xmlValidateNCName(value, 1);
1718b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if ((ret == 0) && (val != NULL)) {
1719b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		TODO;
1720c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    }
1721b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if ((ret == 0) && (node != NULL) &&
1722b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		(node->type == XML_ATTRIBUTE_NODE)) {
1723b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		xmlAttrPtr attr = (xmlAttrPtr) node;
1724b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		xmlChar *strip;
172596a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard
1726b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		strip = xmlSchemaStrip(value);
1727b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (strip != NULL) {
1728b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    xmlAddRef(NULL, node->doc, strip, attr);
1729b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    xmlFree(strip);
1730b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		} else
1731b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    xmlAddRef(NULL, node->doc, value, attr);
1732b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		attr->atype = XML_ATTRIBUTE_IDREF;
1733c5a70f264550ee39da267e81dccd95508ed367ddDaniel Veillard	    }
1734b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    goto done;
1735b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_IDREFS:
1736b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef,
1737b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard					     value, val, node);
1738b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (ret < 0)
1739b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		ret = 2;
1740b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    else
1741b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		ret = 0;
1742b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if ((ret == 0) && (node != NULL) &&
1743b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		(node->type == XML_ATTRIBUTE_NODE)) {
1744b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		xmlAttrPtr attr = (xmlAttrPtr) node;
1745b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1746b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		attr->atype = XML_ATTRIBUTE_IDREFS;
1747b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
1748b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    goto done;
1749b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_ENTITY: {
1750ef2e4ec1a2acce1cba59885b83cc167fd66bd890Daniel Veillard	    xmlChar *strip;
1751b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    ret = xmlValidateNCName(value, 1);
1752b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if ((node == NULL) || (node->doc == NULL))
1753b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		ret = 3;
1754b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (ret == 0) {
1755b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		xmlEntityPtr ent;
1756249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard
1757249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard		strip = xmlSchemaStrip(value);
1758249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard		if (strip != NULL) {
1759b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    ent = xmlGetDocEntity(node->doc, strip);
1760249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard		    xmlFree(strip);
1761249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard		} else {
1762b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    ent = xmlGetDocEntity(node->doc, value);
1763249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard		}
1764b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if ((ent == NULL) ||
1765b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    (ent->etype != XML_EXTERNAL_GENERAL_UNPARSED_ENTITY))
1766b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    ret = 4;
1767c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard	    }
1768b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if ((ret == 0) && (val != NULL)) {
1769b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		TODO;
1770b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
1771b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if ((ret == 0) && (node != NULL) &&
1772b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		(node->type == XML_ATTRIBUTE_NODE)) {
1773b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		xmlAttrPtr attr = (xmlAttrPtr) node;
1774a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard
1775b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		attr->atype = XML_ATTRIBUTE_ENTITY;
1776b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
1777b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    goto done;
1778a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard	}
1779b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_ENTITIES:
1780b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if ((node == NULL) || (node->doc == NULL))
1781b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		goto return3;
1782b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef,
1783b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard					     value, val, node);
1784b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (ret <= 0)
1785b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		ret = 1;
1786b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    else
1787b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		ret = 0;
1788b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if ((ret == 0) && (node != NULL) &&
1789b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		(node->type == XML_ATTRIBUTE_NODE)) {
1790b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		xmlAttrPtr attr = (xmlAttrPtr) node;
1791b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1792b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		attr->atype = XML_ATTRIBUTE_ENTITIES;
1793b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
1794b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    goto done;
1795e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_NOTATION: {
1796e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    xmlChar *uri = NULL;
1797e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    xmlChar *local = NULL;
1798e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
1799e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    ret = xmlValidateQName(value, 1);
1800e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    if ((ret == 0) && (node != NULL)) {
1801e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		xmlChar *prefix;
1802e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		local = xmlSplitQName2(value, &prefix);
1803e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (prefix != NULL) {
1804e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    xmlNsPtr ns;
1805e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
1806e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    ns = xmlSearchNs(node->doc, node, prefix);
1807e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    if (ns == NULL)
1808e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			ret = 1;
1809e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    else if (val != NULL)
1810e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			uri = xmlStrdup(ns->href);
1811e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		}
1812e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((local != NULL) && ((val == NULL) || (ret != 0)))
1813e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    xmlFree(local);
1814e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (prefix != NULL)
1815e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    xmlFree(prefix);
1816e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    }
1817e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    if ((node == NULL) || (node->doc == NULL))
1818e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		ret = 3;
1819e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    if (ret == 0) {
1820e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		ret = xmlValidateNotationUse(NULL, node->doc, value);
1821e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (ret == 1)
1822e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    ret = 0;
1823e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		else
1824e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    ret = 1;
1825e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    }
1826e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    if ((ret == 0) && (val != NULL)) {
1827e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION);
1828e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (v != NULL) {
1829e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    if (local != NULL)
1830e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			v->value.qname.name = local;
1831e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    else
1832e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			v->value.qname.name = xmlStrdup(value);
1833e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    if (uri != NULL)
1834e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			v->value.qname.uri = uri;
1835e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
1836e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    *val = v;
1837e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		} else {
1838e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    if (local != NULL)
1839e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			xmlFree(local);
1840e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    if (uri != NULL)
1841e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			xmlFree(uri);
1842e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    goto error;
1843e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		}
1844e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    }
1845e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    goto done;
1846e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	}
1847b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_ANYURI: {
1848b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    xmlURIPtr uri;
1849a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard
1850b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    uri = xmlParseURI((const char *) value);
1851b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (uri == NULL)
1852b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		goto return1;
1853b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (val != NULL) {
1854b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		TODO;
1855a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard	    }
1856b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    xmlFreeURI(uri);
1857b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    goto return0;
1858a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard	}
1859e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_INTEGER:
1860e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_PINTEGER:
1861e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_NPINTEGER:
1862e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_NINTEGER:
1863e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_NNINTEGER: {
1864b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    const xmlChar *cur = value;
1865e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    unsigned long lo, mi, hi;
1866b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    int sign = 0;
1867b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (cur == NULL)
1868b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		goto return1;
1869b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (*cur == '-') {
1870b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		sign = 1;
1871b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		cur++;
1872b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    } else if (*cur == '+')
1873b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		cur++;
1874e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
1875e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    if (ret == 0)
1876e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	        goto return1;
1877b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (*cur != 0)
1878b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		goto return1;
1879e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    if (type->flags == XML_SCHEMAS_NPINTEGER) {
1880e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((sign == 0) &&
1881e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    ((hi != 0) || (mi != 0) || (lo != 0)))
1882e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    goto return1;
1883e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    } else if (type->flags == XML_SCHEMAS_PINTEGER) {
1884e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (sign == 1)
1885e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    goto return1;
1886e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((hi == 0) && (mi == 0) && (lo == 0))
1887e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    goto return1;
1888e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    } else if (type->flags == XML_SCHEMAS_NINTEGER) {
1889e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (sign == 0)
1890e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    goto return1;
1891e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((hi == 0) && (mi == 0) && (lo == 0))
1892e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    goto return1;
1893e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    } else if (type->flags == XML_SCHEMAS_NNINTEGER) {
1894e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((sign == 1) &&
1895e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    ((hi != 0) || (mi != 0) || (lo != 0)))
1896e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    goto return1;
1897e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    }
1898e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    /*
1899e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	     * We can store a value only if no overflow occured
1900e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	     */
1901e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    if ((ret > 0) && (val != NULL)) {
1902e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		v = xmlSchemaNewValue(type->flags);
1903b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (v != NULL) {
1904e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    v->value.decimal.lo = lo;
1905e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    v->value.decimal.mi = lo;
1906e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    v->value.decimal.hi = lo;
1907b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    v->value.decimal.sign = sign;
1908b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    v->value.decimal.frac = 0;
1909e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    v->value.decimal.total = cur - value;
1910b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    *val = v;
1911b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		}
1912b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
1913b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    goto return0;
1914a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard	}
1915e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_LONG:
1916e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_BYTE:
1917e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_SHORT:
1918e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_INT: {
1919b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    const xmlChar *cur = value;
1920e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    unsigned long lo, mi, hi;
1921b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    int total = 0;
1922b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    int sign = 0;
1923b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (cur == NULL)
1924b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		goto return1;
1925b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (*cur == '-') {
1926b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		sign = 1;
1927b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		cur++;
1928e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    } else if (*cur == '+')
1929b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		cur++;
1930e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
1931e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    if (ret <= 0)
1932e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	        goto return1;
1933b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (*cur != 0)
1934b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		goto return1;
1935e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    if (type->flags == XML_SCHEMAS_LONG) {
1936e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (hi >= 922) {
1937e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    if (hi > 922)
1938e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			goto return1;
1939e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    if (mi >= 33720368) {
1940e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			if (mi > 33720368)
1941e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			    goto return1;
1942e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		        if ((sign == 0) && (lo > 54775807))
1943e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			    goto return1;
1944e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		        if ((sign == 1) && (lo > 54775808))
1945e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			    goto return1;
1946e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    }
1947b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		}
1948e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    } else if (type->flags == XML_SCHEMAS_INT) {
1949e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (hi != 0)
1950e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    goto return1;
1951e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (mi >= 21) {
1952e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    if (mi > 21)
1953e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			goto return1;
1954e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    if ((sign == 0) && (lo > 47483647))
1955e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			goto return1;
1956e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    if ((sign == 1) && (lo > 47483648))
1957e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			goto return1;
1958e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		}
1959e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    } else if (type->flags == XML_SCHEMAS_SHORT) {
1960e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((mi != 0) || (hi != 0))
1961e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    goto return1;
1962e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((sign == 1) && (lo > 32768))
1963e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    goto return1;
1964e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((sign == 0) && (lo > 32767))
1965e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    goto return1;
1966e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    } else if (type->flags == XML_SCHEMAS_BYTE) {
1967e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((mi != 0) || (hi != 0))
1968e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    goto return1;
1969e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((sign == 1) && (lo > 128))
1970e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    goto return1;
1971e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((sign == 0) && (lo > 127))
1972e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    goto return1;
1973b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
1974c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (val != NULL) {
1975e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		v = xmlSchemaNewValue(type->flags);
1976c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		if (v != NULL) {
1977e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    v->value.decimal.lo = lo;
1978e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    v->value.decimal.mi = lo;
1979e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    v->value.decimal.hi = lo;
1980e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    v->value.decimal.sign = sign;
1981b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    v->value.decimal.frac = 0;
1982b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    v->value.decimal.total = total;
1983c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    *val = v;
1984c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		}
1985c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    }
1986b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    goto return0;
1987c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	}
1988e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_UINT:
1989e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_ULONG:
1990e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_USHORT:
1991e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_UBYTE: {
1992b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    const xmlChar *cur = value;
1993e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    unsigned long lo, mi, hi;
1994b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    int total = 0;
1995b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (cur == NULL)
1996b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		goto return1;
1997e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
1998e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    if (ret <= 0)
1999e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	        goto return1;
2000b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (*cur != 0)
2001b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		goto return1;
2002e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    if (type->flags == XML_SCHEMAS_ULONG) {
2003e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (hi >= 1844) {
2004e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    if (hi > 1844)
2005e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			goto return1;
2006e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    if (mi >= 67440737) {
2007e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			if (mi > 67440737)
2008e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			    goto return1;
2009e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			if (lo > 9551615)
2010e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			    goto return1;
2011e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    }
2012b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		}
2013e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    } else if (type->flags == XML_SCHEMAS_UINT) {
2014e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (hi != 0)
2015e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    goto return1;
2016e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (mi >= 42) {
2017e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    if (mi > 42)
2018e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			goto return1;
2019e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    if (lo > 94967295)
2020e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard			goto return1;
2021e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		}
2022e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    } else if (type->flags == XML_SCHEMAS_USHORT) {
2023e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((mi != 0) || (hi != 0))
2024e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    goto return1;
2025e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (lo > 65535)
2026e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    goto return1;
2027e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    } else if (type->flags == XML_SCHEMAS_UBYTE) {
2028e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((mi != 0) || (hi != 0))
2029e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    goto return1;
2030e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (lo > 255)
2031e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    goto return1;
2032b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
2033b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (val != NULL) {
2034e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		v = xmlSchemaNewValue(type->flags);
2035b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (v != NULL) {
2036e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    v->value.decimal.lo = lo;
2037e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    v->value.decimal.mi = mi;
2038e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    v->value.decimal.hi = hi;
2039e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    v->value.decimal.sign = 0;
2040b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    v->value.decimal.frac = 0;
2041b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    v->value.decimal.total = total;
2042b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    *val = v;
2043b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		}
2044b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
2045b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    goto return0;
2046c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	}
20474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
2048b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
2049b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillarddone:
2050b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (norm != NULL) xmlFree(norm);
2051b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return(ret);
2052b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardreturn3:
2053b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (norm != NULL) xmlFree(norm);
2054b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return(3);
2055b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardreturn1:
2056b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (norm != NULL) xmlFree(norm);
2057b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return(1);
2058b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardreturn0:
2059b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (norm != NULL) xmlFree(norm);
206009628210bdf22ac80a0c6f3e4228c1617c0887ecDaniel Veillard    return(0);
2061b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillarderror:
2062b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (norm != NULL) xmlFree(norm);
2063b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return(-1);
2064b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
2065b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
2066b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
2067b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValPredefTypeNode:
2068b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @type: the predefined type
2069b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: the value to check
2070b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @val:  the return computed value
2071b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @node:  the node containing the value
2072b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
2073b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the predefined type.
2074b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * if true a value is computed and returned in @val.
2075b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
2076b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns 0 if this validates, a positive error code number otherwise
2077b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *         and -1 in case of internal or API error.
2078b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
2079b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardint
2080b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value,
2081b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	                   xmlSchemaValPtr *val, xmlNodePtr node) {
2082b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return(xmlSchemaValAtomicType(type, value, val, node, 0));
20834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
20844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
20854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
2086c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * xmlSchemaValidatePredefinedType:
2087c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @type: the predefined type
2088c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @value: the value to check
2089c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @val:  the return computed value
2090c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *
2091c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Check that a value conforms to the lexical space of the predefined type.
2092c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * if true a value is computed and returned in @val.
2093c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *
2094c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
2095c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *         and -1 in case of internal or API error.
2096c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard */
2097c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillardint
2098c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel VeillardxmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value,
2099c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard	                        xmlSchemaValPtr *val) {
2100c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard    return(xmlSchemaValPredefTypeNode(type, value, val, NULL));
2101c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard}
2102c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard
2103c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard/**
21044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareDecimals:
21054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x:  a first decimal value
21064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y:  a second decimal value
21074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
21084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 decimals
21094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
21104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error
21114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
21124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int
21134255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y)
21144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{
21154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValPtr swp;
2116e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    int order = 1, p;
21174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    unsigned long tmp;
21184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
2119e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if ((x->value.decimal.sign) &&
2120e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	((x->value.decimal.lo != 0) ||
2121e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	 (x->value.decimal.mi != 0) ||
2122e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	 (x->value.decimal.hi != 0))) {
2123e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	if ((y->value.decimal.sign) &&
2124e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    ((y->value.decimal.lo != 0) ||
2125e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	     (y->value.decimal.mi != 0) ||
2126e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	     (y->value.decimal.hi != 0)))
212780b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    order = -1;
212880b19092f24410a6b869abf519227686e8f207caDaniel Veillard	else
212980b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    return (-1);
2130e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    } else if ((y->value.decimal.sign) &&
2131e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	       ((y->value.decimal.lo != 0) ||
2132e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		(y->value.decimal.mi != 0) ||
2133e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		(y->value.decimal.hi != 0))) {
21344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (1);
213580b19092f24410a6b869abf519227686e8f207caDaniel Veillard    }
21364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (x->value.decimal.frac == y->value.decimal.frac) {
2137e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	if (x->value.decimal.hi < y->value.decimal.hi)
2138e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (-order);
2139e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	if (x->value.decimal.hi < y->value.decimal.hi)
2140e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (order);
2141e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	if (x->value.decimal.mi < y->value.decimal.mi)
2142e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (-order);
2143e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	if (x->value.decimal.mi < y->value.decimal.mi)
2144e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (order);
2145e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        if (x->value.decimal.lo < y->value.decimal.lo)
214680b19092f24410a6b869abf519227686e8f207caDaniel Veillard            return (-order);
2147e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        if (x->value.decimal.lo > y->value.decimal.lo)
214880b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    return(order);
214980b19092f24410a6b869abf519227686e8f207caDaniel Veillard	return(0);
21504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
21514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (y->value.decimal.frac > x->value.decimal.frac) {
21524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        swp = y;
21534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        y = x;
21544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        x = swp;
21554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        order = -order;
21564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
2157e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    p = powten[x->value.decimal.frac - y->value.decimal.frac];
2158e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    tmp = x->value.decimal.lo / p;
2159e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (tmp > y->value.decimal.lo)
21604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (order);
2161e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (tmp < y->value.decimal.lo)
21624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (-order);
2163e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    tmp = y->value.decimal.lo * p;
2164e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (x->value.decimal.lo < tmp)
21654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (-order);
2166e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (x->value.decimal.lo == tmp)
21674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (0);
21684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return (order);
21694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
21704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
21714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
2172070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xmlSchemaCompareDurations:
2173070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @x:  a first duration value
2174070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @y:  a second duration value
2175070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
2176070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Compare 2 durations
2177070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
2178070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
2179070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * case of error
2180070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
2181070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
2182070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel VeillardxmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y)
2183070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard{
2184070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long carry, mon, day;
2185070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    double sec;
218680b19092f24410a6b869abf519227686e8f207caDaniel Veillard    int invert = 1;
218780b19092f24410a6b869abf519227686e8f207caDaniel Veillard    long xmon, xday, myear, minday, maxday;
2188070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    static const long dayRange [2][12] = {
2189070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        { 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, },
2190070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} };
2191070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2192070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((x == NULL) || (y == NULL))
21935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return -2;
2194070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2195070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* months */
2196070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    mon = x->value.dur.mon - y->value.dur.mon;
2197070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2198070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* seconds */
2199070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    sec = x->value.dur.sec - y->value.dur.sec;
2200070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    carry = (long)sec / SECS_PER_DAY;
2201070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    sec -= (double)(carry * SECS_PER_DAY);
2202070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2203070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* days */
2204070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    day = x->value.dur.day - y->value.dur.day + carry;
2205070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2206070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* easy test */
2207070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (mon == 0) {
2208070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (day == 0)
2209070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (sec == 0.0)
2210070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 0;
2211070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else if (sec < 0.0)
2212070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return -1;
2213070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else
2214070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 1;
2215070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else if (day < 0)
2216070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return -1;
2217070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else
2218070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return 1;
2219070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
2220070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2221070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (mon > 0) {
2222070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if ((day >= 0) && (sec >= 0.0))
2223070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return 1;
2224070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else {
2225070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            xmon = mon;
2226070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            xday = -day;
2227070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        }
2228070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    } else if ((day <= 0) && (sec <= 0.0)) {
2229070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        return -1;
2230070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    } else {
223180b19092f24410a6b869abf519227686e8f207caDaniel Veillard	invert = -1;
2232070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xmon = -mon;
2233070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xday = day;
2234070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
2235070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2236070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    myear = xmon / 12;
223780b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (myear == 0) {
223880b19092f24410a6b869abf519227686e8f207caDaniel Veillard	minday = 0;
223980b19092f24410a6b869abf519227686e8f207caDaniel Veillard	maxday = 0;
224080b19092f24410a6b869abf519227686e8f207caDaniel Veillard    } else {
224180b19092f24410a6b869abf519227686e8f207caDaniel Veillard	maxday = 366 * ((myear + 3) / 4) +
224280b19092f24410a6b869abf519227686e8f207caDaniel Veillard	         365 * ((myear - 1) % 4);
224380b19092f24410a6b869abf519227686e8f207caDaniel Veillard	minday = maxday - 1;
224480b19092f24410a6b869abf519227686e8f207caDaniel Veillard    }
224580b19092f24410a6b869abf519227686e8f207caDaniel Veillard
2246070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmon = xmon % 12;
2247070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    minday += dayRange[0][xmon];
2248070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    maxday += dayRange[1][xmon];
2249070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
225080b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if ((maxday == minday) && (maxday == xday))
225180b19092f24410a6b869abf519227686e8f207caDaniel Veillard	return(0); /* can this really happen ? */
2252070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (maxday < xday)
225380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        return(-invert);
225480b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (minday > xday)
225580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        return(invert);
2256070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2257070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* indeterminate */
22585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return 2;
22595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
22605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
22615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/*
22625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * macros for adding date/times and durations
22635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
22645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT(a,b)                  (floor(((double)a/(double)b)))
22655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO(a,b)                     (a - FQUOTIENT(a,b) * b)
22665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT_RANGE(a,low,high)     (FQUOTIENT((a-low),(high-low)))
22675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO_RANGE(a,low,high)        ((MODULO((a-low),(high-low)))+low)
22685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
22695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
22705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateAdd:
22715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr
22725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dur: an #xmlSchemaValPtr of type #XS_DURATION
22735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
22745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compute a new date/time from @dt and @dur. This function assumes @dt
22755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH,
22765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * or #XML_SCHEMAS_GYEAR.
22775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
22785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns date/time pointer or NULL.
22795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
22805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr
22815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur)
22825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
22835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValPtr ret;
22845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long carry, tempdays, temp;
22855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValDatePtr r, d;
22865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValDurationPtr u;
22875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
22885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((dt == NULL) || (dur == NULL))
22895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
22905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
22915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ret = xmlSchemaNewValue(dt->type);
22925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret == NULL)
22935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
22945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
22955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r = &(ret->value.date);
22965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    d = &(dt->value.date);
22975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    u = &(dur->value.dur);
22985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
22995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalization */
23005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (d->mon == 0)
23015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        d->mon = 1;
23025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
23035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalize for time zone offset */
23045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    u->sec -= (d->tzo * 60);
23055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    d->tzo = 0;
23065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
23075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalization */
23085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (d->day == 0)
23095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        d->day = 1;
23105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
23115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* month */
23125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry  = d->mon + u->mon;
23135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->mon = MODULO_RANGE(carry, 1, 13);
23145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry  = FQUOTIENT_RANGE(carry, 1, 13);
23155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
23165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* year (may be modified later) */
23175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->year = d->year + carry;
23185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (r->year == 0) {
23195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (d->year > 0)
23205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            r->year--;
23215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else
23225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            r->year++;
23235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
23245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
23255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* time zone */
23265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->tzo     = d->tzo;
23275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->tz_flag = d->tz_flag;
23285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
23295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* seconds */
23305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->sec = d->sec + u->sec;
23315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry  = FQUOTIENT((long)r->sec, 60);
23325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (r->sec != 0.0) {
23335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        r->sec = MODULO(r->sec, 60.0);
23345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
23355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
23365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* minute */
23375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry += d->min;
23385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->min = MODULO(carry, 60);
23395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry  = FQUOTIENT(carry, 60);
23405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
23415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* hours */
23425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry  += d->hour;
23435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->hour = MODULO(carry, 24);
23445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry   = FQUOTIENT(carry, 24);
23455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
23465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
23475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * days
23485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * Note we use tempdays because the temporary values may need more
23495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * than 5 bits
23505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
23515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) &&
23525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                  (d->day > MAX_DAYINMONTH(r->year, r->mon)))
23535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = MAX_DAYINMONTH(r->year, r->mon);
23545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (d->day < 1)
23555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = 1;
23565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else
23575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = d->day;
23585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
23595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    tempdays += u->day + carry;
23605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
23615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    while (1) {
23625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (tempdays < 1) {
23635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            long tmon = MODULO_RANGE(r->mon-1, 1, 13);
23645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            long tyr  = r->year + FQUOTIENT_RANGE(r->mon-1, 1, 13);
23655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (tyr == 0)
23665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                tyr--;
23675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            tempdays += MAX_DAYINMONTH(tyr, tmon);
23685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            carry = -1;
23695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        } else if (tempdays > MAX_DAYINMONTH(r->year, r->mon)) {
23705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon);
23715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            carry = 1;
23725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        } else
23735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
23745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
23755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        temp = r->mon + carry;
23765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        r->mon = MODULO_RANGE(temp, 1, 13);
23775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        r->year = r->year + FQUOTIENT_RANGE(temp, 1, 13);
23785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (r->year == 0) {
23795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (temp < 1)
23805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                r->year--;
23815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else
23825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                r->year++;
23835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	}
23845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
23855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
23865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->day = tempdays;
23875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
23885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
23895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * adjust the date/time type to the date values
23905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
23915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret->type != XML_SCHEMAS_DATETIME) {
23925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if ((r->hour) || (r->min) || (r->sec))
23935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ret->type = XML_SCHEMAS_DATETIME;
23945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (ret->type != XML_SCHEMAS_DATE) {
23955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if ((r->mon != 1) && (r->day != 1))
23965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                ret->type = XML_SCHEMAS_DATE;
23975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1))
23985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                ret->type = XML_SCHEMAS_GYEARMONTH;
23995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
24005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
24015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
24025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
24035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
24045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
24055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
24065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaDupVal:
24075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @v: value to duplicate
24085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
24095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * returns a duplicated value.
24105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
24115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr
24125a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaDupVal (xmlSchemaValPtr v)
24135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
24145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValPtr ret = xmlSchemaNewValue(v->type);
24155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret == NULL)
24165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return ret;
24175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
24185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    memcpy(ret, v, sizeof(xmlSchemaVal));
24195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
24205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
24215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
24225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
24235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaDateNormalize:
24245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr
24255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
24265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Normalize @dt to GMT time.
24275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
24285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
24295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr
24305a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset)
24315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
24325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValPtr dur, ret;
24335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
24345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dt == NULL)
24355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
24365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
24375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (((dt->type != XML_SCHEMAS_TIME) &&
24385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard         (dt->type != XML_SCHEMAS_DATETIME)) || (dt->value.date.tzo == 0))
24395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return xmlSchemaDupVal(dt);
24405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
24415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION);
24425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dur == NULL)
24435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
24445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
24455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    dur->value.date.sec -= offset;
24465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
24475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ret = _xmlSchemaDateAdd(dt, dur);
24485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret == NULL)
24495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
24505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
24515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaFreeValue(dur);
24525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
24535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* ret->value.date.tzo = 0; */
24545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
24555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
24565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
24575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
24585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateCastYMToDays:
24595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr
24605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
24615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Convert mon and year of @dt to total number of days. Take the
24625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * number of years since (or before) 1 AD and add the number of leap
24635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years. This is a function  because negative
24645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years must be handled a little differently and there is no zero year.
24655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
24665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns number of days.
24675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
24685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic long
24695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt)
24705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
24715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long ret;
24725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
24735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dt->value.date.year < 0)
24745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ret = (dt->value.date.year * 365) +
24755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+
24765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard               ((dt->value.date.year+1)/400)) +
24775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              DAY_IN_YEAR(0, dt->value.date.mon, dt->value.date.year);
24785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else
24795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ret = ((dt->value.date.year-1) * 365) +
24805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+
24815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard               ((dt->value.date.year-1)/400)) +
24825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              DAY_IN_YEAR(0, dt->value.date.mon, dt->value.date.year);
24835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
24845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
24855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
24865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
24875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
24885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * TIME_TO_NUMBER:
24895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt:  an #xmlSchemaValPtr
24905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
24915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Calculates the number of seconds in the time portion of @dt.
24925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
24935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns seconds.
24945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
24955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define TIME_TO_NUMBER(dt)                              \
24965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ((double)((dt->value.date.hour * SECS_PER_HOUR) +   \
24975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              (dt->value.date.min * SECS_PER_MIN)) + dt->value.date.sec)
24985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
24995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
25005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaCompareDates:
25015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @x:  a first date/time value
25025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @y:  a second date/time value
25035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
25045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compare 2 date/times
25055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
25065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
25075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error
25085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
25095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic int
25105a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y)
25115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
25125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    unsigned char xmask, ymask, xor_mask, and_mask;
25135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValPtr p1, p2, q1, q2;
25145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long p1d, p2d, q1d, q2d;
25155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
25165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((x == NULL) || (y == NULL))
25175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return -2;
25185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
25195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (x->value.date.tz_flag) {
25205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
25215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (!y->value.date.tz_flag) {
25225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            p1 = xmlSchemaDateNormalize(x, 0);
25235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
25245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            /* normalize y + 14:00 */
25255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR));
25265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
25275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
2528fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            if (p1d < q1d) {
2529fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
2530fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
25315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return -1;
2532fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    } else if (p1d == q1d) {
25335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                double sec;
25345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
25355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
2536fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard                if (sec < 0.0) {
2537fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		    xmlSchemaFreeValue(p1);
2538fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		    xmlSchemaFreeValue(q1);
25395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    return -1;
2540fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		} else {
25415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    /* normalize y - 14:00 */
25425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR));
25435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day;
2544fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		    xmlSchemaFreeValue(p1);
2545fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		    xmlSchemaFreeValue(q1);
2546fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		    xmlSchemaFreeValue(q2);
25475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    if (p1d > q2d)
25485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        return 1;
25495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    else if (p1d == q2d) {
25505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2);
25515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        if (sec > 0.0)
25525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                            return 1;
25535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        else
25545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                            return 2; /* indeterminate */
25555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    }
25565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                }
2557fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            } else {
2558fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
2559fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
2560fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    }
25615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
25625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    } else if (y->value.date.tz_flag) {
25635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1 = xmlSchemaDateNormalize(y, 0);
25645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
25655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
25665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        /* normalize x - 14:00 */
25675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR));
25685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
25695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
2570fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard        if (p1d < q1d) {
2571fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(p1);
2572fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(q1);
25735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
2574fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else if (p1d == q1d) {
25755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            double sec;
25765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
25775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
2578fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            if (sec < 0.0) {
2579fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
2580fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
25815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return -1;
2582fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    } else {
25835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                /* normalize x + 14:00 */
25845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR));
25855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day;
25865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
25876560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                if (p2d > q1d) {
25886560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		    xmlSchemaFreeValue(p1);
25896560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		    xmlSchemaFreeValue(q1);
25906560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		    xmlSchemaFreeValue(p2);
25915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    return 1;
25926560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		} else if (p2d == q1d) {
25935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1);
25946560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		    xmlSchemaFreeValue(p1);
25956560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		    xmlSchemaFreeValue(q1);
25966560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		    xmlSchemaFreeValue(p2);
25975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    if (sec > 0.0)
25985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        return 1;
25995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    else
26005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        return 2; /* indeterminate */
26015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                }
26026560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(p1);
26036560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(q1);
26046560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(p2);
26055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            }
2606fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else {
2607fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(p1);
2608fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(q1);
26095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
26105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
26115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
26125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
26135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * if the same type then calculate the difference
26145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
26155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (x->type == y->type) {
26165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1 = xmlSchemaDateNormalize(y, 0);
26175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
26185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
26195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1 = xmlSchemaDateNormalize(x, 0);
26205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
26215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
2622fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard        if (p1d < q1d) {
2623fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(p1);
2624fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(q1);
26255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
2626fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else if (p1d > q1d) {
2627fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(p1);
2628fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(q1);
26295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
2630fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else {
26315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            double sec;
26325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
26335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
2634fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(p1);
2635fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(q1);
26365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (sec < 0.0)
26375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return -1;
26385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else if (sec > 0.0)
26395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return 1;
26405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
26415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
26425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 0;
26435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
26445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
26455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    switch (x->type) {
26465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
26475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0xf;
26485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
26495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
26505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x7;
26515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
26525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
26535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x1;
26545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
26555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
26565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x2;
26575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
26585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
26595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x3;
26605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
26615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
26625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x3;
26635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
26645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
26655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x6;
26665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
26675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
26685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x8;
26695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
26705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        default:
26715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0;
26725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
26735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
26745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
26755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    switch (y->type) {
26765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
26775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0xf;
26785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
26795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
26805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x7;
26815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
26825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
26835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x1;
26845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
26855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
26865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x2;
26875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
26885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
26895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x3;
26905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
26915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
26925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x3;
26935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
26945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
26955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x6;
26965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
26975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
26985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x8;
26995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
27005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        default:
27015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0;
27025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
27035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
27045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
27055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xor_mask = xmask ^ ymask;           /* mark type differences */
27065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    and_mask = xmask & ymask;           /* mark field specification */
27075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
27085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* year */
27095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 1)
27105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
27115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 1) {
27125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.year < y->value.date.year)
27135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
27145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.year > y->value.date.year)
27155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
27165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
27175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
27185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* month */
27195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 2)
27205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
27215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 2) {
27225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.mon < y->value.date.mon)
27235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
27245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.mon > y->value.date.mon)
27255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
27265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
27275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
27285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* day */
27295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 4)
27305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
27315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 4) {
27325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.day < y->value.date.day)
27335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
27345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.day > y->value.date.day)
27355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
27365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
27375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
27385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* time */
27395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 8)
27405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
27415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 8) {
27425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.hour < y->value.date.hour)
27435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
27445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.hour > y->value.date.hour)
27455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
27465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.min < y->value.date.min)
27475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
27485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.min > y->value.date.min)
27495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
27505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.sec < y->value.date.sec)
27515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
27525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.sec > y->value.date.sec)
27535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
27545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
27555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
2756070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
2757070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
2758070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2759070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
2760c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaCompareNormStrings:
2761c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @x:  a first string value
2762c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @y:  a second string value
2763c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
2764c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Compare 2 string for their normalized values.
2765c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
2766c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
2767c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * case of error
2768c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */
2769c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int
2770c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaCompareNormStrings(xmlSchemaValPtr x, xmlSchemaValPtr y) {
2771c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    const xmlChar *utf1;
2772c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    const xmlChar *utf2;
2773c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    int tmp;
2774c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
2775c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    if ((x == NULL) || (y == NULL))
2776c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	return(-2);
2777c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    utf1 = x->value.str;
2778c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    utf2 = y->value.str;
2779c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
2780c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    while (IS_BLANK(*utf1)) utf1++;
2781c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    while (IS_BLANK(*utf2)) utf2++;
2782c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    while ((*utf1 != 0) && (*utf2 != 0)) {
2783c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	if (IS_BLANK(*utf1)) {
2784c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (!IS_BLANK(*utf2)) {
2785c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		tmp = *utf1 - *utf2;
2786c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(tmp);
2787c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    }
2788c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    while (IS_BLANK(*utf1)) utf1++;
2789c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    while (IS_BLANK(*utf2)) utf2++;
2790c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	} else {
2791c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    tmp = *utf1++ - *utf2++;
2792c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (tmp < 0)
2793c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(-1);
2794c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (tmp > 0)
2795c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(1);
2796c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	}
2797c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
2798c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    if (*utf1 != 0) {
2799c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	while (IS_BLANK(*utf1)) utf1++;
2800c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	if (*utf1 != 0)
2801c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    return(1);
2802c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
2803c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    if (*utf2 != 0) {
2804c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	while (IS_BLANK(*utf2)) utf2++;
2805c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	if (*utf2 != 0)
2806c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    return(-1);
2807c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
2808c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    return(0);
2809c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard}
2810c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
2811c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/**
2812b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCompareFloats:
2813b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @x:  a first float or double value
2814b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @y:  a second float or double value
2815b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
2816b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Compare 2 values
2817b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
2818b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
2819b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * case of error
2820b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
2821b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int
2822b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) {
2823b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    double d1, d2;
2824b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
2825b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if ((x == NULL) || (y == NULL))
2826b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
2827b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
2828b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
2829b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * Cast everything to doubles.
2830b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
2831b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (x->type == XML_SCHEMAS_DOUBLE)
2832b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d1 = x->value.d;
2833b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else if (x->type == XML_SCHEMAS_FLOAT)
2834b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d1 = x->value.f;
2835b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else
2836b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
2837b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
2838b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (y->type == XML_SCHEMAS_DOUBLE)
2839b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d2 = y->value.d;
2840b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else if (y->type == XML_SCHEMAS_FLOAT)
2841b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d2 = y->value.f;
2842b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else
2843b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
2844b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
2845b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
2846b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * Check for special cases.
2847b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
2848b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (xmlXPathIsNaN(d1)) {
2849b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (xmlXPathIsNaN(d2))
2850b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
2851b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(1);
2852b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
2853b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (xmlXPathIsNaN(d2))
2854b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-1);
2855b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == xmlXPathPINF) {
2856b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (d2 == xmlXPathPINF)
2857b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
2858b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(1);
2859b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
2860b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d2 == xmlXPathPINF)
2861b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(-1);
2862b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == xmlXPathNINF) {
2863b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (d2 == xmlXPathNINF)
2864b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
2865b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(-1);
2866b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
2867b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d2 == xmlXPathNINF)
2868b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(1);
2869b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
2870b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
2871b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * basic tests, the last one we should have equality, but
2872b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * portability is more important than speed and handling
2873b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * NaN or Inf in a portable way is always a challenge, so ...
2874b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
2875b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 < d2)
2876b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-1);
2877b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 > d2)
2878b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(1);
2879b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == d2)
2880b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(0);
2881b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return(2);
2882b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
2883b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
2884b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
28854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareValues:
28864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x:  a first value
28874255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y:  a second value
28884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
28894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 values
28904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
28915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
28925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error
28934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
289480b19092f24410a6b869abf519227686e8f207caDaniel Veillardint
28954255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) {
28964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if ((x == NULL) || (y == NULL))
28974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(-2);
28984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
28994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    switch (x->type) {
290080b19092f24410a6b869abf519227686e8f207caDaniel Veillard	case XML_SCHEMAS_UNKNOWN:
290180b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    return(-2);
290280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_INTEGER:
290380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NPINTEGER:
290480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NINTEGER:
290580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NNINTEGER:
290680b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_PINTEGER:
290780b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_INT:
290880b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_UINT:
290980b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_LONG:
291080b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ULONG:
291180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_SHORT:
291280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_USHORT:
291380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_BYTE:
291480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_UBYTE:
29154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMAS_DECIMAL:
291680b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    if (y->type == x->type)
291780b19092f24410a6b869abf519227686e8f207caDaniel Veillard		return(xmlSchemaCompareDecimals(x, y));
291880b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    if ((y->type == XML_SCHEMAS_DECIMAL) ||
291980b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_INTEGER) ||
292080b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_NPINTEGER) ||
292180b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_NINTEGER) ||
292280b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_NNINTEGER) ||
292380b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_PINTEGER) ||
292480b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_INT) ||
292580b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_UINT) ||
292680b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_LONG) ||
292780b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_ULONG) ||
292880b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_SHORT) ||
292980b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_USHORT) ||
293080b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_BYTE) ||
293180b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_UBYTE))
29324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(xmlSchemaCompareDecimals(x, y));
29335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    return(-2);
2934070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        case XML_SCHEMAS_DURATION:
2935070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (y->type == XML_SCHEMAS_DURATION)
2936070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return(xmlSchemaCompareDurations(x, y));
29375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return(-2);
29385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
29395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
29405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
29415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
29425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
29435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
29445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
29455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
29465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if ((y->type == XML_SCHEMAS_DATETIME)  ||
29475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_TIME)      ||
29485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_GDAY)      ||
29495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_GMONTH)    ||
29505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_GMONTHDAY) ||
29515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_GYEAR)     ||
29525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_DATE)      ||
29535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_GYEARMONTH))
29545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return (xmlSchemaCompareDates(x, y));
29555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return (-2);
295680b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NORMSTRING:
295780b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_TOKEN:
295880b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_LANGUAGE:
295980b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NMTOKEN:
296080b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NAME:
296180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NCNAME:
296280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ID:
296380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_IDREF:
296480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ENTITY:
296580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NOTATION:
296680b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ANYURI:
2967c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard            if ((y->type == XML_SCHEMAS_NORMSTRING) ||
2968c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_TOKEN) ||
2969c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_LANGUAGE) ||
2970c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_NMTOKEN) ||
2971c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_NAME) ||
2972c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_QNAME) ||
2973c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_NCNAME) ||
2974c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_ID) ||
2975c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_IDREF) ||
2976c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_ENTITY) ||
2977c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_NOTATION) ||
2978c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_ANYURI))
2979c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                return (xmlSchemaCompareNormStrings(x, y));
2980c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard            return (-2);
2981e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_QNAME:
2982e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard            if (y->type == XML_SCHEMAS_QNAME) {
2983e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) &&
2984e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    (xmlStrEqual(x->value.qname.uri, y->value.qname.uri)))
2985e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    return(0);
2986e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		return(2);
2987e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    }
2988e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (-2);
2989c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_FLOAT:
2990c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_DOUBLE:
2991b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard            if ((y->type == XML_SCHEMAS_FLOAT) ||
2992b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard                (y->type == XML_SCHEMAS_DOUBLE))
2993b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard                return (xmlSchemaCompareFloats(x, y));
2994b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard            return (-2);
29954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    TODO
2996c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    break;
2997c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_BOOLEAN:
2998b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard            if (y->type == XML_SCHEMAS_BOOLEAN) {
2999b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (x->value.b == y->value.b)
3000b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    return(0);
3001b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (x->value.b == 0)
3002b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    return(-1);
3003b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		return(1);
3004b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
3005b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return (-2);
3006c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_STRING:
3007c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_IDREFS:
3008c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ENTITIES:
3009c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NMTOKENS:
3010c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    TODO
3011c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    break;
30124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
30135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return -2;
30144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
30154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
30164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
3017c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaNormLen:
3018c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @value:  a string
3019c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
3020c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Computes the UTF8 length of the normalized value of the string
3021c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
3022c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns the length or -1 in case of error.
3023c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */
3024c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int
3025c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaNormLen(const xmlChar *value) {
3026c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    const xmlChar *utf;
3027c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    int ret = 0;
3028c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
3029c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    if (value == NULL)
3030c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	return(-1);
3031c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    utf = value;
3032c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    while (IS_BLANK(*utf)) utf++;
3033c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    while (*utf != 0) {
3034c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	if (utf[0] & 0x80) {
3035c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if ((utf[1] & 0xc0) != 0x80)
3036c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(-1);
3037c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if ((utf[0] & 0xe0) == 0xe0) {
3038c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		if ((utf[2] & 0xc0) != 0x80)
3039c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    return(-1);
3040c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		if ((utf[0] & 0xf0) == 0xf0) {
3041c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80)
3042c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard			return(-1);
3043c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    utf += 4;
3044c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		} else {
3045c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    utf += 3;
3046c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		}
3047c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    } else {
3048c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		utf += 2;
3049c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    }
3050c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	} else if (IS_BLANK(*utf)) {
3051c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    while (IS_BLANK(*utf)) utf++;
3052c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (*utf == 0)
3053c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		break;
3054c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	} else {
3055c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    utf++;
3056c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	}
3057c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	ret++;
3058c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
3059c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    return(ret);
3060c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard}
3061c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
3062c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/**
30634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaValidateFacet:
306401c13b5be2d249ef66d86585adee87901bb8efa2Daniel Veillard * @base:  the base type
30654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @facet:  the facet to check
30664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value:  the lexical repr of the value to validate
30674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val:  the precomputed value
30684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
30694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Check a value against a facet condition
30704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
30714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if the element is schemas valid, a positive error code
30724255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *     number otherwise and -1 in case of internal or API error.
30734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
30744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardint
3075dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateFacet(xmlSchemaTypePtr base ATTRIBUTE_UNUSED,
3076118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	               xmlSchemaFacetPtr facet,
30774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	               const xmlChar *value, xmlSchemaValPtr val)
30784255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{
30794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    int ret;
30804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
30814255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    switch (facet->type) {
30824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMA_FACET_PATTERN:
30834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    ret = xmlRegexpExec(facet->regexp, value);
30844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == 1)
30854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(0);
30864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == 0) {
30878bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		/* TODO error code */
30884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(1);
30894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    }
30904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    return(ret);
30914255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMA_FACET_MAXEXCLUSIVE:
30924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
30934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == -2) {
30948bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		/* TODO error code */
30954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(-1);
30964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    }
30974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == -1)
30984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(0);
30995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    /* error code */
31004255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    return(1);
3101070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MAXINCLUSIVE:
3102070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
3103070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret == -2) {
31048bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		/* TODO error code */
3105070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
3106070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }
3107070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((ret == -1) || (ret == 0))
3108070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
31095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    /* error code */
3110070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return(1);
3111070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MINEXCLUSIVE:
3112070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
3113070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret == -2) {
31148bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		/* TODO error code */
3115070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
3116070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }
3117070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret == 1)
3118070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
31195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    /* error code */
3120070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return(1);
3121070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MININCLUSIVE:
3122070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
3123070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret == -2) {
31248bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		/* TODO error code */
3125070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
3126070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }
3127070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((ret == 1) || (ret == 0))
3128070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
31295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    /* error code */
3130070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return(1);
31318651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard	case XML_SCHEMA_FACET_WHITESPACE:
31328bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    /* TODO whitespaces */
31338651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard	    return(0);
31348bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case  XML_SCHEMA_FACET_ENUMERATION:
31358bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    if ((facet->value != NULL) &&
31368bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		(xmlStrEqual(facet->value, value)))
31378bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		return(0);
31388bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    return(1);
31398bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case XML_SCHEMA_FACET_LENGTH:
3140e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard	case XML_SCHEMA_FACET_MAXLENGTH:
31418bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case XML_SCHEMA_FACET_MINLENGTH: {
31428bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    unsigned int len = 0;
3143e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard
31448bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    if ((facet->val == NULL) ||
3145e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		((facet->val->type != XML_SCHEMAS_DECIMAL) &&
3146e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
31478bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		(facet->val->value.decimal.frac != 0)) {
31488bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		return(-1);
31498bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    }
31508bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    switch (base->flags) {
3151c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		case XML_SCHEMAS_IDREF:
31528bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		case XML_SCHEMAS_NORMSTRING:
31538bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		case XML_SCHEMAS_TOKEN:
31548bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		case XML_SCHEMAS_LANGUAGE:
31558bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		case XML_SCHEMAS_NMTOKEN:
31568bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		case XML_SCHEMAS_NAME:
31578bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		case XML_SCHEMAS_NCNAME:
31588bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		case XML_SCHEMAS_ID:
3159c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    len = xmlSchemaNormLen(value);
3160c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    break;
3161c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		case XML_SCHEMAS_STRING:
31628bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		    len = xmlUTF8Strlen(value);
31638bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		    break;
31648bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		default:
31658bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		    TODO
31668bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    }
31678bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
3168e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len != facet->val->value.decimal.lo)
31698bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		    return(1);
31708bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
3171e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len < facet->val->value.decimal.lo)
3172e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard		    return(1);
31738bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    } else {
3174e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len > facet->val->value.decimal.lo)
3175e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard		    return(1);
3176e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard	    }
31778bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    break;
31788bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	}
31794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	default:
31804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    TODO
31814255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
31824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return(0);
3183b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
31844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
31854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
31864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#endif /* LIBXML_SCHEMAS_ENABLED */
3187