xmlschemastypes.c revision 2ee855d0d0b5aff0c20768ebe5afe6601443ee0b
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
687b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @value:  the value
6886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
6896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Allocate a new simple type value. The type can be
6902ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * of XML_SCHEMAS_STRING.
6912ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * WARNING: This one is intended to be expanded for other
6922ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * string based types. We need this for anySimpleType as well.
6936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
6946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error
6956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
6966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaValPtr
6976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaNewStringValue(xmlSchemaValType type,
6986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			const xmlChar *value)
6996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
7006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    xmlSchemaValPtr val;
7016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
7026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (type != XML_SCHEMAS_STRING)
7036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return(NULL);
7046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    val = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal));
7056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (val == NULL) {
7066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return(NULL);
7076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
7086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    memset(val, 0, sizeof(xmlSchemaVal));
7096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    val->type = type;
7106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    val->value.str = (xmlChar *) value;
7116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(val);
7126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
7136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
714b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik/**
715b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * xmlSchemaNewNOTATIONValue:
716b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @name:  the notation name
717b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @ns: the notation namespace name or NULL
718b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik *
719b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * Allocate a new NOTATION value.
720b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik *
721b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error
722b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik */
723b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. BuchcikxmlSchemaValPtr
724b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. BuchcikxmlSchemaNewNOTATIONValue(const xmlChar *name,
725b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik			  const xmlChar *ns)
726b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik{
727b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    xmlSchemaValPtr val;
728b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik
729b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    val = xmlSchemaNewValue(XML_SCHEMAS_NOTATION);
730b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    if (val == NULL)
731b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik	return (NULL);
732b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik
73312d37ab63441baf9e03db70168cc1d0d6f1c2373William M. Brack    val->value.qname.name = (xmlChar *)name;
734b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    if (ns != NULL)
73512d37ab63441baf9e03db70168cc1d0d6f1c2373William M. Brack	val->value.qname.uri = (xmlChar *)ns;
736b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    return(val);
737b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik}
7386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
7396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
7404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaFreeValue:
7414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value:  the value to free
7424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
7434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library
7444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
7454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid
7464255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaFreeValue(xmlSchemaValPtr value) {
7474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (value == NULL)
7484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return;
749c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    switch (value->type) {
750c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_STRING:
751c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NORMSTRING:
752c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_TOKEN:
753c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_LANGUAGE:
754c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NMTOKEN:
755c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NMTOKENS:
756c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NAME:
757c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NCNAME:
758c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ID:
759c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_IDREF:
760c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_IDREFS:
761c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ENTITY:
762b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik        case XML_SCHEMAS_ENTITIES:
763c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ANYURI:
764c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (value->value.str != NULL)
765c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		xmlFree(value->value.str);
766c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    break;
767b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik	case XML_SCHEMAS_NOTATION:
768e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_QNAME:
769e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    if (value->value.qname.uri != NULL)
770e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		xmlFree(value->value.qname.uri);
771e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    if (value->value.qname.name != NULL)
772e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		xmlFree(value->value.qname.name);
773e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    break;
77470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard        case XML_SCHEMAS_HEXBINARY:
77570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	    if (value->value.hex.str != NULL)
77670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		xmlFree(value->value.hex.str);
77770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	    break;
7781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BASE64BINARY:
7791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	    if (value->value.base64.str != NULL)
7801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		xmlFree(value->value.base64.str);
7811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	    break;
782c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	default:
783c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    break;
784c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
7854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlFree(value);
7864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
7874255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
7884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
7894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaGetPredefinedType:
7904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name: the type name
7914255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @ns:  the URI of the namespace usually "http://www.w3.org/2001/XMLSchema"
7924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
7934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Lookup a type in the default XML Schemas type library
7944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
7954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns the type if found, NULL otherwise
7964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
7974255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaTypePtr
7984255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaGetPredefinedType(const xmlChar *name, const xmlChar *ns) {
7994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
8004255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	xmlSchemaInitTypes();
8014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (name == NULL)
8024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(NULL);
8034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return((xmlSchemaTypePtr) xmlHashLookup2(xmlSchemaTypesBank, name, ns));
8044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
805070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
80601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
80701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInListSimpleTypeItemType:
80801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in simple type.
80901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
8106927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Lookup function
8116927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard *
812c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns the item type of @type as defined by the built-in datatype
813c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * hierarchy of XML Schema Part 2: Datatypes, or NULL in case of an error.
81401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
81501fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr
81601fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInListSimpleTypeItemType(xmlSchemaTypePtr type)
81701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
8184259532303e96e089a185c6f55056cb7c4902d71Daniel Veillard    if ((type == NULL) || (type->type != XML_SCHEMA_TYPE_BASIC))
81901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	return (NULL);
82001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type->builtInType) {
82101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NMTOKENS:
82201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNmtokenDef );
82301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_IDREFS:
82401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdrefDef);
82501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ENTITIES:
82601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeEntityDef);
82701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	default:
82801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (NULL);
82901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
83001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
83101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
832070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/****************************************************************
833070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
834070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *		Convenience macros and functions		*
835070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
836070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/
837070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
838070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_TZO_CHAR(c)						\
839070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	((c == 0) || (c == 'Z') || (c == '+') || (c == '-'))
840070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
841070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_YEAR(yr)          (yr != 0)
842070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MONTH(mon)        ((mon >= 1) && (mon <= 12))
843070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* VALID_DAY should only be used when month is unknown */
844070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DAY(day)          ((day >= 1) && (day <= 31))
845070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_HOUR(hr)          ((hr >= 0) && (hr <= 23))
846070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MIN(min)          ((min >= 0) && (min <= 59))
847070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_SEC(sec)          ((sec >= 0) && (sec < 60))
848070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TZO(tzo)          ((tzo > -1440) && (tzo < 1440))
849070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_LEAP(y)						\
850070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
851070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
852ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonth[12] =
853070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
854ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonthLeap[12] =
855070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
856070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
8575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MAX_DAYINMONTH(yr,mon)                                  \
8585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1])
8595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
860070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MDAY(dt)						\
861070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(IS_LEAP(dt->year) ?				        \
862070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (dt->day <= daysInMonthLeap[dt->mon - 1]) :	        \
863070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (dt->day <= daysInMonth[dt->mon - 1]))
864070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
865070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATE(dt)						\
866070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_YEAR(dt->year) && VALID_MONTH(dt->mon) && VALID_MDAY(dt))
867070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
868070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TIME(dt)						\
869070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_HOUR(dt->hour) && VALID_MIN(dt->min) &&		\
870070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 VALID_SEC(dt->sec) && VALID_TZO(dt->tzo))
871070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
872070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATETIME(dt)					\
873070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_DATE(dt) && VALID_TIME(dt))
874070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
875070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_MIN            (60)
876070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_HOUR           (60 * SECS_PER_MIN)
877070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_DAY            (24 * SECS_PER_HOUR)
878070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
8795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInYearByMonth[12] =
8805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
8815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInLeapYearByMonth[12] =
8825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };
8835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
8845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DAY_IN_YEAR(day, month, year)				\
8855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ((IS_LEAP(year) ?					\
8865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                dayInLeapYearByMonth[month - 1] :		\
8875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                dayInYearByMonth[month - 1]) + day)
8885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
8895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#ifdef DEBUG
8905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt)                                                  \
8915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlGenericError(xmlGenericErrorContext,                             \
8925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        "type=%o %04ld-%02u-%02uT%02u:%02u:%03f",                       \
8935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->type,dt->value.date.year,dt->value.date.mon,                \
8945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->value.date.day,dt->value.date.hour,dt->value.date.min,      \
8955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->value.date.sec);                                            \
8965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dt->value.date.tz_flag)                                         \
8975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (dt->value.date.tzo != 0)                                    \
8985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmlGenericError(xmlGenericErrorContext,                     \
8995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                "%+05d\n",dt->value.date.tzo);                          \
9005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else                                                            \
9015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmlGenericError(xmlGenericErrorContext, "Z\n");             \
9025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else                                                                \
9035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        xmlGenericError(xmlGenericErrorContext,"\n")
9045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#else
9055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt)
9065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#endif
9075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
908070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
909070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGYear:
910070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
911070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
912070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
913070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gYear without time zone and fills in the appropriate
914070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
915070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gYear. It is supposed that @dt->year is big enough to contain
916070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * the year.
917070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
918070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
919070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
920070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
921070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) {
922070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str, *firstChar;
923070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int isneg = 0, digcnt = 0;
924070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
925070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (((*cur < '0') || (*cur > '9')) &&
926070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(*cur != '-') && (*cur != '+'))
927070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
928070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
929070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur == '-') {
930070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	isneg = 1;
931070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
932070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
933070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
934070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    firstChar = cur;
935070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
936070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    while ((*cur >= '0') && (*cur <= '9')) {
937070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->year = dt->year * 10 + (*cur - '0');
938070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
939070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	digcnt++;
940070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
941070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
942070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* year must be at least 4 digits (CCYY); over 4
943070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * digits cannot have a leading zero. */
944070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0')))
945070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
946070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
947070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (isneg)
948070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->year = - dt->year;
949070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
950070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (!VALID_YEAR(dt->year))
951070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
952070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
953070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
954070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
955070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
956070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
957070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
958070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_2_DIGITS:
959070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the integer to fill in
960070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
961070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer
962070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
963070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a 2-digits integer and updates @num with the value. @cur is
964070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer.
965070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and
966070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
967070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
968070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_2_DIGITS(num, cur, invalid)			\
969070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if ((cur[0] < '0') || (cur[0] > '9') ||			\
970070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (cur[1] < '0') || (cur[1] > '9'))			\
971070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    invalid = 1;					\
972070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	else							\
973070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    num = (cur[0] - '0') * 10 + (cur[1] - '0');		\
974070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur += 2;
975070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
976070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
977070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_FLOAT:
978070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the double to fill in
979070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
980070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer
981070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
982070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float and updates @num with the value. @cur is
983070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the float. The float must have a
984070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2-digits integer part and may or may not have a decimal part.
985070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and
986070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
987070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
988070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_FLOAT(num, cur, invalid)				\
989070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(num, cur, invalid);			\
990070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!invalid && (*cur == '.')) {			\
991070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    double mult = 1;				        \
992070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    cur++;						\
993070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((*cur < '0') || (*cur > '9'))			\
994070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		invalid = 1;					\
995070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
996070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		mult /= 10;					\
997070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num += (*cur - '0') * mult;			\
998070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		cur++;						\
999070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }							\
1000070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1001070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1002070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1003070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGMonth:
1004070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1005070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1006070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1007070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gMonth 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:gMonth.
1010070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1011070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1012070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1013070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1014070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) {
1015070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
1016070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
1017070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1018070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_2_DIGITS(dt->mon, cur, ret);
1019070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1020070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1021070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1022070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (!VALID_MONTH(dt->mon))
1023070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1024070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1025070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1026070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1027070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1028070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1029070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1030070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGDay:
1031070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1032070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1033070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1034070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gDay without time zone and fills in the appropriate
1035070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1036070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay.
1037070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1038070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1039070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1040070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1041070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) {
1042070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
1043070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
1044070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1045070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_2_DIGITS(dt->day, cur, ret);
1046070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1047070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1048070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1049070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (!VALID_DAY(dt->day))
1050070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1051070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1052070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1053070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1054070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1055070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1056070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1057070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTime:
1058070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1059070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1060070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1061070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:time without time zone and fills in the appropriate
1062070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * fields of the @dt structure. @str is updated to point just after the
1063070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:time.
1064070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, values of @dt fields are undefined.
1065070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1066070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1067070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1068070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1069070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) {
1070070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
1071070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int hour = 0; /* use temp var in case str is not xs:time */
1072070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
1073070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1074070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_2_DIGITS(hour, cur, ret);
1075070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1076070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1077070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1078070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != ':')
1079070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1080070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1081070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1082070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* the ':' insures this string is xs:time */
1083070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dt->hour = hour;
1084070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1085070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_2_DIGITS(dt->min, cur, ret);
1086070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1087070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1088070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1089070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != ':')
1090070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1091070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1092070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1093070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_FLOAT(dt->sec, cur, ret);
1094070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1095070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1096070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1097070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (!VALID_TIME(dt))
1098070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1099070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1100070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1101070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1102070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1103070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1104070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1105070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTimeZone:
1106070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1107070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1108070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1109070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a time zone without time zone and fills in the appropriate
1110070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1111070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * time zone.
1112070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1113070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1114070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1115070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1116070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) {
1117070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
1118070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
1119070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1120070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (str == NULL)
1121070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1122070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1123070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    switch (*cur) {
1124070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case 0:
1125070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tz_flag = 0;
1126070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = 0;
1127070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1128070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1129070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case 'Z':
1130070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tz_flag = 1;
1131070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = 0;
1132070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1133070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1134070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1135070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case '+':
1136070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case '-': {
1137070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	int isneg = 0, tmp = 0;
1138070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	isneg = (*cur == '-');
1139070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1140070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1141070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1142070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(tmp, cur, ret);
1143070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1144070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return ret;
1145070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_HOUR(tmp))
1146070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1147070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1148070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (*cur != ':')
1149070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 1;
1150070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1151070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1152070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = tmp * 60;
1153070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1154070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(tmp, cur, ret);
1155070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1156070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return ret;
1157070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_MIN(tmp))
1158070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1159070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1160070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo += tmp;
1161070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (isneg)
1162070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    dt->tzo = - dt->tzo;
1163070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1164070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_TZO(dt->tzo))
1165070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1166070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
11675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	dt->tz_flag = 1;
1168070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1169070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard      }
1170070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    default:
1171070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1172070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1173070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1174070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1175070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1176070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1177070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
11781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard/**
11791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * _xmlSchemaBase64Decode:
11801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * @ch: a character
11811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *
11821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Converts a base64 encoded character to its base 64 value.
11831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *
11841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Returns 0-63 (value), 64 (pad), or -1 (not recognized)
11851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */
11861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic int
11871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard_xmlSchemaBase64Decode (const xmlChar ch) {
11881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('A' <= ch) && (ch <= 'Z')) return ch - 'A';
11891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('a' <= ch) && (ch <= 'z')) return ch - 'a' + 26;
11901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('0' <= ch) && (ch <= '9')) return ch - '0' + 52;
11911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('+' == ch) return 62;
11921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('/' == ch) return 63;
11931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('=' == ch) return 64;
11941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return -1;
11951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard}
11961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
1197070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/****************************************************************
1198070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
1199070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *	XML Schema Dates/Times Datatypes Handling		*
1200070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
1201070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/
1202070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1203070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1204070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_DIGITS:
1205070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the integer to fill in
1206070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1207070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag
1208070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1209070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a digits integer and updates @num with the value. @cur is
1210070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer.
1211070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and
1212070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1213070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1214070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_DIGITS(num, cur, num_type)	                \
1215070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if ((*cur < '0') || (*cur > '9'))			\
1216070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    num_type = -1;					\
1217070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else                                                    \
1218070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
1219070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	        num = num * 10 + (*cur - '0');		        \
1220070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	        cur++;                                          \
1221070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            }
1222070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1223070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1224070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_NUM:
1225070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the double to fill in
1226070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1227070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag
1228070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1229070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float or integer and updates @num with the value. @cur is
1230070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the number. If the number is a float,
1231070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * then it must have an integer part and a decimal part; @num_type will
1232070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * be set to 1. If there is no decimal part, @num_type is set to zero.
1233070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and
1234070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1235070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1236070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_NUM(num, cur, num_type)				\
1237070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        num = 0;                                                \
1238070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_DIGITS(num, cur, num_type);	                \
1239070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!num_type && (*cur == '.')) {			\
1240070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    double mult = 1;				        \
1241070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    cur++;						\
1242070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((*cur < '0') || (*cur > '9'))			\
1243070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num_type = -1;					\
1244070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else                                                \
1245070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                num_type = 1;                                   \
1246070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
1247070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		mult /= 10;					\
1248070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num += (*cur - '0') * mult;			\
1249070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		cur++;						\
1250070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }							\
1251070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1252070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1253070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
12545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDates:
1255455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard * @type: the expected type or XML_SCHEMAS_UNKNOWN
1256070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dateTime:  string to analyze
1257070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val:  the return computed value
1258070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1259070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @dateTime conforms to the lexical space of one of the date types.
1260070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val.
1261070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1262070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
1263070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *         and -1 in case of internal or API error.
1264070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1265070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1266455cc07308c673b6714e2f5670c2091a1dab95dcDaniel VeillardxmlSchemaValidateDates (xmlSchemaValType type,
1267118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	                const xmlChar *dateTime, xmlSchemaValPtr *val) {
1268070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmlSchemaValPtr dt;
1269070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret;
1270070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = dateTime;
1271070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1272070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define RETURN_TYPE_IF_VALID(t)					\
1273070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (IS_TZO_CHAR(*cur)) {					\
1274070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur);	\
1275070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret == 0) {						\
1276070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (*cur != 0)					\
1277070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		goto error;					\
1278070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    dt->type = t;					\
1279455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard	    goto done;						\
1280070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}							\
1281070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1282070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1283070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dateTime == NULL)
1284070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1285070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1286070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((*cur != '-') && (*cur < '0') && (*cur > '9'))
1287070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1288070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1289070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN);
1290070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dt == NULL)
1291070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1292070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1293070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((cur[0] == '-') && (cur[1] == '-')) {
1294070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/*
1295070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * It's an incomplete date (xs:gMonthDay, xs:gMonth or
1296070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * xs:gDay)
1297070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 */
1298070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur += 2;
1299070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1300070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/* is it an xs:gDay? */
1301070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (*cur == '-') {
1302455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard	    if (type == XML_SCHEMAS_GMONTH)
1303455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard		goto error;
1304070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	  ++cur;
1305070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1306070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret != 0)
1307070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		goto error;
1308070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1309070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY);
1310070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1311070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    goto error;
1312070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1313070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1314070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/*
1315070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * it should be an xs:gMonthDay or xs:gMonth
1316070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 */
1317070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur);
1318070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1319070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    goto error;
1320070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1321d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        /*
1322d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a '-' char could indicate this type is xs:gMonthDay or
1323d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a negative time zone offset. Check for xs:gMonthDay first.
1324d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * Also the first three char's of a negative tzo (-MM:SS) can
1325d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * appear to be a valid day; so even if the day portion
1326d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * of the xs:gMonthDay verifies, we must insure it was not
1327d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a tzo.
1328d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         */
1329d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if (*cur == '-') {
1330d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            const xmlChar *rewnd = cur;
1331d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            cur++;
1332d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1333d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard  	    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1334d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            if ((ret == 0) && ((*cur == 0) || (*cur != ':'))) {
1335d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1336d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                /*
1337d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * we can use the VALID_MDAY macro to validate the month
1338d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * and day because the leap year test will flag year zero
1339d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * as a leap year (even though zero is an invalid year).
1340d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 */
1341d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                if (VALID_MDAY((&(dt->value.date)))) {
1342d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1343d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard	            RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY);
1344070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1345d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                    goto error;
1346d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                }
1347d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            }
1348d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1349d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            /*
1350d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             * not xs:gMonthDay so rewind and check if just xs:gMonth
1351d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             * with an optional time zone.
1352d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             */
1353d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            cur = rewnd;
1354d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        }
1355d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1356d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard	RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH);
1357070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1358070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1359070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1360070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1361070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /*
1362070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * It's a right-truncated date or an xs:time.
1363070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * Try to parse an xs:time then fallback on right-truncated dates.
1364070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     */
1365070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((*cur >= '0') && (*cur <= '9')) {
1366070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseTime(&(dt->value.date), &cur);
1367070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret == 0) {
1368070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    /* it's an xs:time */
1369070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_TIME);
1370070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1371070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1372070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1373070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* fallback on date parsing */
1374070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur = dateTime;
1375070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1376070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGYear(&(dt->value.date), &cur);
1377070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1378070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1379070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1380070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:gYear? */
1381070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEAR);
1382070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1383070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != '-')
1384070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1385070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1386070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1387070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur);
1388070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1389070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1390070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1391070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:gYearMonth? */
1392070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEARMONTH);
1393070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1394070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != '-')
1395070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1396070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1397070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1398070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1399070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((ret != 0) || !VALID_DATE((&(dt->value.date))))
1400070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1401070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1402070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:date? */
1403070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_DATE);
1404070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1405070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != 'T')
1406070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1407070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1408070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1409070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* it should be an xs:dateTime */
1410070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseTime(&(dt->value.date), &cur);
1411070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1412070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1413070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1414070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur);
1415070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((ret != 0) || (*cur != 0) || !VALID_DATETIME((&(dt->value.date))))
1416070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1417070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1418455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard
1419070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dt->type = XML_SCHEMAS_DATETIME;
1420070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1421455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillarddone:
1422d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#if 1
1423d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type))
1424d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        goto error;
1425d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#else
1426d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    /*
1427d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     * insure the parsed type is equal to or less significant (right
1428d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     * truncated) than the desired type.
1429d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     */
1430d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) {
1431d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1432d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        /* time only matches time */
1433d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_TIME) && (dt->type == XML_SCHEMAS_TIME))
1434d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1435d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1436d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_DATETIME) &&
1437d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            ((dt->type != XML_SCHEMAS_DATE) ||
1438d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEARMONTH) ||
1439d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEAR)))
1440d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1441d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1442d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_DATE) &&
1443d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            ((dt->type != XML_SCHEMAS_GYEAR) ||
1444d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEARMONTH)))
1445d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1446d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1447d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_GYEARMONTH) && (dt->type != XML_SCHEMAS_GYEAR))
1448d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1449d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1450d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_GMONTHDAY) && (dt->type != XML_SCHEMAS_GMONTH))
1451d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1452d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    }
1453455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard#endif
1454455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard
1455070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (val != NULL)
1456070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        *val = dt;
145780b19092f24410a6b869abf519227686e8f207caDaniel Veillard    else
145880b19092f24410a6b869abf519227686e8f207caDaniel Veillard	xmlSchemaFreeValue(dt);
1459070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1460070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1461070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1462070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror:
1463070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dt != NULL)
1464070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	xmlSchemaFreeValue(dt);
1465070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 1;
1466070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1467070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1468070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
14695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDuration:
1470070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @type: the predefined type
1471070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @duration:  string to analyze
1472070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val:  the return computed value
1473070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1474070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @duration conforms to the lexical space of the duration type.
1475070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val.
1476070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1477070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
1478070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *         and -1 in case of internal or API error.
1479070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1480070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1481dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
1482118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	                   const xmlChar *duration, xmlSchemaValPtr *val) {
1483070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar  *cur = duration;
1484070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmlSchemaValPtr dur;
1485070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int isneg = 0;
1486070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int seq = 0;
1487d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    double         num;
1488d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    int            num_type = 0;  /* -1 = invalid, 0 = int, 1 = floating */
1489d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    const xmlChar  desig[]  = {'Y', 'M', 'D', 'H', 'M', 'S'};
1490d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    const double   multi[]  = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0};
1491070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1492070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (duration == NULL)
1493070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1494070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1495070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur == '-') {
1496070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        isneg = 1;
1497070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        cur++;
1498070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1499070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1500070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* duration must start with 'P' (after sign) */
1501070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur++ != 'P')
1502070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1503070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
150480b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (*cur == 0)
150580b19092f24410a6b869abf519227686e8f207caDaniel Veillard	return 1;
150680b19092f24410a6b869abf519227686e8f207caDaniel Veillard
1507070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION);
1508070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dur == NULL)
1509070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1510070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1511070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    while (*cur != 0) {
1512070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1513070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* input string should be empty or invalid date/time item */
1514070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (seq >= sizeof(desig))
1515070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1516070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1517070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* T designator must be present for time items */
1518070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (*cur == 'T') {
1519070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (seq <= 3) {
1520070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                seq = 3;
1521070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                cur++;
1522070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            } else
1523070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 1;
1524070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        } else if (seq == 3)
1525070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1526070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1527070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* parse the number portion of the item */
1528070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        PARSE_NUM(num, cur, num_type);
1529070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1530070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if ((num_type == -1) || (*cur == 0))
1531070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1532070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1533070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* update duration based on item type */
1534070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        while (seq < sizeof(desig)) {
1535070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (*cur == desig[seq]) {
1536070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1537070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                /* verify numeric type; only seconds can be float */
1538070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                if ((num_type != 0) && (seq < (sizeof(desig)-1)))
1539070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    goto error;
1540070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1541070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                switch (seq) {
1542070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    case 0:
1543070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.mon = (long)num * 12;
1544070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1545070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    case 1:
1546070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.mon += (long)num;
1547070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1548070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    default:
1549070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        /* convert to seconds using multiplier */
1550070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.sec += num * multi[seq];
1551070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        seq++;
1552070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1553070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                }
1554070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1555070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                break;          /* exit loop */
1556070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            }
1557070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            /* no date designators found? */
1558070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (++seq == 3)
1559070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                goto error;
1560070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        }
1561070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        cur++;
1562070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1563070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1564070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (isneg) {
1565070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.mon = -dur->value.dur.mon;
1566070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.day = -dur->value.dur.day;
1567070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.sec = -dur->value.dur.sec;
1568070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1569070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1570070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (val != NULL)
1571070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        *val = dur;
157280b19092f24410a6b869abf519227686e8f207caDaniel Veillard    else
157380b19092f24410a6b869abf519227686e8f207caDaniel Veillard	xmlSchemaFreeValue(dur);
1574070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1575070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1576070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1577070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror:
1578070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dur != NULL)
1579070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	xmlSchemaFreeValue(dur);
1580070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 1;
1581070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1582070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1583a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard/**
1584a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * xmlSchemaStrip:
1585a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * @value: a value
1586a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *
1587a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Removes the leading and ending spaces of a string
1588a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *
1589a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the new string or NULL if no change was required.
1590a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard */
1591a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlChar *
1592a1a9d0410000cc69874e53e438b250037d3e14cdDaniel VeillardxmlSchemaStrip(const xmlChar *value) {
1593a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    const xmlChar *start = value, *end, *f;
1594a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard
1595a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if (value == NULL) return(NULL);
159676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((*start != 0) && (IS_BLANK_CH(*start))) start++;
1597a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end = start;
1598a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    while (*end != 0) end++;
1599a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    f = end;
1600a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end--;
160176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((end > start) && (IS_BLANK_CH(*end))) end--;
1602a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end++;
1603a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if ((start == value) && (f == end)) return(NULL);
1604a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    return(xmlStrndup(start, end - start));
1605a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard}
160696a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard
160796a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard/**
160891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * xmlSchemaWhiteSpaceReplace:
160991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * @value: a value
161091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik *
161191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Replaces 0xd, 0x9 and 0xa with a space.
161291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik *
161391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Returns the new string or NULL if no change was required.
161491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik */
161591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlChar *
161691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlSchemaWhiteSpaceReplace(const xmlChar *value) {
161791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    const xmlChar *cur = value;
161891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    xmlChar *ret = NULL, *mcur;
161991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
162091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    if (value == NULL)
162191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	return(NULL);
162291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
162391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    while ((*cur != 0) &&
162491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	(((*cur) != 0xd) && ((*cur) != 0x9) && ((*cur) != 0xa))) {
162591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	cur++;
162691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    }
162791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    if (*cur == 0)
162891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	return (NULL);
162991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    ret = xmlStrdup(value);
163091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    /* TODO FIXME: I guess gcc will bark at this. */
163191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    mcur = (xmlChar *)  (ret + (cur - value));
163291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    do {
163391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	if ( ((*mcur) == 0xd) || ((*mcur) == 0x9) || ((*mcur) == 0xa) )
163491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	    *mcur = ' ';
163591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	mcur++;
163691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    } while (*mcur != 0);
163791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    return(ret);
163891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik}
163991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
164091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik/**
1641b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCollapseString:
1642b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: a value
1643b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
1644b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Removes and normalize white spaces in the string
1645b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
1646b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns the new string or NULL if no change was required.
1647b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
164801fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlChar *
1649b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCollapseString(const xmlChar *value) {
1650b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    const xmlChar *start = value, *end, *f;
1651b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    xmlChar *g;
1652b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    int col = 0;
1653b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1654b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (value == NULL) return(NULL);
165576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((*start != 0) && (IS_BLANK_CH(*start))) start++;
1656b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    end = start;
1657b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    while (*end != 0) {
165876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if ((*end == ' ') && (IS_BLANK_CH(end[1]))) {
1659b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    col = end - start;
1660b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    break;
1661b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	} else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) {
1662b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    col = end - start;
1663b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    break;
1664b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	}
1665b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end++;
1666b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1667b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (col == 0) {
1668b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	f = end;
1669b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end--;
167076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	while ((end > start) && (IS_BLANK_CH(*end))) end--;
1671b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end++;
1672b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if ((start == value) && (f == end)) return(NULL);
1673b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(xmlStrndup(start, end - start));
1674b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1675b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    start = xmlStrdup(start);
1676b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (start == NULL) return(NULL);
1677b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    g = (xmlChar *) (start + col);
1678b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    end = g;
1679b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    while (*end != 0) {
168076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if (IS_BLANK_CH(*end)) {
1681b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    end++;
168276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*end)) end++;
1683b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (*end != 0)
1684b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		*g++ = ' ';
1685b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	} else
1686b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    *g++ = *end++;
1687b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1688b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    *g = 0;
1689b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return((xmlChar *) start);
1690b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
1691b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1692b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
169328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * xmlSchemaValAtomicListNode:
169428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @type: the predefined atomic type for a token in the list
169528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @value: the list value to check
169628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @ret:  the return computed value
169728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @node:  the node containing the value
169828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *
169928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Check that a value conforms to the lexical space of the predefined
170028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * list type. if true a value is computed and returned in @ret.
170128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *
1702a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the number of items if this validates, a negative error code
1703a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *         number otherwise
170428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */
170528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillardstatic int
170628c52ab518d34a36fd8da6870a5850088f129a6aDaniel VeillardxmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value,
170728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	                   xmlSchemaValPtr *ret, xmlNodePtr node) {
170828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    xmlChar *val, *cur, *endval;
170928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    int nb_values = 0;
1710580ced8ee28ecd99374da9383897678e4ba6c358Daniel Veillard    int tmp = 0;
171128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard
171228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (value == NULL) {
171328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	return(-1);
171428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
171528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    val = xmlStrdup(value);
171628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (val == NULL) {
171728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	return(-1);
171828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
17196fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    if (ret != NULL) {
17206fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard        *ret = NULL;
17216fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    }
172228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    cur = val;
172328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    /*
172428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard     * Split the list
172528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard     */
172676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while (IS_BLANK_CH(*cur)) *cur++ = 0;
172728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while (*cur != 0) {
172876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if (IS_BLANK_CH(*cur)) {
172928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    *cur = 0;
173028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    cur++;
173176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*cur)) *cur++ = 0;
173228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	} else {
173328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    nb_values++;
173428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    cur++;
173576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++;
173628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	}
173728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
173828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (nb_values == 0) {
173928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	xmlFree(val);
1740a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard	return(nb_values);
174128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
174228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    endval = cur;
174328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    cur = val;
174428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while ((*cur == 0) && (cur != endval)) cur++;
174528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while (cur != endval) {
174628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node);
174728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	if (tmp != 0)
174828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    break;
174928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	while (*cur != 0) cur++;
175028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	while ((*cur == 0) && (cur != endval)) cur++;
175128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
17526fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    /* TODO what return value ? c.f. bug #158628
175328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (ret != NULL) {
175428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	TODO
17556fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    } */
17566fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    xmlFree(val);
1757a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if (tmp == 0)
1758a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard	return(nb_values);
1759a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    return(-1);
176028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard}
176128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard
176228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard/**
1763e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * xmlSchemaParseUInt:
1764e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @str: pointer to the string R/W
1765e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @llo: pointer to the low result
1766e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lmi: pointer to the mid result
1767e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lhi: pointer to the high result
1768e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *
1769e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Parse an unsigned long into 3 fields.
1770e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *
1771e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Returns the number of chars parsed or -1 if overflow of the capacity
1772e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard */
1773e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic int
1774e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel VeillardxmlSchemaParseUInt(const xmlChar **str, unsigned long *llo,
1775e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	           unsigned long *lmi, unsigned long *lhi) {
1776e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long lo = 0, mi = 0, hi = 0;
1777e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    const xmlChar *tmp, *cur = *str;
1778e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    int ret = 0, i = 0;
1779e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
1780e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (*cur == '0') {
1781e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	ret++;
1782e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	cur++;
1783e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1784e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    tmp = cur;
1785e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) {
1786e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	i++;tmp++;ret++;
1787e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1788e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (i > 24) {
1789e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	*str = tmp;
1790e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	return(-1);
1791e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1792e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 16) {
1793e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	hi = hi * 10 + (*cur++ - '0');
1794e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	i--;
1795e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1796e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 8) {
1797e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	mi = mi * 10 + (*cur++ - '0');
1798e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	i--;
1799e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1800e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 0) {
1801e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	lo = lo * 10 + (*cur++ - '0');
1802e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	i--;
1803e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1804e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
1805e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *str = cur;
1806e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *llo = lo;
1807e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *lmi = mi;
1808e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *lhi = hi;
1809e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    return(ret);
1810e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard}
1811e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
1812e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard/**
1813b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValAtomicType:
18144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type: the predefined type
18154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to check
18164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val:  the return computed value
1817c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @node:  the node containing the value
1818b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * flags:  flags to control the vlidation
18194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
1820b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the atomic type.
18214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * if true a value is computed and returned in @val.
182201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * This checks the value space for list types as well (IDREFS, NMTOKENS).
18234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
18244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
18254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *         and -1 in case of internal or API error.
18264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
1827b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int
18281ac24d36b12487995b659a8fc23a02b9460edb36Daniel VeillardxmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value,
18291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                       xmlSchemaValPtr * val, xmlNodePtr node, int flags)
18301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard{
18314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValPtr v;
1832b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    xmlChar *norm = NULL;
1833d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    int ret = 0;
18344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
18354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
183601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitTypes();
18374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (type == NULL)
18381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        return (-1);
18395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
1840eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard    /*
1841eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard     * validating a non existant text node is similar to validating
1842eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard     * an empty one.
1843eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard     */
1844eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard    if (value == NULL)
1845eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard        value = BAD_CAST "";
1846eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard
18474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (val != NULL)
18481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        *val = NULL;
1849b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if ((flags == 0) && (value != NULL)) {
185091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
185101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        if ((type->builtInType != XML_SCHEMAS_STRING) &&
185291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	  (type->builtInType != XML_SCHEMAS_ANYTYPE) &&
185391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	  (type->builtInType != XML_SCHEMAS_ANYSIMPLETYPE)) {
185491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	    if (type->builtInType == XML_SCHEMAS_NORMSTRING)
185591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik		norm = xmlSchemaWhiteSpaceReplace(value);
185691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik            else
185791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik		norm = xmlSchemaCollapseString(value);
18581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (norm != NULL)
18591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                value = norm;
18601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        }
1861b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1862b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
186301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type->builtInType) {
18642f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack        case XML_SCHEMAS_UNKNOWN:
18651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto error;
18662f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	case XML_SCHEMAS_ANYTYPE:
18672f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	case XML_SCHEMAS_ANYSIMPLETYPE:
18682f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	    goto return0;
1869b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_STRING:
18701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return0;
18711516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard        case XML_SCHEMAS_NORMSTRING:{
18721516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                const xmlChar *cur = value;
18731516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard
18741516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                while (*cur != 0) {
18751516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
18761516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        goto return1;
18771516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    } else {
18781516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        cur++;
18791516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    }
18801516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                }
18811516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                if (val != NULL) {
18821516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NORMSTRING);
18831516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    if (v != NULL) {
18841516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        v->value.str = xmlStrdup(value);
18851516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        *val = v;
18861516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    } else {
18871516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        goto error;
18881516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    }
18891516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                }
18901516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                goto return0;
18911516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard            }
18921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_DECIMAL:{
18931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value, *tmp;
18941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned int frac = 0, len, neg = 0;
18951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long base = 0;
18961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
18971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
18981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
18991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '+')
19001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
19011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else if (*cur == '-') {
19021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    neg = 1;
19031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
19041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
19051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                tmp = cur;
19061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                while ((*cur >= '0') && (*cur <= '9')) {
19071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    base = base * 10 + (*cur - '0');
19081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
19091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
19101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                len = cur - tmp;
19111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '.') {
19121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
19131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    tmp = cur;
19141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while ((*cur >= '0') && (*cur <= '9')) {
19151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        base = base * 10 + (*cur - '0');
19161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
19171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
19181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    frac = cur - tmp;
19191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
19201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
19211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
19221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
19231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL);
19241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
19251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = base;
19261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = neg;
19271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = frac;
19281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.total = frac + len;
19291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
19301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
19311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
19321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
19331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
1934b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_TIME:
1935b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GDAY:
1936b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GMONTH:
1937b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GMONTHDAY:
1938b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GYEAR:
1939b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GYEARMONTH:
1940b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DATE:
1941b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DATETIME:
194201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard            ret = xmlSchemaValidateDates(type->builtInType, value, val);
19431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            break;
1944b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DURATION:
19451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValidateDuration(type, value, val);
19461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            break;
1947b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_FLOAT:
19481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_DOUBLE:{
19491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
19501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int neg = 0;
19511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
19521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
19531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
19541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) {
19551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur += 3;
19561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (*cur != 0)
19571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
19581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (val != NULL) {
19591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (type == xmlSchemaTypeFloatDef) {
19601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
19611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
19621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                v->value.f = (float) xmlXPathNAN;
19631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
19641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
19651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
19661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
19671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
19681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
19691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
19701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                v->value.d = xmlXPathNAN;
19711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
19721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
19731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
19741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
19751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
19761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
19771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
19781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return0;
19791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
19801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
19811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    neg = 1;
19821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
19831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
19841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) {
19851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur += 3;
19861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (*cur != 0)
19871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
19881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (val != NULL) {
19891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (type == xmlSchemaTypeFloatDef) {
19901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
19911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
19921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                if (neg)
19931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.f = (float) xmlXPathNINF;
19941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                else
19951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.f = (float) xmlXPathPINF;
19961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
19971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
19981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
19991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
20001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
20011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
20021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
20031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                if (neg)
20041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.d = xmlXPathNINF;
20051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                else
20061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.d = xmlXPathPINF;
20071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
20081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
20091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
20101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
20111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
20121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
20131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
20141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return0;
20151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
20161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((neg == 0) && (*cur == '+'))
20171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
20181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-'))
20191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
20201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                while ((*cur >= '0') && (*cur <= '9')) {
20211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
20221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
20231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '.') {
20241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
20251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while ((*cur >= '0') && (*cur <= '9'))
20261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
20271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
20281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((*cur == 'e') || (*cur == 'E')) {
20291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
20301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((*cur == '-') || (*cur == '+'))
20311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
20321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while ((*cur >= '0') && (*cur <= '9'))
20331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
20341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
20351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
20361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
20371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
20381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (type == xmlSchemaTypeFloatDef) {
20391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
20401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (v != NULL) {
2041d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard                            if (sscanf((const char *) value, "%f",
20421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                 &(v->value.f)) == 1) {
204301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                *val = v;
20441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
20451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
20461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
20471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
20481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
20491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto error;
20501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
20511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
20521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
20531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (v != NULL) {
2054d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard                            if (sscanf((const char *) value, "%lf",
20551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                 &(v->value.d)) == 1) {
20561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                *val = v;
20571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
20581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
20591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
20601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
20611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
20621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto error;
20631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
20641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
20651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
20661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
20671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
20681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BOOLEAN:{
20691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
20701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
20711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == '0') && (cur[1] == 0))
20721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 0;
20731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else if ((cur[0] == '1') && (cur[1] == 0))
20741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 1;
20751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else if ((cur[0] == 't') && (cur[1] == 'r')
20761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         && (cur[2] == 'u') && (cur[3] == 'e')
20771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         && (cur[4] == 0))
20781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 1;
20791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else if ((cur[0] == 'f') && (cur[1] == 'a')
20801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         && (cur[2] == 'l') && (cur[3] == 's')
20811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         && (cur[4] == 'e') && (cur[5] == 0))
20821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 0;
20831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else
20841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
20851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
20861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN);
20871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
20881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.b = ret;
20891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
20901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
20911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
20921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
20931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
20941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
20951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
20961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_TOKEN:{
20971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
20981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
209976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack                if (IS_BLANK_CH(*cur))
21001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
21011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
21021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                while (*cur != 0) {
21031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
21041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
21051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else if (*cur == ' ') {
21061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
21071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (*cur == 0)
21081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
21091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (*cur == ' ')
21101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
21111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
21121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
21131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
21141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
21151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
21161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN);
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            }
2126b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_LANGUAGE:
21271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (xmlCheckLanguageID(value) == 1) {
21281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
21291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE);
21301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
21311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.str = xmlStrdup(value);
21321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
21331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
21341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
21351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
21361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
21371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
21381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
21391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return1;
2140b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NMTOKEN:
21411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (xmlValidateNMToken(value, 1) == 0) {
21421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
21431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN);
21441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
21451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.str = xmlStrdup(value);
21461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
21471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
21481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
21491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
21501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
21511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
21521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
21531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return1;
2154b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NMTOKENS:
21551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef,
21561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
21571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret > 0)
21581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
21591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
21601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 1;
21611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2162b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NAME:
21631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateName(value, 1);
2164df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard            if ((ret == 0) && (val != NULL) && (value != NULL)) {
2165df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		v = xmlSchemaNewValue(XML_SCHEMAS_NAME);
2166df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		if (v != NULL) {
2167df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     const xmlChar *start = value, *end;
2168df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     while (IS_BLANK_CH(*start)) start++;
2169df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     end = start;
2170df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     while ((*end != 0) && (!IS_BLANK_CH(*end))) end++;
2171df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     v->value.str = xmlStrndup(start, end - start);
2172df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		    *val = v;
2173df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		} else {
2174df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		    goto error;
2175df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		}
21761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
21771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
21781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_QNAME:{
21791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *uri = NULL;
21801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *local = NULL;
21811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
21821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateQName(value, 1);
21831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (node != NULL)) {
21841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *prefix;
21851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
21861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    local = xmlSplitQName2(value, &prefix);
21871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL) {
21881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlNsPtr ns;
21891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
21901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ns = xmlSearchNs(node->doc, node, prefix);
21911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (ns == NULL)
21921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            ret = 1;
21931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        else if (val != NULL)
21941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            uri = xmlStrdup(ns->href);
21951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
21961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((local != NULL) && ((val == NULL) || (ret != 0)))
21971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(local);
21981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL)
21991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(prefix);
22001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
22011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (val != NULL)) {
22021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_QNAME);
22031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
22041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (local != NULL)
22051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.name = local;
22061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        else
22071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.name = xmlStrdup(value);
22081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (uri != NULL)
22091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.uri = uri;
22101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
22111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
22121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
22131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (local != NULL)
22141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            xmlFree(local);
22151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (uri != NULL)
22161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            xmlFree(uri);
22171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
22181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
22191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
22201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
22211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2222b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NCNAME:
22231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
22241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
22251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME);
22261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (v != NULL) {
22271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.str = xmlStrdup(value);
22281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
22291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else {
22301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto error;
22311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
22321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
22331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2234b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_ID:
22351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
22361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
22371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                v = xmlSchemaNewValue(XML_SCHEMAS_ID);
22381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (v != NULL) {
22391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.str = xmlStrdup(value);
22401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
22411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else {
22421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto error;
22431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
22441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
22451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
22461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
22471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
22481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
22491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /*
22501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * NOTE: the IDness might have already be declared in the DTD
22511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 */
22521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (attr->atype != XML_ATTRIBUTE_ID) {
22531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlIDPtr res;
22541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *strip;
22551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
22561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    strip = xmlSchemaStrip(value);
22571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (strip != NULL) {
22581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        res = xmlAddID(NULL, node->doc, strip, attr);
22591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(strip);
22601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else
22611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        res = xmlAddID(NULL, node->doc, value, attr);
22621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (res == NULL) {
22631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 2;
22641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
22651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        attr->atype = XML_ATTRIBUTE_ID;
22661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
22671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
22681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
22691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2270b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_IDREF:
22711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
22721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
22736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		v = xmlSchemaNewValue(XML_SCHEMAS_IDREF);
22746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (v == NULL)
22756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    goto error;
22766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		v->value.str = xmlStrdup(value);
22776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*val = v;
22781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
22791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
22801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
22811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
22821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *strip;
22831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
22841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                strip = xmlSchemaStrip(value);
22851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (strip != NULL) {
22861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAddRef(NULL, node->doc, strip, attr);
22871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlFree(strip);
22881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else
22891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAddRef(NULL, node->doc, value, attr);
22901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_IDREF;
22911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
22921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2293b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_IDREFS:
22941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef,
22951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
22961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret < 0)
22971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 2;
22981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
22991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
23001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
23011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
23021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
2303249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard
23041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_IDREFS;
23051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
23061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
23071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_ENTITY:{
23081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *strip;
23091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateNCName(value, 1);
23111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((node == NULL) || (node->doc == NULL))
23121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 3;
23131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret == 0) {
23141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlEntityPtr ent;
23151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    strip = xmlSchemaStrip(value);
23171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (strip != NULL) {
23181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ent = xmlGetDocEntity(node->doc, strip);
23191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(strip);
23201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
23211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ent = xmlGetDocEntity(node->doc, value);
23221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
23231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((ent == NULL) ||
23241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        (ent->etype !=
23251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         XML_EXTERNAL_GENERAL_UNPARSED_ENTITY))
23261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 4;
23271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (val != NULL)) {
23291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    TODO;
23301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (node != NULL) &&
23321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    (node->type == XML_ATTRIBUTE_NODE)) {
23331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAttrPtr attr = (xmlAttrPtr) node;
2334a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard
23351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    attr->atype = XML_ATTRIBUTE_ENTITY;
23361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
23381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2339b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_ENTITIES:
23401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((node == NULL) || (node->doc == NULL))
23411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return3;
23421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef,
23431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
23441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret <= 0)
23451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 1;
23461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
23471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
23481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
23491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
23501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
23511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_ENTITIES;
23531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
23541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
23551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_NOTATION:{
23561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *uri = NULL;
23571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *local = NULL;
23581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateQName(value, 1);
23601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (node != NULL)) {
23611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *prefix;
23621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    local = xmlSplitQName2(value, &prefix);
23641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL) {
23651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlNsPtr ns;
23661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ns = xmlSearchNs(node->doc, node, prefix);
23681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (ns == NULL)
23691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            ret = 1;
23701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        else if (val != NULL)
23711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            uri = xmlStrdup(ns->href);
23721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
23731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((local != NULL) && ((val == NULL) || (ret != 0)))
23741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(local);
23751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL)
23761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(prefix);
23771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((node == NULL) || (node->doc == NULL))
23791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 3;
23801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret == 0) {
23811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = xmlValidateNotationUse(NULL, node->doc, value);
23821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (ret == 1)
23831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 0;
23841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else
23851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 1;
23861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (val != NULL)) {
23881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION);
23891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
23901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (local != NULL)
23911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.name = local;
23921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        else
23931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.name = xmlStrdup(value);
23941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (uri != NULL)
23951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.uri = uri;
23961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
23981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
23991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (local != NULL)
24001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            xmlFree(local);
24011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (uri != NULL)
24021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            xmlFree(uri);
24031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
24041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
24051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
2407560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard            }
24081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_ANYURI:{
240911c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                if (*value != 0) {
241011c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    xmlURIPtr uri = xmlParseURI((const char *) value);
241111c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    if (uri == NULL)
241211c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                        goto return1;
241311c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    xmlFreeURI(uri);
241411c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                }
2415560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
24161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
241711c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_ANYURI);
241811c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    if (v == NULL)
241911c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                        goto error;
242011c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    v->value.str = xmlStrdup(value);
242111c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    *val = v;
24221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
24241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
24251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_HEXBINARY:{
24261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
24271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *base;
24281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int total, i = 0;
2429560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
2430f34a20e69dc675cd23d3eb558cad135ea280f472Daniel Veillard                if (cur == NULL)
24311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
2432560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
24331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                while (((*cur >= '0') && (*cur <= '9')) ||
24341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                       ((*cur >= 'A') && (*cur <= 'F')) ||
24351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                       ((*cur >= 'a') && (*cur <= 'f'))) {
24361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    i++;
24371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
2439560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
24401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
24411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
24421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((i % 2) != 0)
244370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard                    goto return1;
2444560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
24451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
24461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
24471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY);
24481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v == NULL)
24491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
24501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
24511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur = xmlStrdup(value);
24521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (cur == NULL) {
2453d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard		        xmlSchemaTypeErrMemory(node, "allocating hexbin data");
24541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(v);
24551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
24561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
24571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
24581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total = i / 2;      /* number of octets */
245970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
24601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    base = (xmlChar *) cur;
24611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while (i-- > 0) {
24621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (*base >= 'a')
24631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            *base = *base - ('a' - 'A');
24641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        base++;
24651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
246670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
24671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.hex.str = (xmlChar *) cur;
24681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.hex.total = total;
24691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
24701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
24721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
24731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BASE64BINARY:{
24741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /* ISSUE:
24751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 *
24761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Ignore all stray characters? (yes, currently)
24771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Worry about long lines? (no, currently)
24781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 *
24791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * rfc2045.txt:
24801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 *
24811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * "The encoded output stream must be represented in lines of
24821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * no more than 76 characters each.  All line breaks or other
24831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * characters not found in Table 1 must be ignored by decoding
24841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * software.  In base64 data, characters other than those in
24851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Table 1, line breaks, and other white space probably
24861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * indicate a transmission error, about which a warning
24871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * message or even a message rejection might be appropriate
24881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * under some circumstances." */
24891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
24901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *base;
24911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int total, i = 0, pad = 0;
24921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
24931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
24941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
24951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
24961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                for (; *cur; ++cur) {
24971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
24981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
24991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    decc = _xmlSchemaBase64Decode(*cur);
25001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc < 0) ;
25011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (decc < 64)
25021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        i++;
25031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else
25041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        break;
25051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
25061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                for (; *cur; ++cur) {
25071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
25081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
25091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    decc = _xmlSchemaBase64Decode(*cur);
25101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc < 0) ;
25111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (decc < 64)
25121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
25131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc == 64)
25141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        pad++;
25151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
25161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
25171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /* rfc2045.txt: "Special processing is performed if fewer than
25181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * 24 bits are available at the end of the data being encoded.
25191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * A full encoding quantum is always completed at the end of a
25201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * body.  When fewer than 24 input bits are available in an
25211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * input group, zero bits are added (on the right) to form an
25221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * integral number of 6-bit groups.  Padding at the end of the
25231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * data is performed using the "=" character.  Since all
25241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * base64 input is an integral number of octets, only the
25251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * following cases can arise: (1) the final quantum of
25261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * encoding input is an integral multiple of 24 bits; here,
25271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * the final unit of encoded output will be an integral
25281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * multiple ofindent: Standard input:701: Warning:old style
25291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		 * assignment ambiguity in "=*".  Assuming "= *" 4 characters
25301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		 * with no "=" padding, (2) the final
25311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * quantum of encoding input is exactly 8 bits; here, the
25321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * final unit of encoded output will be two characters
25331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * followed by two "=" padding characters, or (3) the final
25341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * quantum of encoding input is exactly 16 bits; here, the
25351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * final unit of encoded output will be three characters
25361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * followed by one "=" padding character." */
25371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
25381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                total = 3 * (i / 4);
25391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (pad == 0) {
25401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 0)
25411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
25421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (pad == 1) {
25431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
25441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
25451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 3)
25461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
25471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (decc = _xmlSchemaBase64Decode(*cur);
25481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         (decc < 0) || (decc > 63);
25491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         decc = _xmlSchemaBase64Decode(*cur))
25501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        --cur;
25511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 16bits in 24bits means 2 pad bits: nnnnnn nnmmmm mmmm00*/
25521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 00111100 -> 0x3c */
25531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc & ~0x3c)
25541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
25551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total += 2;
25561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (pad == 2) {
25571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
25581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
25591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 2)
25601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
25611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (decc = _xmlSchemaBase64Decode(*cur);
25621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         (decc < 0) || (decc > 63);
25631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         decc = _xmlSchemaBase64Decode(*cur))
25641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        --cur;
25651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 8bits in 12bits means 4 pad bits: nnnnnn nn0000 */
25661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 00110000 -> 0x30 */
25671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc & ~0x30)
25681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
25691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total += 1;
25701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else
25711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
25721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
25731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
25741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_BASE64BINARY);
25751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v == NULL)
25761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
25771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    base =
25781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        (xmlChar *) xmlMallocAtomic((i + pad + 1) *
25791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                                    sizeof(xmlChar));
25801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (base == NULL) {
2581d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard		        xmlSchemaTypeErrMemory(node, "allocating base64 data");
25821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(v);
25831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
25841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
25851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.base64.str = base;
25861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (cur = value; *cur; ++cur)
25871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (_xmlSchemaBase64Decode(*cur) >= 0) {
25881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            *base = *cur;
25891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            ++base;
25901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
25911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *base = 0;
25921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.base64.total = total;
25931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
25941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
25951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
259670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard            }
2597e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_INTEGER:
2598e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_PINTEGER:
2599e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_NPINTEGER:
2600e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_NINTEGER:
26011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_NNINTEGER:{
26021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
26031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
26041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int sign = 0;
26051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
26061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
26071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
26081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
26091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    sign = 1;
26101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
26111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (*cur == '+')
26121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
26131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
26141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret == 0)
26151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
26161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
26171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
261801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_NPINTEGER) {
26191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) &&
26201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ((hi != 0) || (mi != 0) || (lo != 0)))
26211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
262201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_PINTEGER) {
26231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (sign == 1)
26241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
26251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((hi == 0) && (mi == 0) && (lo == 0))
26261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
262701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_NINTEGER) {
26281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (sign == 0)
26291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
26301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((hi == 0) && (mi == 0) && (lo == 0))
26311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
263201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_NNINTEGER) {
26331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) &&
26341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ((hi != 0) || (mi != 0) || (lo != 0)))
26351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
26361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /*
26381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * We can store a value only if no overflow occured
26391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 */
26401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret > 0) && (val != NULL)) {
264101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
26421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
26431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
26441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.mi = lo;
26451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.hi = lo;
26461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = sign;
26471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
26481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.total = cur - value;
26491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
26501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
26511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
26531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2654e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_LONG:
2655e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_BYTE:
2656e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_SHORT:
26571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_INT:{
26581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
26591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
26601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int total = 0;
26611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int sign = 0;
26621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
26631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
26641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
26651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
26661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    sign = 1;
26671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
26681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (*cur == '+')
26691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
26701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
26711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret <= 0)
26721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
26731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
26741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
267501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_LONG) {
26761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi >= 922) {
26771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (hi > 922)
26781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
26791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi >= 33720368) {
26801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (mi > 33720368)
26811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
26821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if ((sign == 0) && (lo > 54775807))
26831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
26841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if ((sign == 1) && (lo > 54775808))
26851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
26861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
26871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
268801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_INT) {
26891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi != 0)
26901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
26911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (mi >= 21) {
26921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi > 21)
26931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
26941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if ((sign == 0) && (lo > 47483647))
26951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
26961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if ((sign == 1) && (lo > 47483648))
26971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
26981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
269901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_SHORT) {
27001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
27011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
27021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) && (lo > 32768))
27031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
27041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) && (lo > 32767))
27051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
270601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_BYTE) {
27071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
27081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
27091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) && (lo > 128))
27101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
27111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) && (lo > 127))
27121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
27131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
271501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
27161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
27171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
27181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.mi = lo;
27191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.hi = lo;
27201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = sign;
27211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
27221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.total = total;
27231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
27241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
27251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
27271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2728e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_UINT:
2729e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_ULONG:
2730e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_USHORT:
27311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_UBYTE:{
27321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
27331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
27341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int total = 0;
27351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
27361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
27371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
27381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
27391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret <= 0)
27401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
27411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
27421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
274301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_ULONG) {
27441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi >= 1844) {
27451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (hi > 1844)
27461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
27471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi >= 67440737) {
27481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (mi > 67440737)
27491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
27501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (lo > 9551615)
27511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
27521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
27531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
275401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_UINT) {
27551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi != 0)
27561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
27571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (mi >= 42) {
27581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi > 42)
27591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
27601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (lo > 94967295)
27611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
27621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
276301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_USHORT) {
27641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
27651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
27661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (lo > 65535)
27671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
276801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_UBYTE) {
27691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
27701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
27711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (lo > 255)
27721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
27731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
277501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
27761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
27771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
27781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.mi = mi;
27791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.hi = hi;
27801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = 0;
27811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
27821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.total = total;
27831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
27841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
27851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
27871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
2789b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
27901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  done:
27911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
27921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
27931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (ret);
27941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return3:
27951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
27961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
27971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (3);
27981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return1:
27991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
28001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
28011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (1);
28021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return0:
28031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
28041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
28051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (0);
28061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  error:
28071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
28081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
28091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (-1);
2810b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
2811b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
2812b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
2813b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValPredefTypeNode:
2814b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @type: the predefined type
2815b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: the value to check
2816b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @val:  the return computed value
2817b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @node:  the node containing the value
2818b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
2819b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the predefined type.
2820b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * if true a value is computed and returned in @val.
2821b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
2822b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns 0 if this validates, a positive error code number otherwise
2823b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *         and -1 in case of internal or API error.
2824b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
2825b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardint
2826b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value,
2827b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	                   xmlSchemaValPtr *val, xmlNodePtr node) {
2828b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return(xmlSchemaValAtomicType(type, value, val, node, 0));
28294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
28304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
28314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
2832c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaValPredefTypeNodeNoNorm:
2833c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the predefined type
2834c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the value to check
2835c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val:  the return computed value
2836c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @node:  the node containing the value
2837c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
2838c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Check that a value conforms to the lexical space of the predefined type.
2839c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * if true a value is computed and returned in @val.
2840c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * This one does apply any normalization to the value.
2841c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
2842c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
2843c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *         and -1 in case of internal or API error.
2844c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */
2845c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardint
2846c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, const xmlChar *value,
2847c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard				 xmlSchemaValPtr *val, xmlNodePtr node) {
2848c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    return(xmlSchemaValAtomicType(type, value, val, node, 1));
2849c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
2850c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
2851c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/**
2852c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * xmlSchemaValidatePredefinedType:
2853c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @type: the predefined type
2854c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @value: the value to check
2855c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @val:  the return computed value
2856c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *
2857c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Check that a value conforms to the lexical space of the predefined type.
2858c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * if true a value is computed and returned in @val.
2859c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *
2860c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
2861c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *         and -1 in case of internal or API error.
2862c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard */
2863c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillardint
2864c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel VeillardxmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value,
2865c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard	                        xmlSchemaValPtr *val) {
2866c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard    return(xmlSchemaValPredefTypeNode(type, value, val, NULL));
2867c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard}
2868c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard
2869c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard/**
28704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareDecimals:
28714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x:  a first decimal value
28724255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y:  a second decimal value
28734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
28744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 decimals
28754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
28764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error
28774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
28784255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int
28794255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y)
28804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{
28814255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValPtr swp;
2882e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    int order = 1, p;
28834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    unsigned long tmp;
28844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
2885e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if ((x->value.decimal.sign) &&
2886e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	((x->value.decimal.lo != 0) ||
2887e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	 (x->value.decimal.mi != 0) ||
2888e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	 (x->value.decimal.hi != 0))) {
2889e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	if ((y->value.decimal.sign) &&
2890e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    ((y->value.decimal.lo != 0) ||
2891e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	     (y->value.decimal.mi != 0) ||
2892e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	     (y->value.decimal.hi != 0)))
289380b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    order = -1;
289480b19092f24410a6b869abf519227686e8f207caDaniel Veillard	else
289580b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    return (-1);
2896e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    } else if ((y->value.decimal.sign) &&
2897e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	       ((y->value.decimal.lo != 0) ||
2898e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		(y->value.decimal.mi != 0) ||
2899e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		(y->value.decimal.hi != 0))) {
29004255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (1);
290180b19092f24410a6b869abf519227686e8f207caDaniel Veillard    }
29024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (x->value.decimal.frac == y->value.decimal.frac) {
2903e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	if (x->value.decimal.hi < y->value.decimal.hi)
2904e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (-order);
290501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (x->value.decimal.hi > y->value.decimal.hi)
2906e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (order);
2907e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	if (x->value.decimal.mi < y->value.decimal.mi)
2908e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (-order);
290901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (x->value.decimal.mi > y->value.decimal.mi)
2910e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (order);
2911e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        if (x->value.decimal.lo < y->value.decimal.lo)
291280b19092f24410a6b869abf519227686e8f207caDaniel Veillard            return (-order);
2913e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        if (x->value.decimal.lo > y->value.decimal.lo)
291480b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    return(order);
291580b19092f24410a6b869abf519227686e8f207caDaniel Veillard	return(0);
29164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
29174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (y->value.decimal.frac > x->value.decimal.frac) {
29184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        swp = y;
29194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        y = x;
29204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        x = swp;
29214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        order = -order;
29224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
2923e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    p = powten[x->value.decimal.frac - y->value.decimal.frac];
2924e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    tmp = x->value.decimal.lo / p;
2925e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (tmp > y->value.decimal.lo)
29264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (order);
2927e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (tmp < y->value.decimal.lo)
29284255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (-order);
2929e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    tmp = y->value.decimal.lo * p;
2930e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (x->value.decimal.lo < tmp)
29314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (-order);
2932e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (x->value.decimal.lo == tmp)
29334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (0);
29344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return (order);
29354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
29364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
29374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
2938070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xmlSchemaCompareDurations:
2939070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @x:  a first duration value
2940070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @y:  a second duration value
2941070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
2942070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Compare 2 durations
2943070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
2944070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
2945070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * case of error
2946070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
2947070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
2948070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel VeillardxmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y)
2949070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard{
2950070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long carry, mon, day;
2951070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    double sec;
295280b19092f24410a6b869abf519227686e8f207caDaniel Veillard    int invert = 1;
295380b19092f24410a6b869abf519227686e8f207caDaniel Veillard    long xmon, xday, myear, minday, maxday;
2954070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    static const long dayRange [2][12] = {
2955070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        { 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, },
2956070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} };
2957070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2958070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((x == NULL) || (y == NULL))
29595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return -2;
2960070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2961070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* months */
2962070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    mon = x->value.dur.mon - y->value.dur.mon;
2963070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2964070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* seconds */
2965070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    sec = x->value.dur.sec - y->value.dur.sec;
2966070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    carry = (long)sec / SECS_PER_DAY;
2967070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    sec -= (double)(carry * SECS_PER_DAY);
2968070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2969070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* days */
2970070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    day = x->value.dur.day - y->value.dur.day + carry;
2971070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2972070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* easy test */
2973070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (mon == 0) {
2974070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (day == 0)
2975070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (sec == 0.0)
2976070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 0;
2977070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else if (sec < 0.0)
2978070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return -1;
2979070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else
2980070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 1;
2981070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else if (day < 0)
2982070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return -1;
2983070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else
2984070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return 1;
2985070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
2986070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2987070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (mon > 0) {
2988070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if ((day >= 0) && (sec >= 0.0))
2989070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return 1;
2990070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else {
2991070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            xmon = mon;
2992070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            xday = -day;
2993070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        }
2994070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    } else if ((day <= 0) && (sec <= 0.0)) {
2995070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        return -1;
2996070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    } else {
299780b19092f24410a6b869abf519227686e8f207caDaniel Veillard	invert = -1;
2998070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xmon = -mon;
2999070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xday = day;
3000070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
3001070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3002070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    myear = xmon / 12;
300380b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (myear == 0) {
300480b19092f24410a6b869abf519227686e8f207caDaniel Veillard	minday = 0;
300580b19092f24410a6b869abf519227686e8f207caDaniel Veillard	maxday = 0;
300680b19092f24410a6b869abf519227686e8f207caDaniel Veillard    } else {
300780b19092f24410a6b869abf519227686e8f207caDaniel Veillard	maxday = 366 * ((myear + 3) / 4) +
300880b19092f24410a6b869abf519227686e8f207caDaniel Veillard	         365 * ((myear - 1) % 4);
300980b19092f24410a6b869abf519227686e8f207caDaniel Veillard	minday = maxday - 1;
301080b19092f24410a6b869abf519227686e8f207caDaniel Veillard    }
301180b19092f24410a6b869abf519227686e8f207caDaniel Veillard
3012070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmon = xmon % 12;
3013070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    minday += dayRange[0][xmon];
3014070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    maxday += dayRange[1][xmon];
3015070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
301680b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if ((maxday == minday) && (maxday == xday))
301780b19092f24410a6b869abf519227686e8f207caDaniel Veillard	return(0); /* can this really happen ? */
3018070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (maxday < xday)
301980b19092f24410a6b869abf519227686e8f207caDaniel Veillard        return(-invert);
302080b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (minday > xday)
302180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        return(invert);
3022070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3023070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* indeterminate */
30245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return 2;
30255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
30265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/*
30285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * macros for adding date/times and durations
30295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
30305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT(a,b)                  (floor(((double)a/(double)b)))
30315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO(a,b)                     (a - FQUOTIENT(a,b) * b)
30325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT_RANGE(a,low,high)     (FQUOTIENT((a-low),(high-low)))
30335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO_RANGE(a,low,high)        ((MODULO((a-low),(high-low)))+low)
30345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
3036669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * xmlSchemaDupVal:
3037669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @v: the #xmlSchemaValPtr value to duplicate
3038669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard *
3039669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Makes a copy of @v. The calling program is responsible for freeing
3040669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the returned value.
3041669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard *
3042669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * returns a pointer to a duplicated #xmlSchemaValPtr or NULL if error.
3043669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard */
3044669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillardstatic xmlSchemaValPtr
3045669adfcd3af5dfda873b10119d44202a7450bb20Daniel VeillardxmlSchemaDupVal (xmlSchemaValPtr v)
3046669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard{
3047669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaValPtr ret = xmlSchemaNewValue(v->type);
3048669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    if (ret == NULL)
3049669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        return NULL;
3050669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard
3051669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    memcpy(ret, v, sizeof(xmlSchemaVal));
3052669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    return ret;
3053669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard}
3054669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard
3055669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard/**
3056285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * xmlSchemaCopyValue:
3057285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * @val:  the precomputed value to be copied
3058285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik *
3059285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Copies the precomputed value. This duplicates any string within.
3060285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik *
3061285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Returns the copy or NULL if a copy for a data-type is not implemented.
3062285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik */
3063285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaValPtr
3064285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaCopyValue(xmlSchemaValPtr val)
3065285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik{
3066285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    xmlSchemaValPtr ret;
3067285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik
3068285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    if (val == NULL)
3069285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik        return (NULL);
3070285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    /*
3071285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    * Copy the string values.
3072285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    */
3073285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    switch (val->type) {
3074285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik        case XML_SCHEMAS_IDREFS:
3075285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik        case XML_SCHEMAS_ENTITIES:
3076285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik        case XML_SCHEMAS_NMTOKENS:
3077285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik        case XML_SCHEMAS_ANYTYPE:
3078285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik        case XML_SCHEMAS_ANYSIMPLETYPE:
3079285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik            return (NULL);
3080285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik        case XML_SCHEMAS_STRING:
3081285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik        case XML_SCHEMAS_NORMSTRING:
3082285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik        case XML_SCHEMAS_TOKEN:
3083285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik        case XML_SCHEMAS_LANGUAGE:
3084285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik        case XML_SCHEMAS_NAME:
3085285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik        case XML_SCHEMAS_NCNAME:
3086285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik        case XML_SCHEMAS_ID:
3087285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik        case XML_SCHEMAS_IDREF:
3088285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik        case XML_SCHEMAS_ENTITY:
3089285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik        case XML_SCHEMAS_NMTOKEN:
30902ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	case XML_SCHEMAS_ANYURI:
3091285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik            ret = xmlSchemaDupVal(val);
3092285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik            if (val->value.str != NULL)
3093285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                ret->value.str = xmlStrdup(BAD_CAST val->value.str);
3094285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik            return (ret);
30952ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik        case XML_SCHEMAS_QNAME:
3096285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik        case XML_SCHEMAS_NOTATION:
3097285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik            ret = xmlSchemaDupVal(val);
3098285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik            if (val->value.qname.name != NULL)
3099285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                ret->value.qname.name =
3100285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                    xmlStrdup(BAD_CAST val->value.qname.name);
3101285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik            if (val->value.qname.uri != NULL)
3102285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                ret->value.qname.uri =
3103285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                    xmlStrdup(BAD_CAST val->value.qname.uri);
3104285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik            return (ret);
3105285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik        case XML_SCHEMAS_HEXBINARY:
3106285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik            ret = xmlSchemaDupVal(val);
3107285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik            if (val->value.hex.str != NULL)
3108285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                ret->value.hex.str = xmlStrdup(BAD_CAST val->value.hex.str);
3109285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik            return (ret);
3110285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik        case XML_SCHEMAS_BASE64BINARY:
3111285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik            ret = xmlSchemaDupVal(val);
3112285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik            if (val->value.base64.str != NULL)
3113285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                ret->value.base64.str =
3114285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                    xmlStrdup(BAD_CAST val->value.base64.str);
3115285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik            return (ret);
3116285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik        default:
3117285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik            return (xmlSchemaDupVal(val));
3118285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    }
3119285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    return (NULL);
3120285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik}
3121285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik
3122285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik/**
31235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateAdd:
31245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr
31255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dur: an #xmlSchemaValPtr of type #XS_DURATION
31265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
31275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compute a new date/time from @dt and @dur. This function assumes @dt
31285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH,
3129669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * or #XML_SCHEMAS_GYEAR. The returned #xmlSchemaVal is the same type as
3130669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt. The calling program is responsible for freeing the returned value.
31315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3132669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a pointer to a new #xmlSchemaVal or NULL if error.
31335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
31345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr
31355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur)
31365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
3137669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaValPtr ret, tmp;
31385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long carry, tempdays, temp;
31395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValDatePtr r, d;
31405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValDurationPtr u;
31415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((dt == NULL) || (dur == NULL))
31435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
31445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ret = xmlSchemaNewValue(dt->type);
31465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret == NULL)
31475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
31485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3149669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    /* make a copy so we don't alter the original value */
3150669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    tmp = xmlSchemaDupVal(dt);
3151669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    if (tmp == NULL) {
3152669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        xmlSchemaFreeValue(ret);
3153669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        return NULL;
3154669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    }
3155669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard
31565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r = &(ret->value.date);
3157669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    d = &(tmp->value.date);
31585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    u = &(dur->value.dur);
31595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalization */
31615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (d->mon == 0)
31625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        d->mon = 1;
31635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalize for time zone offset */
31655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    u->sec -= (d->tzo * 60);
31665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    d->tzo = 0;
31675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalization */
31695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (d->day == 0)
31705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        d->day = 1;
31715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* month */
31735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry  = d->mon + u->mon;
3174ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->mon = (unsigned int) MODULO_RANGE(carry, 1, 13);
3175ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT_RANGE(carry, 1, 13);
31765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* year (may be modified later) */
31785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->year = d->year + carry;
31795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (r->year == 0) {
31805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (d->year > 0)
31815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            r->year--;
31825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else
31835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            r->year++;
31845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
31855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* time zone */
31875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->tzo     = d->tzo;
31885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->tz_flag = d->tz_flag;
31895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* seconds */
31915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->sec = d->sec + u->sec;
3192ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT((long)r->sec, 60);
31935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (r->sec != 0.0) {
31945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        r->sec = MODULO(r->sec, 60.0);
31955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
31965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* minute */
31985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry += d->min;
3199ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->min = (unsigned int) MODULO(carry, 60);
3200ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT(carry, 60);
32015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* hours */
32035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry  += d->hour;
3204ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->hour = (unsigned int) MODULO(carry, 24);
3205ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry   = (long)FQUOTIENT(carry, 24);
32065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
32085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * days
32095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * Note we use tempdays because the temporary values may need more
32105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * than 5 bits
32115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
32125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) &&
32135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                  (d->day > MAX_DAYINMONTH(r->year, r->mon)))
32145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = MAX_DAYINMONTH(r->year, r->mon);
32155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (d->day < 1)
32165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = 1;
32175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else
32185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = d->day;
32195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    tempdays += u->day + carry;
32215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    while (1) {
32235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (tempdays < 1) {
3224ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard            long tmon = (long) MODULO_RANGE(r->mon-1, 1, 13);
3225ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard            long tyr  = r->year + (long)FQUOTIENT_RANGE(r->mon-1, 1, 13);
32265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (tyr == 0)
32275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                tyr--;
32285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            tempdays += MAX_DAYINMONTH(tyr, tmon);
32295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            carry = -1;
3230ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard        } else if (tempdays > (long) MAX_DAYINMONTH(r->year, r->mon)) {
32315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon);
32325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            carry = 1;
32335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        } else
32345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
32355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        temp = r->mon + carry;
3237ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard        r->mon = (unsigned int) MODULO_RANGE(temp, 1, 13);
3238ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard        r->year = r->year + (unsigned int) FQUOTIENT_RANGE(temp, 1, 13);
32395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (r->year == 0) {
32405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (temp < 1)
32415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                r->year--;
32425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else
32435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                r->year++;
32445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	}
32455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
32465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->day = tempdays;
32485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
32505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * adjust the date/time type to the date values
32515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
32525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret->type != XML_SCHEMAS_DATETIME) {
32535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if ((r->hour) || (r->min) || (r->sec))
32545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ret->type = XML_SCHEMAS_DATETIME;
32555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (ret->type != XML_SCHEMAS_DATE) {
32565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if ((r->mon != 1) && (r->day != 1))
32575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                ret->type = XML_SCHEMAS_DATE;
32585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1))
32595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                ret->type = XML_SCHEMAS_GYEARMONTH;
32605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
32615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
32625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3263669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaFreeValue(tmp);
32645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
32665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
32675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
32695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaDateNormalize:
3270669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt: an #xmlSchemaValPtr of a date/time type value.
3271669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @offset: number of seconds to adjust @dt by.
32725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3273669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Normalize @dt to GMT time. The @offset parameter is subtracted from
3274669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the return value is a time-zone offset is present on @dt.
32755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3276669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a normalized copy of @dt or NULL if error.
32775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
32785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr
32795a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset)
32805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
32815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValPtr dur, ret;
32825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dt == NULL)
32845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
32855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (((dt->type != XML_SCHEMAS_TIME) &&
32875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard         (dt->type != XML_SCHEMAS_DATETIME)) || (dt->value.date.tzo == 0))
32885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return xmlSchemaDupVal(dt);
32895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION);
32915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dur == NULL)
32925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
32935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    dur->value.date.sec -= offset;
32955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ret = _xmlSchemaDateAdd(dt, dur);
32975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret == NULL)
32985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
32995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaFreeValue(dur);
33015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* ret->value.date.tzo = 0; */
33035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
33045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
33055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
33075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateCastYMToDays:
33085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr
33095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
33105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Convert mon and year of @dt to total number of days. Take the
33115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * number of years since (or before) 1 AD and add the number of leap
33125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years. This is a function  because negative
33135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years must be handled a little differently and there is no zero year.
33145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
33155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns number of days.
33165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
33175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic long
33185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt)
33195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
33205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long ret;
332149e8963c640865343327c67d4755a1af705717d3Daniel Veillard    int mon;
33225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
332349e8963c640865343327c67d4755a1af705717d3Daniel Veillard    mon = dt->value.date.mon;
332449e8963c640865343327c67d4755a1af705717d3Daniel Veillard    if (mon <= 0) mon = 1; /* normalization */
332549e8963c640865343327c67d4755a1af705717d3Daniel Veillard
332649e8963c640865343327c67d4755a1af705717d3Daniel Veillard    if (dt->value.date.year <= 0)
33275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ret = (dt->value.date.year * 365) +
33285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+
33295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard               ((dt->value.date.year+1)/400)) +
333049e8963c640865343327c67d4755a1af705717d3Daniel Veillard              DAY_IN_YEAR(0, mon, dt->value.date.year);
33315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else
33325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ret = ((dt->value.date.year-1) * 365) +
33335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+
33345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard               ((dt->value.date.year-1)/400)) +
333549e8963c640865343327c67d4755a1af705717d3Daniel Veillard              DAY_IN_YEAR(0, mon, dt->value.date.year);
33365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
33385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
33395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
33415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * TIME_TO_NUMBER:
33425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt:  an #xmlSchemaValPtr
33435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
33445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Calculates the number of seconds in the time portion of @dt.
33455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
33465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns seconds.
33475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
33485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define TIME_TO_NUMBER(dt)                              \
33495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ((double)((dt->value.date.hour * SECS_PER_HOUR) +   \
3350b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard              (dt->value.date.min * SECS_PER_MIN) +	\
3351b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard              (dt->value.date.tzo * SECS_PER_MIN)) +	\
3352b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard               dt->value.date.sec)
33535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
33555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaCompareDates:
33565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @x:  a first date/time value
33575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @y:  a second date/time value
33585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
33595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compare 2 date/times
33605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
33615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
33625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error
33635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
33645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic int
33655a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y)
33665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
33675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    unsigned char xmask, ymask, xor_mask, and_mask;
33685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValPtr p1, p2, q1, q2;
33695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long p1d, p2d, q1d, q2d;
33705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((x == NULL) || (y == NULL))
33725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return -2;
33735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (x->value.date.tz_flag) {
33755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (!y->value.date.tz_flag) {
33775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            p1 = xmlSchemaDateNormalize(x, 0);
33785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
33795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            /* normalize y + 14:00 */
33805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR));
33815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
3383fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            if (p1d < q1d) {
3384fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
3385fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
33865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return -1;
3387fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    } else if (p1d == q1d) {
33885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                double sec;
33895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
3391fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard                if (sec < 0.0) {
3392fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		    xmlSchemaFreeValue(p1);
3393fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		    xmlSchemaFreeValue(q1);
33945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    return -1;
3395fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		} else {
33964aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    int ret = 0;
33975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    /* normalize y - 14:00 */
33985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR));
33995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day;
34005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    if (p1d > q2d)
34014aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 1;
34025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    else if (p1d == q2d) {
34035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2);
34045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        if (sec > 0.0)
34054aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                            ret = 1;
34065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        else
34074aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                            ret = 2; /* indeterminate */
34085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    }
34094aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(p1);
34104aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(q1);
34114aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(q2);
34124aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    if (ret != 0)
34134aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		        return(ret);
34145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                }
3415fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            } else {
3416fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
3417fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
3418fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    }
34195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
34205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    } else if (y->value.date.tz_flag) {
34215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1 = xmlSchemaDateNormalize(y, 0);
34225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
34235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
34245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        /* normalize x - 14:00 */
34255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR));
34265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
34275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3428fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard        if (p1d < q1d) {
3429fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(p1);
3430fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(q1);
34315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
3432fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else if (p1d == q1d) {
34335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            double sec;
34345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
34355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
3436fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            if (sec < 0.0) {
3437fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
3438fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
34395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return -1;
3440fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    } else {
34414aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	        int ret = 0;
34425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                /* normalize x + 14:00 */
34435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR));
34445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day;
34455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
34466560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                if (p2d > q1d) {
34474aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                    ret = 1;
34486560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		} else if (p2d == q1d) {
34495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1);
34505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    if (sec > 0.0)
34514aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 1;
34525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    else
34534aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 2; /* indeterminate */
34545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                }
34556560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(p1);
34566560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(q1);
34576560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(p2);
34584aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		if (ret != 0)
34594aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    return(ret);
34605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            }
3461fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else {
3462fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(p1);
3463fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(q1);
34645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
34655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
34665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
34675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
34685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * if the same type then calculate the difference
34695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
34705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (x->type == y->type) {
34714aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard        int ret = 0;
34725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1 = xmlSchemaDateNormalize(y, 0);
34735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
34745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
34755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1 = xmlSchemaDateNormalize(x, 0);
34765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
34775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3478fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard        if (p1d < q1d) {
34794aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard            ret = -1;
3480fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else if (p1d > q1d) {
34814aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard            ret = 1;
3482fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else {
34835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            double sec;
34845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
34855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
34865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (sec < 0.0)
34874aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                ret = -1;
34885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else if (sec > 0.0)
34894aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                ret = 1;
34905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
34915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
34924aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	xmlSchemaFreeValue(p1);
34934aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	xmlSchemaFreeValue(q1);
34944aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard        return(ret);
34955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
34965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
34975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    switch (x->type) {
34985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
34995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0xf;
35005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
35015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
35025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x7;
35035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
35045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
35055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x1;
35065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
35075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
35085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x2;
35095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
35105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
35115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x3;
35125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
35135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
35145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x3;
35155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
35165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
35175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x6;
35185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
35195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
35205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x8;
35215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
35225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        default:
35235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0;
35245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
35255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
35265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
35275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    switch (y->type) {
35285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
35295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0xf;
35305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
35315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
35325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x7;
35335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
35345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
35355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x1;
35365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
35375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
35385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x2;
35395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
35405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
35415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x3;
35425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
35435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
35445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x3;
35455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
35465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
35475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x6;
35485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
35495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
35505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x8;
35515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
35525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        default:
35535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0;
35545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
35555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
35565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
35575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xor_mask = xmask ^ ymask;           /* mark type differences */
35585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    and_mask = xmask & ymask;           /* mark field specification */
35595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
35605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* year */
35615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 1)
35625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
35635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 1) {
35645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.year < y->value.date.year)
35655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
35665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.year > y->value.date.year)
35675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
35685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
35695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
35705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* month */
35715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 2)
35725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
35735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 2) {
35745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.mon < y->value.date.mon)
35755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
35765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.mon > y->value.date.mon)
35775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
35785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
35795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
35805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* day */
35815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 4)
35825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
35835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 4) {
35845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.day < y->value.date.day)
35855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
35865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.day > y->value.date.day)
35875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
35885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
35895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
35905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* time */
35915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 8)
35925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
35935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 8) {
35945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.hour < y->value.date.hour)
35955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
35965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.hour > y->value.date.hour)
35975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
35985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.min < y->value.date.min)
35995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
36005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.min > y->value.date.min)
36015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
36025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.sec < y->value.date.sec)
36035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
36045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.sec > y->value.date.sec)
36055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
36065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
36075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3608070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
3609070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
3610070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3611070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
36126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveReplaceStrings:
36136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
36146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
36156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @invert: inverts the result if x < y or x > y.
36166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
36176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
36186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is
36196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "replace". I.e. @x could
36206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString".
36216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
36226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
36236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
36246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
36256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
36266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaComparePreserveReplaceStrings(xmlSchemaValPtr x, xmlSchemaValPtr y,
36276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				       int invert)
36286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
36296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    const xmlChar *utf1;
36306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    const xmlChar *utf2;
36316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
36326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
36336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if ((x == NULL) || (y == NULL))
36346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return(-2);
36356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    utf1 = x->value.str;
36366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    utf2 = y->value.str;
36376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
36386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    while ((*utf1 != 0) && (*utf2 != 0)) {
36396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (IS_WSP_REPLACE_CH(*utf2)) {
36406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (! IS_WSP_SPACE_CH(*utf1)) {
36416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if ((*utf1 - 0x20) < 0) {
36426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
36436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
36446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
36456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
36466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
36476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
36486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
36496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
36506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
36516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
36526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
36536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
36546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    tmp = *utf1 - *utf2;
36556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0) {
36566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
36576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
36586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
36596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
36606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
36616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0) {
36626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
36636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
36646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
36656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
36666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
36676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
36686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	utf1++;
36696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	utf2++;
36706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
36716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (*utf1 != 0) {
36726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (invert)
36736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(-1);
36746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	else
36756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(1);
36766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
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    return(0);
36846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
36856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
36866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
36876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings:
36886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
36896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
36906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
36916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
36926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is
36936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could
36946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString".
36956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
36966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
36976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
36986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
36996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
37006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaComparePreserveCollapseStrings(xmlSchemaValPtr x, xmlSchemaValPtr y,
37016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik					int invert)
37026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
37036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    const xmlChar *utf1;
37046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    const xmlChar *utf2;
37056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
37066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
37076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if ((x == NULL) || (y == NULL))
37086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return(-2);
37096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    utf1 = x->value.str;
37106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    utf2 = y->value.str;
37116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
37126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    /*
37136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    * Skip leading blank chars of the collapsed string.
37146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    */
37156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2))
37166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	utf2++;
37176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
37186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    while ((*utf1 != 0) && (*utf2 != 0)) {
37196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2)) {
37206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (! IS_WSP_SPACE_CH(*utf1)) {
37216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		/*
37226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		* The utf2 character would have been replaced to 0x20.
37236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*/
37246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if ((*utf1 - 0x20) < 0) {
37256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
37266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
37276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
37286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
37296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
37306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
37316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
37326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
37336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
37346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
37356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
37366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    utf1++;
37376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    utf2++;
37386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    /*
37396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    * Skip contiguous blank chars of the collapsed string.
37406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    */
37416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2))
37426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		utf2++;
37436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
37446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    tmp = *utf1++ - *utf2++;
37456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0) {
37466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
37476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
37486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
37496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
37506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
37516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0) {
37526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
37536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
37546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
37556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
37566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
37576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
37586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
37596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (*utf1 != 0) {
37606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 if (invert)
37616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(-1);
37626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 else
37636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(1);
37646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
37656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (*utf2 != 0) {
37666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	/*
37676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	* Skip trailing blank chars of the collapsed string.
37686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	*/
37696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2))
37706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    utf2++;
37716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (*utf2 != 0) {
37726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (invert)
37736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(1);
37746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    else
37756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(-1);
37766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
37776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
37786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
37796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
37806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
37816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
37826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings:
37836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
37846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
37856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
37866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
37876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is
37886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could
37896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString".
37906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
37916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
37926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
37936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
37946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
37956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareReplaceCollapseStrings(xmlSchemaValPtr x, xmlSchemaValPtr y,
37966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				       int invert)
37976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
37986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    const xmlChar *utf1;
37996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    const xmlChar *utf2;
38006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
38016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
38026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if ((x == NULL) || (y == NULL))
38036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return(-2);
38046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    utf1 = x->value.str;
38056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    utf2 = y->value.str;
38066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
38076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    /*
38086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    * Skip leading blank chars of the collapsed string.
38096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    */
38106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2))
38116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	utf2++;
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		/*
38176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		* The utf2 character would have been replaced to 0x20.
38186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*/
38196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if ((*utf1 - 0x20) < 0) {
38206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
38216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
38226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
38236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
38246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
38256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
38266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
38276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
38286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
38296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
38306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
38316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    utf1++;
38326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    utf2++;
38336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    /*
38346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    * Skip contiguous blank chars of the collapsed string.
38356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    */
38366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2))
38376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		utf2++;
38386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
38396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (IS_WSP_SPACE_CH(*utf1) || IS_WSP_REPLACE_CH(*utf1)) {
38406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		/*
38416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		* The utf1 character would have been replaced to 0x20.
38426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*/
38436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if ((0x20 - *utf2) < 0) {
38446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
38456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
38466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
38476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
38486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
38496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
38506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
38516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
38526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
38536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
38546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
38556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    tmp = *utf1++ - *utf2++;
38566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0)
38576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(-1);
38586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0)
38596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(1);
38606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
38616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
38626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (*utf1 != 0) {
38636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 if (invert)
38646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(-1);
38656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 else
38666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(1);
38676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
38686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (*utf2 != 0) {
38696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	/*
38706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	* Skip trailing blank chars of the collapsed string.
38716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	*/
38726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2))
38736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    utf2++;
38746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (*utf2 != 0) {
38756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (invert)
38766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(1);
38776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    else
38786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(-1);
38796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
38806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
38816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
38826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
38836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
38846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
38856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
38866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareReplacedStrings:
38876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
38886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
38896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
38906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
38916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
38926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
38936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
38946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
38956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
38966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareReplacedStrings(xmlSchemaValPtr x, xmlSchemaValPtr y)
38976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
38986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    const xmlChar *utf1;
38996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    const xmlChar *utf2;
39006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
39016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
39026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if ((x == NULL) || (y == NULL))
39036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return(-2);
39046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    utf1 = x->value.str;
39056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    utf2 = y->value.str;
39066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
39076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    while ((*utf1 != 0) && (*utf2 != 0)) {
39086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2)) {
39096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (! (IS_WSP_SPACE_CH(*utf1) || IS_WSP_REPLACE_CH(*utf1))) {
39106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if ((*utf1 - 0x20) < 0)
39116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    		    return(-1);
39126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
39136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
39146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
39156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
39166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (IS_WSP_SPACE_CH(*utf1) || IS_WSP_REPLACE_CH(*utf1)) {
39176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if ((0x20 - *utf2) < 0)
39186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    		    return(-1);
39196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
39206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
39216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
39226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    tmp = *utf1 - *utf2;
39236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0)
39246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    		return(-1);
39256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0)
39266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    		return(1);
39276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
39286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	utf1++;
39296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	utf2++;
39306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
39316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (*utf1 != 0)
39326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        return(1);
39336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (*utf2 != 0)
39346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        return(-1);
39356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
39366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
39376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
39386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
3939c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaCompareNormStrings:
3940c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @x:  a first string value
3941c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @y:  a second string value
3942c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
3943c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Compare 2 string for their normalized values.
3944c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
3945c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
3946c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * case of error
3947c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */
3948c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int
3949c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaCompareNormStrings(xmlSchemaValPtr x, xmlSchemaValPtr y) {
3950c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    const xmlChar *utf1;
3951c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    const xmlChar *utf2;
3952c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    int tmp;
3953c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
3954c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    if ((x == NULL) || (y == NULL))
3955c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	return(-2);
3956c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    utf1 = x->value.str;
3957c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    utf2 = y->value.str;
3958c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
395976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while (IS_BLANK_CH(*utf1)) utf1++;
396076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while (IS_BLANK_CH(*utf2)) utf2++;
3961c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    while ((*utf1 != 0) && (*utf2 != 0)) {
396276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if (IS_BLANK_CH(*utf1)) {
396376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    if (!IS_BLANK_CH(*utf2)) {
3964c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		tmp = *utf1 - *utf2;
3965c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(tmp);
3966c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    }
396776e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*utf1)) utf1++;
396876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*utf2)) utf2++;
3969c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	} else {
3970c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    tmp = *utf1++ - *utf2++;
3971c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (tmp < 0)
3972c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(-1);
3973c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (tmp > 0)
3974c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(1);
3975c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	}
3976c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
3977c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    if (*utf1 != 0) {
397876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	while (IS_BLANK_CH(*utf1)) utf1++;
3979c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	if (*utf1 != 0)
3980c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    return(1);
3981c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
3982c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    if (*utf2 != 0) {
398376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	while (IS_BLANK_CH(*utf2)) utf2++;
3984c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	if (*utf2 != 0)
3985c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    return(-1);
3986c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
3987c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    return(0);
3988c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard}
3989c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
3990c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/**
3991b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCompareFloats:
3992b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @x:  a first float or double value
3993b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @y:  a second float or double value
3994b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
3995b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Compare 2 values
3996b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
3997b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
3998b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * case of error
3999b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
4000b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int
4001b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) {
4002b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    double d1, d2;
4003b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4004b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if ((x == NULL) || (y == NULL))
4005b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
4006b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4007b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
4008b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * Cast everything to doubles.
4009b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
4010b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (x->type == XML_SCHEMAS_DOUBLE)
4011b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d1 = x->value.d;
4012b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else if (x->type == XML_SCHEMAS_FLOAT)
4013b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d1 = x->value.f;
4014b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else
4015b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
4016b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4017b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (y->type == XML_SCHEMAS_DOUBLE)
4018b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d2 = y->value.d;
4019b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else if (y->type == XML_SCHEMAS_FLOAT)
4020b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d2 = y->value.f;
4021b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else
4022b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
4023b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4024b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
4025b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * Check for special cases.
4026b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
4027b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (xmlXPathIsNaN(d1)) {
4028b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (xmlXPathIsNaN(d2))
4029b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
4030b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(1);
4031b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
4032b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (xmlXPathIsNaN(d2))
4033b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-1);
4034b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == xmlXPathPINF) {
4035b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (d2 == xmlXPathPINF)
4036b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
4037b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(1);
4038b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
4039b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d2 == xmlXPathPINF)
4040b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(-1);
4041b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == xmlXPathNINF) {
4042b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (d2 == xmlXPathNINF)
4043b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
4044b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(-1);
4045b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
4046b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d2 == xmlXPathNINF)
4047b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(1);
4048b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4049b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
4050b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * basic tests, the last one we should have equality, but
4051b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * portability is more important than speed and handling
4052b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * NaN or Inf in a portable way is always a challenge, so ...
4053b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
4054b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 < d2)
4055b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-1);
4056b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 > d2)
4057b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(1);
4058b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == d2)
4059b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(0);
4060b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return(2);
4061b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
4062b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4063b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
40644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareValues:
40654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x:  a first value
40666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xwtsp: the whitespace type
40674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y:  a second value
40686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @ywtsp: the whitespace type
40694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
40704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 values
40714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
40725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
40735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error
40744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
40756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
40766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValuesInternal(xmlSchemaValPtr x,
40776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType xws,
40786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			       xmlSchemaValPtr y,
40796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType yws) {
40804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if ((x == NULL) || (y == NULL))
40814255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(-2);
40824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
40834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    switch (x->type) {
408480b19092f24410a6b869abf519227686e8f207caDaniel Veillard	case XML_SCHEMAS_UNKNOWN:
40852f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	case XML_SCHEMAS_ANYTYPE:
408680b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    return(-2);
408780b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_INTEGER:
408880b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NPINTEGER:
408980b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NINTEGER:
409080b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NNINTEGER:
409180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_PINTEGER:
409280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_INT:
409380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_UINT:
409480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_LONG:
409580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ULONG:
409680b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_SHORT:
409780b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_USHORT:
409880b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_BYTE:
409980b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_UBYTE:
41004255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMAS_DECIMAL:
410180b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    if (y->type == x->type)
410280b19092f24410a6b869abf519227686e8f207caDaniel Veillard		return(xmlSchemaCompareDecimals(x, y));
410380b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    if ((y->type == XML_SCHEMAS_DECIMAL) ||
410480b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_INTEGER) ||
410580b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_NPINTEGER) ||
410680b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_NINTEGER) ||
410780b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_NNINTEGER) ||
410880b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_PINTEGER) ||
410980b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_INT) ||
411080b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_UINT) ||
411180b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_LONG) ||
411280b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_ULONG) ||
411380b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_SHORT) ||
411480b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_USHORT) ||
411580b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_BYTE) ||
411680b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_UBYTE))
41174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(xmlSchemaCompareDecimals(x, y));
41185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    return(-2);
4119070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        case XML_SCHEMAS_DURATION:
4120070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (y->type == XML_SCHEMAS_DURATION)
4121070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return(xmlSchemaCompareDurations(x, y));
41225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return(-2);
41235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
41245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
41255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
41265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
41275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
41285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
41295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
41305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
41315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if ((y->type == XML_SCHEMAS_DATETIME)  ||
41325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_TIME)      ||
41335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_GDAY)      ||
41345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_GMONTH)    ||
41355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_GMONTHDAY) ||
41365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_GYEAR)     ||
41375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_DATE)      ||
41385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_GYEARMONTH))
41395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return (xmlSchemaCompareDates(x, y));
41405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return (-2);
41412ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	/*
41422ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	* Note that we will support comparison of string types against
41432ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	* anySimpleType as well.
41442ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	*/
41452ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	case XML_SCHEMAS_ANYSIMPLETYPE:
41466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_STRING:
41476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        case XML_SCHEMAS_NORMSTRING:
414880b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_TOKEN:
414980b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_LANGUAGE:
415080b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NMTOKEN:
415180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NAME:
415280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NCNAME:
415380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ID:
415480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_IDREF:
415580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ENTITY:
415680b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NOTATION:
415780b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ANYURI:
41586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    /*
41596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    * TODO: Compare those against QName.
41606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    */
41616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (y->type == XML_SCHEMAS_QNAME) {
41626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		TODO
41636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return (-2);
41646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
41652ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik            if ((y->type == XML_SCHEMAS_ANYSIMPLETYPE) ||
41662ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik		(y->type == XML_SCHEMAS_STRING) ||
41676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		(y->type == XML_SCHEMAS_NORMSTRING) ||
4168c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_TOKEN) ||
4169c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_LANGUAGE) ||
4170c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_NMTOKEN) ||
4171c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_NAME) ||
4172c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_NCNAME) ||
4173c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_ID) ||
4174c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_IDREF) ||
4175c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_ENTITY) ||
4176c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_NOTATION) ||
41776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik                (y->type == XML_SCHEMAS_ANYURI)) {
41786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
41796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (xws == XML_SCHEMA_WHITESPACE_PRESERVE) {
41806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
41816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) {
41826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			/* TODO: What about x < y or x > y. */
41836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			if (xmlStrEqual(x->value.str, y->value.str))
41846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			    return (0);
41856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			else
41866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			    return (2);
41876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    } else if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
41886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return (xmlSchemaComparePreserveReplaceStrings(x, y, 0));
41896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
41906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return (xmlSchemaComparePreserveCollapseStrings(x, y, 0));
41916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
41926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else if (xws == XML_SCHEMA_WHITESPACE_REPLACE) {
41936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
41946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE)
41956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return (xmlSchemaComparePreserveReplaceStrings(y, x, 1));
41966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
41976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return (xmlSchemaCompareReplacedStrings(x, y));
41986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
41996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return (xmlSchemaCompareReplaceCollapseStrings(x, y, 0));
42006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
42016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else if (xws == XML_SCHEMA_WHITESPACE_COLLAPSE) {
42026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
42036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE)
42046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return (xmlSchemaComparePreserveCollapseStrings(y, x, 1));
42056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
42066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return (xmlSchemaCompareReplaceCollapseStrings(y, x, 1));
42076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
42086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return (xmlSchemaCompareNormStrings(x, y));
42096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else
42106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return (-2);
42116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
42126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4213c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard            return (-2);
4214e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_QNAME:
4215e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard            if (y->type == XML_SCHEMAS_QNAME) {
4216e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) &&
4217e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    (xmlStrEqual(x->value.qname.uri, y->value.qname.uri)))
4218e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    return(0);
4219e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		return(2);
4220e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    }
4221e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (-2);
4222c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_FLOAT:
4223c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_DOUBLE:
4224b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard            if ((y->type == XML_SCHEMAS_FLOAT) ||
4225b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard                (y->type == XML_SCHEMAS_DOUBLE))
4226b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard                return (xmlSchemaCompareFloats(x, y));
4227b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard            return (-2);
4228c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_BOOLEAN:
4229b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard            if (y->type == XML_SCHEMAS_BOOLEAN) {
4230b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (x->value.b == y->value.b)
4231b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    return(0);
4232b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (x->value.b == 0)
4233b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    return(-1);
4234b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		return(1);
4235b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
4236b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return (-2);
4237560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard        case XML_SCHEMAS_HEXBINARY:
423870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard            if (y->type == XML_SCHEMAS_HEXBINARY) {
423970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	        if (x->value.hex.total == y->value.hex.total) {
424070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    int ret = xmlStrcmp(x->value.hex.str, y->value.hex.str);
424170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    if (ret > 0)
424270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard			return(1);
424370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    else if (ret == 0)
424470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard			return(0);
424570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		}
424670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		else if (x->value.hex.total > y->value.hex.total)
424770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    return(1);
424870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
424970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		return(-1);
425070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard            }
4251560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard            return (-2);
42521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BASE64BINARY:
42531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (y->type == XML_SCHEMAS_BASE64BINARY) {
42541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (x->value.base64.total == y->value.base64.total) {
42551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int ret = xmlStrcmp(x->value.base64.str,
42561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		                        y->value.base64.str);
42571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (ret > 0)
42581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        return(1);
42591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (ret == 0)
42601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        return(0);
42611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
42621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else if (x->value.base64.total > y->value.base64.total)
42631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    return(1);
42641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else
42651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    return(-1);
42661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
42676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik            return (-2);
4268c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_IDREFS:
4269c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ENTITIES:
4270c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NMTOKENS:
4271c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    TODO
4272c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    break;
42734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
42745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return -2;
42754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
42764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
42774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
42786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValues:
42796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first value
42806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second value
42816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
42826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values
42836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
42846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
42856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
42866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
42876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint
42886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) {
42896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    xmlSchemaWhitespaceValueType xws, yws;
42906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
42915e094143e423c01739ac9221f371846fd290be4eDaniel Veillard    if ((x == NULL) || (y == NULL))
42925e094143e423c01739ac9221f371846fd290be4eDaniel Veillard        return(-2);
42936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (x->type == XML_SCHEMAS_STRING)
42946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	xws = XML_SCHEMA_WHITESPACE_PRESERVE;
42956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else if (x->type == XML_SCHEMAS_NORMSTRING)
42966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        xws = XML_SCHEMA_WHITESPACE_REPLACE;
42976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else
42986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        xws = XML_SCHEMA_WHITESPACE_COLLAPSE;
42996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
43006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (y->type == XML_SCHEMAS_STRING)
43016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	yws = XML_SCHEMA_WHITESPACE_PRESERVE;
43026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else if (x->type == XML_SCHEMAS_NORMSTRING)
43036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        yws = XML_SCHEMA_WHITESPACE_REPLACE;
43046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else
43056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        yws = XML_SCHEMA_WHITESPACE_COLLAPSE;
43066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
43076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(xmlSchemaCompareValuesInternal(x, xws, y, yws));
43086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
43096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
43106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
43116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValuesWhtsp:
43126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first value
43136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xws: the whitespace value of x
43146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second value
43156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @yws: the whitespace value of y
43166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
43176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values
43186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
43196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
43206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
43216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
43226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint
43236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValuesWhtsp(xmlSchemaValPtr x,
43246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				 xmlSchemaWhitespaceValueType xws,
43256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				 xmlSchemaValPtr y,
43266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				 xmlSchemaWhitespaceValueType yws) {
43276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(xmlSchemaCompareValuesInternal(x, xws, y, yws));
43286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
43296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
43306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
4331c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaNormLen:
4332c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @value:  a string
4333c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
4334c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Computes the UTF8 length of the normalized value of the string
4335c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
4336c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns the length or -1 in case of error.
4337c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */
4338c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int
4339c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaNormLen(const xmlChar *value) {
4340c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    const xmlChar *utf;
4341c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    int ret = 0;
4342c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
4343c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    if (value == NULL)
4344c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	return(-1);
4345c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    utf = value;
434676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while (IS_BLANK_CH(*utf)) utf++;
4347c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    while (*utf != 0) {
4348c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	if (utf[0] & 0x80) {
4349c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if ((utf[1] & 0xc0) != 0x80)
4350c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(-1);
4351c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if ((utf[0] & 0xe0) == 0xe0) {
4352c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		if ((utf[2] & 0xc0) != 0x80)
4353c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    return(-1);
4354c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		if ((utf[0] & 0xf0) == 0xf0) {
4355c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80)
4356c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard			return(-1);
4357c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    utf += 4;
4358c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		} else {
4359c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    utf += 3;
4360c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		}
4361c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    } else {
4362c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		utf += 2;
4363c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    }
436476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	} else if (IS_BLANK_CH(*utf)) {
436576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*utf)) utf++;
4366c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (*utf == 0)
4367c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		break;
4368c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	} else {
4369c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    utf++;
4370c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	}
4371c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	ret++;
4372c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
4373c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    return(ret);
4374c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard}
4375c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
43766927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard/**
43776927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaGetFacetValueAsULong:
43786927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * @facet: an schemas type facet
43796927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard *
43806927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Extract the value of a facet
43816927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard *
43826927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Returns the value as a long
43836927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard */
4384c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardunsigned long
4385c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaGetFacetValueAsULong(xmlSchemaFacetPtr facet)
4386c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{
4387c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    /*
4388c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    * TODO: Check if this is a decimal.
4389c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    */
4390094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack    if (facet == NULL)
4391094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack        return 0;
4392c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    return ((unsigned long) facet->val->value.decimal.lo);
4393c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
4394c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
4395c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/**
439601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateListSimpleTypeFacet:
439701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facet:  the facet to check
439801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @value:  the lexical repr of the value to validate
439901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @actualLen:  the number of list items
440001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @expectedLen: the resulting expected number of list items
440101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
440201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Checks the value of a list simple type against a facet.
440301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
440401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 0 if the value is valid, a positive error code
440501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * number otherwise and -1 in case of an internal error.
440601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
440701fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint
440801fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaValidateListSimpleTypeFacet(xmlSchemaFacetPtr facet,
440901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     const xmlChar *value,
441001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     unsigned long actualLen,
441101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     unsigned long *expectedLen)
441201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
4413ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard    if (facet == NULL)
4414ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard        return(-1);
441501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    /*
441601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * TODO: Check if this will work with large numbers.
441701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * (compare value.decimal.mi and value.decimal.hi as well?).
441801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
441901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
442001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen != facet->val->value.decimal.lo) {
4421c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    if (expectedLen != 0)
4422c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
442301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_LENGTH_VALID);
442401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
442501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
442601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen < facet->val->value.decimal.lo) {
4427c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    if (expectedLen != 0)
4428c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
442901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_MINLENGTH_VALID);
443001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
443101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MAXLENGTH) {
443201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen > facet->val->value.decimal.lo) {
4433c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    if (expectedLen != 0)
4434c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
443501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_MAXLENGTH_VALID);
443601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
443701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else
443801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	/*
443901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	* NOTE: That we can pass NULL as xmlSchemaValPtr to
444001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	* xmlSchemaValidateFacet, since the remaining facet types
444101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	* are: XML_SCHEMA_FACET_PATTERN, XML_SCHEMA_FACET_ENUMERATION.
444201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	*/
444301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	return(xmlSchemaValidateFacet(NULL, facet, value, NULL));
444401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    return (0);
444501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
444601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
444701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
44486927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaValidateLengthFacet:
4449c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type:  the built-in type
4450c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @facet:  the facet to check
4451c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value:  the lexical repr. of the value to be validated
4452c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val:  the precomputed value
4453c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @length: the actual length of the value
4454c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
4455c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength"
4456c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * facet; sets @length to the computed length of @value.
4457c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
4458c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if the value is valid, a positive error code
4459c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * otherwise and -1 in case of an internal or API error.
4460c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */
4461c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardint
4462c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaValidateLengthFacet(xmlSchemaTypePtr type,
4463c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard			     xmlSchemaFacetPtr facet,
4464c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard			     const xmlChar *value,
4465c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard			     xmlSchemaValPtr val,
4466c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard			     unsigned long *length)
4467c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{
4468c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    unsigned int len = 0;
4469c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
4470ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard    if ((length == NULL) || (facet == NULL) || (type == NULL))
4471ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard        return (-1);
4472c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    *length = 0;
4473c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((facet->type != XML_SCHEMA_FACET_LENGTH) &&
4474c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->type != XML_SCHEMA_FACET_MAXLENGTH) &&
4475c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->type != XML_SCHEMA_FACET_MINLENGTH))
4476c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	return (-1);
4477c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
4478c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((facet->val == NULL) ||
4479c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	((facet->val->type != XML_SCHEMAS_DECIMAL) &&
4480c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
4481c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->val->value.decimal.frac != 0)) {
4482c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	return(-1);
4483c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
4484c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY))
4485c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	len = val->value.hex.total;
4486c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY))
4487c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	len = val->value.base64.total;
4488c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    else {
4489c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	switch (type->builtInType) {
4490c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_IDREF:
4491c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NORMSTRING:
4492c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_TOKEN:
4493c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_LANGUAGE:
4494c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NMTOKEN:
4495c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NAME:
4496c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NCNAME:
4497c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_ID:
4498c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		len = xmlSchemaNormLen(value);
4499c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		break;
4500c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_STRING:
4501c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    /*
4502c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    * FIXME: What exactly to do with anyURI?
4503c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    */
4504c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_ANYURI:
4505c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		if (value != NULL)
4506c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		    len = xmlUTF8Strlen(value);
4507c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		break;
4508c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    default:
4509c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		TODO
4510c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	}
4511c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
4512c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    *length = (unsigned long) len;
4513c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
4514c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len != facet->val->value.decimal.lo)
4515c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_LENGTH_VALID);
4516c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
4517c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len < facet->val->value.decimal.lo)
4518c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_MINLENGTH_VALID);
4519c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    } else {
4520c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len > facet->val->value.decimal.lo)
4521c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXLENGTH_VALID);
4522c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
4523c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
4524c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    return (0);
4525c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
4526c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
4527c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/**
4528c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaValidateFacet:
452901c13b5be2d249ef66d86585adee87901bb8efa2Daniel Veillard * @base:  the base type
45304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @facet:  the facet to check
45314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value:  the lexical repr of the value to validate
45324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val:  the precomputed value
45334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
45344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Check a value against a facet condition
45354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
45364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if the element is schemas valid, a positive error code
45374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *     number otherwise and -1 in case of internal or API error.
45384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
45394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardint
4540dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateFacet(xmlSchemaTypePtr base ATTRIBUTE_UNUSED,
4541118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	               xmlSchemaFacetPtr facet,
45424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	               const xmlChar *value, xmlSchemaValPtr val)
45434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{
45444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    int ret;
45454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
4546ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard    if ((facet == NULL) || (value == NULL))
4547ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard        return(-1);
45484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    switch (facet->type) {
45494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMA_FACET_PATTERN:
45504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    ret = xmlRegexpExec(facet->regexp, value);
45514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == 1)
45524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(0);
45534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == 0) {
455401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return(XML_SCHEMAV_CVC_PATTERN_VALID);
45554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    }
45564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    return(ret);
45574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMA_FACET_MAXEXCLUSIVE:
45584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
45594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == -2) {
45608bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		/* TODO error code */
45614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(-1);
45624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    }
45634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == -1)
45644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(0);
45655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    /* error code */
456601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID);
4567070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MAXINCLUSIVE:
4568070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
4569070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret == -2) {
45708bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		/* TODO error code */
4571070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
4572070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }
4573070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((ret == -1) || (ret == 0))
4574070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
45755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    /* error code */
457601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID);
4577070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MINEXCLUSIVE:
4578070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
4579070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret == -2) {
45808bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		/* TODO error code */
4581070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
4582070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }
4583070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret == 1)
4584070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
45855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    /* error code */
458601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID);
4587070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MININCLUSIVE:
4588070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
4589070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret == -2) {
45908bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		/* TODO error code */
4591070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
4592070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }
4593070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((ret == 1) || (ret == 0))
4594070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
45955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    /* error code */
459601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MININCLUSIVE_VALID);
45978651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard	case XML_SCHEMA_FACET_WHITESPACE:
45988bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    /* TODO whitespaces */
459901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    /*
460001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * NOTE: Whitespace should be handled to normalize
460101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * the value to be validated against a the facets;
460201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * not to normalize the value in-between.
460301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    */
46048651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard	    return(0);
46058bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case  XML_SCHEMA_FACET_ENUMERATION:
46068bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    if ((facet->value != NULL) &&
46078bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		(xmlStrEqual(facet->value, value)))
46088bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		return(0);
460901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_ENUMERATION_VALID);
46108bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case XML_SCHEMA_FACET_LENGTH:
4611e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard	case XML_SCHEMA_FACET_MAXLENGTH:
46128bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case XML_SCHEMA_FACET_MINLENGTH: {
46138bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    unsigned int len = 0;
4614e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard
46158bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    if ((facet->val == NULL) ||
4616e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		((facet->val->type != XML_SCHEMAS_DECIMAL) &&
4617e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
46188bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		(facet->val->value.decimal.frac != 0)) {
46198bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		return(-1);
46208bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    }
4621560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY))
462270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		len = val->value.hex.total;
46231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	    else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY))
46241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		len = val->value.base64.total;
46251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	    else {
462601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		switch (base->builtInType) {
4627560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    	    case XML_SCHEMAS_IDREF:
4628560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NORMSTRING:
4629560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_TOKEN:
4630560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_LANGUAGE:
4631560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NMTOKEN:
4632560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NAME:
4633560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NCNAME:
4634560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_ID:
463570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    	len = xmlSchemaNormLen(value);
463670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    	break;
4637560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_STRING:
463801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    /*
463901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    * FIXME: What exactly to do with anyURI?
464001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    */
464101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    case XML_SCHEMAS_ANYURI:
4642fbf2c5eaf550a8e7b94e87d5a4940db53bdffeacWilliam M. Brack		        if (value != NULL)
4643fbf2c5eaf550a8e7b94e87d5a4940db53bdffeacWilliam M. Brack			    len = xmlUTF8Strlen(value);
464470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    	break;
4645560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    default:
4646560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		        TODO
464770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	    	}
46488bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    }
46498bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
4650e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len != facet->val->value.decimal.lo)
465101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_LENGTH_VALID);
46528bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
4653e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len < facet->val->value.decimal.lo)
465401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_MINLENGTH_VALID);
46558bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    } else {
4656e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len > facet->val->value.decimal.lo)
465701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_MAXLENGTH_VALID);
4658e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard	    }
46598bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    break;
46608bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	}
4661560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	case XML_SCHEMA_FACET_TOTALDIGITS:
4662560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	case XML_SCHEMA_FACET_FRACTIONDIGITS:
4663560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
4664560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((facet->val == NULL) ||
4665560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		((facet->val->type != XML_SCHEMAS_DECIMAL) &&
4666560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
4667560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		(facet->val->value.decimal.frac != 0)) {
4668560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		return(-1);
4669560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
4670560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((val == NULL) ||
4671560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		((val->type != XML_SCHEMAS_DECIMAL) &&
4672560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_INTEGER) &&
4673560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NPINTEGER) &&
4674560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NINTEGER) &&
4675560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NNINTEGER) &&
4676560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_PINTEGER) &&
4677560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_INT) &&
4678560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_UINT) &&
4679560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_LONG) &&
4680560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_ULONG) &&
4681560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_SHORT) &&
4682560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_USHORT) &&
4683560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_BYTE) &&
4684560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_UBYTE))) {
4685560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		return(-1);
4686560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
4687560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) {
4688560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	        if (val->value.decimal.total > facet->val->value.decimal.lo)
468901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	            return(XML_SCHEMAV_CVC_TOTALDIGITS_VALID);
4690560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
4691560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) {
4692560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	        if (val->value.decimal.frac > facet->val->value.decimal.lo)
469301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID);
4694560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
4695560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    break;
46964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	default:
46974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    TODO
46984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
46994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return(0);
4700b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
47014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
47024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
47036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
47046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaGetCanonValue:
47056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @val: the precomputed value
47066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @retValue: the returned value
47076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
4708b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * Get a the cononical representation of the value.
4709b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * The caller has to free the returned retValue.
47106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
47116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns 0 if the value could be built and -1 in case of
47126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *         API errors or if the value type is not supported yet.
47136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
47146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint
4715b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel VeillardxmlSchemaGetCanonValue(xmlSchemaValPtr val, const xmlChar **retValue)
47166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
4717b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard    if ((retValue == NULL) || (val == NULL))
47186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return (-1);
47196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    *retValue = NULL;
47206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    switch (val->type) {
47216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_STRING:
47226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NORMSTRING:
47236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	/*
47246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_TOKEN:
47256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_LANGUAGE:
47266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NMTOKEN:
47276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NAME:
47286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_QNAME:
47296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NCNAME:
47306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_ID:
47316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_IDREF:
47326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_ENTITY:
47336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NOTATION:
47346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_ANYURI:
47356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	*/
47366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (val->value.str == NULL)
47376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*retValue = NULL;
47386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    else
47396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		/* TODO: This is not yet correct for non-normalized values. */
47406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*retValue =
47416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    BAD_CAST xmlStrdup((const xmlChar *) val->value.str);
47426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return (0);
47436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	default:
47446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return (-1);
47456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
47466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return (-1);
47476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
47486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
47494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#endif /* LIBXML_SCHEMAS_ENABLED */
4750