xmlschemastypes.c revision 6e224f1272bc2a7d069b72f70b3ce737caf3cf81
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
34d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillard#ifndef LIBXML_XPATH_ENABLED
35d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillardextern double xmlXPathNAN;
36d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillardextern double xmlXPathPINF;
37d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillardextern double xmlXPathNINF;
38d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillard#endif
39d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillard
404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define TODO 								\
414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlGenericError(xmlGenericErrorContext,				\
424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    "Unimplemented block at %s:%d\n",				\
434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard            __FILE__, __LINE__);
444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define XML_SCHEMAS_NAMESPACE_NAME \
464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    (const xmlChar *)"http://www.w3.org/2001/XMLSchema"
474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik#define IS_WSP_REPLACE_CH(c)	((((c) == 0x9) || ((c) == 0xa)) || \
496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				 ((c) == 0xd))
506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik#define IS_WSP_SPACE_CH(c)	((c) == 0x20)
526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
545f704afe98c584b7188aa0e4fbc9d9e68e0d7b1bDaniel Veillardstatic unsigned long powten[10] = {
554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    1, 10, 100, 1000, 10000, 100000, 1000000, 10000000L,
564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    100000000L, 1000000000L
574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard};
584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
5901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
60070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* Date value */
61070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef struct _xmlSchemaValDate xmlSchemaValDate;
62070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef xmlSchemaValDate *xmlSchemaValDatePtr;
63070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstruct _xmlSchemaValDate {
64070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long		year;
65070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	mon	:4;	/* 1 <=  mon    <= 12   */
66070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	day	:5;	/* 1 <=  day    <= 31   */
67070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	hour	:5;	/* 0 <=  hour   <= 23   */
68070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	min	:6;	/* 0 <=  min    <= 59	*/
69070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    double		sec;
70a77cf71f453249f224d609f2f20789a897c5bdebDaniel Veillard    unsigned int	tz_flag	:1;	/* is tzo explicitely set? */
71070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int			tzo	:11;	/* -1440 <= tzo <= 1440 */
72070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard};
73070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
74070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* Duration value */
75070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef struct _xmlSchemaValDuration xmlSchemaValDuration;
76070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef xmlSchemaValDuration *xmlSchemaValDurationPtr;
77070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstruct _xmlSchemaValDuration {
78070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long	        mon;		/* mon stores years also */
79070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long        	day;
80070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    double		sec;            /* sec stores min and hour also */
81070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard};
82070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardtypedef struct _xmlSchemaValDecimal xmlSchemaValDecimal;
844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardtypedef xmlSchemaValDecimal *xmlSchemaValDecimalPtr;
854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstruct _xmlSchemaValDecimal {
864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    /* would use long long but not portable */
87e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long lo;
88e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long mi;
89e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long hi;
904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    unsigned int extra;
915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    unsigned int sign:1;
92c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack    unsigned int frac:7;
93c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack    unsigned int total:8;
944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard};
954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
96e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardtypedef struct _xmlSchemaValQName xmlSchemaValQName;
97e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardtypedef xmlSchemaValQName *xmlSchemaValQNamePtr;
98e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstruct _xmlSchemaValQName {
99e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    xmlChar *name;
100e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    xmlChar *uri;
101e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard};
102e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
10370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardtypedef struct _xmlSchemaValHex xmlSchemaValHex;
10470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardtypedef xmlSchemaValHex *xmlSchemaValHexPtr;
10570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardstruct _xmlSchemaValHex {
10670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard    xmlChar     *str;
10770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard    unsigned int total;
10870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard};
10970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
1101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardtypedef struct _xmlSchemaValBase64 xmlSchemaValBase64;
1111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardtypedef xmlSchemaValBase64 *xmlSchemaValBase64Ptr;
1121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstruct _xmlSchemaValBase64 {
1131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    xmlChar     *str;
1141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    unsigned int total;
1151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard};
1161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
1174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstruct _xmlSchemaVal {
1184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValType type;
1194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    union {
1205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	xmlSchemaValDecimal     decimal;
121070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xmlSchemaValDate        date;
122070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xmlSchemaValDuration    dur;
123e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	xmlSchemaValQName	qname;
12470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	xmlSchemaValHex		hex;
1251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	xmlSchemaValBase64	base64;
12684d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard	float			f;
12784d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard	double			d;
128c5a70f264550ee39da267e81dccd95508ed367ddDaniel Veillard	int			b;
129c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	xmlChar                *str;
1304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    } value;
1314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard};
1324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
1334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int xmlSchemaTypesInitialized = 0;
1344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlHashTablePtr xmlSchemaTypesBank = NULL;
1354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
136c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard/*
137c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * Basic types
138c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */
1394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeStringDef = NULL;
1404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnyTypeDef = NULL;
1414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnySimpleTypeDef = NULL;
1424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDecimalDef = NULL;
143070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDatetimeDef = NULL;
1444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDateDef = NULL;
145070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeTimeDef = NULL;
146070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGYearDef = NULL;
147070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGYearMonthDef = NULL;
148070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGDayDef = NULL;
149070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGMonthDayDef = NULL;
150070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGMonthDef = NULL;
151070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDurationDef = NULL;
15284d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeFloatDef = NULL;
153c5a70f264550ee39da267e81dccd95508ed367ddDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeBooleanDef = NULL;
15484d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDoubleDef = NULL;
155560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeHexBinaryDef = NULL;
1561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeBase64BinaryDef = NULL;
157e5b110b3844d58ff4bea56bcb699144f6fbe0b83Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnyURIDef = NULL;
1584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
1594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/*
160c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * Derived types
161c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */
162c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypePositiveIntegerDef = NULL;
163c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNonPositiveIntegerDef = NULL;
164c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNegativeIntegerDef = NULL;
165c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNonNegativeIntegerDef = NULL;
166c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIntegerDef = NULL;
167c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeLongDef = NULL;
168c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIntDef = NULL;
169c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeShortDef = NULL;
170c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeByteDef = NULL;
171c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedLongDef = NULL;
172c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedIntDef = NULL;
173c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedShortDef = NULL;
174c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedByteDef = NULL;
1758bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNormStringDef = NULL;
1768bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeTokenDef = NULL;
1778bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeLanguageDef = NULL;
1788bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNameDef = NULL;
1798bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeQNameDef = NULL;
180e5b110b3844d58ff4bea56bcb699144f6fbe0b83Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNCNameDef = NULL;
1818bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdDef = NULL;
1828bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdrefDef = NULL;
1838bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdrefsDef = NULL;
184a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeEntityDef = NULL;
185a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeEntitiesDef = NULL;
186e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNotationDef = NULL;
1878bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNmtokenDef = NULL;
1888bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNmtokensDef = NULL;
189c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard
190d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/************************************************************************
191d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *									*
192d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * 			Datatype error handlers				*
193d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *									*
194d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard ************************************************************************/
195d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/**
196d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * xmlSchemaTypeErrMemory:
197d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * @extra:  extra informations
198d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *
199d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * Handle an out of memory condition
200d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard */
201d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillardstatic void
202d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel VeillardxmlSchemaTypeErrMemory(xmlNodePtr node, const char *extra)
203d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard{
204d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard    __xmlSimpleError(XML_FROM_DATATYPE, XML_ERR_NO_MEMORY, node, NULL, extra);
205d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard}
206d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard
207d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/************************************************************************
208d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *									*
209d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * 			Base types support				*
210d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *									*
211d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard ************************************************************************/
212c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard/*
2134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitBasicType:
2144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name:  the type name
2158bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard * @type:  the value type associated
2164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
21701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Initialize one primitive built-in type
2184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
2194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr
22001fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaInitBasicType(const char *name, xmlSchemaValType type,
22101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		       xmlSchemaTypePtr baseType) {
2224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypePtr ret;
2234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
2244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType));
2254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (ret == NULL) {
226d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard        xmlSchemaTypeErrMemory(NULL, "could not initialize basic types");
2274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(NULL);
2284255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
2294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    memset(ret, 0, sizeof(xmlSchemaType));
230be9c6320d4ed8d5622322014310555bb88b02a85Daniel Veillard    ret->name = (const xmlChar *)name;
2314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    ret->type = XML_SCHEMA_TYPE_BASIC;
23201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    ret->baseType = baseType;
23301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    /*
23401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * Hack to reflect the variety.
23501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
23601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if ((type == XML_SCHEMAS_IDREFS) ||
23701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	(type == XML_SCHEMAS_NMTOKENS) ||
23801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	(type == XML_SCHEMAS_ENTITIES))
23901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	ret->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST;
2402f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack    else if ((type != XML_SCHEMAS_ANYTYPE) &&
2412f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	(type != XML_SCHEMAS_ANYSIMPLETYPE))
24201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	ret->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC;
2434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    ret->contentType = XML_SCHEMA_CONTENT_BASIC;
24401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type) {
24501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_STRING:
24601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DECIMAL:
24701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATE:
24801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATETIME:
24901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TIME:
25001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEAR:
25101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEARMONTH:
25201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTH:
25301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTHDAY:
25401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GDAY:
25501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DURATION:
25601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_FLOAT:
25701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DOUBLE:
25801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BOOLEAN:
25901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYURI:
26001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_HEXBINARY:
26101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BASE64BINARY:
26201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_QNAME:
26301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NOTATION:
26401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    ret->flags |= XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE;
26596d2effc735fb45cfa363b6a876ff23a862f87a5William M. Brack	default:
26696d2effc735fb45cfa363b6a876ff23a862f87a5William M. Brack	break;
26701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
26801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
2694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlHashAddEntry2(xmlSchemaTypesBank, ret->name,
2704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	             XML_SCHEMAS_NAMESPACE_NAME, ret);
27101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    ret->builtInType = type;
2724255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return(ret);
2734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
2744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
2754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/*
2764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitTypes:
2774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
2784255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Initialize the default XML Schemas type library
2794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
2804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid
2816560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel VeillardxmlSchemaInitTypes(void)
2826560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard{
2834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized != 0)
2846560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        return;
2854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypesBank = xmlHashCreate(40);
2866560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard
28701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
288c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard    /*
28901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * 3.4.7 Built-in Complex Type Definition
29001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
2918bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeAnyTypeDef = xmlSchemaInitBasicType("anyType",
2922f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack                                                     XML_SCHEMAS_ANYTYPE,
29301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     NULL);
29401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeAnyTypeDef->baseType = xmlSchemaTypeAnyTypeDef;
29501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED;
29601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    {
29701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaWildcardPtr wild;
29801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
29901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard));
30001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (wild == NULL) {
3012f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	    xmlSchemaTypeErrMemory(NULL, "could not create an attribute wildcard on anyType");
30201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return;
30301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
30401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	memset(wild, 0, sizeof(xmlSchemaWildcard));
30501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	wild->any = 1;
30601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	wild->processContents = XML_SCHEMAS_ANY_LAX;
30701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	wild->minOccurs = 1;
30801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	wild->maxOccurs = 1;
30901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeAnyTypeDef->attributeWildcard = wild;
31001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
31101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeAnySimpleTypeDef = xmlSchemaInitBasicType("anySimpleType",
3122f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack                                                           XML_SCHEMAS_ANYSIMPLETYPE,
31301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard							   xmlSchemaTypeAnyTypeDef);
31401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    /*
31501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * primitive datatypes
31601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
31701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeStringDef = xmlSchemaInitBasicType("string",
31801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_STRING,
31901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
3208bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDecimalDef = xmlSchemaInitBasicType("decimal",
32101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_DECIMAL,
32201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeAnySimpleTypeDef);
3238bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDateDef = xmlSchemaInitBasicType("date",
32401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_DATE,
32501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeAnySimpleTypeDef);
3268bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDatetimeDef = xmlSchemaInitBasicType("dateTime",
32701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_DATETIME,
32801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						      xmlSchemaTypeAnySimpleTypeDef);
3298bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeTimeDef = xmlSchemaInitBasicType("time",
33001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_TIME,
33101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeAnySimpleTypeDef);
3328bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGYearDef = xmlSchemaInitBasicType("gYear",
33301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_GYEAR,
33401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeAnySimpleTypeDef);
3358bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGYearMonthDef = xmlSchemaInitBasicType("gYearMonth",
33601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                        XML_SCHEMAS_GYEARMONTH,
33701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard							xmlSchemaTypeAnySimpleTypeDef);
3388bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGMonthDef = xmlSchemaInitBasicType("gMonth",
33901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_GMONTH,
34001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
3418bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGMonthDayDef = xmlSchemaInitBasicType("gMonthDay",
34201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                       XML_SCHEMAS_GMONTHDAY,
34301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						       xmlSchemaTypeAnySimpleTypeDef);
3448bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGDayDef = xmlSchemaInitBasicType("gDay",
34501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_GDAY,
34601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeAnySimpleTypeDef);
3478bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDurationDef = xmlSchemaInitBasicType("duration",
34801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_DURATION,
34901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						      xmlSchemaTypeAnySimpleTypeDef);
3508bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float",
35101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_FLOAT,
35201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeAnySimpleTypeDef);
3538bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double",
35401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_DOUBLE,
35501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
3568bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeBooleanDef = xmlSchemaInitBasicType("boolean",
35701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_BOOLEAN,
35801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeAnySimpleTypeDef);
3598bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeAnyURIDef = xmlSchemaInitBasicType("anyURI",
36001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_ANYURI,
36101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
362560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard    xmlSchemaTypeHexBinaryDef = xmlSchemaInitBasicType("hexBinary",
36301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_HEXBINARY,
36401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeAnySimpleTypeDef);
3651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    xmlSchemaTypeBase64BinaryDef
36601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        = xmlSchemaInitBasicType("base64Binary", XML_SCHEMAS_BASE64BINARY,
36701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeAnySimpleTypeDef);
36801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNotationDef = xmlSchemaInitBasicType("NOTATION",
36901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_NOTATION,
37001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
37101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeQNameDef = xmlSchemaInitBasicType("QName",
37201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_QNAME,
37301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeAnySimpleTypeDef);
3744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
375c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard    /*
376c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard     * derived datatypes
377c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard     */
3788bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeIntegerDef = xmlSchemaInitBasicType("integer",
37901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_INTEGER,
38001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeDecimalDef);
3816560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeNonPositiveIntegerDef =
3826560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        xmlSchemaInitBasicType("nonPositiveInteger",
38301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                               XML_SCHEMAS_NPINTEGER,
38401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard			       xmlSchemaTypeIntegerDef);
3856560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeNegativeIntegerDef =
38601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("negativeInteger", XML_SCHEMAS_NINTEGER,
38701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeNonPositiveIntegerDef);
3886560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeLongDef =
38901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("long", XML_SCHEMAS_LONG,
39001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeIntegerDef);
39101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeIntDef = xmlSchemaInitBasicType("int", XML_SCHEMAS_INT,
39201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeLongDef);
3938bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeShortDef = xmlSchemaInitBasicType("short",
39401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_SHORT,
39501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeIntDef);
3968bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeByteDef = xmlSchemaInitBasicType("byte",
39701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_BYTE,
39801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeShortDef);
3996560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeNonNegativeIntegerDef =
4006560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        xmlSchemaInitBasicType("nonNegativeInteger",
40101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                               XML_SCHEMAS_NNINTEGER,
40201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard			       xmlSchemaTypeIntegerDef);
4036560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedLongDef =
40401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedLong", XML_SCHEMAS_ULONG,
40501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeNonNegativeIntegerDef);
4066560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedIntDef =
40701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedInt", XML_SCHEMAS_UINT,
40801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeUnsignedLongDef);
4096560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedShortDef =
41001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedShort", XML_SCHEMAS_USHORT,
41101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeUnsignedIntDef);
4126560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedByteDef =
41301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedByte", XML_SCHEMAS_UBYTE,
41401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeUnsignedShortDef);
4156560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypePositiveIntegerDef =
41601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("positiveInteger", XML_SCHEMAS_PINTEGER,
41701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeNonNegativeIntegerDef);
4188bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeNormStringDef = xmlSchemaInitBasicType("normalizedString",
41901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                        XML_SCHEMAS_NORMSTRING,
42001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard							xmlSchemaTypeStringDef);
4218bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeTokenDef = xmlSchemaInitBasicType("token",
42201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_TOKEN,
42301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeNormStringDef);
4248bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeLanguageDef = xmlSchemaInitBasicType("language",
42501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_LANGUAGE,
42601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						      xmlSchemaTypeTokenDef);
42701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNameDef = xmlSchemaInitBasicType("Name",
42801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_NAME,
42901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeTokenDef);
43001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNmtokenDef = xmlSchemaInitBasicType("NMTOKEN",
43101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_NMTOKEN,
43201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeTokenDef);
43301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNCNameDef = xmlSchemaInitBasicType("NCName",
43401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_NCNAME,
43501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeNameDef);
43601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeIdDef = xmlSchemaInitBasicType("ID", XML_SCHEMAS_ID,
43701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeNCNameDef);
4388bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeIdrefDef = xmlSchemaInitBasicType("IDREF",
43901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_IDREF,
44001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeNCNameDef);
4418bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeIdrefsDef = xmlSchemaInitBasicType("IDREFS",
44201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_IDREFS,
44301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeIdrefDef);
44401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNmtokensDef = xmlSchemaInitBasicType("NMTOKENS",
44501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_NMTOKENS,
44601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						      xmlSchemaTypeNmtokenDef);
447a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    xmlSchemaTypeEntityDef = xmlSchemaInitBasicType("ENTITY",
44801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_ENTITY,
44901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeNCNameDef);
450a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    xmlSchemaTypeEntitiesDef = xmlSchemaInitBasicType("ENTITIES",
45101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_ENTITIES,
45201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						      xmlSchemaTypeNCNameDef);
4534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypesInitialized = 1;
4544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
4554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
4564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
4574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCleanupTypes:
4584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
4594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library
4604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
4614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid
4624255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCleanupTypes(void) {
4634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
4644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return;
46501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaFreeWildcard(xmlSchemaTypeAnyTypeDef->attributeWildcard);
4664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlHashFree(xmlSchemaTypesBank, (xmlHashDeallocator) xmlSchemaFreeType);
4674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypesInitialized = 0;
4684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
4694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
4704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
4716927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaIsBuiltInTypeFacet:
47201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in type
47301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facetType:  the facet type
47401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
47501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Evaluates if a specific facet can be
47601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * used in conjunction with a type.
47701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
47801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 1 if the facet can be used with the given built-in type,
47901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 0 otherwise and -1 in case the type is not a built-in type.
48001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
48101fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint
48201fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaIsBuiltInTypeFacet(xmlSchemaTypePtr type, int facetType)
48301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
484ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard    if (type == NULL)
485ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard	return (-1);
48601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if (type->type != XML_SCHEMA_TYPE_BASIC)
48701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	return (-1);
48801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type->builtInType) {
48901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BOOLEAN:
49001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_PATTERN) ||
49101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE))
49201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
49301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
49401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (0);
49501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_STRING:
49601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NOTATION:
49701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_QNAME:
49801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYURI:
49901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BASE64BINARY:
50001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_HEXBINARY:
50101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_LENGTH) ||
50201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MINLENGTH) ||
50301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXLENGTH) ||
50401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_PATTERN) ||
50501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_ENUMERATION) ||
50601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE))
50701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
50801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
50901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (0);
51001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DECIMAL:
51101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_TOTALDIGITS) ||
51201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) ||
51301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_PATTERN) ||
51401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE) ||
51501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_ENUMERATION) ||
51601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) ||
51701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) ||
51801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MININCLUSIVE) ||
51901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MINEXCLUSIVE))
52001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
52101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
52201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (0);
52301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TIME:
52401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GDAY:
52501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTH:
52601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTHDAY:
52701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEAR:
52801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEARMONTH:
52901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATE:
53001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATETIME:
53101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DURATION:
53201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_FLOAT:
53301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DOUBLE:
53401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_PATTERN) ||
53501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_ENUMERATION) ||
53601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE) ||
53701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) ||
53801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) ||
53901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MININCLUSIVE) ||
54001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MINEXCLUSIVE))
54101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
54201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
54301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (0);
54401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	default:
545c7e3cc49bade82dba0cda4ae7c07ffcd1e32fe25Daniel Veillard	    break;
54601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
54701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    return (0);
54801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
54901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
55001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
55101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInType:
55201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type:  the type of the built in type
55301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
55401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Gives you the type struct for a built-in
55501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * type by its type id.
55601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
55701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns the type if found, NULL otherwise.
55801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
55901fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr
56001fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInType(xmlSchemaValType type)
56101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
56201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
56301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaInitTypes();
56401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type) {
56501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
56601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYSIMPLETYPE:
56701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeAnySimpleTypeDef);
56801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_STRING:
56901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeStringDef);
57001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NORMSTRING:
57101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNormStringDef);
57201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DECIMAL:
57301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDecimalDef);
57401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TIME:
57501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeTimeDef);
57601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GDAY:
57701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGDayDef);
57801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTH:
57901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGMonthDef);
58001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTHDAY:
58101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    	    return (xmlSchemaTypeGMonthDayDef);
58201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEAR:
58301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGYearDef);
58401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEARMONTH:
58501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGYearMonthDef);
58601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATE:
58701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDateDef);
58801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATETIME:
58901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDatetimeDef);
59001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DURATION:
59101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDurationDef);
59201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_FLOAT:
59301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeFloatDef);
59401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DOUBLE:
59501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDoubleDef);
59601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BOOLEAN:
59701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeBooleanDef);
59801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TOKEN:
59901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeTokenDef);
60001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_LANGUAGE:
60101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeLanguageDef);
60201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NMTOKEN:
60301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNmtokenDef);
60401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NMTOKENS:
60501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNmtokensDef);
60601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NAME:
60701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNameDef);
60801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_QNAME:
60901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeQNameDef);
61001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NCNAME:
61101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNCNameDef);
61201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ID:
61301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdDef);
61401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_IDREF:
61501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdrefDef);
61601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_IDREFS:
61701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdrefsDef);
61801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ENTITY:
61901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeEntityDef);
62001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ENTITIES:
62101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeEntitiesDef);
62201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NOTATION:
62301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNotationDef);
62401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYURI:
62501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeAnyURIDef);
62601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_INTEGER:
62701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIntegerDef);
62801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NPINTEGER:
62901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNonPositiveIntegerDef);
63001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NINTEGER:
63101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNegativeIntegerDef);
63201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NNINTEGER:
63301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNonNegativeIntegerDef);
63401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_PINTEGER:
63501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypePositiveIntegerDef);
63601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_INT:
63701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIntDef);
63801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_UINT:
63901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedIntDef);
64001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_LONG:
64101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeLongDef);
64201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ULONG:
64301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedLongDef);
64401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_SHORT:
64501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeShortDef);
64601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_USHORT:
64701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedShortDef);
64801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BYTE:
64901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeByteDef);
65001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_UBYTE:
65101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedByteDef);
65201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_HEXBINARY:
65301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeHexBinaryDef);
65401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BASE64BINARY:
65501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeBase64BinaryDef);
65601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYTYPE:
65701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeAnyTypeDef);
65801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	default:
65901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (NULL);
66001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
66101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
66201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
66301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
6644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaNewValue:
6654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type:  the value type
6664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
6674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Allocate a new simple type value
6684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
6694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns a pointer to the new value or NULL in case of error
6704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
6714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaValPtr
6724255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaNewValue(xmlSchemaValType type) {
6734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValPtr value;
6744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
6754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    value = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal));
6764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (value == NULL) {
6774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(NULL);
6784255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
6794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    memset(value, 0, sizeof(xmlSchemaVal));
6804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    value->type = type;
6814255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return(value);
6824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
6834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
6844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
6856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaNewStringValue:
6866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @type:  the value type
6876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
6886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Allocate a new simple type value. The type can be
6896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * of XML_SCHEMAS_STRING.
6906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
6916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error
6926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
6936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaValPtr
6946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaNewStringValue(xmlSchemaValType type,
6956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			const xmlChar *value)
6966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
6976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    xmlSchemaValPtr val;
6986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
6996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (type != XML_SCHEMAS_STRING)
7006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return(NULL);
7016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    val = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal));
7026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (val == NULL) {
7036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return(NULL);
7046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
7056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    memset(val, 0, sizeof(xmlSchemaVal));
7066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    val->type = type;
7076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    val->value.str = (xmlChar *) value;
7086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(val);
7096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
7106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
7116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
7126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
7134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaFreeValue:
7144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value:  the value to free
7154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
7164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library
7174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
7184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid
7194255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaFreeValue(xmlSchemaValPtr value) {
7204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (value == NULL)
7214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return;
722c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    switch (value->type) {
723c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_STRING:
724c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NORMSTRING:
725c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_TOKEN:
726c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_LANGUAGE:
727c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NMTOKEN:
728c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NMTOKENS:
729c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NAME:
730c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NCNAME:
731c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ID:
732c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_IDREF:
733c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_IDREFS:
734c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ENTITY:
735c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ENTITIES:
736c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NOTATION:
737c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ANYURI:
738c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (value->value.str != NULL)
739c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		xmlFree(value->value.str);
740c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    break;
741e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_QNAME:
742e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    if (value->value.qname.uri != NULL)
743e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		xmlFree(value->value.qname.uri);
744e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    if (value->value.qname.name != NULL)
745e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		xmlFree(value->value.qname.name);
746e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    break;
74770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard        case XML_SCHEMAS_HEXBINARY:
74870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	    if (value->value.hex.str != NULL)
74970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		xmlFree(value->value.hex.str);
75070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	    break;
7511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BASE64BINARY:
7521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	    if (value->value.base64.str != NULL)
7531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		xmlFree(value->value.base64.str);
7541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	    break;
755c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	default:
756c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    break;
757c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
7584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlFree(value);
7594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
7604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
7614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
7624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaGetPredefinedType:
7634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name: the type name
7644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @ns:  the URI of the namespace usually "http://www.w3.org/2001/XMLSchema"
7654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
7664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Lookup a type in the default XML Schemas type library
7674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
7684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns the type if found, NULL otherwise
7694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
7704255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaTypePtr
7714255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaGetPredefinedType(const xmlChar *name, const xmlChar *ns) {
7724255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
7734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	xmlSchemaInitTypes();
7744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (name == NULL)
7754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(NULL);
7764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return((xmlSchemaTypePtr) xmlHashLookup2(xmlSchemaTypesBank, name, ns));
7774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
778070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
77901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
78001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInListSimpleTypeItemType:
78101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in simple type.
78201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
7836927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Lookup function
7846927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard *
785c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns the item type of @type as defined by the built-in datatype
786c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * hierarchy of XML Schema Part 2: Datatypes, or NULL in case of an error.
78701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
78801fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr
78901fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInListSimpleTypeItemType(xmlSchemaTypePtr type)
79001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
7914259532303e96e089a185c6f55056cb7c4902d71Daniel Veillard    if ((type == NULL) || (type->type != XML_SCHEMA_TYPE_BASIC))
79201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	return (NULL);
79301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type->builtInType) {
79401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NMTOKENS:
79501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNmtokenDef );
79601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_IDREFS:
79701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdrefDef);
79801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ENTITIES:
79901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeEntityDef);
80001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	default:
80101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (NULL);
80201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
80301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
80401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
805070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/****************************************************************
806070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
807070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *		Convenience macros and functions		*
808070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
809070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/
810070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
811070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_TZO_CHAR(c)						\
812070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	((c == 0) || (c == 'Z') || (c == '+') || (c == '-'))
813070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
814070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_YEAR(yr)          (yr != 0)
815070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MONTH(mon)        ((mon >= 1) && (mon <= 12))
816070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* VALID_DAY should only be used when month is unknown */
817070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DAY(day)          ((day >= 1) && (day <= 31))
818070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_HOUR(hr)          ((hr >= 0) && (hr <= 23))
819070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MIN(min)          ((min >= 0) && (min <= 59))
820070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_SEC(sec)          ((sec >= 0) && (sec < 60))
821070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TZO(tzo)          ((tzo > -1440) && (tzo < 1440))
822070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_LEAP(y)						\
823070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
824070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
825ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonth[12] =
826070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
827ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonthLeap[12] =
828070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
829070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
8305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MAX_DAYINMONTH(yr,mon)                                  \
8315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1])
8325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
833070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MDAY(dt)						\
834070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(IS_LEAP(dt->year) ?				        \
835070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (dt->day <= daysInMonthLeap[dt->mon - 1]) :	        \
836070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (dt->day <= daysInMonth[dt->mon - 1]))
837070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
838070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATE(dt)						\
839070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_YEAR(dt->year) && VALID_MONTH(dt->mon) && VALID_MDAY(dt))
840070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
841070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TIME(dt)						\
842070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_HOUR(dt->hour) && VALID_MIN(dt->min) &&		\
843070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 VALID_SEC(dt->sec) && VALID_TZO(dt->tzo))
844070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
845070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATETIME(dt)					\
846070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_DATE(dt) && VALID_TIME(dt))
847070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
848070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_MIN            (60)
849070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_HOUR           (60 * SECS_PER_MIN)
850070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_DAY            (24 * SECS_PER_HOUR)
851070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
8525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInYearByMonth[12] =
8535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
8545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInLeapYearByMonth[12] =
8555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };
8565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
8575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DAY_IN_YEAR(day, month, year)				\
8585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ((IS_LEAP(year) ?					\
8595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                dayInLeapYearByMonth[month - 1] :		\
8605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                dayInYearByMonth[month - 1]) + day)
8615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
8625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#ifdef DEBUG
8635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt)                                                  \
8645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlGenericError(xmlGenericErrorContext,                             \
8655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        "type=%o %04ld-%02u-%02uT%02u:%02u:%03f",                       \
8665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->type,dt->value.date.year,dt->value.date.mon,                \
8675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->value.date.day,dt->value.date.hour,dt->value.date.min,      \
8685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->value.date.sec);                                            \
8695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dt->value.date.tz_flag)                                         \
8705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (dt->value.date.tzo != 0)                                    \
8715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmlGenericError(xmlGenericErrorContext,                     \
8725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                "%+05d\n",dt->value.date.tzo);                          \
8735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else                                                            \
8745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmlGenericError(xmlGenericErrorContext, "Z\n");             \
8755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else                                                                \
8765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        xmlGenericError(xmlGenericErrorContext,"\n")
8775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#else
8785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt)
8795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#endif
8805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
881070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
882070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGYear:
883070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
884070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
885070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
886070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gYear without time zone and fills in the appropriate
887070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
888070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gYear. It is supposed that @dt->year is big enough to contain
889070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * the year.
890070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
891070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
892070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
893070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
894070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) {
895070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str, *firstChar;
896070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int isneg = 0, digcnt = 0;
897070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
898070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (((*cur < '0') || (*cur > '9')) &&
899070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(*cur != '-') && (*cur != '+'))
900070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
901070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
902070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur == '-') {
903070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	isneg = 1;
904070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
905070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
906070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
907070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    firstChar = cur;
908070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
909070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    while ((*cur >= '0') && (*cur <= '9')) {
910070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->year = dt->year * 10 + (*cur - '0');
911070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
912070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	digcnt++;
913070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
914070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
915070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* year must be at least 4 digits (CCYY); over 4
916070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * digits cannot have a leading zero. */
917070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0')))
918070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
919070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
920070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (isneg)
921070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->year = - dt->year;
922070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
923070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (!VALID_YEAR(dt->year))
924070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
925070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
926070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
927070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
928070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
929070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
930070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
931070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_2_DIGITS:
932070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the integer to fill in
933070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
934070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer
935070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
936070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a 2-digits integer and updates @num with the value. @cur is
937070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer.
938070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and
939070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
940070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
941070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_2_DIGITS(num, cur, invalid)			\
942070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if ((cur[0] < '0') || (cur[0] > '9') ||			\
943070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (cur[1] < '0') || (cur[1] > '9'))			\
944070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    invalid = 1;					\
945070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	else							\
946070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    num = (cur[0] - '0') * 10 + (cur[1] - '0');		\
947070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur += 2;
948070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
949070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
950070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_FLOAT:
951070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the double to fill in
952070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
953070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer
954070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
955070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float and updates @num with the value. @cur is
956070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the float. The float must have a
957070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2-digits integer part and may or may not have a decimal part.
958070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and
959070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
960070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
961070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_FLOAT(num, cur, invalid)				\
962070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(num, cur, invalid);			\
963070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!invalid && (*cur == '.')) {			\
964070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    double mult = 1;				        \
965070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    cur++;						\
966070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((*cur < '0') || (*cur > '9'))			\
967070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		invalid = 1;					\
968070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
969070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		mult /= 10;					\
970070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num += (*cur - '0') * mult;			\
971070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		cur++;						\
972070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }							\
973070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
974070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
975070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
976070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGMonth:
977070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
978070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
979070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
980070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gMonth without time zone and fills in the appropriate
981070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
982070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gMonth.
983070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
984070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
985070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
986070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
987070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) {
988070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
989070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
990070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
991070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_2_DIGITS(dt->mon, cur, ret);
992070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
993070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
994070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
995070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (!VALID_MONTH(dt->mon))
996070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
997070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
998070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
999070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1000070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1001070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1002070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1003070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGDay:
1004070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1005070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1006070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1007070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gDay without time zone and fills in the appropriate
1008070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1009070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay.
1010070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1011070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1012070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1013070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1014070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) {
1015070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
1016070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
1017070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1018070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_2_DIGITS(dt->day, cur, ret);
1019070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1020070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1021070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1022070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (!VALID_DAY(dt->day))
1023070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1024070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1025070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1026070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1027070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1028070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1029070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1030070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTime:
1031070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1032070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1033070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1034070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:time without time zone and fills in the appropriate
1035070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * fields of the @dt structure. @str is updated to point just after the
1036070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:time.
1037070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, values of @dt fields are undefined.
1038070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1039070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1040070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1041070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1042070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) {
1043070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
1044070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int hour = 0; /* use temp var in case str is not xs:time */
1045070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
1046070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1047070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_2_DIGITS(hour, cur, ret);
1048070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1049070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1050070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1051070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != ':')
1052070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1053070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1054070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1055070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* the ':' insures this string is xs:time */
1056070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dt->hour = hour;
1057070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1058070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_2_DIGITS(dt->min, cur, ret);
1059070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1060070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1061070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1062070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != ':')
1063070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1064070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1065070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1066070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_FLOAT(dt->sec, cur, ret);
1067070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1068070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1069070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1070070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (!VALID_TIME(dt))
1071070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1072070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1073070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1074070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1075070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1076070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1077070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1078070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTimeZone:
1079070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1080070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1081070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1082070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a time zone without time zone and fills in the appropriate
1083070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1084070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * time zone.
1085070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1086070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1087070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1088070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1089070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) {
1090070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
1091070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
1092070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1093070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (str == NULL)
1094070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1095070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1096070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    switch (*cur) {
1097070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case 0:
1098070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tz_flag = 0;
1099070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = 0;
1100070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1101070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1102070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case 'Z':
1103070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tz_flag = 1;
1104070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = 0;
1105070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1106070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1107070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1108070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case '+':
1109070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case '-': {
1110070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	int isneg = 0, tmp = 0;
1111070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	isneg = (*cur == '-');
1112070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1113070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1114070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1115070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(tmp, cur, ret);
1116070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1117070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return ret;
1118070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_HOUR(tmp))
1119070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1120070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1121070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (*cur != ':')
1122070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 1;
1123070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1124070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1125070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = tmp * 60;
1126070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1127070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(tmp, cur, ret);
1128070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1129070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return ret;
1130070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_MIN(tmp))
1131070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1132070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1133070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo += tmp;
1134070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (isneg)
1135070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    dt->tzo = - dt->tzo;
1136070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1137070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_TZO(dt->tzo))
1138070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1139070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
11405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	dt->tz_flag = 1;
1141070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1142070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard      }
1143070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    default:
1144070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1145070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1146070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1147070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1148070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1149070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1150070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
11511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard/**
11521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * _xmlSchemaBase64Decode:
11531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * @ch: a character
11541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *
11551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Converts a base64 encoded character to its base 64 value.
11561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *
11571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Returns 0-63 (value), 64 (pad), or -1 (not recognized)
11581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */
11591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic int
11601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard_xmlSchemaBase64Decode (const xmlChar ch) {
11611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('A' <= ch) && (ch <= 'Z')) return ch - 'A';
11621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('a' <= ch) && (ch <= 'z')) return ch - 'a' + 26;
11631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('0' <= ch) && (ch <= '9')) return ch - '0' + 52;
11641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('+' == ch) return 62;
11651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('/' == ch) return 63;
11661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('=' == ch) return 64;
11671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return -1;
11681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard}
11691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
1170070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/****************************************************************
1171070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
1172070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *	XML Schema Dates/Times Datatypes Handling		*
1173070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
1174070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/
1175070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1176070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1177070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_DIGITS:
1178070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the integer to fill in
1179070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1180070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag
1181070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1182070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a digits integer and updates @num with the value. @cur is
1183070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer.
1184070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and
1185070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1186070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1187070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_DIGITS(num, cur, num_type)	                \
1188070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if ((*cur < '0') || (*cur > '9'))			\
1189070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    num_type = -1;					\
1190070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else                                                    \
1191070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
1192070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	        num = num * 10 + (*cur - '0');		        \
1193070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	        cur++;                                          \
1194070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            }
1195070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1196070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1197070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_NUM:
1198070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the double to fill in
1199070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1200070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag
1201070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1202070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float or integer and updates @num with the value. @cur is
1203070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the number. If the number is a float,
1204070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * then it must have an integer part and a decimal part; @num_type will
1205070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * be set to 1. If there is no decimal part, @num_type is set to zero.
1206070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and
1207070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1208070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1209070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_NUM(num, cur, num_type)				\
1210070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        num = 0;                                                \
1211070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_DIGITS(num, cur, num_type);	                \
1212070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!num_type && (*cur == '.')) {			\
1213070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    double mult = 1;				        \
1214070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    cur++;						\
1215070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((*cur < '0') || (*cur > '9'))			\
1216070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num_type = -1;					\
1217070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else                                                \
1218070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                num_type = 1;                                   \
1219070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
1220070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		mult /= 10;					\
1221070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num += (*cur - '0') * mult;			\
1222070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		cur++;						\
1223070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }							\
1224070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1225070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1226070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
12275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDates:
1228455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard * @type: the expected type or XML_SCHEMAS_UNKNOWN
1229070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dateTime:  string to analyze
1230070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val:  the return computed value
1231070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1232070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @dateTime conforms to the lexical space of one of the date types.
1233070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val.
1234070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1235070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
1236070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *         and -1 in case of internal or API error.
1237070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1238070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1239455cc07308c673b6714e2f5670c2091a1dab95dcDaniel VeillardxmlSchemaValidateDates (xmlSchemaValType type,
1240118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	                const xmlChar *dateTime, xmlSchemaValPtr *val) {
1241070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmlSchemaValPtr dt;
1242070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret;
1243070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = dateTime;
1244070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1245070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define RETURN_TYPE_IF_VALID(t)					\
1246070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (IS_TZO_CHAR(*cur)) {					\
1247070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur);	\
1248070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret == 0) {						\
1249070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (*cur != 0)					\
1250070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		goto error;					\
1251070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    dt->type = t;					\
1252455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard	    goto done;						\
1253070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}							\
1254070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1255070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1256070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dateTime == NULL)
1257070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1258070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1259070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((*cur != '-') && (*cur < '0') && (*cur > '9'))
1260070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1261070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1262070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN);
1263070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dt == NULL)
1264070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1265070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1266070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((cur[0] == '-') && (cur[1] == '-')) {
1267070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/*
1268070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * It's an incomplete date (xs:gMonthDay, xs:gMonth or
1269070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * xs:gDay)
1270070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 */
1271070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur += 2;
1272070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1273070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/* is it an xs:gDay? */
1274070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (*cur == '-') {
1275455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard	    if (type == XML_SCHEMAS_GMONTH)
1276455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard		goto error;
1277070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	  ++cur;
1278070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1279070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret != 0)
1280070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		goto error;
1281070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1282070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY);
1283070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1284070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    goto error;
1285070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1286070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1287070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/*
1288070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * it should be an xs:gMonthDay or xs:gMonth
1289070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 */
1290070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur);
1291070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1292070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    goto error;
1293070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1294d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        /*
1295d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a '-' char could indicate this type is xs:gMonthDay or
1296d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a negative time zone offset. Check for xs:gMonthDay first.
1297d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * Also the first three char's of a negative tzo (-MM:SS) can
1298d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * appear to be a valid day; so even if the day portion
1299d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * of the xs:gMonthDay verifies, we must insure it was not
1300d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a tzo.
1301d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         */
1302d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if (*cur == '-') {
1303d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            const xmlChar *rewnd = cur;
1304d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            cur++;
1305d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1306d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard  	    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1307d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            if ((ret == 0) && ((*cur == 0) || (*cur != ':'))) {
1308d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1309d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                /*
1310d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * we can use the VALID_MDAY macro to validate the month
1311d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * and day because the leap year test will flag year zero
1312d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * as a leap year (even though zero is an invalid year).
1313d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 */
1314d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                if (VALID_MDAY((&(dt->value.date)))) {
1315d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1316d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard	            RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY);
1317070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1318d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                    goto error;
1319d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                }
1320d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            }
1321d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1322d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            /*
1323d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             * not xs:gMonthDay so rewind and check if just xs:gMonth
1324d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             * with an optional time zone.
1325d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             */
1326d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            cur = rewnd;
1327d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        }
1328d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1329d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard	RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH);
1330070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1331070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1332070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1333070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1334070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /*
1335070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * It's a right-truncated date or an xs:time.
1336070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * Try to parse an xs:time then fallback on right-truncated dates.
1337070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     */
1338070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((*cur >= '0') && (*cur <= '9')) {
1339070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseTime(&(dt->value.date), &cur);
1340070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret == 0) {
1341070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    /* it's an xs:time */
1342070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_TIME);
1343070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1344070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1345070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1346070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* fallback on date parsing */
1347070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur = dateTime;
1348070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1349070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGYear(&(dt->value.date), &cur);
1350070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1351070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1352070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1353070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:gYear? */
1354070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEAR);
1355070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1356070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != '-')
1357070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1358070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1359070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1360070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur);
1361070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1362070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1363070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1364070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:gYearMonth? */
1365070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEARMONTH);
1366070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1367070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != '-')
1368070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1369070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1370070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1371070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1372070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((ret != 0) || !VALID_DATE((&(dt->value.date))))
1373070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1374070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1375070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:date? */
1376070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_DATE);
1377070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1378070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != 'T')
1379070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1380070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1381070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1382070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* it should be an xs:dateTime */
1383070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseTime(&(dt->value.date), &cur);
1384070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1385070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1386070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1387070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur);
1388070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((ret != 0) || (*cur != 0) || !VALID_DATETIME((&(dt->value.date))))
1389070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1390070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1391455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard
1392070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dt->type = XML_SCHEMAS_DATETIME;
1393070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1394455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillarddone:
1395d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#if 1
1396d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type))
1397d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        goto error;
1398d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#else
1399d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    /*
1400d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     * insure the parsed type is equal to or less significant (right
1401d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     * truncated) than the desired type.
1402d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     */
1403d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) {
1404d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1405d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        /* time only matches time */
1406d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_TIME) && (dt->type == XML_SCHEMAS_TIME))
1407d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1408d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1409d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_DATETIME) &&
1410d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            ((dt->type != XML_SCHEMAS_DATE) ||
1411d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEARMONTH) ||
1412d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEAR)))
1413d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1414d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1415d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_DATE) &&
1416d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            ((dt->type != XML_SCHEMAS_GYEAR) ||
1417d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEARMONTH)))
1418d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1419d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1420d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_GYEARMONTH) && (dt->type != XML_SCHEMAS_GYEAR))
1421d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1422d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1423d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_GMONTHDAY) && (dt->type != XML_SCHEMAS_GMONTH))
1424d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1425d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    }
1426455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard#endif
1427455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard
1428070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (val != NULL)
1429070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        *val = dt;
143080b19092f24410a6b869abf519227686e8f207caDaniel Veillard    else
143180b19092f24410a6b869abf519227686e8f207caDaniel Veillard	xmlSchemaFreeValue(dt);
1432070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1433070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1434070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1435070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror:
1436070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dt != NULL)
1437070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	xmlSchemaFreeValue(dt);
1438070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 1;
1439070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1440070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1441070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
14425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDuration:
1443070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @type: the predefined type
1444070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @duration:  string to analyze
1445070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val:  the return computed value
1446070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1447070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @duration conforms to the lexical space of the duration type.
1448070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val.
1449070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1450070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
1451070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *         and -1 in case of internal or API error.
1452070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1453070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1454dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
1455118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	                   const xmlChar *duration, xmlSchemaValPtr *val) {
1456070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar  *cur = duration;
1457070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmlSchemaValPtr dur;
1458070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int isneg = 0;
1459070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int seq = 0;
1460d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    double         num;
1461d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    int            num_type = 0;  /* -1 = invalid, 0 = int, 1 = floating */
1462d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    const xmlChar  desig[]  = {'Y', 'M', 'D', 'H', 'M', 'S'};
1463d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    const double   multi[]  = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0};
1464070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1465070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (duration == NULL)
1466070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1467070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1468070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur == '-') {
1469070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        isneg = 1;
1470070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        cur++;
1471070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1472070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1473070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* duration must start with 'P' (after sign) */
1474070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur++ != 'P')
1475070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1476070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
147780b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (*cur == 0)
147880b19092f24410a6b869abf519227686e8f207caDaniel Veillard	return 1;
147980b19092f24410a6b869abf519227686e8f207caDaniel Veillard
1480070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION);
1481070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dur == NULL)
1482070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1483070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1484070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    while (*cur != 0) {
1485070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1486070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* input string should be empty or invalid date/time item */
1487070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (seq >= sizeof(desig))
1488070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1489070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1490070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* T designator must be present for time items */
1491070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (*cur == 'T') {
1492070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (seq <= 3) {
1493070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                seq = 3;
1494070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                cur++;
1495070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            } else
1496070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 1;
1497070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        } else if (seq == 3)
1498070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1499070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1500070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* parse the number portion of the item */
1501070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        PARSE_NUM(num, cur, num_type);
1502070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1503070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if ((num_type == -1) || (*cur == 0))
1504070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1505070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1506070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* update duration based on item type */
1507070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        while (seq < sizeof(desig)) {
1508070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (*cur == desig[seq]) {
1509070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1510070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                /* verify numeric type; only seconds can be float */
1511070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                if ((num_type != 0) && (seq < (sizeof(desig)-1)))
1512070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    goto error;
1513070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1514070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                switch (seq) {
1515070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    case 0:
1516070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.mon = (long)num * 12;
1517070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1518070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    case 1:
1519070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.mon += (long)num;
1520070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1521070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    default:
1522070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        /* convert to seconds using multiplier */
1523070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.sec += num * multi[seq];
1524070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        seq++;
1525070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1526070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                }
1527070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1528070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                break;          /* exit loop */
1529070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            }
1530070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            /* no date designators found? */
1531070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (++seq == 3)
1532070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                goto error;
1533070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        }
1534070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        cur++;
1535070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1536070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1537070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (isneg) {
1538070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.mon = -dur->value.dur.mon;
1539070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.day = -dur->value.dur.day;
1540070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.sec = -dur->value.dur.sec;
1541070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1542070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1543070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (val != NULL)
1544070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        *val = dur;
154580b19092f24410a6b869abf519227686e8f207caDaniel Veillard    else
154680b19092f24410a6b869abf519227686e8f207caDaniel Veillard	xmlSchemaFreeValue(dur);
1547070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1548070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1549070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1550070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror:
1551070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dur != NULL)
1552070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	xmlSchemaFreeValue(dur);
1553070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 1;
1554070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1555070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1556a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard/**
1557a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * xmlSchemaStrip:
1558a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * @value: a value
1559a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *
1560a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Removes the leading and ending spaces of a string
1561a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *
1562a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the new string or NULL if no change was required.
1563a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard */
1564a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlChar *
1565a1a9d0410000cc69874e53e438b250037d3e14cdDaniel VeillardxmlSchemaStrip(const xmlChar *value) {
1566a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    const xmlChar *start = value, *end, *f;
1567a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard
1568a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if (value == NULL) return(NULL);
156976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((*start != 0) && (IS_BLANK_CH(*start))) start++;
1570a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end = start;
1571a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    while (*end != 0) end++;
1572a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    f = end;
1573a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end--;
157476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((end > start) && (IS_BLANK_CH(*end))) end--;
1575a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end++;
1576a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if ((start == value) && (f == end)) return(NULL);
1577a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    return(xmlStrndup(start, end - start));
1578a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard}
157996a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard
158096a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard/**
158191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * xmlSchemaWhiteSpaceReplace:
158291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * @value: a value
158391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik *
158491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Replaces 0xd, 0x9 and 0xa with a space.
158591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik *
158691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Returns the new string or NULL if no change was required.
158791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik */
158891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlChar *
158991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlSchemaWhiteSpaceReplace(const xmlChar *value) {
159091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    const xmlChar *cur = value;
159191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    xmlChar *ret = NULL, *mcur;
159291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
159391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    if (value == NULL)
159491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	return(NULL);
159591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
159691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    while ((*cur != 0) &&
159791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	(((*cur) != 0xd) && ((*cur) != 0x9) && ((*cur) != 0xa))) {
159891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	cur++;
159991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    }
160091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    if (*cur == 0)
160191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	return (NULL);
160291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    ret = xmlStrdup(value);
160391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    /* TODO FIXME: I guess gcc will bark at this. */
160491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    mcur = (xmlChar *)  (ret + (cur - value));
160591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    do {
160691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	if ( ((*mcur) == 0xd) || ((*mcur) == 0x9) || ((*mcur) == 0xa) )
160791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	    *mcur = ' ';
160891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	mcur++;
160991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    } while (*mcur != 0);
161091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    return(ret);
161191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik}
161291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
161391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik/**
1614b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCollapseString:
1615b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: a value
1616b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
1617b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Removes and normalize white spaces in the string
1618b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
1619b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns the new string or NULL if no change was required.
1620b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
162101fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlChar *
1622b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCollapseString(const xmlChar *value) {
1623b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    const xmlChar *start = value, *end, *f;
1624b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    xmlChar *g;
1625b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    int col = 0;
1626b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1627b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (value == NULL) return(NULL);
162876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((*start != 0) && (IS_BLANK_CH(*start))) start++;
1629b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    end = start;
1630b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    while (*end != 0) {
163176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if ((*end == ' ') && (IS_BLANK_CH(end[1]))) {
1632b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    col = end - start;
1633b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    break;
1634b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	} else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) {
1635b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    col = end - start;
1636b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    break;
1637b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	}
1638b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end++;
1639b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1640b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (col == 0) {
1641b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	f = end;
1642b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end--;
164376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	while ((end > start) && (IS_BLANK_CH(*end))) end--;
1644b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end++;
1645b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if ((start == value) && (f == end)) return(NULL);
1646b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(xmlStrndup(start, end - start));
1647b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1648b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    start = xmlStrdup(start);
1649b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (start == NULL) return(NULL);
1650b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    g = (xmlChar *) (start + col);
1651b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    end = g;
1652b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    while (*end != 0) {
165376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if (IS_BLANK_CH(*end)) {
1654b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    end++;
165576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*end)) end++;
1656b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (*end != 0)
1657b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		*g++ = ' ';
1658b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	} else
1659b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    *g++ = *end++;
1660b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1661b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    *g = 0;
1662b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return((xmlChar *) start);
1663b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
1664b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1665b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
166628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * xmlSchemaValAtomicListNode:
166728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @type: the predefined atomic type for a token in the list
166828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @value: the list value to check
166928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @ret:  the return computed value
167028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @node:  the node containing the value
167128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *
167228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Check that a value conforms to the lexical space of the predefined
167328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * list type. if true a value is computed and returned in @ret.
167428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *
1675a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the number of items if this validates, a negative error code
1676a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *         number otherwise
167728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */
167828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillardstatic int
167928c52ab518d34a36fd8da6870a5850088f129a6aDaniel VeillardxmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value,
168028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	                   xmlSchemaValPtr *ret, xmlNodePtr node) {
168128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    xmlChar *val, *cur, *endval;
168228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    int nb_values = 0;
1683580ced8ee28ecd99374da9383897678e4ba6c358Daniel Veillard    int tmp = 0;
168428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard
168528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (value == NULL) {
168628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	return(-1);
168728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
168828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    val = xmlStrdup(value);
168928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (val == NULL) {
169028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	return(-1);
169128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
16926fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    if (ret != NULL) {
16936fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard        *ret = NULL;
16946fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    }
169528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    cur = val;
169628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    /*
169728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard     * Split the list
169828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard     */
169976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while (IS_BLANK_CH(*cur)) *cur++ = 0;
170028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while (*cur != 0) {
170176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if (IS_BLANK_CH(*cur)) {
170228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    *cur = 0;
170328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    cur++;
170476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*cur)) *cur++ = 0;
170528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	} else {
170628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    nb_values++;
170728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    cur++;
170876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++;
170928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	}
171028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
171128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (nb_values == 0) {
171228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	xmlFree(val);
1713a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard	return(nb_values);
171428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
171528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    endval = cur;
171628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    cur = val;
171728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while ((*cur == 0) && (cur != endval)) cur++;
171828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while (cur != endval) {
171928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node);
172028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	if (tmp != 0)
172128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    break;
172228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	while (*cur != 0) cur++;
172328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	while ((*cur == 0) && (cur != endval)) cur++;
172428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
17256fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    /* TODO what return value ? c.f. bug #158628
172628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (ret != NULL) {
172728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	TODO
17286fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    } */
17296fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    xmlFree(val);
1730a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if (tmp == 0)
1731a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard	return(nb_values);
1732a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    return(-1);
173328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard}
173428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard
173528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard/**
1736e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * xmlSchemaParseUInt:
1737e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @str: pointer to the string R/W
1738e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @llo: pointer to the low result
1739e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lmi: pointer to the mid result
1740e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lhi: pointer to the high result
1741e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *
1742e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Parse an unsigned long into 3 fields.
1743e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *
1744e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Returns the number of chars parsed or -1 if overflow of the capacity
1745e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard */
1746e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic int
1747e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel VeillardxmlSchemaParseUInt(const xmlChar **str, unsigned long *llo,
1748e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	           unsigned long *lmi, unsigned long *lhi) {
1749e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long lo = 0, mi = 0, hi = 0;
1750e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    const xmlChar *tmp, *cur = *str;
1751e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    int ret = 0, i = 0;
1752e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
1753e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (*cur == '0') {
1754e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	ret++;
1755e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	cur++;
1756e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1757e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    tmp = cur;
1758e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) {
1759e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	i++;tmp++;ret++;
1760e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1761e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (i > 24) {
1762e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	*str = tmp;
1763e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	return(-1);
1764e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1765e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 16) {
1766e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	hi = hi * 10 + (*cur++ - '0');
1767e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	i--;
1768e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1769e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 8) {
1770e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	mi = mi * 10 + (*cur++ - '0');
1771e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	i--;
1772e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1773e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 0) {
1774e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	lo = lo * 10 + (*cur++ - '0');
1775e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	i--;
1776e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1777e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
1778e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *str = cur;
1779e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *llo = lo;
1780e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *lmi = mi;
1781e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *lhi = hi;
1782e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    return(ret);
1783e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard}
1784e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
1785e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard/**
1786b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValAtomicType:
17874255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type: the predefined type
17884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to check
17894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val:  the return computed value
1790c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @node:  the node containing the value
1791b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * flags:  flags to control the vlidation
17924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
1793b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the atomic type.
17944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * if true a value is computed and returned in @val.
179501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * This checks the value space for list types as well (IDREFS, NMTOKENS).
17964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
17974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
17984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *         and -1 in case of internal or API error.
17994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
1800b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int
18011ac24d36b12487995b659a8fc23a02b9460edb36Daniel VeillardxmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value,
18021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                       xmlSchemaValPtr * val, xmlNodePtr node, int flags)
18031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard{
18044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValPtr v;
1805b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    xmlChar *norm = NULL;
1806d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    int ret = 0;
18074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
18084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
180901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitTypes();
18104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (type == NULL)
18111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        return (-1);
18125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
1813eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard    /*
1814eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard     * validating a non existant text node is similar to validating
1815eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard     * an empty one.
1816eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard     */
1817eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard    if (value == NULL)
1818eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard        value = BAD_CAST "";
1819eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard
18204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (val != NULL)
18211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        *val = NULL;
1822b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if ((flags == 0) && (value != NULL)) {
182391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
182401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        if ((type->builtInType != XML_SCHEMAS_STRING) &&
182591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	  (type->builtInType != XML_SCHEMAS_ANYTYPE) &&
182691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	  (type->builtInType != XML_SCHEMAS_ANYSIMPLETYPE)) {
182791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	    if (type->builtInType == XML_SCHEMAS_NORMSTRING)
182891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik		norm = xmlSchemaWhiteSpaceReplace(value);
182991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik            else
183091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik		norm = xmlSchemaCollapseString(value);
18311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (norm != NULL)
18321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                value = norm;
18331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        }
1834b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1835b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
183601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type->builtInType) {
18372f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack        case XML_SCHEMAS_UNKNOWN:
18381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto error;
18392f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	case XML_SCHEMAS_ANYTYPE:
18402f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	case XML_SCHEMAS_ANYSIMPLETYPE:
18412f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	    goto return0;
1842b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_STRING:
18431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return0;
18441516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard        case XML_SCHEMAS_NORMSTRING:{
18451516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                const xmlChar *cur = value;
18461516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard
18471516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                while (*cur != 0) {
18481516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
18491516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        goto return1;
18501516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    } else {
18511516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        cur++;
18521516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    }
18531516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                }
18541516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                if (val != NULL) {
18551516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NORMSTRING);
18561516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    if (v != NULL) {
18571516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        v->value.str = xmlStrdup(value);
18581516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        *val = v;
18591516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    } else {
18601516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        goto error;
18611516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    }
18621516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                }
18631516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                goto return0;
18641516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard            }
18651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_DECIMAL:{
18661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value, *tmp;
18671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned int frac = 0, len, neg = 0;
18681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long base = 0;
18691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
18701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
18711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
18721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '+')
18731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
18741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else if (*cur == '-') {
18751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    neg = 1;
18761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
18771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
18781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                tmp = cur;
18791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                while ((*cur >= '0') && (*cur <= '9')) {
18801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    base = base * 10 + (*cur - '0');
18811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
18821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
18831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                len = cur - tmp;
18841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '.') {
18851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
18861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    tmp = cur;
18871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while ((*cur >= '0') && (*cur <= '9')) {
18881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        base = base * 10 + (*cur - '0');
18891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
18901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
18911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    frac = cur - tmp;
18921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
18931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
18941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
18951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
18961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL);
18971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
18981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = base;
18991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = neg;
19001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = frac;
19011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.total = frac + len;
19021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
19031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
19041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
19051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
19061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
1907b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_TIME:
1908b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GDAY:
1909b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GMONTH:
1910b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GMONTHDAY:
1911b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GYEAR:
1912b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GYEARMONTH:
1913b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DATE:
1914b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DATETIME:
191501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard            ret = xmlSchemaValidateDates(type->builtInType, value, val);
19161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            break;
1917b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DURATION:
19181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValidateDuration(type, value, val);
19191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            break;
1920b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_FLOAT:
19211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_DOUBLE:{
19221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
19231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int neg = 0;
19241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
19251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
19261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
19271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) {
19281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur += 3;
19291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (*cur != 0)
19301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
19311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (val != NULL) {
19321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (type == xmlSchemaTypeFloatDef) {
19331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
19341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
19351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                v->value.f = (float) xmlXPathNAN;
19361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
19371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
19381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
19391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
19401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
19411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
19421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
19431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                v->value.d = xmlXPathNAN;
19441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
19451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
19461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
19471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
19481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
19491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
19501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
19511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return0;
19521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
19531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
19541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    neg = 1;
19551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
19561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
19571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) {
19581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur += 3;
19591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (*cur != 0)
19601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
19611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (val != NULL) {
19621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (type == xmlSchemaTypeFloatDef) {
19631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
19641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
19651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                if (neg)
19661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.f = (float) xmlXPathNINF;
19671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                else
19681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.f = (float) xmlXPathPINF;
19691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
19701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
19711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
19721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
19731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
19741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
19751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
19761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                if (neg)
19771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.d = xmlXPathNINF;
19781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                else
19791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.d = xmlXPathPINF;
19801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
19811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
19821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
19831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
19841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
19851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
19861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
19871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return0;
19881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
19891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((neg == 0) && (*cur == '+'))
19901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
19911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-'))
19921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
19931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                while ((*cur >= '0') && (*cur <= '9')) {
19941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
19951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
19961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '.') {
19971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
19981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while ((*cur >= '0') && (*cur <= '9'))
19991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
20001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
20011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((*cur == 'e') || (*cur == 'E')) {
20021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
20031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((*cur == '-') || (*cur == '+'))
20041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
20051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while ((*cur >= '0') && (*cur <= '9'))
20061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
20071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
20081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
20091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
20101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
20111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (type == xmlSchemaTypeFloatDef) {
20121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
20131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (v != NULL) {
2014d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard                            if (sscanf((const char *) value, "%f",
20151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                 &(v->value.f)) == 1) {
201601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                *val = v;
20171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
20181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
20191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
20201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
20211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
20221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto error;
20231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
20241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
20251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
20261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (v != NULL) {
2027d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard                            if (sscanf((const char *) value, "%lf",
20281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                 &(v->value.d)) == 1) {
20291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                *val = v;
20301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
20311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
20321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
20331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
20341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
20351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto error;
20361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
20371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
20381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
20391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
20401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
20411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BOOLEAN:{
20421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
20431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
20441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == '0') && (cur[1] == 0))
20451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 0;
20461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else if ((cur[0] == '1') && (cur[1] == 0))
20471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 1;
20481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else if ((cur[0] == 't') && (cur[1] == 'r')
20491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         && (cur[2] == 'u') && (cur[3] == 'e')
20501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         && (cur[4] == 0))
20511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 1;
20521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else if ((cur[0] == 'f') && (cur[1] == 'a')
20531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         && (cur[2] == 'l') && (cur[3] == 's')
20541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         && (cur[4] == 'e') && (cur[5] == 0))
20551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 0;
20561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else
20571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
20581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
20591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN);
20601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
20611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.b = ret;
20621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
20631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
20641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
20651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
20661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
20671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
20681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
20691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_TOKEN:{
20701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
20711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
207276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack                if (IS_BLANK_CH(*cur))
20731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
20741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
20751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                while (*cur != 0) {
20761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
20771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
20781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else if (*cur == ' ') {
20791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
20801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (*cur == 0)
20811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
20821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (*cur == ' ')
20831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
20841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
20851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
20861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
20871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
20881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
20891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN);
20901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
20911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.str = xmlStrdup(value);
20921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
20931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
20941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
20951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
20961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
20971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
20981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2099b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_LANGUAGE:
21001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (xmlCheckLanguageID(value) == 1) {
21011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
21021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE);
21031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
21041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.str = xmlStrdup(value);
21051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
21061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
21071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
21081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
21091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
21101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
21111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
21121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return1;
2113b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NMTOKEN:
21141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (xmlValidateNMToken(value, 1) == 0) {
21151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
21161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN);
21171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
21181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.str = xmlStrdup(value);
21191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
21201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
21211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
21221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
21231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
21241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
21251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
21261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return1;
2127b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NMTOKENS:
21281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef,
21291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
21301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret > 0)
21311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
21321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
21331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 1;
21341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2135b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NAME:
21361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateName(value, 1);
2137df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard            if ((ret == 0) && (val != NULL) && (value != NULL)) {
2138df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		v = xmlSchemaNewValue(XML_SCHEMAS_NAME);
2139df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		if (v != NULL) {
2140df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     const xmlChar *start = value, *end;
2141df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     while (IS_BLANK_CH(*start)) start++;
2142df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     end = start;
2143df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     while ((*end != 0) && (!IS_BLANK_CH(*end))) end++;
2144df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     v->value.str = xmlStrndup(start, end - start);
2145df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		    *val = v;
2146df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		} else {
2147df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		    goto error;
2148df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		}
21491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
21501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
21511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_QNAME:{
21521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *uri = NULL;
21531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *local = NULL;
21541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
21551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateQName(value, 1);
21561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (node != NULL)) {
21571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *prefix;
21581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
21591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    local = xmlSplitQName2(value, &prefix);
21601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL) {
21611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlNsPtr ns;
21621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
21631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ns = xmlSearchNs(node->doc, node, prefix);
21641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (ns == NULL)
21651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            ret = 1;
21661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        else if (val != NULL)
21671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            uri = xmlStrdup(ns->href);
21681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
21691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((local != NULL) && ((val == NULL) || (ret != 0)))
21701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(local);
21711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL)
21721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(prefix);
21731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
21741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (val != NULL)) {
21751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_QNAME);
21761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
21771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (local != NULL)
21781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.name = local;
21791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        else
21801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.name = xmlStrdup(value);
21811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (uri != NULL)
21821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.uri = uri;
21831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
21841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
21851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
21861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (local != NULL)
21871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            xmlFree(local);
21881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (uri != NULL)
21891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            xmlFree(uri);
21901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
21911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
21921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
21931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
21941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2195b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NCNAME:
21961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
21971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
21981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME);
21991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (v != NULL) {
22001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.str = xmlStrdup(value);
22011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
22021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else {
22031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto error;
22041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
22051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
22061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2207b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_ID:
22081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
22091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
22101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                v = xmlSchemaNewValue(XML_SCHEMAS_ID);
22111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (v != NULL) {
22121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.str = xmlStrdup(value);
22131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
22141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else {
22151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto error;
22161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
22171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
22181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
22191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
22201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
22211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
22221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /*
22231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * NOTE: the IDness might have already be declared in the DTD
22241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 */
22251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (attr->atype != XML_ATTRIBUTE_ID) {
22261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlIDPtr res;
22271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *strip;
22281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
22291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    strip = xmlSchemaStrip(value);
22301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (strip != NULL) {
22311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        res = xmlAddID(NULL, node->doc, strip, attr);
22321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(strip);
22331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else
22341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        res = xmlAddID(NULL, node->doc, value, attr);
22351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (res == NULL) {
22361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 2;
22371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
22381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        attr->atype = XML_ATTRIBUTE_ID;
22391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
22401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
22411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
22421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2243b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_IDREF:
22441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
22451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
22466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		v = xmlSchemaNewValue(XML_SCHEMAS_IDREF);
22476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (v == NULL)
22486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    goto error;
22496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		v->value.str = xmlStrdup(value);
22506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*val = v;
22511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
22521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
22531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
22541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
22551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *strip;
22561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
22571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                strip = xmlSchemaStrip(value);
22581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (strip != NULL) {
22591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAddRef(NULL, node->doc, strip, attr);
22601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlFree(strip);
22611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else
22621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAddRef(NULL, node->doc, value, attr);
22631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_IDREF;
22641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
22651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2266b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_IDREFS:
22671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef,
22681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
22691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret < 0)
22701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 2;
22711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
22721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
22731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
22741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
22751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
2276249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard
22771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_IDREFS;
22781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
22791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
22801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_ENTITY:{
22811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *strip;
22821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
22831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateNCName(value, 1);
22841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((node == NULL) || (node->doc == NULL))
22851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 3;
22861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret == 0) {
22871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlEntityPtr ent;
22881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
22891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    strip = xmlSchemaStrip(value);
22901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (strip != NULL) {
22911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ent = xmlGetDocEntity(node->doc, strip);
22921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(strip);
22931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
22941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ent = xmlGetDocEntity(node->doc, value);
22951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
22961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((ent == NULL) ||
22971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        (ent->etype !=
22981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         XML_EXTERNAL_GENERAL_UNPARSED_ENTITY))
22991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 4;
23001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (val != NULL)) {
23021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    TODO;
23031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (node != NULL) &&
23051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    (node->type == XML_ATTRIBUTE_NODE)) {
23061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAttrPtr attr = (xmlAttrPtr) node;
2307a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard
23081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    attr->atype = XML_ATTRIBUTE_ENTITY;
23091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
23111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2312b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_ENTITIES:
23131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((node == NULL) || (node->doc == NULL))
23141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return3;
23151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef,
23161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
23171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret <= 0)
23181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 1;
23191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
23201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
23211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
23221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
23231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
23241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_ENTITIES;
23261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
23271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
23281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_NOTATION:{
23291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *uri = NULL;
23301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *local = NULL;
23311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateQName(value, 1);
23331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (node != NULL)) {
23341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *prefix;
23351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    local = xmlSplitQName2(value, &prefix);
23371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL) {
23381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlNsPtr ns;
23391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ns = xmlSearchNs(node->doc, node, prefix);
23411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (ns == NULL)
23421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            ret = 1;
23431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        else if (val != NULL)
23441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            uri = xmlStrdup(ns->href);
23451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
23461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((local != NULL) && ((val == NULL) || (ret != 0)))
23471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(local);
23481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL)
23491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(prefix);
23501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((node == NULL) || (node->doc == NULL))
23521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 3;
23531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret == 0) {
23541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = xmlValidateNotationUse(NULL, node->doc, value);
23551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (ret == 1)
23561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 0;
23571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else
23581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 1;
23591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (val != NULL)) {
23611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION);
23621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
23631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (local != NULL)
23641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.name = local;
23651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        else
23661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.name = xmlStrdup(value);
23671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (uri != NULL)
23681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.uri = uri;
23691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
23711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
23721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (local != NULL)
23731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            xmlFree(local);
23741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (uri != NULL)
23751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            xmlFree(uri);
23761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
23771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
23781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
2380560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard            }
23811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_ANYURI:{
238211c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                if (*value != 0) {
238311c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    xmlURIPtr uri = xmlParseURI((const char *) value);
238411c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    if (uri == NULL)
238511c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                        goto return1;
238611c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    xmlFreeURI(uri);
238711c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                }
2388560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
23891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
239011c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_ANYURI);
239111c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    if (v == NULL)
239211c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                        goto error;
239311c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    v->value.str = xmlStrdup(value);
239411c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    *val = v;
23951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
23971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
23981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_HEXBINARY:{
23991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
24001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *base;
24011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int total, i = 0;
2402560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
2403f34a20e69dc675cd23d3eb558cad135ea280f472Daniel Veillard                if (cur == NULL)
24041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
2405560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
24061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                while (((*cur >= '0') && (*cur <= '9')) ||
24071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                       ((*cur >= 'A') && (*cur <= 'F')) ||
24081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                       ((*cur >= 'a') && (*cur <= 'f'))) {
24091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    i++;
24101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
2412560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
24131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
24141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
24151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((i % 2) != 0)
241670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard                    goto return1;
2417560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
24181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
24191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
24201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY);
24211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v == NULL)
24221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
24231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
24241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur = xmlStrdup(value);
24251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (cur == NULL) {
2426d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard		        xmlSchemaTypeErrMemory(node, "allocating hexbin data");
24271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(v);
24281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
24291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
24301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
24311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total = i / 2;      /* number of octets */
243270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
24331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    base = (xmlChar *) cur;
24341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while (i-- > 0) {
24351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (*base >= 'a')
24361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            *base = *base - ('a' - 'A');
24371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        base++;
24381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
243970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
24401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.hex.str = (xmlChar *) cur;
24411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.hex.total = total;
24421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
24431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
24451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
24461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BASE64BINARY:{
24471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /* ISSUE:
24481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 *
24491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Ignore all stray characters? (yes, currently)
24501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Worry about long lines? (no, currently)
24511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 *
24521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * rfc2045.txt:
24531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 *
24541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * "The encoded output stream must be represented in lines of
24551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * no more than 76 characters each.  All line breaks or other
24561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * characters not found in Table 1 must be ignored by decoding
24571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * software.  In base64 data, characters other than those in
24581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Table 1, line breaks, and other white space probably
24591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * indicate a transmission error, about which a warning
24601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * message or even a message rejection might be appropriate
24611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * under some circumstances." */
24621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
24631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *base;
24641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int total, i = 0, pad = 0;
24651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
24661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
24671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
24681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
24691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                for (; *cur; ++cur) {
24701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
24711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
24721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    decc = _xmlSchemaBase64Decode(*cur);
24731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc < 0) ;
24741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (decc < 64)
24751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        i++;
24761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else
24771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        break;
24781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                for (; *cur; ++cur) {
24801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
24811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
24821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    decc = _xmlSchemaBase64Decode(*cur);
24831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc < 0) ;
24841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (decc < 64)
24851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
24861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc == 64)
24871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        pad++;
24881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
24901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /* rfc2045.txt: "Special processing is performed if fewer than
24911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * 24 bits are available at the end of the data being encoded.
24921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * A full encoding quantum is always completed at the end of a
24931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * body.  When fewer than 24 input bits are available in an
24941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * input group, zero bits are added (on the right) to form an
24951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * integral number of 6-bit groups.  Padding at the end of the
24961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * data is performed using the "=" character.  Since all
24971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * base64 input is an integral number of octets, only the
24981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * following cases can arise: (1) the final quantum of
24991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * encoding input is an integral multiple of 24 bits; here,
25001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * the final unit of encoded output will be an integral
25011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * multiple ofindent: Standard input:701: Warning:old style
25021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		 * assignment ambiguity in "=*".  Assuming "= *" 4 characters
25031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		 * with no "=" padding, (2) the final
25041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * quantum of encoding input is exactly 8 bits; here, the
25051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * final unit of encoded output will be two characters
25061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * followed by two "=" padding characters, or (3) the final
25071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * quantum of encoding input is exactly 16 bits; here, the
25081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * final unit of encoded output will be three characters
25091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * followed by one "=" padding character." */
25101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
25111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                total = 3 * (i / 4);
25121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (pad == 0) {
25131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 0)
25141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
25151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (pad == 1) {
25161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
25171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
25181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 3)
25191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
25201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (decc = _xmlSchemaBase64Decode(*cur);
25211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         (decc < 0) || (decc > 63);
25221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         decc = _xmlSchemaBase64Decode(*cur))
25231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        --cur;
25241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 16bits in 24bits means 2 pad bits: nnnnnn nnmmmm mmmm00*/
25251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 00111100 -> 0x3c */
25261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc & ~0x3c)
25271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
25281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total += 2;
25291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (pad == 2) {
25301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
25311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
25321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 2)
25331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
25341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (decc = _xmlSchemaBase64Decode(*cur);
25351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         (decc < 0) || (decc > 63);
25361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         decc = _xmlSchemaBase64Decode(*cur))
25371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        --cur;
25381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 8bits in 12bits means 4 pad bits: nnnnnn nn0000 */
25391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 00110000 -> 0x30 */
25401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc & ~0x30)
25411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
25421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total += 1;
25431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else
25441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
25451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
25461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
25471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_BASE64BINARY);
25481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v == NULL)
25491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
25501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    base =
25511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        (xmlChar *) xmlMallocAtomic((i + pad + 1) *
25521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                                    sizeof(xmlChar));
25531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (base == NULL) {
2554d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard		        xmlSchemaTypeErrMemory(node, "allocating base64 data");
25551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(v);
25561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
25571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
25581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.base64.str = base;
25591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (cur = value; *cur; ++cur)
25601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (_xmlSchemaBase64Decode(*cur) >= 0) {
25611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            *base = *cur;
25621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            ++base;
25631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
25641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *base = 0;
25651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.base64.total = total;
25661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
25671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
25681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
256970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard            }
2570e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_INTEGER:
2571e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_PINTEGER:
2572e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_NPINTEGER:
2573e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_NINTEGER:
25741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_NNINTEGER:{
25751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
25761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
25771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int sign = 0;
25781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
25791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
25801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
25811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
25821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    sign = 1;
25831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
25841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (*cur == '+')
25851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
25861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
25871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret == 0)
25881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
25891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
25901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
259101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_NPINTEGER) {
25921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) &&
25931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ((hi != 0) || (mi != 0) || (lo != 0)))
25941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
259501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_PINTEGER) {
25961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (sign == 1)
25971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
25981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((hi == 0) && (mi == 0) && (lo == 0))
25991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
260001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_NINTEGER) {
26011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (sign == 0)
26021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
26031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((hi == 0) && (mi == 0) && (lo == 0))
26041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
260501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_NNINTEGER) {
26061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) &&
26071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ((hi != 0) || (mi != 0) || (lo != 0)))
26081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
26091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /*
26111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * We can store a value only if no overflow occured
26121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 */
26131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret > 0) && (val != NULL)) {
261401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
26151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
26161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
26171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.mi = lo;
26181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.hi = lo;
26191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = sign;
26201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
26211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.total = cur - value;
26221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
26231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
26241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
26261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2627e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_LONG:
2628e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_BYTE:
2629e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_SHORT:
26301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_INT:{
26311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
26321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
26331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int total = 0;
26341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int sign = 0;
26351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
26361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
26371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
26381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
26391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    sign = 1;
26401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
26411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (*cur == '+')
26421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
26431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
26441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret <= 0)
26451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
26461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
26471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
264801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_LONG) {
26491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi >= 922) {
26501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (hi > 922)
26511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
26521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi >= 33720368) {
26531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (mi > 33720368)
26541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
26551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if ((sign == 0) && (lo > 54775807))
26561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
26571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if ((sign == 1) && (lo > 54775808))
26581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
26591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
26601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
266101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_INT) {
26621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi != 0)
26631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
26641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (mi >= 21) {
26651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi > 21)
26661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
26671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if ((sign == 0) && (lo > 47483647))
26681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
26691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if ((sign == 1) && (lo > 47483648))
26701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
26711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
267201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_SHORT) {
26731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
26741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
26751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) && (lo > 32768))
26761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
26771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) && (lo > 32767))
26781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
267901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_BYTE) {
26801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
26811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
26821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) && (lo > 128))
26831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
26841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) && (lo > 127))
26851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
26861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
268801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
26891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
26901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
26911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.mi = lo;
26921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.hi = lo;
26931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = sign;
26941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
26951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.total = total;
26961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
26971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
26981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
27001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2701e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_UINT:
2702e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_ULONG:
2703e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_USHORT:
27041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_UBYTE:{
27051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
27061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
27071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int total = 0;
27081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
27091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
27101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
27111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
27121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret <= 0)
27131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
27141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
27151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
271601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_ULONG) {
27171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi >= 1844) {
27181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (hi > 1844)
27191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
27201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi >= 67440737) {
27211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (mi > 67440737)
27221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
27231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (lo > 9551615)
27241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
27251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
27261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
272701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_UINT) {
27281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi != 0)
27291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
27301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (mi >= 42) {
27311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi > 42)
27321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
27331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (lo > 94967295)
27341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
27351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
273601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_USHORT) {
27371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
27381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
27391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (lo > 65535)
27401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
274101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_UBYTE) {
27421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
27431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
27441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (lo > 255)
27451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
27461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
274801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
27491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
27501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
27511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.mi = mi;
27521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.hi = hi;
27531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = 0;
27541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
27551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.total = total;
27561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
27571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
27581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
27601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
2762b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
27631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  done:
27641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
27651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
27661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (ret);
27671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return3:
27681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
27691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
27701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (3);
27711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return1:
27721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
27731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
27741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (1);
27751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return0:
27761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
27771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
27781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (0);
27791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  error:
27801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
27811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
27821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (-1);
2783b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
2784b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
2785b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
2786b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValPredefTypeNode:
2787b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @type: the predefined type
2788b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: the value to check
2789b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @val:  the return computed value
2790b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @node:  the node containing the value
2791b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
2792b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the predefined type.
2793b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * if true a value is computed and returned in @val.
2794b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
2795b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns 0 if this validates, a positive error code number otherwise
2796b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *         and -1 in case of internal or API error.
2797b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
2798b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardint
2799b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value,
2800b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	                   xmlSchemaValPtr *val, xmlNodePtr node) {
2801b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return(xmlSchemaValAtomicType(type, value, val, node, 0));
28024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
28034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
28044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
2805c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaValPredefTypeNodeNoNorm:
2806c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the predefined type
2807c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the value to check
2808c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val:  the return computed value
2809c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @node:  the node containing the value
2810c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
2811c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Check that a value conforms to the lexical space of the predefined type.
2812c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * if true a value is computed and returned in @val.
2813c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * This one does apply any normalization to the value.
2814c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
2815c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
2816c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *         and -1 in case of internal or API error.
2817c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */
2818c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardint
2819c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, const xmlChar *value,
2820c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard				 xmlSchemaValPtr *val, xmlNodePtr node) {
2821c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    return(xmlSchemaValAtomicType(type, value, val, node, 1));
2822c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
2823c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
2824c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/**
2825c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * xmlSchemaValidatePredefinedType:
2826c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @type: the predefined type
2827c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @value: the value to check
2828c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @val:  the return computed value
2829c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *
2830c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Check that a value conforms to the lexical space of the predefined type.
2831c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * if true a value is computed and returned in @val.
2832c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *
2833c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
2834c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *         and -1 in case of internal or API error.
2835c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard */
2836c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillardint
2837c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel VeillardxmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value,
2838c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard	                        xmlSchemaValPtr *val) {
2839c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard    return(xmlSchemaValPredefTypeNode(type, value, val, NULL));
2840c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard}
2841c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard
2842c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard/**
28434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareDecimals:
28444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x:  a first decimal value
28454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y:  a second decimal value
28464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
28474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 decimals
28484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
28494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error
28504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
28514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int
28524255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y)
28534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{
28544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValPtr swp;
2855e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    int order = 1, p;
28564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    unsigned long tmp;
28574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
2858e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if ((x->value.decimal.sign) &&
2859e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	((x->value.decimal.lo != 0) ||
2860e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	 (x->value.decimal.mi != 0) ||
2861e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	 (x->value.decimal.hi != 0))) {
2862e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	if ((y->value.decimal.sign) &&
2863e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    ((y->value.decimal.lo != 0) ||
2864e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	     (y->value.decimal.mi != 0) ||
2865e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	     (y->value.decimal.hi != 0)))
286680b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    order = -1;
286780b19092f24410a6b869abf519227686e8f207caDaniel Veillard	else
286880b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    return (-1);
2869e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    } else if ((y->value.decimal.sign) &&
2870e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	       ((y->value.decimal.lo != 0) ||
2871e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		(y->value.decimal.mi != 0) ||
2872e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		(y->value.decimal.hi != 0))) {
28734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (1);
287480b19092f24410a6b869abf519227686e8f207caDaniel Veillard    }
28754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (x->value.decimal.frac == y->value.decimal.frac) {
2876e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	if (x->value.decimal.hi < y->value.decimal.hi)
2877e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (-order);
287801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (x->value.decimal.hi > y->value.decimal.hi)
2879e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (order);
2880e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	if (x->value.decimal.mi < y->value.decimal.mi)
2881e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (-order);
288201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (x->value.decimal.mi > y->value.decimal.mi)
2883e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (order);
2884e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        if (x->value.decimal.lo < y->value.decimal.lo)
288580b19092f24410a6b869abf519227686e8f207caDaniel Veillard            return (-order);
2886e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        if (x->value.decimal.lo > y->value.decimal.lo)
288780b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    return(order);
288880b19092f24410a6b869abf519227686e8f207caDaniel Veillard	return(0);
28894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
28904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (y->value.decimal.frac > x->value.decimal.frac) {
28914255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        swp = y;
28924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        y = x;
28934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        x = swp;
28944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        order = -order;
28954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
2896e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    p = powten[x->value.decimal.frac - y->value.decimal.frac];
2897e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    tmp = x->value.decimal.lo / p;
2898e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (tmp > y->value.decimal.lo)
28994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (order);
2900e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (tmp < y->value.decimal.lo)
29014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (-order);
2902e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    tmp = y->value.decimal.lo * p;
2903e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (x->value.decimal.lo < tmp)
29044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (-order);
2905e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (x->value.decimal.lo == tmp)
29064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (0);
29074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return (order);
29084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
29094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
29104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
2911070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xmlSchemaCompareDurations:
2912070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @x:  a first duration value
2913070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @y:  a second duration value
2914070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
2915070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Compare 2 durations
2916070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
2917070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
2918070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * case of error
2919070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
2920070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
2921070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel VeillardxmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y)
2922070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard{
2923070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long carry, mon, day;
2924070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    double sec;
292580b19092f24410a6b869abf519227686e8f207caDaniel Veillard    int invert = 1;
292680b19092f24410a6b869abf519227686e8f207caDaniel Veillard    long xmon, xday, myear, minday, maxday;
2927070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    static const long dayRange [2][12] = {
2928070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        { 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, },
2929070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} };
2930070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2931070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((x == NULL) || (y == NULL))
29325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return -2;
2933070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2934070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* months */
2935070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    mon = x->value.dur.mon - y->value.dur.mon;
2936070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2937070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* seconds */
2938070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    sec = x->value.dur.sec - y->value.dur.sec;
2939070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    carry = (long)sec / SECS_PER_DAY;
2940070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    sec -= (double)(carry * SECS_PER_DAY);
2941070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2942070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* days */
2943070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    day = x->value.dur.day - y->value.dur.day + carry;
2944070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2945070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* easy test */
2946070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (mon == 0) {
2947070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (day == 0)
2948070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (sec == 0.0)
2949070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 0;
2950070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else if (sec < 0.0)
2951070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return -1;
2952070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else
2953070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 1;
2954070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else if (day < 0)
2955070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return -1;
2956070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else
2957070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return 1;
2958070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
2959070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2960070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (mon > 0) {
2961070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if ((day >= 0) && (sec >= 0.0))
2962070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return 1;
2963070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else {
2964070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            xmon = mon;
2965070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            xday = -day;
2966070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        }
2967070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    } else if ((day <= 0) && (sec <= 0.0)) {
2968070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        return -1;
2969070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    } else {
297080b19092f24410a6b869abf519227686e8f207caDaniel Veillard	invert = -1;
2971070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xmon = -mon;
2972070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xday = day;
2973070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
2974070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2975070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    myear = xmon / 12;
297680b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (myear == 0) {
297780b19092f24410a6b869abf519227686e8f207caDaniel Veillard	minday = 0;
297880b19092f24410a6b869abf519227686e8f207caDaniel Veillard	maxday = 0;
297980b19092f24410a6b869abf519227686e8f207caDaniel Veillard    } else {
298080b19092f24410a6b869abf519227686e8f207caDaniel Veillard	maxday = 366 * ((myear + 3) / 4) +
298180b19092f24410a6b869abf519227686e8f207caDaniel Veillard	         365 * ((myear - 1) % 4);
298280b19092f24410a6b869abf519227686e8f207caDaniel Veillard	minday = maxday - 1;
298380b19092f24410a6b869abf519227686e8f207caDaniel Veillard    }
298480b19092f24410a6b869abf519227686e8f207caDaniel Veillard
2985070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmon = xmon % 12;
2986070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    minday += dayRange[0][xmon];
2987070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    maxday += dayRange[1][xmon];
2988070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
298980b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if ((maxday == minday) && (maxday == xday))
299080b19092f24410a6b869abf519227686e8f207caDaniel Veillard	return(0); /* can this really happen ? */
2991070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (maxday < xday)
299280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        return(-invert);
299380b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (minday > xday)
299480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        return(invert);
2995070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2996070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* indeterminate */
29975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return 2;
29985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
29995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/*
30015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * macros for adding date/times and durations
30025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
30035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT(a,b)                  (floor(((double)a/(double)b)))
30045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO(a,b)                     (a - FQUOTIENT(a,b) * b)
30055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT_RANGE(a,low,high)     (FQUOTIENT((a-low),(high-low)))
30065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO_RANGE(a,low,high)        ((MODULO((a-low),(high-low)))+low)
30075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
3009669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * xmlSchemaDupVal:
3010669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @v: the #xmlSchemaValPtr value to duplicate
3011669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard *
3012669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Makes a copy of @v. The calling program is responsible for freeing
3013669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the returned value.
3014669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard *
3015669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * returns a pointer to a duplicated #xmlSchemaValPtr or NULL if error.
3016669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard */
3017669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillardstatic xmlSchemaValPtr
3018669adfcd3af5dfda873b10119d44202a7450bb20Daniel VeillardxmlSchemaDupVal (xmlSchemaValPtr v)
3019669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard{
3020669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaValPtr ret = xmlSchemaNewValue(v->type);
3021669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    if (ret == NULL)
3022669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        return NULL;
3023669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard
3024669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    memcpy(ret, v, sizeof(xmlSchemaVal));
3025669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    return ret;
3026669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard}
3027669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard
3028669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard/**
30295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateAdd:
30305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr
30315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dur: an #xmlSchemaValPtr of type #XS_DURATION
30325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
30335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compute a new date/time from @dt and @dur. This function assumes @dt
30345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH,
3035669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * or #XML_SCHEMAS_GYEAR. The returned #xmlSchemaVal is the same type as
3036669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt. The calling program is responsible for freeing the returned value.
30375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3038669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a pointer to a new #xmlSchemaVal or NULL if error.
30395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
30405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr
30415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur)
30425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
3043669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaValPtr ret, tmp;
30445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long carry, tempdays, temp;
30455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValDatePtr r, d;
30465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValDurationPtr u;
30475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((dt == NULL) || (dur == NULL))
30495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
30505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ret = xmlSchemaNewValue(dt->type);
30525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret == NULL)
30535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
30545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3055669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    /* make a copy so we don't alter the original value */
3056669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    tmp = xmlSchemaDupVal(dt);
3057669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    if (tmp == NULL) {
3058669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        xmlSchemaFreeValue(ret);
3059669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        return NULL;
3060669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    }
3061669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard
30625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r = &(ret->value.date);
3063669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    d = &(tmp->value.date);
30645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    u = &(dur->value.dur);
30655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalization */
30675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (d->mon == 0)
30685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        d->mon = 1;
30695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalize for time zone offset */
30715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    u->sec -= (d->tzo * 60);
30725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    d->tzo = 0;
30735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalization */
30755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (d->day == 0)
30765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        d->day = 1;
30775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* month */
30795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry  = d->mon + u->mon;
3080ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->mon = (unsigned int) MODULO_RANGE(carry, 1, 13);
3081ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT_RANGE(carry, 1, 13);
30825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* year (may be modified later) */
30845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->year = d->year + carry;
30855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (r->year == 0) {
30865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (d->year > 0)
30875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            r->year--;
30885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else
30895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            r->year++;
30905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
30915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* time zone */
30935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->tzo     = d->tzo;
30945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->tz_flag = d->tz_flag;
30955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* seconds */
30975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->sec = d->sec + u->sec;
3098ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT((long)r->sec, 60);
30995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (r->sec != 0.0) {
31005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        r->sec = MODULO(r->sec, 60.0);
31015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
31025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* minute */
31045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry += d->min;
3105ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->min = (unsigned int) MODULO(carry, 60);
3106ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT(carry, 60);
31075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* hours */
31095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry  += d->hour;
3110ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->hour = (unsigned int) MODULO(carry, 24);
3111ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry   = (long)FQUOTIENT(carry, 24);
31125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
31145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * days
31155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * Note we use tempdays because the temporary values may need more
31165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * than 5 bits
31175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
31185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) &&
31195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                  (d->day > MAX_DAYINMONTH(r->year, r->mon)))
31205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = MAX_DAYINMONTH(r->year, r->mon);
31215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (d->day < 1)
31225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = 1;
31235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else
31245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = d->day;
31255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    tempdays += u->day + carry;
31275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    while (1) {
31295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (tempdays < 1) {
3130ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard            long tmon = (long) MODULO_RANGE(r->mon-1, 1, 13);
3131ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard            long tyr  = r->year + (long)FQUOTIENT_RANGE(r->mon-1, 1, 13);
31325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (tyr == 0)
31335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                tyr--;
31345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            tempdays += MAX_DAYINMONTH(tyr, tmon);
31355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            carry = -1;
3136ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard        } else if (tempdays > (long) MAX_DAYINMONTH(r->year, r->mon)) {
31375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon);
31385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            carry = 1;
31395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        } else
31405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
31415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        temp = r->mon + carry;
3143ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard        r->mon = (unsigned int) MODULO_RANGE(temp, 1, 13);
3144ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard        r->year = r->year + (unsigned int) FQUOTIENT_RANGE(temp, 1, 13);
31455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (r->year == 0) {
31465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (temp < 1)
31475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                r->year--;
31485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else
31495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                r->year++;
31505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	}
31515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
31525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->day = tempdays;
31545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
31565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * adjust the date/time type to the date values
31575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
31585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret->type != XML_SCHEMAS_DATETIME) {
31595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if ((r->hour) || (r->min) || (r->sec))
31605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ret->type = XML_SCHEMAS_DATETIME;
31615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (ret->type != XML_SCHEMAS_DATE) {
31625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if ((r->mon != 1) && (r->day != 1))
31635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                ret->type = XML_SCHEMAS_DATE;
31645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1))
31655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                ret->type = XML_SCHEMAS_GYEARMONTH;
31665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
31675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
31685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3169669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaFreeValue(tmp);
31705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
31725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
31735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
31755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaDateNormalize:
3176669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt: an #xmlSchemaValPtr of a date/time type value.
3177669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @offset: number of seconds to adjust @dt by.
31785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3179669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Normalize @dt to GMT time. The @offset parameter is subtracted from
3180669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the return value is a time-zone offset is present on @dt.
31815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3182669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a normalized copy of @dt or NULL if error.
31835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
31845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr
31855a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset)
31865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
31875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValPtr dur, ret;
31885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dt == NULL)
31905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
31915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (((dt->type != XML_SCHEMAS_TIME) &&
31935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard         (dt->type != XML_SCHEMAS_DATETIME)) || (dt->value.date.tzo == 0))
31945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return xmlSchemaDupVal(dt);
31955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION);
31975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dur == NULL)
31985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
31995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    dur->value.date.sec -= offset;
32015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ret = _xmlSchemaDateAdd(dt, dur);
32035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret == NULL)
32045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
32055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaFreeValue(dur);
32075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* ret->value.date.tzo = 0; */
32095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
32105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
32115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
32135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateCastYMToDays:
32145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr
32155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
32165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Convert mon and year of @dt to total number of days. Take the
32175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * number of years since (or before) 1 AD and add the number of leap
32185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years. This is a function  because negative
32195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years must be handled a little differently and there is no zero year.
32205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
32215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns number of days.
32225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
32235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic long
32245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt)
32255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
32265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long ret;
322749e8963c640865343327c67d4755a1af705717d3Daniel Veillard    int mon;
32285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
322949e8963c640865343327c67d4755a1af705717d3Daniel Veillard    mon = dt->value.date.mon;
323049e8963c640865343327c67d4755a1af705717d3Daniel Veillard    if (mon <= 0) mon = 1; /* normalization */
323149e8963c640865343327c67d4755a1af705717d3Daniel Veillard
323249e8963c640865343327c67d4755a1af705717d3Daniel Veillard    if (dt->value.date.year <= 0)
32335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ret = (dt->value.date.year * 365) +
32345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+
32355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard               ((dt->value.date.year+1)/400)) +
323649e8963c640865343327c67d4755a1af705717d3Daniel Veillard              DAY_IN_YEAR(0, mon, dt->value.date.year);
32375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else
32385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ret = ((dt->value.date.year-1) * 365) +
32395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+
32405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard               ((dt->value.date.year-1)/400)) +
324149e8963c640865343327c67d4755a1af705717d3Daniel Veillard              DAY_IN_YEAR(0, mon, dt->value.date.year);
32425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
32445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
32455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
32475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * TIME_TO_NUMBER:
32485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt:  an #xmlSchemaValPtr
32495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
32505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Calculates the number of seconds in the time portion of @dt.
32515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
32525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns seconds.
32535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
32545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define TIME_TO_NUMBER(dt)                              \
32555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ((double)((dt->value.date.hour * SECS_PER_HOUR) +   \
3256b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard              (dt->value.date.min * SECS_PER_MIN) +	\
3257b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard              (dt->value.date.tzo * SECS_PER_MIN)) +	\
3258b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard               dt->value.date.sec)
32595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
32615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaCompareDates:
32625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @x:  a first date/time value
32635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @y:  a second date/time value
32645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
32655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compare 2 date/times
32665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
32675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
32685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error
32695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
32705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic int
32715a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y)
32725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
32735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    unsigned char xmask, ymask, xor_mask, and_mask;
32745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValPtr p1, p2, q1, q2;
32755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long p1d, p2d, q1d, q2d;
32765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((x == NULL) || (y == NULL))
32785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return -2;
32795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (x->value.date.tz_flag) {
32815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (!y->value.date.tz_flag) {
32835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            p1 = xmlSchemaDateNormalize(x, 0);
32845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
32855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            /* normalize y + 14:00 */
32865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR));
32875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
3289fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            if (p1d < q1d) {
3290fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
3291fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
32925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return -1;
3293fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    } else if (p1d == q1d) {
32945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                double sec;
32955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
3297fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard                if (sec < 0.0) {
3298fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		    xmlSchemaFreeValue(p1);
3299fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		    xmlSchemaFreeValue(q1);
33005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    return -1;
3301fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		} else {
33024aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    int ret = 0;
33035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    /* normalize y - 14:00 */
33045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR));
33055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day;
33065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    if (p1d > q2d)
33074aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 1;
33085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    else if (p1d == q2d) {
33095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2);
33105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        if (sec > 0.0)
33114aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                            ret = 1;
33125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        else
33134aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                            ret = 2; /* indeterminate */
33145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    }
33154aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(p1);
33164aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(q1);
33174aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(q2);
33184aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    if (ret != 0)
33194aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		        return(ret);
33205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                }
3321fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            } else {
3322fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
3323fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
3324fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    }
33255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
33265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    } else if (y->value.date.tz_flag) {
33275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1 = xmlSchemaDateNormalize(y, 0);
33285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
33295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        /* normalize x - 14:00 */
33315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR));
33325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
33335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3334fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard        if (p1d < q1d) {
3335fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(p1);
3336fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(q1);
33375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
3338fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else if (p1d == q1d) {
33395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            double sec;
33405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
3342fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            if (sec < 0.0) {
3343fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
3344fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
33455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return -1;
3346fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    } else {
33474aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	        int ret = 0;
33485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                /* normalize x + 14:00 */
33495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR));
33505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day;
33515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33526560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                if (p2d > q1d) {
33534aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                    ret = 1;
33546560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		} else if (p2d == q1d) {
33555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1);
33565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    if (sec > 0.0)
33574aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 1;
33585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    else
33594aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 2; /* indeterminate */
33605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                }
33616560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(p1);
33626560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(q1);
33636560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(p2);
33644aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		if (ret != 0)
33654aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    return(ret);
33665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            }
3367fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else {
3368fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(p1);
3369fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(q1);
33705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
33715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
33725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
33745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * if the same type then calculate the difference
33755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
33765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (x->type == y->type) {
33774aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard        int ret = 0;
33785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1 = xmlSchemaDateNormalize(y, 0);
33795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
33805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1 = xmlSchemaDateNormalize(x, 0);
33825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
33835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3384fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard        if (p1d < q1d) {
33854aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard            ret = -1;
3386fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else if (p1d > q1d) {
33874aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard            ret = 1;
3388fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else {
33895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            double sec;
33905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
33925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (sec < 0.0)
33934aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                ret = -1;
33945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else if (sec > 0.0)
33954aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                ret = 1;
33965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
33984aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	xmlSchemaFreeValue(p1);
33994aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	xmlSchemaFreeValue(q1);
34004aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard        return(ret);
34015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
34025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
34035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    switch (x->type) {
34045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
34055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0xf;
34065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
34075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
34085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x7;
34095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
34105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
34115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x1;
34125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
34135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
34145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x2;
34155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
34165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
34175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x3;
34185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
34195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
34205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x3;
34215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
34225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
34235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x6;
34245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
34255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
34265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x8;
34275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
34285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        default:
34295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0;
34305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
34315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
34325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
34335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    switch (y->type) {
34345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
34355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0xf;
34365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
34375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
34385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x7;
34395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
34405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
34415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x1;
34425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
34435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
34445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x2;
34455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
34465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
34475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x3;
34485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
34495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
34505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x3;
34515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
34525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
34535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x6;
34545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
34555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
34565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x8;
34575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
34585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        default:
34595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0;
34605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
34615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
34625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
34635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xor_mask = xmask ^ ymask;           /* mark type differences */
34645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    and_mask = xmask & ymask;           /* mark field specification */
34655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
34665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* year */
34675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 1)
34685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
34695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 1) {
34705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.year < y->value.date.year)
34715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
34725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.year > y->value.date.year)
34735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
34745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
34755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
34765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* month */
34775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 2)
34785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
34795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 2) {
34805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.mon < y->value.date.mon)
34815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
34825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.mon > y->value.date.mon)
34835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
34845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
34855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
34865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* day */
34875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 4)
34885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
34895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 4) {
34905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.day < y->value.date.day)
34915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
34925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.day > y->value.date.day)
34935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
34945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
34955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
34965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* time */
34975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 8)
34985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
34995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 8) {
35005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.hour < y->value.date.hour)
35015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
35025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.hour > y->value.date.hour)
35035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
35045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.min < y->value.date.min)
35055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
35065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.min > y->value.date.min)
35075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
35085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.sec < y->value.date.sec)
35095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
35105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.sec > y->value.date.sec)
35115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
35125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
35135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3514070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
3515070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
3516070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3517070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
35186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveReplaceStrings:
35196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
35206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
35216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @invert: inverts the result if x < y or x > y.
35226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
35236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
35246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is
35256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "replace". I.e. @x could
35266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString".
35276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
35286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
35296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
35306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
35316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
35326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaComparePreserveReplaceStrings(xmlSchemaValPtr x, xmlSchemaValPtr y,
35336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				       int invert)
35346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
35356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    const xmlChar *utf1;
35366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    const xmlChar *utf2;
35376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
35386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
35396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if ((x == NULL) || (y == NULL))
35406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return(-2);
35416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    utf1 = x->value.str;
35426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    utf2 = y->value.str;
35436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
35446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    while ((*utf1 != 0) && (*utf2 != 0)) {
35456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (IS_WSP_REPLACE_CH(*utf2)) {
35466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (! IS_WSP_SPACE_CH(*utf1)) {
35476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if ((*utf1 - 0x20) < 0) {
35486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
35496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
35506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
35516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
35526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
35536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
35546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
35556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
35566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
35576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
35586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
35596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
35606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    tmp = *utf1 - *utf2;
35616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0) {
35626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
35636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
35646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
35656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
35666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
35676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0) {
35686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
35696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
35706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
35716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
35726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
35736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
35746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	utf1++;
35756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	utf2++;
35766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
35776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (*utf1 != 0) {
35786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (invert)
35796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(-1);
35806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	else
35816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(1);
35826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
35836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (*utf2 != 0) {
35846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (invert)
35856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(1);
35866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	else
35876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(-1);
35886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
35896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
35906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
35916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
35926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
35936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings:
35946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
35956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
35966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
35976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
35986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is
35996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could
36006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString".
36016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
36026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
36036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
36046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
36056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
36066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaComparePreserveCollapseStrings(xmlSchemaValPtr x, xmlSchemaValPtr y,
36076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik					int invert)
36086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
36096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    const xmlChar *utf1;
36106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    const xmlChar *utf2;
36116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
36126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
36136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if ((x == NULL) || (y == NULL))
36146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return(-2);
36156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    utf1 = x->value.str;
36166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    utf2 = y->value.str;
36176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
36186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    /*
36196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    * Skip leading blank chars of the collapsed string.
36206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    */
36216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2))
36226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	utf2++;
36236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
36246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    while ((*utf1 != 0) && (*utf2 != 0)) {
36256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2)) {
36266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (! IS_WSP_SPACE_CH(*utf1)) {
36276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		/*
36286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		* The utf2 character would have been replaced to 0x20.
36296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*/
36306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if ((*utf1 - 0x20) < 0) {
36316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
36326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
36336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
36346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
36356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
36366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
36376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
36386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
36396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
36406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
36416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
36426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    utf1++;
36436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    utf2++;
36446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    /*
36456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    * Skip contiguous blank chars of the collapsed string.
36466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    */
36476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2))
36486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		utf2++;
36496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
36506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    tmp = *utf1++ - *utf2++;
36516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0) {
36526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
36536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
36546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
36556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
36566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
36576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0) {
36586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
36596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
36606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
36616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
36626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
36636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
36646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
36656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (*utf1 != 0) {
36666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 if (invert)
36676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(-1);
36686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 else
36696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(1);
36706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
36716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (*utf2 != 0) {
36726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	/*
36736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	* Skip trailing blank chars of the collapsed string.
36746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	*/
36756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2))
36766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    utf2++;
36776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (*utf2 != 0) {
36786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (invert)
36796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(1);
36806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    else
36816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(-1);
36826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
36836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
36846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
36856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
36866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
36876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
36886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings:
36896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
36906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
36916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
36926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
36936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is
36946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could
36956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString".
36966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
36976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
36986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
36996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
37006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
37016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareReplaceCollapseStrings(xmlSchemaValPtr x, xmlSchemaValPtr y,
37026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				       int invert)
37036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
37046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    const xmlChar *utf1;
37056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    const xmlChar *utf2;
37066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
37076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
37086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if ((x == NULL) || (y == NULL))
37096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return(-2);
37106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    utf1 = x->value.str;
37116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    utf2 = y->value.str;
37126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
37136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    /*
37146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    * Skip leading blank chars of the collapsed string.
37156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    */
37166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2))
37176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	utf2++;
37186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
37196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    while ((*utf1 != 0) && (*utf2 != 0)) {
37206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2)) {
37216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (! (IS_WSP_SPACE_CH(*utf1) || IS_WSP_REPLACE_CH(*utf1))) {
37226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		/*
37236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		* The utf2 character would have been replaced to 0x20.
37246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*/
37256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if ((*utf1 - 0x20) < 0) {
37266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
37276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
37286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
37296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
37306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
37316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
37326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
37336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
37346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
37356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
37366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
37376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    utf1++;
37386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    utf2++;
37396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    /*
37406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    * Skip contiguous blank chars of the collapsed string.
37416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    */
37426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2))
37436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		utf2++;
37446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
37456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (IS_WSP_SPACE_CH(*utf1) || IS_WSP_REPLACE_CH(*utf1)) {
37466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		/*
37476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		* The utf1 character would have been replaced to 0x20.
37486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*/
37496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if ((0x20 - *utf2) < 0) {
37506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
37516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
37526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
37536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
37546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
37556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
37566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
37576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
37586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
37596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
37606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
37616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    tmp = *utf1++ - *utf2++;
37626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0)
37636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(-1);
37646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0)
37656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(1);
37666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
37676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
37686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (*utf1 != 0) {
37696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 if (invert)
37706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(-1);
37716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 else
37726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(1);
37736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
37746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (*utf2 != 0) {
37756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	/*
37766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	* Skip trailing blank chars of the collapsed string.
37776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	*/
37786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2))
37796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    utf2++;
37806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (*utf2 != 0) {
37816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (invert)
37826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(1);
37836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    else
37846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(-1);
37856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
37866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
37876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
37886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
37896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
37906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
37916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
37926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareReplacedStrings:
37936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
37946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
37956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
37966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
37976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
37986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
37996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
38006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
38016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
38026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareReplacedStrings(xmlSchemaValPtr x, xmlSchemaValPtr y)
38036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
38046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    const xmlChar *utf1;
38056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    const xmlChar *utf2;
38066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
38076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
38086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if ((x == NULL) || (y == NULL))
38096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return(-2);
38106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    utf1 = x->value.str;
38116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    utf2 = y->value.str;
38126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
38136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    while ((*utf1 != 0) && (*utf2 != 0)) {
38146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2)) {
38156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (! (IS_WSP_SPACE_CH(*utf1) || IS_WSP_REPLACE_CH(*utf1))) {
38166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if ((*utf1 - 0x20) < 0)
38176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    		    return(-1);
38186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
38196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
38206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
38216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
38226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (IS_WSP_SPACE_CH(*utf1) || IS_WSP_REPLACE_CH(*utf1)) {
38236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if ((0x20 - *utf2) < 0)
38246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    		    return(-1);
38256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
38266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
38276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
38286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    tmp = *utf1 - *utf2;
38296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0)
38306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    		return(-1);
38316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0)
38326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    		return(1);
38336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
38346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	utf1++;
38356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	utf2++;
38366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
38376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (*utf1 != 0)
38386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        return(1);
38396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (*utf2 != 0)
38406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        return(-1);
38416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
38426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
38436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
38446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
3845c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaCompareNormStrings:
3846c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @x:  a first string value
3847c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @y:  a second string value
3848c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
3849c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Compare 2 string for their normalized values.
3850c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
3851c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
3852c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * case of error
3853c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */
3854c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int
3855c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaCompareNormStrings(xmlSchemaValPtr x, xmlSchemaValPtr y) {
3856c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    const xmlChar *utf1;
3857c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    const xmlChar *utf2;
3858c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    int tmp;
3859c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
3860c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    if ((x == NULL) || (y == NULL))
3861c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	return(-2);
3862c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    utf1 = x->value.str;
3863c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    utf2 = y->value.str;
3864c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
386576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while (IS_BLANK_CH(*utf1)) utf1++;
386676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while (IS_BLANK_CH(*utf2)) utf2++;
3867c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    while ((*utf1 != 0) && (*utf2 != 0)) {
386876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if (IS_BLANK_CH(*utf1)) {
386976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    if (!IS_BLANK_CH(*utf2)) {
3870c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		tmp = *utf1 - *utf2;
3871c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(tmp);
3872c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    }
387376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*utf1)) utf1++;
387476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*utf2)) utf2++;
3875c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	} else {
3876c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    tmp = *utf1++ - *utf2++;
3877c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (tmp < 0)
3878c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(-1);
3879c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (tmp > 0)
3880c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(1);
3881c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	}
3882c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
3883c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    if (*utf1 != 0) {
388476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	while (IS_BLANK_CH(*utf1)) utf1++;
3885c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	if (*utf1 != 0)
3886c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    return(1);
3887c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
3888c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    if (*utf2 != 0) {
388976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	while (IS_BLANK_CH(*utf2)) utf2++;
3890c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	if (*utf2 != 0)
3891c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    return(-1);
3892c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
3893c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    return(0);
3894c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard}
3895c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
3896c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/**
3897b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCompareFloats:
3898b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @x:  a first float or double value
3899b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @y:  a second float or double value
3900b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
3901b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Compare 2 values
3902b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
3903b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
3904b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * case of error
3905b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
3906b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int
3907b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) {
3908b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    double d1, d2;
3909b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
3910b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if ((x == NULL) || (y == NULL))
3911b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
3912b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
3913b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
3914b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * Cast everything to doubles.
3915b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
3916b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (x->type == XML_SCHEMAS_DOUBLE)
3917b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d1 = x->value.d;
3918b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else if (x->type == XML_SCHEMAS_FLOAT)
3919b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d1 = x->value.f;
3920b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else
3921b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
3922b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
3923b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (y->type == XML_SCHEMAS_DOUBLE)
3924b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d2 = y->value.d;
3925b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else if (y->type == XML_SCHEMAS_FLOAT)
3926b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d2 = y->value.f;
3927b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else
3928b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
3929b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
3930b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
3931b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * Check for special cases.
3932b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
3933b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (xmlXPathIsNaN(d1)) {
3934b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (xmlXPathIsNaN(d2))
3935b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
3936b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(1);
3937b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
3938b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (xmlXPathIsNaN(d2))
3939b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-1);
3940b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == xmlXPathPINF) {
3941b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (d2 == xmlXPathPINF)
3942b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
3943b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(1);
3944b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
3945b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d2 == xmlXPathPINF)
3946b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(-1);
3947b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == xmlXPathNINF) {
3948b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (d2 == xmlXPathNINF)
3949b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
3950b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(-1);
3951b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
3952b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d2 == xmlXPathNINF)
3953b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(1);
3954b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
3955b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
3956b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * basic tests, the last one we should have equality, but
3957b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * portability is more important than speed and handling
3958b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * NaN or Inf in a portable way is always a challenge, so ...
3959b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
3960b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 < d2)
3961b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-1);
3962b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 > d2)
3963b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(1);
3964b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == d2)
3965b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(0);
3966b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return(2);
3967b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
3968b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
3969b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
39704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareValues:
39714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x:  a first value
39726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xwtsp: the whitespace type
39734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y:  a second value
39746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @ywtsp: the whitespace type
39754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
39764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 values
39774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
39785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
39795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error
39804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
39816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
39826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValuesInternal(xmlSchemaValPtr x,
39836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType xws,
39846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			       xmlSchemaValPtr y,
39856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType yws) {
39864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if ((x == NULL) || (y == NULL))
39874255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(-2);
39884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
39894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    switch (x->type) {
399080b19092f24410a6b869abf519227686e8f207caDaniel Veillard	case XML_SCHEMAS_UNKNOWN:
39912f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	case XML_SCHEMAS_ANYTYPE:
39922f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	case XML_SCHEMAS_ANYSIMPLETYPE:
399380b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    return(-2);
399480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_INTEGER:
399580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NPINTEGER:
399680b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NINTEGER:
399780b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NNINTEGER:
399880b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_PINTEGER:
399980b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_INT:
400080b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_UINT:
400180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_LONG:
400280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ULONG:
400380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_SHORT:
400480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_USHORT:
400580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_BYTE:
400680b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_UBYTE:
40074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMAS_DECIMAL:
400880b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    if (y->type == x->type)
400980b19092f24410a6b869abf519227686e8f207caDaniel Veillard		return(xmlSchemaCompareDecimals(x, y));
401080b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    if ((y->type == XML_SCHEMAS_DECIMAL) ||
401180b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_INTEGER) ||
401280b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_NPINTEGER) ||
401380b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_NINTEGER) ||
401480b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_NNINTEGER) ||
401580b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_PINTEGER) ||
401680b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_INT) ||
401780b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_UINT) ||
401880b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_LONG) ||
401980b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_ULONG) ||
402080b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_SHORT) ||
402180b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_USHORT) ||
402280b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_BYTE) ||
402380b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_UBYTE))
40244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(xmlSchemaCompareDecimals(x, y));
40255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    return(-2);
4026070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        case XML_SCHEMAS_DURATION:
4027070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (y->type == XML_SCHEMAS_DURATION)
4028070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return(xmlSchemaCompareDurations(x, y));
40295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return(-2);
40305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
40315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
40325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
40335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
40345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
40355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
40365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
40375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
40385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if ((y->type == XML_SCHEMAS_DATETIME)  ||
40395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_TIME)      ||
40405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_GDAY)      ||
40415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_GMONTH)    ||
40425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_GMONTHDAY) ||
40435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_GYEAR)     ||
40445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_DATE)      ||
40455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_GYEARMONTH))
40465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return (xmlSchemaCompareDates(x, y));
40475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return (-2);
40486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_STRING:
40496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        case XML_SCHEMAS_NORMSTRING:
405080b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_TOKEN:
405180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_LANGUAGE:
405280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NMTOKEN:
405380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NAME:
405480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NCNAME:
405580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ID:
405680b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_IDREF:
405780b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ENTITY:
405880b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NOTATION:
405980b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ANYURI:
40606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    /*
40616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    * TODO: Compare those against QName.
40626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    */
40636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (y->type == XML_SCHEMAS_QNAME) {
40646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		TODO
40656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return (-2);
40666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
40676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik            if ((y->type == XML_SCHEMAS_STRING) ||
40686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		(y->type == XML_SCHEMAS_NORMSTRING) ||
4069c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_TOKEN) ||
4070c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_LANGUAGE) ||
4071c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_NMTOKEN) ||
4072c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_NAME) ||
4073c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_NCNAME) ||
4074c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_ID) ||
4075c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_IDREF) ||
4076c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_ENTITY) ||
4077c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_NOTATION) ||
40786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik                (y->type == XML_SCHEMAS_ANYURI)) {
40796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
40806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (xws == XML_SCHEMA_WHITESPACE_PRESERVE) {
40816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
40826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) {
40836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			/* TODO: What about x < y or x > y. */
40846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			if (xmlStrEqual(x->value.str, y->value.str))
40856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			    return (0);
40866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			else
40876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			    return (2);
40886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    } else if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
40896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return (xmlSchemaComparePreserveReplaceStrings(x, y, 0));
40906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
40916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return (xmlSchemaComparePreserveCollapseStrings(x, y, 0));
40926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
40936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else if (xws == XML_SCHEMA_WHITESPACE_REPLACE) {
40946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
40956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE)
40966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return (xmlSchemaComparePreserveReplaceStrings(y, x, 1));
40976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
40986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return (xmlSchemaCompareReplacedStrings(x, y));
40996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
41006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return (xmlSchemaCompareReplaceCollapseStrings(x, y, 0));
41016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
41026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else if (xws == XML_SCHEMA_WHITESPACE_COLLAPSE) {
41036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
41046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE)
41056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return (xmlSchemaComparePreserveCollapseStrings(y, x, 1));
41066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
41076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return (xmlSchemaCompareReplaceCollapseStrings(y, x, 1));
41086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
41096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return (xmlSchemaCompareNormStrings(x, y));
41106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else
41116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return (-2);
41126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
41136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4114c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard            return (-2);
4115e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_QNAME:
4116e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard            if (y->type == XML_SCHEMAS_QNAME) {
4117e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) &&
4118e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    (xmlStrEqual(x->value.qname.uri, y->value.qname.uri)))
4119e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    return(0);
4120e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		return(2);
4121e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    }
4122e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (-2);
4123c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_FLOAT:
4124c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_DOUBLE:
4125b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard            if ((y->type == XML_SCHEMAS_FLOAT) ||
4126b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard                (y->type == XML_SCHEMAS_DOUBLE))
4127b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard                return (xmlSchemaCompareFloats(x, y));
4128b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard            return (-2);
4129c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_BOOLEAN:
4130b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard            if (y->type == XML_SCHEMAS_BOOLEAN) {
4131b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (x->value.b == y->value.b)
4132b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    return(0);
4133b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (x->value.b == 0)
4134b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    return(-1);
4135b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		return(1);
4136b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
4137b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return (-2);
4138560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard        case XML_SCHEMAS_HEXBINARY:
413970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard            if (y->type == XML_SCHEMAS_HEXBINARY) {
414070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	        if (x->value.hex.total == y->value.hex.total) {
414170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    int ret = xmlStrcmp(x->value.hex.str, y->value.hex.str);
414270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    if (ret > 0)
414370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard			return(1);
414470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    else if (ret == 0)
414570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard			return(0);
414670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		}
414770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		else if (x->value.hex.total > y->value.hex.total)
414870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    return(1);
414970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
415070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		return(-1);
415170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard            }
4152560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard            return (-2);
41531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BASE64BINARY:
41541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (y->type == XML_SCHEMAS_BASE64BINARY) {
41551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (x->value.base64.total == y->value.base64.total) {
41561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int ret = xmlStrcmp(x->value.base64.str,
41571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		                        y->value.base64.str);
41581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (ret > 0)
41591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        return(1);
41601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (ret == 0)
41611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        return(0);
41621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
41631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else if (x->value.base64.total > y->value.base64.total)
41641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    return(1);
41651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else
41661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    return(-1);
41671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
41686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik            return (-2);
4169c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_IDREFS:
4170c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ENTITIES:
4171c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NMTOKENS:
4172c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    TODO
4173c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    break;
41744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
41755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return -2;
41764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
41774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
41784255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
41796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValues:
41806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first value
41816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second value
41826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
41836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values
41846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
41856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
41866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
41876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
41886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint
41896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) {
41906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    xmlSchemaWhitespaceValueType xws, yws;
41916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
41926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (x->type == XML_SCHEMAS_STRING)
41936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	xws = XML_SCHEMA_WHITESPACE_PRESERVE;
41946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else if (x->type == XML_SCHEMAS_NORMSTRING)
41956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        xws = XML_SCHEMA_WHITESPACE_REPLACE;
41966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else
41976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        xws = XML_SCHEMA_WHITESPACE_COLLAPSE;
41986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
41996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (y->type == XML_SCHEMAS_STRING)
42006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	yws = XML_SCHEMA_WHITESPACE_PRESERVE;
42016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else if (x->type == XML_SCHEMAS_NORMSTRING)
42026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        yws = XML_SCHEMA_WHITESPACE_REPLACE;
42036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else
42046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        yws = XML_SCHEMA_WHITESPACE_COLLAPSE;
42056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
42066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(xmlSchemaCompareValuesInternal(x, xws, y, yws));
42076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
42086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
42096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
42106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValuesWhtsp:
42116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first value
42126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xws: the whitespace value of x
42136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second value
42146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @yws: the whitespace value of y
42156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
42166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values
42176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
42186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
42196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
42206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
42216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint
42226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValuesWhtsp(xmlSchemaValPtr x,
42236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				 xmlSchemaWhitespaceValueType xws,
42246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				 xmlSchemaValPtr y,
42256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				 xmlSchemaWhitespaceValueType yws) {
42266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(xmlSchemaCompareValuesInternal(x, xws, y, yws));
42276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
42286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
42296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
4230c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaNormLen:
4231c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @value:  a string
4232c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
4233c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Computes the UTF8 length of the normalized value of the string
4234c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
4235c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns the length or -1 in case of error.
4236c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */
4237c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int
4238c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaNormLen(const xmlChar *value) {
4239c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    const xmlChar *utf;
4240c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    int ret = 0;
4241c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
4242c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    if (value == NULL)
4243c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	return(-1);
4244c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    utf = value;
424576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while (IS_BLANK_CH(*utf)) utf++;
4246c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    while (*utf != 0) {
4247c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	if (utf[0] & 0x80) {
4248c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if ((utf[1] & 0xc0) != 0x80)
4249c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(-1);
4250c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if ((utf[0] & 0xe0) == 0xe0) {
4251c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		if ((utf[2] & 0xc0) != 0x80)
4252c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    return(-1);
4253c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		if ((utf[0] & 0xf0) == 0xf0) {
4254c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80)
4255c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard			return(-1);
4256c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    utf += 4;
4257c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		} else {
4258c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    utf += 3;
4259c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		}
4260c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    } else {
4261c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		utf += 2;
4262c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    }
426376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	} else if (IS_BLANK_CH(*utf)) {
426476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*utf)) utf++;
4265c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (*utf == 0)
4266c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		break;
4267c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	} else {
4268c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    utf++;
4269c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	}
4270c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	ret++;
4271c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
4272c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    return(ret);
4273c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard}
4274c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
42756927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard/**
42766927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaGetFacetValueAsULong:
42776927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * @facet: an schemas type facet
42786927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard *
42796927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Extract the value of a facet
42806927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard *
42816927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Returns the value as a long
42826927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard */
4283c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardunsigned long
4284c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaGetFacetValueAsULong(xmlSchemaFacetPtr facet)
4285c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{
4286c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    /*
4287c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    * TODO: Check if this is a decimal.
4288c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    */
4289094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack    if (facet == NULL)
4290094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack        return 0;
4291c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    return ((unsigned long) facet->val->value.decimal.lo);
4292c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
4293c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
4294c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/**
429501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateListSimpleTypeFacet:
429601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facet:  the facet to check
429701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @value:  the lexical repr of the value to validate
429801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @actualLen:  the number of list items
429901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @expectedLen: the resulting expected number of list items
430001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
430101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Checks the value of a list simple type against a facet.
430201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
430301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 0 if the value is valid, a positive error code
430401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * number otherwise and -1 in case of an internal error.
430501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
430601fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint
430701fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaValidateListSimpleTypeFacet(xmlSchemaFacetPtr facet,
430801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     const xmlChar *value,
430901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     unsigned long actualLen,
431001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     unsigned long *expectedLen)
431101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
4312ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard    if (facet == NULL)
4313ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard        return(-1);
431401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    /*
431501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * TODO: Check if this will work with large numbers.
431601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * (compare value.decimal.mi and value.decimal.hi as well?).
431701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
431801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
431901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen != facet->val->value.decimal.lo) {
4320c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    if (expectedLen != 0)
4321c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
432201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_LENGTH_VALID);
432301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
432401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
432501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen < facet->val->value.decimal.lo) {
4326c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    if (expectedLen != 0)
4327c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
432801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_MINLENGTH_VALID);
432901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
433001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MAXLENGTH) {
433101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen > facet->val->value.decimal.lo) {
4332c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    if (expectedLen != 0)
4333c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
433401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_MAXLENGTH_VALID);
433501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
433601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else
433701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	/*
433801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	* NOTE: That we can pass NULL as xmlSchemaValPtr to
433901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	* xmlSchemaValidateFacet, since the remaining facet types
434001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	* are: XML_SCHEMA_FACET_PATTERN, XML_SCHEMA_FACET_ENUMERATION.
434101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	*/
434201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	return(xmlSchemaValidateFacet(NULL, facet, value, NULL));
434301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    return (0);
434401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
434501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
434601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
43476927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaValidateLengthFacet:
4348c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type:  the built-in type
4349c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @facet:  the facet to check
4350c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value:  the lexical repr. of the value to be validated
4351c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val:  the precomputed value
4352c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @length: the actual length of the value
4353c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
4354c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength"
4355c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * facet; sets @length to the computed length of @value.
4356c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
4357c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if the value is valid, a positive error code
4358c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * otherwise and -1 in case of an internal or API error.
4359c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */
4360c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardint
4361c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaValidateLengthFacet(xmlSchemaTypePtr type,
4362c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard			     xmlSchemaFacetPtr facet,
4363c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard			     const xmlChar *value,
4364c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard			     xmlSchemaValPtr val,
4365c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard			     unsigned long *length)
4366c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{
4367c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    unsigned int len = 0;
4368c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
4369ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard    if ((length == NULL) || (facet == NULL) || (type == NULL))
4370ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard        return (-1);
4371c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    *length = 0;
4372c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((facet->type != XML_SCHEMA_FACET_LENGTH) &&
4373c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->type != XML_SCHEMA_FACET_MAXLENGTH) &&
4374c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->type != XML_SCHEMA_FACET_MINLENGTH))
4375c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	return (-1);
4376c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
4377c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((facet->val == NULL) ||
4378c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	((facet->val->type != XML_SCHEMAS_DECIMAL) &&
4379c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
4380c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->val->value.decimal.frac != 0)) {
4381c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	return(-1);
4382c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
4383c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY))
4384c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	len = val->value.hex.total;
4385c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY))
4386c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	len = val->value.base64.total;
4387c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    else {
4388c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	switch (type->builtInType) {
4389c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_IDREF:
4390c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NORMSTRING:
4391c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_TOKEN:
4392c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_LANGUAGE:
4393c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NMTOKEN:
4394c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NAME:
4395c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NCNAME:
4396c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_ID:
4397c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		len = xmlSchemaNormLen(value);
4398c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		break;
4399c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_STRING:
4400c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    /*
4401c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    * FIXME: What exactly to do with anyURI?
4402c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    */
4403c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_ANYURI:
4404c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		if (value != NULL)
4405c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		    len = xmlUTF8Strlen(value);
4406c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		break;
4407c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    default:
4408c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		TODO
4409c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	}
4410c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
4411c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    *length = (unsigned long) len;
4412c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
4413c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len != facet->val->value.decimal.lo)
4414c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_LENGTH_VALID);
4415c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
4416c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len < facet->val->value.decimal.lo)
4417c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_MINLENGTH_VALID);
4418c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    } else {
4419c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len > facet->val->value.decimal.lo)
4420c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXLENGTH_VALID);
4421c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
4422c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
4423c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    return (0);
4424c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
4425c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
4426c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/**
4427c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaValidateFacet:
442801c13b5be2d249ef66d86585adee87901bb8efa2Daniel Veillard * @base:  the base type
44294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @facet:  the facet to check
44304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value:  the lexical repr of the value to validate
44314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val:  the precomputed value
44324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
44334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Check a value against a facet condition
44344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
44354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if the element is schemas valid, a positive error code
44364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *     number otherwise and -1 in case of internal or API error.
44374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
44384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardint
4439dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateFacet(xmlSchemaTypePtr base ATTRIBUTE_UNUSED,
4440118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	               xmlSchemaFacetPtr facet,
44414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	               const xmlChar *value, xmlSchemaValPtr val)
44424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{
44434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    int ret;
44444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
4445ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard    if ((facet == NULL) || (value == NULL))
4446ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard        return(-1);
44474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    switch (facet->type) {
44484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMA_FACET_PATTERN:
44494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    ret = xmlRegexpExec(facet->regexp, value);
44504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == 1)
44514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(0);
44524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == 0) {
445301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return(XML_SCHEMAV_CVC_PATTERN_VALID);
44544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    }
44554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    return(ret);
44564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMA_FACET_MAXEXCLUSIVE:
44574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
44584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == -2) {
44598bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		/* TODO error code */
44604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(-1);
44614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    }
44624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == -1)
44634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(0);
44645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    /* error code */
446501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID);
4466070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MAXINCLUSIVE:
4467070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
4468070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret == -2) {
44698bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		/* TODO error code */
4470070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
4471070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }
4472070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((ret == -1) || (ret == 0))
4473070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
44745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    /* error code */
447501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID);
4476070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MINEXCLUSIVE:
4477070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
4478070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret == -2) {
44798bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		/* TODO error code */
4480070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
4481070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }
4482070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret == 1)
4483070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
44845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    /* error code */
448501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID);
4486070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MININCLUSIVE:
4487070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
4488070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret == -2) {
44898bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		/* TODO error code */
4490070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
4491070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }
4492070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((ret == 1) || (ret == 0))
4493070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
44945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    /* error code */
449501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MININCLUSIVE_VALID);
44968651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard	case XML_SCHEMA_FACET_WHITESPACE:
44978bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    /* TODO whitespaces */
449801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    /*
449901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * NOTE: Whitespace should be handled to normalize
450001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * the value to be validated against a the facets;
450101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * not to normalize the value in-between.
450201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    */
45038651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard	    return(0);
45048bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case  XML_SCHEMA_FACET_ENUMERATION:
45058bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    if ((facet->value != NULL) &&
45068bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		(xmlStrEqual(facet->value, value)))
45078bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		return(0);
450801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_ENUMERATION_VALID);
45098bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case XML_SCHEMA_FACET_LENGTH:
4510e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard	case XML_SCHEMA_FACET_MAXLENGTH:
45118bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case XML_SCHEMA_FACET_MINLENGTH: {
45128bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    unsigned int len = 0;
4513e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard
45148bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    if ((facet->val == NULL) ||
4515e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		((facet->val->type != XML_SCHEMAS_DECIMAL) &&
4516e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
45178bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		(facet->val->value.decimal.frac != 0)) {
45188bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		return(-1);
45198bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    }
4520560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY))
452170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		len = val->value.hex.total;
45221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	    else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY))
45231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		len = val->value.base64.total;
45241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	    else {
452501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		switch (base->builtInType) {
4526560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    	    case XML_SCHEMAS_IDREF:
4527560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NORMSTRING:
4528560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_TOKEN:
4529560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_LANGUAGE:
4530560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NMTOKEN:
4531560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NAME:
4532560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NCNAME:
4533560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_ID:
453470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    	len = xmlSchemaNormLen(value);
453570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    	break;
4536560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_STRING:
453701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    /*
453801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    * FIXME: What exactly to do with anyURI?
453901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    */
454001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    case XML_SCHEMAS_ANYURI:
4541fbf2c5eaf550a8e7b94e87d5a4940db53bdffeacWilliam M. Brack		        if (value != NULL)
4542fbf2c5eaf550a8e7b94e87d5a4940db53bdffeacWilliam M. Brack			    len = xmlUTF8Strlen(value);
454370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    	break;
4544560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    default:
4545560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		        TODO
454670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	    	}
45478bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    }
45488bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
4549e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len != facet->val->value.decimal.lo)
455001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_LENGTH_VALID);
45518bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
4552e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len < facet->val->value.decimal.lo)
455301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_MINLENGTH_VALID);
45548bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    } else {
4555e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len > facet->val->value.decimal.lo)
455601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_MAXLENGTH_VALID);
4557e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard	    }
45588bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    break;
45598bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	}
4560560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	case XML_SCHEMA_FACET_TOTALDIGITS:
4561560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	case XML_SCHEMA_FACET_FRACTIONDIGITS:
4562560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
4563560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((facet->val == NULL) ||
4564560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		((facet->val->type != XML_SCHEMAS_DECIMAL) &&
4565560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
4566560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		(facet->val->value.decimal.frac != 0)) {
4567560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		return(-1);
4568560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
4569560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((val == NULL) ||
4570560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		((val->type != XML_SCHEMAS_DECIMAL) &&
4571560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_INTEGER) &&
4572560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NPINTEGER) &&
4573560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NINTEGER) &&
4574560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NNINTEGER) &&
4575560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_PINTEGER) &&
4576560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_INT) &&
4577560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_UINT) &&
4578560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_LONG) &&
4579560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_ULONG) &&
4580560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_SHORT) &&
4581560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_USHORT) &&
4582560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_BYTE) &&
4583560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_UBYTE))) {
4584560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		return(-1);
4585560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
4586560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) {
4587560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	        if (val->value.decimal.total > facet->val->value.decimal.lo)
458801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	            return(XML_SCHEMAV_CVC_TOTALDIGITS_VALID);
4589560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
4590560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) {
4591560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	        if (val->value.decimal.frac > facet->val->value.decimal.lo)
459201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID);
4593560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
4594560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    break;
45954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	default:
45964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    TODO
45974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
45984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return(0);
4599b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
46004255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
46014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
46026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
46036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaGetCanonValue:
46046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @val: the precomputed value
46056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @retValue: the returned value
46066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
46076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns a the cononical representation of the value.
46086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * The called has to free the returned retValue.
46096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
46106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns 0 if the value could be built and -1 in case of
46116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *         API errors or if the value type is not supported yet.
46126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
46136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint
46146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaGetCanonValue(xmlSchemaValPtr val,
46156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		       const xmlChar **retValue)
46166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
46176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (retValue == NULL)
46186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return (-1);
46196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    *retValue = NULL;
46206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    switch (val->type) {
46216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_STRING:
46226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NORMSTRING:
46236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	/*
46246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_TOKEN:
46256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_LANGUAGE:
46266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NMTOKEN:
46276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NAME:
46286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_QNAME:
46296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NCNAME:
46306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_ID:
46316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_IDREF:
46326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_ENTITY:
46336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NOTATION:
46346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_ANYURI:
46356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	*/
46366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (val->value.str == NULL)
46376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*retValue = NULL;
46386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    else
46396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		/* TODO: This is not yet correct for non-normalized values. */
46406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*retValue =
46416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    BAD_CAST xmlStrdup((const xmlChar *) val->value.str);
46426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return (0);
46436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	default:
46446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return (-1);
46456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
46466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return (-1);
46476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
46486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
46494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#endif /* LIBXML_SCHEMAS_ENABLED */
4650