xmlschemastypes.c revision c0826a7709eddbf10ade02f0ce80e5d077ac05f6
14255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/*
24255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * schemastypes.c : implementation of the XML Schema Datatypes
34255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *             definition and validity checking
44255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
54255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * See Copyright for the status of this software.
64255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
74255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Daniel Veillard <veillard@redhat.com>
84255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
94255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define IN_LIBXML
114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include "libxml.h"
124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#ifdef LIBXML_SCHEMAS_ENABLED
144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <string.h>
164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/xmlmemory.h>
174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/parser.h>
184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/parserInternals.h>
194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/hash.h>
204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/valid.h>
2196a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard#include <libxml/xpath.h>
2296a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard#include <libxml/uri.h>
234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/xmlschemas.h>
254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/schemasInternals.h>
264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/xmlschemastypes.h>
274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
28070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#ifdef HAVE_MATH_H
29070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#include <math.h>
30070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#endif
31070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define DEBUG
334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define TODO 								\
354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlGenericError(xmlGenericErrorContext,				\
364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    "Unimplemented block at %s:%d\n",				\
374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard            __FILE__, __LINE__);
384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define XML_SCHEMAS_NAMESPACE_NAME \
404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    (const xmlChar *)"http://www.w3.org/2001/XMLSchema"
414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
435f704afe98c584b7188aa0e4fbc9d9e68e0d7b1bDaniel Veillardstatic unsigned long powten[10] = {
444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    1, 10, 100, 1000, 10000, 100000, 1000000, 10000000L,
454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    100000000L, 1000000000L
464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard};
474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
4801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
49070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* Date value */
50070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef struct _xmlSchemaValDate xmlSchemaValDate;
51070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef xmlSchemaValDate *xmlSchemaValDatePtr;
52070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstruct _xmlSchemaValDate {
53070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long		year;
54070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	mon	:4;	/* 1 <=  mon    <= 12   */
55070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	day	:5;	/* 1 <=  day    <= 31   */
56070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	hour	:5;	/* 0 <=  hour   <= 23   */
57070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	min	:6;	/* 0 <=  min    <= 59	*/
58070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    double		sec;
59a77cf71f453249f224d609f2f20789a897c5bdebDaniel Veillard    unsigned int	tz_flag	:1;	/* is tzo explicitely set? */
60070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int			tzo	:11;	/* -1440 <= tzo <= 1440 */
61070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard};
62070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
63070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* Duration value */
64070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef struct _xmlSchemaValDuration xmlSchemaValDuration;
65070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef xmlSchemaValDuration *xmlSchemaValDurationPtr;
66070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstruct _xmlSchemaValDuration {
67070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long	        mon;		/* mon stores years also */
68070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long        	day;
69070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    double		sec;            /* sec stores min and hour also */
70070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard};
71070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
724255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardtypedef struct _xmlSchemaValDecimal xmlSchemaValDecimal;
734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardtypedef xmlSchemaValDecimal *xmlSchemaValDecimalPtr;
744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstruct _xmlSchemaValDecimal {
754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    /* would use long long but not portable */
76e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long lo;
77e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long mi;
78e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long hi;
794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    unsigned int extra;
805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    unsigned int sign:1;
81c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack    unsigned int frac:7;
82c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack    unsigned int total:8;
834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard};
844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
85e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardtypedef struct _xmlSchemaValQName xmlSchemaValQName;
86e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardtypedef xmlSchemaValQName *xmlSchemaValQNamePtr;
87e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstruct _xmlSchemaValQName {
88e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    xmlChar *name;
89e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    xmlChar *uri;
90e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard};
91e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
9270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardtypedef struct _xmlSchemaValHex xmlSchemaValHex;
9370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardtypedef xmlSchemaValHex *xmlSchemaValHexPtr;
9470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardstruct _xmlSchemaValHex {
9570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard    xmlChar     *str;
9670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard    unsigned int total;
9770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard};
9870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardtypedef struct _xmlSchemaValBase64 xmlSchemaValBase64;
1001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardtypedef xmlSchemaValBase64 *xmlSchemaValBase64Ptr;
1011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstruct _xmlSchemaValBase64 {
1021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    xmlChar     *str;
1031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    unsigned int total;
1041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard};
1051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
1064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstruct _xmlSchemaVal {
1074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValType type;
1084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    union {
1095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	xmlSchemaValDecimal     decimal;
110070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xmlSchemaValDate        date;
111070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xmlSchemaValDuration    dur;
112e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	xmlSchemaValQName	qname;
11370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	xmlSchemaValHex		hex;
1141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	xmlSchemaValBase64	base64;
11584d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard	float			f;
11684d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard	double			d;
117c5a70f264550ee39da267e81dccd95508ed367ddDaniel Veillard	int			b;
118c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	xmlChar                *str;
1194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    } value;
1204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard};
1214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
1224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int xmlSchemaTypesInitialized = 0;
1234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlHashTablePtr xmlSchemaTypesBank = NULL;
1244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
125c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard/*
126c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * Basic types
127c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */
1284255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeStringDef = NULL;
1294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnyTypeDef = NULL;
1304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnySimpleTypeDef = NULL;
1314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDecimalDef = NULL;
132070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDatetimeDef = NULL;
1334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDateDef = NULL;
134070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeTimeDef = NULL;
135070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGYearDef = NULL;
136070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGYearMonthDef = NULL;
137070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGDayDef = NULL;
138070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGMonthDayDef = NULL;
139070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGMonthDef = NULL;
140070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDurationDef = NULL;
14184d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeFloatDef = NULL;
142c5a70f264550ee39da267e81dccd95508ed367ddDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeBooleanDef = NULL;
14384d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDoubleDef = NULL;
144560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeHexBinaryDef = NULL;
1451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeBase64BinaryDef = NULL;
146e5b110b3844d58ff4bea56bcb699144f6fbe0b83Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnyURIDef = NULL;
1474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
1484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/*
149c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * Derived types
150c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */
151c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypePositiveIntegerDef = NULL;
152c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNonPositiveIntegerDef = NULL;
153c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNegativeIntegerDef = NULL;
154c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNonNegativeIntegerDef = NULL;
155c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIntegerDef = NULL;
156c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeLongDef = NULL;
157c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIntDef = NULL;
158c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeShortDef = NULL;
159c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeByteDef = NULL;
160c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedLongDef = NULL;
161c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedIntDef = NULL;
162c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedShortDef = NULL;
163c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedByteDef = NULL;
1648bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNormStringDef = NULL;
1658bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeTokenDef = NULL;
1668bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeLanguageDef = NULL;
1678bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNameDef = NULL;
1688bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeQNameDef = NULL;
169e5b110b3844d58ff4bea56bcb699144f6fbe0b83Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNCNameDef = NULL;
1708bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdDef = NULL;
1718bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdrefDef = NULL;
1728bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdrefsDef = NULL;
173a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeEntityDef = NULL;
174a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeEntitiesDef = NULL;
175e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNotationDef = NULL;
1768bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNmtokenDef = NULL;
1778bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNmtokensDef = NULL;
178c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard
179d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/************************************************************************
180d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *									*
181d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * 			Datatype error handlers				*
182d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *									*
183d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard ************************************************************************/
184d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/**
185d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * xmlSchemaTypeErrMemory:
186d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * @extra:  extra informations
187d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *
188d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * Handle an out of memory condition
189d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard */
190d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillardstatic void
191d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel VeillardxmlSchemaTypeErrMemory(xmlNodePtr node, const char *extra)
192d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard{
193d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard    __xmlSimpleError(XML_FROM_DATATYPE, XML_ERR_NO_MEMORY, node, NULL, extra);
194d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard}
195d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard
196d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/************************************************************************
197d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *									*
198d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * 			Base types support				*
199d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *									*
200d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard ************************************************************************/
201c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard/*
2024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitBasicType:
2034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name:  the type name
2048bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard * @type:  the value type associated
2054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
20601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Initialize one primitive built-in type
2074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
2084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr
20901fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaInitBasicType(const char *name, xmlSchemaValType type,
21001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		       xmlSchemaTypePtr baseType) {
2114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypePtr ret;
2124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
2134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType));
2144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (ret == NULL) {
215d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard        xmlSchemaTypeErrMemory(NULL, "could not initialize basic types");
2164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(NULL);
2174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
2184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    memset(ret, 0, sizeof(xmlSchemaType));
219be9c6320d4ed8d5622322014310555bb88b02a85Daniel Veillard    ret->name = (const xmlChar *)name;
2204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    ret->type = XML_SCHEMA_TYPE_BASIC;
22101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    ret->baseType = baseType;
22201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    /*
22301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * Hack to reflect the variety.
22401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
22501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if ((type == XML_SCHEMAS_IDREFS) ||
22601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	(type == XML_SCHEMAS_NMTOKENS) ||
22701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	(type == XML_SCHEMAS_ENTITIES))
22801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	ret->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST;
22901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    else if (type != XML_SCHEMAS_UNKNOWN)
23001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	ret->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC;
2314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    ret->contentType = XML_SCHEMA_CONTENT_BASIC;
23201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type) {
23301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_STRING:
23401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DECIMAL:
23501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATE:
23601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATETIME:
23701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TIME:
23801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEAR:
23901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEARMONTH:
24001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTH:
24101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTHDAY:
24201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GDAY:
24301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DURATION:
24401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_FLOAT:
24501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DOUBLE:
24601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BOOLEAN:
24701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYURI:
24801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_HEXBINARY:
24901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BASE64BINARY:
25001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_QNAME:
25101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NOTATION:
25201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    ret->flags |= XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE;
25396d2effc735fb45cfa363b6a876ff23a862f87a5William M. Brack	default:
25496d2effc735fb45cfa363b6a876ff23a862f87a5William M. Brack	break;
25501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
25601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
2574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlHashAddEntry2(xmlSchemaTypesBank, ret->name,
2584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	             XML_SCHEMAS_NAMESPACE_NAME, ret);
25901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    ret->builtInType = type;
2604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return(ret);
2614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
2624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
2634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/*
2644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitTypes:
2654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
2664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Initialize the default XML Schemas type library
2674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
2684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid
2696560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel VeillardxmlSchemaInitTypes(void)
2706560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard{
2714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized != 0)
2726560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        return;
2734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypesBank = xmlHashCreate(40);
2746560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard
27501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
276c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard    /*
27701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * 3.4.7 Built-in Complex Type Definition
27801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
2798bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeAnyTypeDef = xmlSchemaInitBasicType("anyType",
28001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_UNKNOWN,
28101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     NULL);
28201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeAnyTypeDef->baseType = xmlSchemaTypeAnyTypeDef;
28301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED;
28401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    {
28501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaWildcardPtr wild;
28601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
28701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard));
28801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (wild == NULL) {
28901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    xmlSchemaTypeErrMemory(NULL, "could not create a wildcard on anyType");
29001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return;
29101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
29201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	memset(wild, 0, sizeof(xmlSchemaWildcard));
29301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	wild->any = 1;
29401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	wild->processContents = XML_SCHEMAS_ANY_LAX;
29501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	wild->minOccurs = 1;
29601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	wild->maxOccurs = 1;
29701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeAnyTypeDef->attributeWildcard = wild;
29801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
29901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeAnySimpleTypeDef = xmlSchemaInitBasicType("anySimpleType",
30001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                           XML_SCHEMAS_UNKNOWN,
30101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard							   xmlSchemaTypeAnyTypeDef);
30201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    /*
30301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * primitive datatypes
30401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
30501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeStringDef = xmlSchemaInitBasicType("string",
30601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_STRING,
30701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
3088bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDecimalDef = xmlSchemaInitBasicType("decimal",
30901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_DECIMAL,
31001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeAnySimpleTypeDef);
3118bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDateDef = xmlSchemaInitBasicType("date",
31201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_DATE,
31301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeAnySimpleTypeDef);
3148bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDatetimeDef = xmlSchemaInitBasicType("dateTime",
31501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_DATETIME,
31601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						      xmlSchemaTypeAnySimpleTypeDef);
3178bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeTimeDef = xmlSchemaInitBasicType("time",
31801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_TIME,
31901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeAnySimpleTypeDef);
3208bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGYearDef = xmlSchemaInitBasicType("gYear",
32101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_GYEAR,
32201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeAnySimpleTypeDef);
3238bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGYearMonthDef = xmlSchemaInitBasicType("gYearMonth",
32401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                        XML_SCHEMAS_GYEARMONTH,
32501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard							xmlSchemaTypeAnySimpleTypeDef);
3268bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGMonthDef = xmlSchemaInitBasicType("gMonth",
32701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_GMONTH,
32801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
3298bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGMonthDayDef = xmlSchemaInitBasicType("gMonthDay",
33001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                       XML_SCHEMAS_GMONTHDAY,
33101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						       xmlSchemaTypeAnySimpleTypeDef);
3328bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGDayDef = xmlSchemaInitBasicType("gDay",
33301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_GDAY,
33401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeAnySimpleTypeDef);
3358bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDurationDef = xmlSchemaInitBasicType("duration",
33601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_DURATION,
33701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						      xmlSchemaTypeAnySimpleTypeDef);
3388bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float",
33901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_FLOAT,
34001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeAnySimpleTypeDef);
3418bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double",
34201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_DOUBLE,
34301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
3448bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeBooleanDef = xmlSchemaInitBasicType("boolean",
34501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_BOOLEAN,
34601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeAnySimpleTypeDef);
3478bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeAnyURIDef = xmlSchemaInitBasicType("anyURI",
34801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_ANYURI,
34901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
350560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard    xmlSchemaTypeHexBinaryDef = xmlSchemaInitBasicType("hexBinary",
35101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_HEXBINARY,
35201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeAnySimpleTypeDef);
3531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    xmlSchemaTypeBase64BinaryDef
35401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        = xmlSchemaInitBasicType("base64Binary", XML_SCHEMAS_BASE64BINARY,
35501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeAnySimpleTypeDef);
35601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNotationDef = xmlSchemaInitBasicType("NOTATION",
35701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_NOTATION,
35801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
35901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeQNameDef = xmlSchemaInitBasicType("QName",
36001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_QNAME,
36101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeAnySimpleTypeDef);
3624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
363c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard    /*
364c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard     * derived datatypes
365c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard     */
3668bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeIntegerDef = xmlSchemaInitBasicType("integer",
36701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_INTEGER,
36801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeDecimalDef);
3696560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeNonPositiveIntegerDef =
3706560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        xmlSchemaInitBasicType("nonPositiveInteger",
37101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                               XML_SCHEMAS_NPINTEGER,
37201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard			       xmlSchemaTypeIntegerDef);
3736560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeNegativeIntegerDef =
37401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("negativeInteger", XML_SCHEMAS_NINTEGER,
37501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeNonPositiveIntegerDef);
3766560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeLongDef =
37701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("long", XML_SCHEMAS_LONG,
37801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeIntegerDef);
37901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeIntDef = xmlSchemaInitBasicType("int", XML_SCHEMAS_INT,
38001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeLongDef);
3818bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeShortDef = xmlSchemaInitBasicType("short",
38201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_SHORT,
38301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeIntDef);
3848bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeByteDef = xmlSchemaInitBasicType("byte",
38501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_BYTE,
38601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeShortDef);
3876560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeNonNegativeIntegerDef =
3886560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        xmlSchemaInitBasicType("nonNegativeInteger",
38901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                               XML_SCHEMAS_NNINTEGER,
39001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard			       xmlSchemaTypeIntegerDef);
3916560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedLongDef =
39201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedLong", XML_SCHEMAS_ULONG,
39301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeNonNegativeIntegerDef);
3946560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedIntDef =
39501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedInt", XML_SCHEMAS_UINT,
39601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeUnsignedLongDef);
3976560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedShortDef =
39801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedShort", XML_SCHEMAS_USHORT,
39901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeUnsignedIntDef);
4006560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedByteDef =
40101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedByte", XML_SCHEMAS_UBYTE,
40201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeUnsignedShortDef);
4036560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypePositiveIntegerDef =
40401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("positiveInteger", XML_SCHEMAS_PINTEGER,
40501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeNonNegativeIntegerDef);
4068bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeNormStringDef = xmlSchemaInitBasicType("normalizedString",
40701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                        XML_SCHEMAS_NORMSTRING,
40801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard							xmlSchemaTypeStringDef);
4098bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeTokenDef = xmlSchemaInitBasicType("token",
41001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_TOKEN,
41101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeNormStringDef);
4128bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeLanguageDef = xmlSchemaInitBasicType("language",
41301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_LANGUAGE,
41401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						      xmlSchemaTypeTokenDef);
41501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNameDef = xmlSchemaInitBasicType("Name",
41601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_NAME,
41701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeTokenDef);
41801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNmtokenDef = xmlSchemaInitBasicType("NMTOKEN",
41901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_NMTOKEN,
42001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeTokenDef);
42101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNCNameDef = xmlSchemaInitBasicType("NCName",
42201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_NCNAME,
42301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeNameDef);
42401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeIdDef = xmlSchemaInitBasicType("ID", XML_SCHEMAS_ID,
42501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeNCNameDef);
4268bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeIdrefDef = xmlSchemaInitBasicType("IDREF",
42701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_IDREF,
42801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeNCNameDef);
4298bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeIdrefsDef = xmlSchemaInitBasicType("IDREFS",
43001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_IDREFS,
43101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeIdrefDef);
43201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNmtokensDef = xmlSchemaInitBasicType("NMTOKENS",
43301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_NMTOKENS,
43401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						      xmlSchemaTypeNmtokenDef);
435a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    xmlSchemaTypeEntityDef = xmlSchemaInitBasicType("ENTITY",
43601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_ENTITY,
43701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeNCNameDef);
438a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    xmlSchemaTypeEntitiesDef = xmlSchemaInitBasicType("ENTITIES",
43901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_ENTITIES,
44001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						      xmlSchemaTypeNCNameDef);
4414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypesInitialized = 1;
4424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
4434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
4444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
4454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCleanupTypes:
4464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
4474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library
4484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
4494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid
4504255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCleanupTypes(void) {
4514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
4524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return;
45301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaFreeWildcard(xmlSchemaTypeAnyTypeDef->attributeWildcard);
4544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlHashFree(xmlSchemaTypesBank, (xmlHashDeallocator) xmlSchemaFreeType);
4554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypesInitialized = 0;
4564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
4574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
4584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
459c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaGetBuiltInType:
46001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in type
46101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facetType:  the facet type
46201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
46301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Evaluates if a specific facet can be
46401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * used in conjunction with a type.
46501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
46601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 1 if the facet can be used with the given built-in type,
46701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 0 otherwise and -1 in case the type is not a built-in type.
46801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
46901fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint
47001fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaIsBuiltInTypeFacet(xmlSchemaTypePtr type, int facetType)
47101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
47201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if (type->type != XML_SCHEMA_TYPE_BASIC)
47301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	return (-1);
47401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type->builtInType) {
47501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BOOLEAN:
47601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_PATTERN) ||
47701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE))
47801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
47901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
48001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (0);
48101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_STRING:
48201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NOTATION:
48301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_QNAME:
48401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYURI:
48501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BASE64BINARY:
48601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_HEXBINARY:
48701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_LENGTH) ||
48801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MINLENGTH) ||
48901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXLENGTH) ||
49001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_PATTERN) ||
49101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_ENUMERATION) ||
49201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE))
49301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
49401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
49501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (0);
49601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DECIMAL:
49701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_TOTALDIGITS) ||
49801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) ||
49901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_PATTERN) ||
50001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE) ||
50101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_ENUMERATION) ||
50201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) ||
50301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) ||
50401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MININCLUSIVE) ||
50501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MINEXCLUSIVE))
50601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
50701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
50801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (0);
50901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TIME:
51001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GDAY:
51101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTH:
51201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTHDAY:
51301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEAR:
51401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEARMONTH:
51501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATE:
51601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATETIME:
51701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DURATION:
51801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_FLOAT:
51901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DOUBLE:
52001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_PATTERN) ||
52101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_ENUMERATION) ||
52201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE) ||
52301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) ||
52401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) ||
52501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MININCLUSIVE) ||
52601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MINEXCLUSIVE))
52701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
52801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
52901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (0);
53001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	default:
53101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (0);
53201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
53301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    return (0);
53401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
53501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
53601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
53701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInType:
53801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type:  the type of the built in type
53901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
54001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Gives you the type struct for a built-in
54101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * type by its type id.
54201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
54301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns the type if found, NULL otherwise.
54401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
54501fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr
54601fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInType(xmlSchemaValType type)
54701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
54801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
54901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaInitTypes();
55001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type) {
55101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
55201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYSIMPLETYPE:
55301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeAnySimpleTypeDef);
55401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_STRING:
55501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeStringDef);
55601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NORMSTRING:
55701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNormStringDef);
55801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DECIMAL:
55901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDecimalDef);
56001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TIME:
56101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeTimeDef);
56201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GDAY:
56301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGDayDef);
56401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTH:
56501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGMonthDef);
56601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTHDAY:
56701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    	    return (xmlSchemaTypeGMonthDayDef);
56801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEAR:
56901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGYearDef);
57001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEARMONTH:
57101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGYearMonthDef);
57201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATE:
57301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDateDef);
57401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATETIME:
57501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDatetimeDef);
57601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DURATION:
57701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDurationDef);
57801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_FLOAT:
57901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeFloatDef);
58001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DOUBLE:
58101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDoubleDef);
58201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BOOLEAN:
58301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeBooleanDef);
58401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TOKEN:
58501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeTokenDef);
58601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_LANGUAGE:
58701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeLanguageDef);
58801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NMTOKEN:
58901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNmtokenDef);
59001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NMTOKENS:
59101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNmtokensDef);
59201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NAME:
59301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNameDef);
59401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_QNAME:
59501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeQNameDef);
59601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NCNAME:
59701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNCNameDef);
59801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ID:
59901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdDef);
60001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_IDREF:
60101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdrefDef);
60201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_IDREFS:
60301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdrefsDef);
60401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ENTITY:
60501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeEntityDef);
60601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ENTITIES:
60701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeEntitiesDef);
60801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NOTATION:
60901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNotationDef);
61001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYURI:
61101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeAnyURIDef);
61201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_INTEGER:
61301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIntegerDef);
61401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NPINTEGER:
61501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNonPositiveIntegerDef);
61601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NINTEGER:
61701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNegativeIntegerDef);
61801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NNINTEGER:
61901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNonNegativeIntegerDef);
62001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_PINTEGER:
62101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypePositiveIntegerDef);
62201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_INT:
62301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIntDef);
62401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_UINT:
62501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedIntDef);
62601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_LONG:
62701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeLongDef);
62801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ULONG:
62901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedLongDef);
63001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_SHORT:
63101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeShortDef);
63201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_USHORT:
63301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedShortDef);
63401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BYTE:
63501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeByteDef);
63601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_UBYTE:
63701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedByteDef);
63801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_HEXBINARY:
63901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeHexBinaryDef);
64001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BASE64BINARY:
64101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeBase64BinaryDef);
64201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYTYPE:
64301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeAnyTypeDef);
64401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	default:
64501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (NULL);
64601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
64701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
64801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
64901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
6504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaNewValue:
6514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type:  the value type
6524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
6534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Allocate a new simple type value
6544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
6554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns a pointer to the new value or NULL in case of error
6564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
6574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaValPtr
6584255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaNewValue(xmlSchemaValType type) {
6594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValPtr value;
6604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
6614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    value = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal));
6624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (value == NULL) {
6634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(NULL);
6644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
6654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    memset(value, 0, sizeof(xmlSchemaVal));
6664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    value->type = type;
6674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return(value);
6684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
6694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
6704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
6714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaFreeValue:
6724255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value:  the value to free
6734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
6744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library
6754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
6764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid
6774255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaFreeValue(xmlSchemaValPtr value) {
6784255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (value == NULL)
6794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return;
680c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    switch (value->type) {
681c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_STRING:
682c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NORMSTRING:
683c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_TOKEN:
684c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_LANGUAGE:
685c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NMTOKEN:
686c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NMTOKENS:
687c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NAME:
688c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NCNAME:
689c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ID:
690c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_IDREF:
691c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_IDREFS:
692c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ENTITY:
693c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ENTITIES:
694c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NOTATION:
695c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ANYURI:
696c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (value->value.str != NULL)
697c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		xmlFree(value->value.str);
698c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    break;
699e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_QNAME:
700e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    if (value->value.qname.uri != NULL)
701e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		xmlFree(value->value.qname.uri);
702e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    if (value->value.qname.name != NULL)
703e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		xmlFree(value->value.qname.name);
704e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    break;
70570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard        case XML_SCHEMAS_HEXBINARY:
70670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	    if (value->value.hex.str != NULL)
70770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		xmlFree(value->value.hex.str);
70870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	    break;
7091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BASE64BINARY:
7101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	    if (value->value.base64.str != NULL)
7111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		xmlFree(value->value.base64.str);
7121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	    break;
713c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	default:
714c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    break;
715c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
7164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlFree(value);
7174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
7184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
7194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
7204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaGetPredefinedType:
7214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name: the type name
7224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @ns:  the URI of the namespace usually "http://www.w3.org/2001/XMLSchema"
7234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
7244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Lookup a type in the default XML Schemas type library
7254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
7264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns the type if found, NULL otherwise
7274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
7284255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaTypePtr
7294255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaGetPredefinedType(const xmlChar *name, const xmlChar *ns) {
7304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
7314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	xmlSchemaInitTypes();
7324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (name == NULL)
7334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(NULL);
7344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return((xmlSchemaTypePtr) xmlHashLookup2(xmlSchemaTypesBank, name, ns));
7354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
736070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
73701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
73801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInListSimpleTypeItemType:
73901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in simple type.
74001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
741c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns the item type of @type as defined by the built-in datatype
742c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * hierarchy of XML Schema Part 2: Datatypes, or NULL in case of an error.
74301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
74401fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr
74501fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInListSimpleTypeItemType(xmlSchemaTypePtr type)
74601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
74701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if (type->type != XML_SCHEMA_TYPE_BASIC)
74801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	return (NULL);
74901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type->builtInType) {
75001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NMTOKENS:
75101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNmtokenDef );
75201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_IDREFS:
75301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdrefDef);
75401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ENTITIES:
75501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeEntityDef);
75601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	default:
75701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (NULL);
75801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
75901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
76001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
761070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/****************************************************************
762070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
763070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *		Convenience macros and functions		*
764070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
765070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/
766070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
767070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_TZO_CHAR(c)						\
768070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	((c == 0) || (c == 'Z') || (c == '+') || (c == '-'))
769070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
770070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_YEAR(yr)          (yr != 0)
771070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MONTH(mon)        ((mon >= 1) && (mon <= 12))
772070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* VALID_DAY should only be used when month is unknown */
773070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DAY(day)          ((day >= 1) && (day <= 31))
774070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_HOUR(hr)          ((hr >= 0) && (hr <= 23))
775070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MIN(min)          ((min >= 0) && (min <= 59))
776070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_SEC(sec)          ((sec >= 0) && (sec < 60))
777070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TZO(tzo)          ((tzo > -1440) && (tzo < 1440))
778070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_LEAP(y)						\
779070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
780070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
781ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonth[12] =
782070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
783ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonthLeap[12] =
784070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
785070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
7865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MAX_DAYINMONTH(yr,mon)                                  \
7875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1])
7885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
789070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MDAY(dt)						\
790070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(IS_LEAP(dt->year) ?				        \
791070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (dt->day <= daysInMonthLeap[dt->mon - 1]) :	        \
792070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (dt->day <= daysInMonth[dt->mon - 1]))
793070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
794070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATE(dt)						\
795070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_YEAR(dt->year) && VALID_MONTH(dt->mon) && VALID_MDAY(dt))
796070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
797070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TIME(dt)						\
798070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_HOUR(dt->hour) && VALID_MIN(dt->min) &&		\
799070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 VALID_SEC(dt->sec) && VALID_TZO(dt->tzo))
800070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
801070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATETIME(dt)					\
802070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_DATE(dt) && VALID_TIME(dt))
803070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
804070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_MIN            (60)
805070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_HOUR           (60 * SECS_PER_MIN)
806070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_DAY            (24 * SECS_PER_HOUR)
807070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
8085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInYearByMonth[12] =
8095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
8105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInLeapYearByMonth[12] =
8115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };
8125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
8135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DAY_IN_YEAR(day, month, year)				\
8145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ((IS_LEAP(year) ?					\
8155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                dayInLeapYearByMonth[month - 1] :		\
8165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                dayInYearByMonth[month - 1]) + day)
8175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
8185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#ifdef DEBUG
8195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt)                                                  \
8205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlGenericError(xmlGenericErrorContext,                             \
8215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        "type=%o %04ld-%02u-%02uT%02u:%02u:%03f",                       \
8225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->type,dt->value.date.year,dt->value.date.mon,                \
8235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->value.date.day,dt->value.date.hour,dt->value.date.min,      \
8245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->value.date.sec);                                            \
8255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dt->value.date.tz_flag)                                         \
8265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (dt->value.date.tzo != 0)                                    \
8275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmlGenericError(xmlGenericErrorContext,                     \
8285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                "%+05d\n",dt->value.date.tzo);                          \
8295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else                                                            \
8305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmlGenericError(xmlGenericErrorContext, "Z\n");             \
8315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else                                                                \
8325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        xmlGenericError(xmlGenericErrorContext,"\n")
8335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#else
8345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt)
8355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#endif
8365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
837070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
838070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGYear:
839070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
840070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
841070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
842070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gYear without time zone and fills in the appropriate
843070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
844070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gYear. It is supposed that @dt->year is big enough to contain
845070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * the year.
846070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
847070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
848070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
849070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
850070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) {
851070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str, *firstChar;
852070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int isneg = 0, digcnt = 0;
853070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
854070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (((*cur < '0') || (*cur > '9')) &&
855070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(*cur != '-') && (*cur != '+'))
856070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
857070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
858070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur == '-') {
859070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	isneg = 1;
860070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
861070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
862070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
863070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    firstChar = cur;
864070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
865070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    while ((*cur >= '0') && (*cur <= '9')) {
866070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->year = dt->year * 10 + (*cur - '0');
867070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
868070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	digcnt++;
869070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
870070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
871070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* year must be at least 4 digits (CCYY); over 4
872070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * digits cannot have a leading zero. */
873070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0')))
874070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
875070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
876070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (isneg)
877070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->year = - dt->year;
878070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
879070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (!VALID_YEAR(dt->year))
880070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
881070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
882070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
883070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
884070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
885070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
886070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
887070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_2_DIGITS:
888070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the integer to fill in
889070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
890070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer
891070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
892070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a 2-digits integer and updates @num with the value. @cur is
893070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer.
894070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and
895070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
896070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
897070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_2_DIGITS(num, cur, invalid)			\
898070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if ((cur[0] < '0') || (cur[0] > '9') ||			\
899070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (cur[1] < '0') || (cur[1] > '9'))			\
900070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    invalid = 1;					\
901070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	else							\
902070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    num = (cur[0] - '0') * 10 + (cur[1] - '0');		\
903070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur += 2;
904070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
905070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
906070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_FLOAT:
907070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the double to fill in
908070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
909070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer
910070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
911070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float and updates @num with the value. @cur is
912070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the float. The float must have a
913070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2-digits integer part and may or may not have a decimal part.
914070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and
915070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
916070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
917070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_FLOAT(num, cur, invalid)				\
918070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(num, cur, invalid);			\
919070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!invalid && (*cur == '.')) {			\
920070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    double mult = 1;				        \
921070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    cur++;						\
922070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((*cur < '0') || (*cur > '9'))			\
923070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		invalid = 1;					\
924070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
925070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		mult /= 10;					\
926070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num += (*cur - '0') * mult;			\
927070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		cur++;						\
928070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }							\
929070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
930070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
931070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
932070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGMonth:
933070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
934070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
935070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
936070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gMonth without time zone and fills in the appropriate
937070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
938070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gMonth.
939070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
940070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
941070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
942070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
943070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) {
944070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
945070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
946070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
947070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_2_DIGITS(dt->mon, cur, ret);
948070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
949070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
950070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
951070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (!VALID_MONTH(dt->mon))
952070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
953070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
954070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
955070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
956070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
957070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
958070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
959070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGDay:
960070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
961070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
962070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
963070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gDay without time zone and fills in the appropriate
964070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
965070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay.
966070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
967070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
968070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
969070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
970070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) {
971070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
972070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
973070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
974070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_2_DIGITS(dt->day, cur, ret);
975070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
976070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
977070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
978070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (!VALID_DAY(dt->day))
979070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
980070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
981070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
982070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
983070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
984070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
985070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
986070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTime:
987070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
988070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
989070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
990070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:time without time zone and fills in the appropriate
991070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * fields of the @dt structure. @str is updated to point just after the
992070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:time.
993070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, values of @dt fields are undefined.
994070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
995070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
996070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
997070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
998070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) {
999070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
1000070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int hour = 0; /* use temp var in case str is not xs:time */
1001070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
1002070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1003070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_2_DIGITS(hour, cur, ret);
1004070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1005070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1006070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1007070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != ':')
1008070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1009070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1010070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1011070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* the ':' insures this string is xs:time */
1012070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dt->hour = hour;
1013070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1014070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_2_DIGITS(dt->min, cur, ret);
1015070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1016070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1017070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1018070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != ':')
1019070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1020070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1021070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1022070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_FLOAT(dt->sec, cur, ret);
1023070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1024070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1025070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1026070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (!VALID_TIME(dt))
1027070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1028070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1029070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1030070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1031070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1032070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1033070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1034070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTimeZone:
1035070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1036070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1037070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1038070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a time zone without time zone and fills in the appropriate
1039070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1040070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * time zone.
1041070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1042070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1043070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1044070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1045070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) {
1046070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
1047070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
1048070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1049070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (str == NULL)
1050070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1051070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1052070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    switch (*cur) {
1053070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case 0:
1054070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tz_flag = 0;
1055070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = 0;
1056070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1057070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1058070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case 'Z':
1059070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tz_flag = 1;
1060070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = 0;
1061070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1062070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1063070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1064070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case '+':
1065070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case '-': {
1066070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	int isneg = 0, tmp = 0;
1067070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	isneg = (*cur == '-');
1068070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1069070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1070070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1071070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(tmp, cur, ret);
1072070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1073070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return ret;
1074070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_HOUR(tmp))
1075070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1076070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1077070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (*cur != ':')
1078070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 1;
1079070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1080070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1081070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = tmp * 60;
1082070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1083070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(tmp, cur, ret);
1084070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1085070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return ret;
1086070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_MIN(tmp))
1087070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1088070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1089070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo += tmp;
1090070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (isneg)
1091070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    dt->tzo = - dt->tzo;
1092070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1093070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_TZO(dt->tzo))
1094070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1095070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
10965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	dt->tz_flag = 1;
1097070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1098070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard      }
1099070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    default:
1100070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1101070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1102070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1103070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1104070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1105070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1106070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
11071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard/**
11081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * _xmlSchemaBase64Decode:
11091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * @ch: a character
11101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *
11111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Converts a base64 encoded character to its base 64 value.
11121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *
11131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Returns 0-63 (value), 64 (pad), or -1 (not recognized)
11141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */
11151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic int
11161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard_xmlSchemaBase64Decode (const xmlChar ch) {
11171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('A' <= ch) && (ch <= 'Z')) return ch - 'A';
11181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('a' <= ch) && (ch <= 'z')) return ch - 'a' + 26;
11191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('0' <= ch) && (ch <= '9')) return ch - '0' + 52;
11201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('+' == ch) return 62;
11211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('/' == ch) return 63;
11221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('=' == ch) return 64;
11231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return -1;
11241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard}
11251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
1126070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/****************************************************************
1127070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
1128070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *	XML Schema Dates/Times Datatypes Handling		*
1129070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
1130070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/
1131070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1132070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1133070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_DIGITS:
1134070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the integer to fill in
1135070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1136070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag
1137070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1138070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a digits integer and updates @num with the value. @cur is
1139070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer.
1140070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and
1141070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1142070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1143070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_DIGITS(num, cur, num_type)	                \
1144070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if ((*cur < '0') || (*cur > '9'))			\
1145070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    num_type = -1;					\
1146070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else                                                    \
1147070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
1148070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	        num = num * 10 + (*cur - '0');		        \
1149070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	        cur++;                                          \
1150070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            }
1151070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1152070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1153070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_NUM:
1154070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the double to fill in
1155070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1156070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag
1157070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1158070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float or integer and updates @num with the value. @cur is
1159070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the number. If the number is a float,
1160070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * then it must have an integer part and a decimal part; @num_type will
1161070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * be set to 1. If there is no decimal part, @num_type is set to zero.
1162070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and
1163070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1164070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1165070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_NUM(num, cur, num_type)				\
1166070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        num = 0;                                                \
1167070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_DIGITS(num, cur, num_type);	                \
1168070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!num_type && (*cur == '.')) {			\
1169070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    double mult = 1;				        \
1170070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    cur++;						\
1171070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((*cur < '0') || (*cur > '9'))			\
1172070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num_type = -1;					\
1173070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else                                                \
1174070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                num_type = 1;                                   \
1175070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
1176070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		mult /= 10;					\
1177070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num += (*cur - '0') * mult;			\
1178070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		cur++;						\
1179070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }							\
1180070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1181070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1182070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
11835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDates:
1184455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard * @type: the expected type or XML_SCHEMAS_UNKNOWN
1185070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dateTime:  string to analyze
1186070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val:  the return computed value
1187070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1188070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @dateTime conforms to the lexical space of one of the date types.
1189070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val.
1190070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1191070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
1192070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *         and -1 in case of internal or API error.
1193070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1194070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1195455cc07308c673b6714e2f5670c2091a1dab95dcDaniel VeillardxmlSchemaValidateDates (xmlSchemaValType type,
1196118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	                const xmlChar *dateTime, xmlSchemaValPtr *val) {
1197070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmlSchemaValPtr dt;
1198070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret;
1199070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = dateTime;
1200070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1201070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define RETURN_TYPE_IF_VALID(t)					\
1202070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (IS_TZO_CHAR(*cur)) {					\
1203070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur);	\
1204070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret == 0) {						\
1205070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (*cur != 0)					\
1206070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		goto error;					\
1207070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    dt->type = t;					\
1208455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard	    goto done;						\
1209070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}							\
1210070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1211070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1212070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dateTime == NULL)
1213070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1214070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1215070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((*cur != '-') && (*cur < '0') && (*cur > '9'))
1216070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1217070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1218070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN);
1219070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dt == NULL)
1220070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1221070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1222070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((cur[0] == '-') && (cur[1] == '-')) {
1223070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/*
1224070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * It's an incomplete date (xs:gMonthDay, xs:gMonth or
1225070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * xs:gDay)
1226070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 */
1227070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur += 2;
1228070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1229070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/* is it an xs:gDay? */
1230070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (*cur == '-') {
1231455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard	    if (type == XML_SCHEMAS_GMONTH)
1232455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard		goto error;
1233070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	  ++cur;
1234070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1235070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret != 0)
1236070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		goto error;
1237070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1238070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY);
1239070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1240070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    goto error;
1241070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1242070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1243070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/*
1244070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * it should be an xs:gMonthDay or xs:gMonth
1245070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 */
1246070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur);
1247070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1248070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    goto error;
1249070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1250d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        /*
1251d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a '-' char could indicate this type is xs:gMonthDay or
1252d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a negative time zone offset. Check for xs:gMonthDay first.
1253d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * Also the first three char's of a negative tzo (-MM:SS) can
1254d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * appear to be a valid day; so even if the day portion
1255d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * of the xs:gMonthDay verifies, we must insure it was not
1256d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a tzo.
1257d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         */
1258d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if (*cur == '-') {
1259d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            const xmlChar *rewnd = cur;
1260d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            cur++;
1261d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1262d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard  	    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1263d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            if ((ret == 0) && ((*cur == 0) || (*cur != ':'))) {
1264d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1265d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                /*
1266d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * we can use the VALID_MDAY macro to validate the month
1267d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * and day because the leap year test will flag year zero
1268d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * as a leap year (even though zero is an invalid year).
1269d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 */
1270d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                if (VALID_MDAY((&(dt->value.date)))) {
1271d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1272d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard	            RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY);
1273070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1274d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                    goto error;
1275d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                }
1276d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            }
1277d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1278d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            /*
1279d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             * not xs:gMonthDay so rewind and check if just xs:gMonth
1280d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             * with an optional time zone.
1281d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             */
1282d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            cur = rewnd;
1283d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        }
1284d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1285d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard	RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH);
1286070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1287070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1288070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1289070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1290070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /*
1291070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * It's a right-truncated date or an xs:time.
1292070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * Try to parse an xs:time then fallback on right-truncated dates.
1293070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     */
1294070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((*cur >= '0') && (*cur <= '9')) {
1295070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseTime(&(dt->value.date), &cur);
1296070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret == 0) {
1297070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    /* it's an xs:time */
1298070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_TIME);
1299070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1300070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1301070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1302070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* fallback on date parsing */
1303070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur = dateTime;
1304070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1305070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGYear(&(dt->value.date), &cur);
1306070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1307070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1308070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1309070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:gYear? */
1310070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEAR);
1311070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1312070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != '-')
1313070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1314070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1315070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1316070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur);
1317070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1318070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1319070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1320070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:gYearMonth? */
1321070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEARMONTH);
1322070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1323070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != '-')
1324070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1325070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1326070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1327070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1328070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((ret != 0) || !VALID_DATE((&(dt->value.date))))
1329070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1330070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1331070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:date? */
1332070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_DATE);
1333070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1334070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != 'T')
1335070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1336070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1337070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1338070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* it should be an xs:dateTime */
1339070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseTime(&(dt->value.date), &cur);
1340070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1341070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1342070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1343070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur);
1344070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((ret != 0) || (*cur != 0) || !VALID_DATETIME((&(dt->value.date))))
1345070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1346070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1347455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard
1348070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dt->type = XML_SCHEMAS_DATETIME;
1349070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1350455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillarddone:
1351d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#if 1
1352d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type))
1353d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        goto error;
1354d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#else
1355d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    /*
1356d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     * insure the parsed type is equal to or less significant (right
1357d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     * truncated) than the desired type.
1358d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     */
1359d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) {
1360d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1361d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        /* time only matches time */
1362d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_TIME) && (dt->type == XML_SCHEMAS_TIME))
1363d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1364d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1365d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_DATETIME) &&
1366d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            ((dt->type != XML_SCHEMAS_DATE) ||
1367d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEARMONTH) ||
1368d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEAR)))
1369d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1370d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1371d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_DATE) &&
1372d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            ((dt->type != XML_SCHEMAS_GYEAR) ||
1373d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEARMONTH)))
1374d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1375d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1376d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_GYEARMONTH) && (dt->type != XML_SCHEMAS_GYEAR))
1377d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1378d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1379d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_GMONTHDAY) && (dt->type != XML_SCHEMAS_GMONTH))
1380d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1381d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    }
1382455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard#endif
1383455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard
1384070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (val != NULL)
1385070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        *val = dt;
138680b19092f24410a6b869abf519227686e8f207caDaniel Veillard    else
138780b19092f24410a6b869abf519227686e8f207caDaniel Veillard	xmlSchemaFreeValue(dt);
1388070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1389070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1390070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1391070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror:
1392070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dt != NULL)
1393070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	xmlSchemaFreeValue(dt);
1394070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 1;
1395070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1396070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1397070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
13985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDuration:
1399070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @type: the predefined type
1400070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @duration:  string to analyze
1401070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val:  the return computed value
1402070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1403070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @duration conforms to the lexical space of the duration type.
1404070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val.
1405070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1406070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
1407070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *         and -1 in case of internal or API error.
1408070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1409070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1410dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
1411118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	                   const xmlChar *duration, xmlSchemaValPtr *val) {
1412070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar  *cur = duration;
1413070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmlSchemaValPtr dur;
1414070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int isneg = 0;
1415070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int seq = 0;
1416d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    double         num;
1417d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    int            num_type = 0;  /* -1 = invalid, 0 = int, 1 = floating */
1418d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    const xmlChar  desig[]  = {'Y', 'M', 'D', 'H', 'M', 'S'};
1419d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    const double   multi[]  = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0};
1420070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1421070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (duration == NULL)
1422070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1423070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1424070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur == '-') {
1425070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        isneg = 1;
1426070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        cur++;
1427070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1428070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1429070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* duration must start with 'P' (after sign) */
1430070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur++ != 'P')
1431070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1432070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
143380b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (*cur == 0)
143480b19092f24410a6b869abf519227686e8f207caDaniel Veillard	return 1;
143580b19092f24410a6b869abf519227686e8f207caDaniel Veillard
1436070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION);
1437070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dur == NULL)
1438070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1439070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1440070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    while (*cur != 0) {
1441070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1442070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* input string should be empty or invalid date/time item */
1443070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (seq >= sizeof(desig))
1444070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1445070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1446070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* T designator must be present for time items */
1447070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (*cur == 'T') {
1448070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (seq <= 3) {
1449070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                seq = 3;
1450070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                cur++;
1451070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            } else
1452070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 1;
1453070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        } else if (seq == 3)
1454070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1455070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1456070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* parse the number portion of the item */
1457070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        PARSE_NUM(num, cur, num_type);
1458070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1459070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if ((num_type == -1) || (*cur == 0))
1460070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1461070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1462070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* update duration based on item type */
1463070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        while (seq < sizeof(desig)) {
1464070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (*cur == desig[seq]) {
1465070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1466070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                /* verify numeric type; only seconds can be float */
1467070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                if ((num_type != 0) && (seq < (sizeof(desig)-1)))
1468070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    goto error;
1469070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1470070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                switch (seq) {
1471070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    case 0:
1472070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.mon = (long)num * 12;
1473070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1474070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    case 1:
1475070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.mon += (long)num;
1476070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1477070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    default:
1478070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        /* convert to seconds using multiplier */
1479070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.sec += num * multi[seq];
1480070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        seq++;
1481070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1482070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                }
1483070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1484070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                break;          /* exit loop */
1485070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            }
1486070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            /* no date designators found? */
1487070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (++seq == 3)
1488070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                goto error;
1489070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        }
1490070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        cur++;
1491070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1492070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1493070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (isneg) {
1494070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.mon = -dur->value.dur.mon;
1495070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.day = -dur->value.dur.day;
1496070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.sec = -dur->value.dur.sec;
1497070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1498070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1499070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (val != NULL)
1500070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        *val = dur;
150180b19092f24410a6b869abf519227686e8f207caDaniel Veillard    else
150280b19092f24410a6b869abf519227686e8f207caDaniel Veillard	xmlSchemaFreeValue(dur);
1503070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1504070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1505070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1506070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror:
1507070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dur != NULL)
1508070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	xmlSchemaFreeValue(dur);
1509070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 1;
1510070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1511070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1512a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard/**
1513a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * xmlSchemaStrip:
1514a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * @value: a value
1515a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *
1516a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Removes the leading and ending spaces of a string
1517a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *
1518a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the new string or NULL if no change was required.
1519a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard */
1520a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlChar *
1521a1a9d0410000cc69874e53e438b250037d3e14cdDaniel VeillardxmlSchemaStrip(const xmlChar *value) {
1522a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    const xmlChar *start = value, *end, *f;
1523a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard
1524a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if (value == NULL) return(NULL);
152576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((*start != 0) && (IS_BLANK_CH(*start))) start++;
1526a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end = start;
1527a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    while (*end != 0) end++;
1528a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    f = end;
1529a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end--;
153076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((end > start) && (IS_BLANK_CH(*end))) end--;
1531a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end++;
1532a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if ((start == value) && (f == end)) return(NULL);
1533a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    return(xmlStrndup(start, end - start));
1534a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard}
153596a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard
153696a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard/**
1537b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCollapseString:
1538b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: a value
1539b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
1540b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Removes and normalize white spaces in the string
1541b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
1542b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns the new string or NULL if no change was required.
1543b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
154401fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlChar *
1545b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCollapseString(const xmlChar *value) {
1546b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    const xmlChar *start = value, *end, *f;
1547b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    xmlChar *g;
1548b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    int col = 0;
1549b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1550b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (value == NULL) return(NULL);
155176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((*start != 0) && (IS_BLANK_CH(*start))) start++;
1552b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    end = start;
1553b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    while (*end != 0) {
155476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if ((*end == ' ') && (IS_BLANK_CH(end[1]))) {
1555b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    col = end - start;
1556b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    break;
1557b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	} else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) {
1558b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    col = end - start;
1559b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    break;
1560b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	}
1561b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end++;
1562b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1563b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (col == 0) {
1564b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	f = end;
1565b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end--;
156676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	while ((end > start) && (IS_BLANK_CH(*end))) end--;
1567b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end++;
1568b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if ((start == value) && (f == end)) return(NULL);
1569b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(xmlStrndup(start, end - start));
1570b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1571b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    start = xmlStrdup(start);
1572b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (start == NULL) return(NULL);
1573b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    g = (xmlChar *) (start + col);
1574b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    end = g;
1575b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    while (*end != 0) {
157676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if (IS_BLANK_CH(*end)) {
1577b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    end++;
157876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*end)) end++;
1579b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (*end != 0)
1580b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		*g++ = ' ';
1581b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	} else
1582b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    *g++ = *end++;
1583b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1584b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    *g = 0;
1585b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return((xmlChar *) start);
1586b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
1587b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1588b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
158928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * xmlSchemaValAtomicListNode:
159028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @type: the predefined atomic type for a token in the list
159128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @value: the list value to check
159228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @ret:  the return computed value
159328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @node:  the node containing the value
159428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *
159528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Check that a value conforms to the lexical space of the predefined
159628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * list type. if true a value is computed and returned in @ret.
159728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *
1598a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the number of items if this validates, a negative error code
1599a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *         number otherwise
160028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */
160128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillardstatic int
160228c52ab518d34a36fd8da6870a5850088f129a6aDaniel VeillardxmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value,
160328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	                   xmlSchemaValPtr *ret, xmlNodePtr node) {
160428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    xmlChar *val, *cur, *endval;
160528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    int nb_values = 0;
1606580ced8ee28ecd99374da9383897678e4ba6c358Daniel Veillard    int tmp = 0;
160728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard
160828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (value == NULL) {
160928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	return(-1);
161028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
161128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    val = xmlStrdup(value);
161228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (val == NULL) {
161328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	return(-1);
161428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
161528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    cur = val;
161628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    /*
161728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard     * Split the list
161828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard     */
161976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while (IS_BLANK_CH(*cur)) *cur++ = 0;
162028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while (*cur != 0) {
162176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if (IS_BLANK_CH(*cur)) {
162228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    *cur = 0;
162328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    cur++;
162476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*cur)) *cur++ = 0;
162528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	} else {
162628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    nb_values++;
162728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    cur++;
162876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++;
162928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	}
163028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
163128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (nb_values == 0) {
163228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	if (ret != NULL) {
163328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    TODO
163428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	}
163528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	xmlFree(val);
1636a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard	return(nb_values);
163728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
163828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    endval = cur;
163928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    cur = val;
164028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while ((*cur == 0) && (cur != endval)) cur++;
164128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while (cur != endval) {
164228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node);
164328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	if (tmp != 0)
164428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    break;
164528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	while (*cur != 0) cur++;
164628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	while ((*cur == 0) && (cur != endval)) cur++;
164728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
164828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    xmlFree(val);
164928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (ret != NULL) {
165028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	TODO
165128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
1652a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if (tmp == 0)
1653a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard	return(nb_values);
1654a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    return(-1);
165528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard}
165628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard
165728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard/**
1658e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * xmlSchemaParseUInt:
1659e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @str: pointer to the string R/W
1660e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @llo: pointer to the low result
1661e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lmi: pointer to the mid result
1662e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lhi: pointer to the high result
1663e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *
1664e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Parse an unsigned long into 3 fields.
1665e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *
1666e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Returns the number of chars parsed or -1 if overflow of the capacity
1667e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard */
1668e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic int
1669e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel VeillardxmlSchemaParseUInt(const xmlChar **str, unsigned long *llo,
1670e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	           unsigned long *lmi, unsigned long *lhi) {
1671e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long lo = 0, mi = 0, hi = 0;
1672e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    const xmlChar *tmp, *cur = *str;
1673e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    int ret = 0, i = 0;
1674e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
1675e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (*cur == '0') {
1676e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	ret++;
1677e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	cur++;
1678e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1679e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    tmp = cur;
1680e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) {
1681e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	i++;tmp++;ret++;
1682e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1683e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (i > 24) {
1684e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	*str = tmp;
1685e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	return(-1);
1686e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1687e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 16) {
1688e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	hi = hi * 10 + (*cur++ - '0');
1689e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	i--;
1690e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1691e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 8) {
1692e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	mi = mi * 10 + (*cur++ - '0');
1693e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	i--;
1694e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1695e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 0) {
1696e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	lo = lo * 10 + (*cur++ - '0');
1697e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	i--;
1698e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1699e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
1700e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *str = cur;
1701e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *llo = lo;
1702e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *lmi = mi;
1703e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *lhi = hi;
1704e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    return(ret);
1705e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard}
1706e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
1707e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard/**
1708b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValAtomicType:
17094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type: the predefined type
17104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to check
17114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val:  the return computed value
1712c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @node:  the node containing the value
1713b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * flags:  flags to control the vlidation
17144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
1715b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the atomic type.
17164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * if true a value is computed and returned in @val.
171701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * This checks the value space for list types as well (IDREFS, NMTOKENS).
17184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
17194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
17204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *         and -1 in case of internal or API error.
17214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
1722b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int
17231ac24d36b12487995b659a8fc23a02b9460edb36Daniel VeillardxmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value,
17241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                       xmlSchemaValPtr * val, xmlNodePtr node, int flags)
17251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard{
17264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValPtr v;
1727b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    xmlChar *norm = NULL;
1728d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    int ret = 0;
17294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
17304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
173101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitTypes();
17324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (type == NULL)
17331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        return (-1);
17345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
17354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (val != NULL)
17361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        *val = NULL;
1737b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if ((flags == 0) && (value != NULL)) {
173801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        if ((type->builtInType != XML_SCHEMAS_STRING) &&
173901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard            (type->builtInType != XML_SCHEMAS_NORMSTRING)) {
17401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            norm = xmlSchemaCollapseString(value);
17411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (norm != NULL)
17421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                value = norm;
17431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        }
1744b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1745b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
174601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type->builtInType) {
1747b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_UNKNOWN:
1748c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard            if ((type == xmlSchemaTypeAnySimpleTypeDef) ||
1749c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		(type == xmlSchemaTypeAnyTypeDef))
17501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
17511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto error;
1752b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_STRING:
17531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return0;
17541516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard        case XML_SCHEMAS_NORMSTRING:{
17551516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                const xmlChar *cur = value;
17561516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard
17571516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                while (*cur != 0) {
17581516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
17591516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        goto return1;
17601516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    } else {
17611516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        cur++;
17621516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    }
17631516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                }
17641516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                if (val != NULL) {
17651516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NORMSTRING);
17661516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    if (v != NULL) {
17671516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        v->value.str = xmlStrdup(value);
17681516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        *val = v;
17691516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    } else {
17701516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        goto error;
17711516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    }
17721516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                }
17731516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                goto return0;
17741516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard            }
17751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_DECIMAL:{
17761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value, *tmp;
17771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned int frac = 0, len, neg = 0;
17781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long base = 0;
17791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
17801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
17811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
17821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '+')
17831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
17841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else if (*cur == '-') {
17851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    neg = 1;
17861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
17871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
17881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                tmp = cur;
17891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                while ((*cur >= '0') && (*cur <= '9')) {
17901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    base = base * 10 + (*cur - '0');
17911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
17921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
17931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                len = cur - tmp;
17941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '.') {
17951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
17961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    tmp = cur;
17971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while ((*cur >= '0') && (*cur <= '9')) {
17981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        base = base * 10 + (*cur - '0');
17991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
18001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
18011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    frac = cur - tmp;
18021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
18031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
18041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
18051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
18061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL);
18071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
18081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = base;
18091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = neg;
18101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = frac;
18111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.total = frac + len;
18121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
18131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
18141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
18151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
18161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
1817b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_TIME:
1818b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GDAY:
1819b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GMONTH:
1820b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GMONTHDAY:
1821b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GYEAR:
1822b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GYEARMONTH:
1823b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DATE:
1824b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DATETIME:
182501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard            ret = xmlSchemaValidateDates(type->builtInType, value, val);
18261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            break;
1827b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DURATION:
18281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValidateDuration(type, value, val);
18291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            break;
1830b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_FLOAT:
18311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_DOUBLE:{
18321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
18331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int neg = 0;
18341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
18351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
18361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
18371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) {
18381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur += 3;
18391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (*cur != 0)
18401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
18411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (val != NULL) {
18421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (type == xmlSchemaTypeFloatDef) {
18431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
18441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
18451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                v->value.f = (float) xmlXPathNAN;
18461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
18471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
18481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
18491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
18501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
18511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
18521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
18531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                v->value.d = xmlXPathNAN;
18541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
18551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
18561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
18571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
18581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
18591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
18601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
18611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return0;
18621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
18631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
18641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    neg = 1;
18651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
18661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
18671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) {
18681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur += 3;
18691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (*cur != 0)
18701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
18711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (val != NULL) {
18721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (type == xmlSchemaTypeFloatDef) {
18731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
18741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
18751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                if (neg)
18761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.f = (float) xmlXPathNINF;
18771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                else
18781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.f = (float) xmlXPathPINF;
18791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
18801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
18811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
18821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
18831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
18841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
18851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
18861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                if (neg)
18871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.d = xmlXPathNINF;
18881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                else
18891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.d = xmlXPathPINF;
18901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
18911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
18921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
18931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
18941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
18951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
18961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
18971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return0;
18981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
18991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((neg == 0) && (*cur == '+'))
19001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
19011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-'))
19021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
19031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                while ((*cur >= '0') && (*cur <= '9')) {
19041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
19051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
19061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '.') {
19071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
19081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while ((*cur >= '0') && (*cur <= '9'))
19091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
19101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
19111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((*cur == 'e') || (*cur == 'E')) {
19121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
19131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((*cur == '-') || (*cur == '+'))
19141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
19151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while ((*cur >= '0') && (*cur <= '9'))
19161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
19171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
19181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
19191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
19201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
19211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (type == xmlSchemaTypeFloatDef) {
19221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
19231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (v != NULL) {
1924d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard                            if (sscanf((const char *) value, "%f",
19251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                 &(v->value.f)) == 1) {
192601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                *val = v;
19271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
19281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
19291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
19301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
19311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
19321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto error;
19331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
19341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
19351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
19361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (v != NULL) {
1937d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard                            if (sscanf((const char *) value, "%lf",
19381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                 &(v->value.d)) == 1) {
19391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                *val = v;
19401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
19411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
19421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
19431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
19441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
19451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto error;
19461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
19471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
19481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
19491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
19501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
19511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BOOLEAN:{
19521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
19531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
19541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == '0') && (cur[1] == 0))
19551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 0;
19561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else if ((cur[0] == '1') && (cur[1] == 0))
19571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 1;
19581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else if ((cur[0] == 't') && (cur[1] == 'r')
19591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         && (cur[2] == 'u') && (cur[3] == 'e')
19601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         && (cur[4] == 0))
19611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 1;
19621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else if ((cur[0] == 'f') && (cur[1] == 'a')
19631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         && (cur[2] == 'l') && (cur[3] == 's')
19641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         && (cur[4] == 'e') && (cur[5] == 0))
19651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 0;
19661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else
19671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
19681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
19691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN);
19701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
19711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.b = ret;
19721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
19731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
19741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
19751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
19761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
19771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
19781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
19791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_TOKEN:{
19801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
19811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
198276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack                if (IS_BLANK_CH(*cur))
19831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
19841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
19851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                while (*cur != 0) {
19861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
19871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
19881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else if (*cur == ' ') {
19891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
19901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (*cur == 0)
19911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
19921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (*cur == ' ')
19931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
19941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
19951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
19961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
19971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
19981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
19991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN);
20001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
20011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.str = xmlStrdup(value);
20021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
20031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
20041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
20051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
20061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
20071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
20081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2009b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_LANGUAGE:
20101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (xmlCheckLanguageID(value) == 1) {
20111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
20121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE);
20131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
20141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.str = xmlStrdup(value);
20151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
20161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
20171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
20181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
20191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
20201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
20211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
20221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return1;
2023b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NMTOKEN:
20241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (xmlValidateNMToken(value, 1) == 0) {
20251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
20261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN);
20271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
20281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.str = xmlStrdup(value);
20291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
20301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
20311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
20321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
20331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
20341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
20351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
20361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return1;
2037b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NMTOKENS:
20381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef,
20391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
20401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret > 0)
20411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
20421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
20431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 1;
20441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2045b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NAME:
20461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateName(value, 1);
20471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
20481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                TODO;
20491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
20501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
20511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_QNAME:{
20521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *uri = NULL;
20531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *local = NULL;
20541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
20551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateQName(value, 1);
20561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (node != NULL)) {
20571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *prefix;
20581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
20591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    local = xmlSplitQName2(value, &prefix);
20601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL) {
20611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlNsPtr ns;
20621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
20631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ns = xmlSearchNs(node->doc, node, prefix);
20641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (ns == NULL)
20651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            ret = 1;
20661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        else if (val != NULL)
20671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            uri = xmlStrdup(ns->href);
20681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
20691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((local != NULL) && ((val == NULL) || (ret != 0)))
20701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(local);
20711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL)
20721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(prefix);
20731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
20741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (val != NULL)) {
20751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_QNAME);
20761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
20771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (local != NULL)
20781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.name = local;
20791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        else
20801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.name = xmlStrdup(value);
20811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (uri != NULL)
20821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.uri = uri;
20831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
20841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
20851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
20861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (local != NULL)
20871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            xmlFree(local);
20881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (uri != NULL)
20891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            xmlFree(uri);
20901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
20911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
20921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
20931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
20941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2095b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NCNAME:
20961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
20971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
20981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME);
20991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (v != NULL) {
21001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.str = xmlStrdup(value);
21011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
21021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else {
21031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto error;
21041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
21051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
21061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2107b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_ID:
21081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
21091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
21101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                v = xmlSchemaNewValue(XML_SCHEMAS_ID);
21111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (v != NULL) {
21121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.str = xmlStrdup(value);
21131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
21141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else {
21151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto error;
21161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
21171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
21181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
21191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
21201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
21211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
21221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /*
21231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * NOTE: the IDness might have already be declared in the DTD
21241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 */
21251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (attr->atype != XML_ATTRIBUTE_ID) {
21261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlIDPtr res;
21271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *strip;
21281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
21291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    strip = xmlSchemaStrip(value);
21301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (strip != NULL) {
21311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        res = xmlAddID(NULL, node->doc, strip, attr);
21321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(strip);
21331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else
21341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        res = xmlAddID(NULL, node->doc, value, attr);
21351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (res == NULL) {
21361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 2;
21371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
21381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        attr->atype = XML_ATTRIBUTE_ID;
21391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
21401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
21411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
21421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2143b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_IDREF:
21441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
21451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
21461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                TODO;
21471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
21481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
21491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
21501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
21511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *strip;
21521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
21531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                strip = xmlSchemaStrip(value);
21541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (strip != NULL) {
21551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAddRef(NULL, node->doc, strip, attr);
21561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlFree(strip);
21571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else
21581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAddRef(NULL, node->doc, value, attr);
21591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_IDREF;
21601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
21611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2162b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_IDREFS:
21631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef,
21641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
21651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret < 0)
21661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 2;
21671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
21681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
21691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
21701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
21711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
2172249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard
21731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_IDREFS;
21741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
21751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
21761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_ENTITY:{
21771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *strip;
21781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
21791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateNCName(value, 1);
21801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((node == NULL) || (node->doc == NULL))
21811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 3;
21821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret == 0) {
21831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlEntityPtr ent;
21841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
21851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    strip = xmlSchemaStrip(value);
21861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (strip != NULL) {
21871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ent = xmlGetDocEntity(node->doc, strip);
21881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(strip);
21891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
21901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ent = xmlGetDocEntity(node->doc, value);
21911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
21921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((ent == NULL) ||
21931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        (ent->etype !=
21941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         XML_EXTERNAL_GENERAL_UNPARSED_ENTITY))
21951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 4;
21961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
21971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (val != NULL)) {
21981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    TODO;
21991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
22001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (node != NULL) &&
22011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    (node->type == XML_ATTRIBUTE_NODE)) {
22021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAttrPtr attr = (xmlAttrPtr) node;
2203a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard
22041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    attr->atype = XML_ATTRIBUTE_ENTITY;
22051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
22061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
22071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2208b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_ENTITIES:
22091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((node == NULL) || (node->doc == NULL))
22101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return3;
22111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef,
22121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
22131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret <= 0)
22141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 1;
22151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
22161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
22171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
22181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
22191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
22201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
22211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_ENTITIES;
22221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
22231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
22241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_NOTATION:{
22251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *uri = NULL;
22261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *local = NULL;
22271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
22281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateQName(value, 1);
22291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (node != NULL)) {
22301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *prefix;
22311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
22321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    local = xmlSplitQName2(value, &prefix);
22331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL) {
22341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlNsPtr ns;
22351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
22361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ns = xmlSearchNs(node->doc, node, prefix);
22371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (ns == NULL)
22381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            ret = 1;
22391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        else if (val != NULL)
22401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            uri = xmlStrdup(ns->href);
22411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
22421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((local != NULL) && ((val == NULL) || (ret != 0)))
22431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(local);
22441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL)
22451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(prefix);
22461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
22471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((node == NULL) || (node->doc == NULL))
22481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 3;
22491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret == 0) {
22501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = xmlValidateNotationUse(NULL, node->doc, value);
22511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (ret == 1)
22521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 0;
22531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else
22541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 1;
22551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
22561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (val != NULL)) {
22571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION);
22581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
22591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (local != NULL)
22601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.name = local;
22611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        else
22621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.name = xmlStrdup(value);
22631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (uri != NULL)
22641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.uri = uri;
22651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
22661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
22671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
22681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (local != NULL)
22691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            xmlFree(local);
22701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (uri != NULL)
22711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            xmlFree(uri);
22721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
22731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
22741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
22751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
2276560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard            }
22771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_ANYURI:{
227811c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                if (*value != 0) {
227911c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    xmlURIPtr uri = xmlParseURI((const char *) value);
228011c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    if (uri == NULL)
228111c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                        goto return1;
228211c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    xmlFreeURI(uri);
228311c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                }
2284560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
22851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
228611c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_ANYURI);
228711c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    if (v == NULL)
228811c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                        goto error;
228911c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    v->value.str = xmlStrdup(value);
229011c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    *val = v;
22911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
22921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
22931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
22941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_HEXBINARY:{
22951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
22961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *base;
22971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int total, i = 0;
2298560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
22991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
23001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
2301560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
23021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                while (((*cur >= '0') && (*cur <= '9')) ||
23031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                       ((*cur >= 'A') && (*cur <= 'F')) ||
23041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                       ((*cur >= 'a') && (*cur <= 'f'))) {
23051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    i++;
23061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
23071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
2308560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
23091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
23101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
23111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((i % 2) != 0)
231270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard                    goto return1;
2313560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
23141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
23151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY);
23171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v == NULL)
23181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
23191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur = xmlStrdup(value);
23211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (cur == NULL) {
2322d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard		        xmlSchemaTypeErrMemory(node, "allocating hexbin data");
23231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(v);
23241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
23251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
23261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total = i / 2;      /* number of octets */
232870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
23291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    base = (xmlChar *) cur;
23301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while (i-- > 0) {
23311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (*base >= 'a')
23321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            *base = *base - ('a' - 'A');
23331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        base++;
23341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
233570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
23361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.hex.str = (xmlChar *) cur;
23371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.hex.total = total;
23381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
23391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
23411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
23421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BASE64BINARY:{
23431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /* ISSUE:
23441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 *
23451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Ignore all stray characters? (yes, currently)
23461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Worry about long lines? (no, currently)
23471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 *
23481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * rfc2045.txt:
23491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 *
23501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * "The encoded output stream must be represented in lines of
23511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * no more than 76 characters each.  All line breaks or other
23521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * characters not found in Table 1 must be ignored by decoding
23531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * software.  In base64 data, characters other than those in
23541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Table 1, line breaks, and other white space probably
23551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * indicate a transmission error, about which a warning
23561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * message or even a message rejection might be appropriate
23571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * under some circumstances." */
23581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
23591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *base;
23601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int total, i = 0, pad = 0;
23611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
23631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
23641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                for (; *cur; ++cur) {
23661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
23671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    decc = _xmlSchemaBase64Decode(*cur);
23691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc < 0) ;
23701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (decc < 64)
23711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        i++;
23721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else
23731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        break;
23741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                for (; *cur; ++cur) {
23761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
23771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    decc = _xmlSchemaBase64Decode(*cur);
23791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc < 0) ;
23801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (decc < 64)
23811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
23821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc == 64)
23831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        pad++;
23841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /* rfc2045.txt: "Special processing is performed if fewer than
23871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * 24 bits are available at the end of the data being encoded.
23881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * A full encoding quantum is always completed at the end of a
23891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * body.  When fewer than 24 input bits are available in an
23901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * input group, zero bits are added (on the right) to form an
23911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * integral number of 6-bit groups.  Padding at the end of the
23921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * data is performed using the "=" character.  Since all
23931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * base64 input is an integral number of octets, only the
23941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * following cases can arise: (1) the final quantum of
23951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * encoding input is an integral multiple of 24 bits; here,
23961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * the final unit of encoded output will be an integral
23971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * multiple ofindent: Standard input:701: Warning:old style
23981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		 * assignment ambiguity in "=*".  Assuming "= *" 4 characters
23991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		 * with no "=" padding, (2) the final
24001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * quantum of encoding input is exactly 8 bits; here, the
24011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * final unit of encoded output will be two characters
24021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * followed by two "=" padding characters, or (3) the final
24031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * quantum of encoding input is exactly 16 bits; here, the
24041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * final unit of encoded output will be three characters
24051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * followed by one "=" padding character." */
24061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
24071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                total = 3 * (i / 4);
24081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (pad == 0) {
24091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 0)
24101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
24111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (pad == 1) {
24121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
24131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
24141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 3)
24151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
24161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (decc = _xmlSchemaBase64Decode(*cur);
24171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         (decc < 0) || (decc > 63);
24181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         decc = _xmlSchemaBase64Decode(*cur))
24191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        --cur;
24201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 16bits in 24bits means 2 pad bits: nnnnnn nnmmmm mmmm00*/
24211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 00111100 -> 0x3c */
24221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc & ~0x3c)
24231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
24241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total += 2;
24251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (pad == 2) {
24261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
24271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
24281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 2)
24291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
24301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (decc = _xmlSchemaBase64Decode(*cur);
24311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         (decc < 0) || (decc > 63);
24321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         decc = _xmlSchemaBase64Decode(*cur))
24331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        --cur;
24341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 8bits in 12bits means 4 pad bits: nnnnnn nn0000 */
24351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 00110000 -> 0x30 */
24361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc & ~0x30)
24371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
24381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total += 1;
24391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else
24401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
24411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
24421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
24431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_BASE64BINARY);
24441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v == NULL)
24451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
24461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    base =
24471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        (xmlChar *) xmlMallocAtomic((i + pad + 1) *
24481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                                    sizeof(xmlChar));
24491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (base == NULL) {
2450d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard		        xmlSchemaTypeErrMemory(node, "allocating base64 data");
24511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(v);
24521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
24531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
24541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.base64.str = base;
24551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (cur = value; *cur; ++cur)
24561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (_xmlSchemaBase64Decode(*cur) >= 0) {
24571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            *base = *cur;
24581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            ++base;
24591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
24601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *base = 0;
24611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.base64.total = total;
24621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
24631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
246570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard            }
2466e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_INTEGER:
2467e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_PINTEGER:
2468e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_NPINTEGER:
2469e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_NINTEGER:
24701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_NNINTEGER:{
24711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
24721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
24731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int sign = 0;
24741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
24751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
24761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
24771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
24781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    sign = 1;
24791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (*cur == '+')
24811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
24831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret == 0)
24841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
24851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
24861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
248701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_NPINTEGER) {
24881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) &&
24891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ((hi != 0) || (mi != 0) || (lo != 0)))
24901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
249101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_PINTEGER) {
24921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (sign == 1)
24931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
24941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((hi == 0) && (mi == 0) && (lo == 0))
24951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
249601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_NINTEGER) {
24971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (sign == 0)
24981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
24991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((hi == 0) && (mi == 0) && (lo == 0))
25001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
250101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_NNINTEGER) {
25021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) &&
25031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ((hi != 0) || (mi != 0) || (lo != 0)))
25041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
25051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
25061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /*
25071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * We can store a value only if no overflow occured
25081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 */
25091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret > 0) && (val != NULL)) {
251001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
25111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
25121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
25131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.mi = lo;
25141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.hi = lo;
25151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = sign;
25161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
25171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.total = cur - value;
25181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
25191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
25201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
25211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
25221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2523e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_LONG:
2524e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_BYTE:
2525e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_SHORT:
25261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_INT:{
25271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
25281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
25291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int total = 0;
25301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int sign = 0;
25311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
25321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
25331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
25341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
25351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    sign = 1;
25361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
25371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (*cur == '+')
25381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
25391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
25401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret <= 0)
25411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
25421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
25431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
254401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_LONG) {
25451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi >= 922) {
25461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (hi > 922)
25471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
25481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi >= 33720368) {
25491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (mi > 33720368)
25501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
25511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if ((sign == 0) && (lo > 54775807))
25521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
25531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if ((sign == 1) && (lo > 54775808))
25541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
25551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
25561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
255701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_INT) {
25581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi != 0)
25591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
25601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (mi >= 21) {
25611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi > 21)
25621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
25631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if ((sign == 0) && (lo > 47483647))
25641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
25651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if ((sign == 1) && (lo > 47483648))
25661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
25671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
256801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_SHORT) {
25691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
25701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
25711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) && (lo > 32768))
25721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
25731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) && (lo > 32767))
25741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
257501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_BYTE) {
25761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
25771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
25781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) && (lo > 128))
25791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
25801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) && (lo > 127))
25811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
25821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
25831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
258401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
25851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
25861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
25871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.mi = lo;
25881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.hi = lo;
25891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = sign;
25901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
25911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.total = total;
25921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
25931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
25941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
25951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
25961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2597e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_UINT:
2598e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_ULONG:
2599e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_USHORT:
26001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_UBYTE:{
26011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
26021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
26031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int total = 0;
26041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
26051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
26061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
26071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
26081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret <= 0)
26091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
26101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
26111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
261201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_ULONG) {
26131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi >= 1844) {
26141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (hi > 1844)
26151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
26161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi >= 67440737) {
26171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (mi > 67440737)
26181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
26191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (lo > 9551615)
26201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
26211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
26221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
262301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_UINT) {
26241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi != 0)
26251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
26261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (mi >= 42) {
26271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi > 42)
26281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
26291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (lo > 94967295)
26301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
26311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
263201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_USHORT) {
26331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
26341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
26351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (lo > 65535)
26361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
263701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_UBYTE) {
26381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
26391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
26401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (lo > 255)
26411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
26421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
264401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
26451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
26461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
26471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.mi = mi;
26481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.hi = hi;
26491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = 0;
26501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
26511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.total = total;
26521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
26531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
26541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
26561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
26574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
2658b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
26591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  done:
26601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
26611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
26621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (ret);
26631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return3:
26641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
26651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
26661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (3);
26671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return1:
26681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
26691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
26701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (1);
26711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return0:
26721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
26731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
26741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (0);
26751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  error:
26761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
26771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
26781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (-1);
2679b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
2680b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
2681b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
2682b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValPredefTypeNode:
2683b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @type: the predefined type
2684b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: the value to check
2685b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @val:  the return computed value
2686b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @node:  the node containing the value
2687b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
2688b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the predefined type.
2689b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * if true a value is computed and returned in @val.
2690b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
2691b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns 0 if this validates, a positive error code number otherwise
2692b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *         and -1 in case of internal or API error.
2693b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
2694b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardint
2695b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value,
2696b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	                   xmlSchemaValPtr *val, xmlNodePtr node) {
2697b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return(xmlSchemaValAtomicType(type, value, val, node, 0));
26984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
26994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
27004255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
2701c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaValPredefTypeNodeNoNorm:
2702c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the predefined type
2703c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the value to check
2704c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val:  the return computed value
2705c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @node:  the node containing the value
2706c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
2707c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Check that a value conforms to the lexical space of the predefined type.
2708c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * if true a value is computed and returned in @val.
2709c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * This one does apply any normalization to the value.
2710c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
2711c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
2712c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *         and -1 in case of internal or API error.
2713c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */
2714c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardint
2715c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, const xmlChar *value,
2716c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard				 xmlSchemaValPtr *val, xmlNodePtr node) {
2717c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    return(xmlSchemaValAtomicType(type, value, val, node, 1));
2718c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
2719c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
2720c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/**
2721c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * xmlSchemaValidatePredefinedType:
2722c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @type: the predefined type
2723c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @value: the value to check
2724c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @val:  the return computed value
2725c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *
2726c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Check that a value conforms to the lexical space of the predefined type.
2727c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * if true a value is computed and returned in @val.
2728c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *
2729c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
2730c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *         and -1 in case of internal or API error.
2731c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard */
2732c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillardint
2733c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel VeillardxmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value,
2734c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard	                        xmlSchemaValPtr *val) {
2735c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard    return(xmlSchemaValPredefTypeNode(type, value, val, NULL));
2736c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard}
2737c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard
2738c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard/**
27394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareDecimals:
27404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x:  a first decimal value
27414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y:  a second decimal value
27424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
27434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 decimals
27444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
27454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error
27464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
27474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int
27484255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y)
27494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{
27504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValPtr swp;
2751e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    int order = 1, p;
27524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    unsigned long tmp;
27534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
2754e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if ((x->value.decimal.sign) &&
2755e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	((x->value.decimal.lo != 0) ||
2756e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	 (x->value.decimal.mi != 0) ||
2757e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	 (x->value.decimal.hi != 0))) {
2758e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	if ((y->value.decimal.sign) &&
2759e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    ((y->value.decimal.lo != 0) ||
2760e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	     (y->value.decimal.mi != 0) ||
2761e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	     (y->value.decimal.hi != 0)))
276280b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    order = -1;
276380b19092f24410a6b869abf519227686e8f207caDaniel Veillard	else
276480b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    return (-1);
2765e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    } else if ((y->value.decimal.sign) &&
2766e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	       ((y->value.decimal.lo != 0) ||
2767e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		(y->value.decimal.mi != 0) ||
2768e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		(y->value.decimal.hi != 0))) {
27694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (1);
277080b19092f24410a6b869abf519227686e8f207caDaniel Veillard    }
27714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (x->value.decimal.frac == y->value.decimal.frac) {
2772e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	if (x->value.decimal.hi < y->value.decimal.hi)
2773e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (-order);
277401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (x->value.decimal.hi > y->value.decimal.hi)
2775e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (order);
2776e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	if (x->value.decimal.mi < y->value.decimal.mi)
2777e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (-order);
277801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (x->value.decimal.mi > y->value.decimal.mi)
2779e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (order);
2780e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        if (x->value.decimal.lo < y->value.decimal.lo)
278180b19092f24410a6b869abf519227686e8f207caDaniel Veillard            return (-order);
2782e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        if (x->value.decimal.lo > y->value.decimal.lo)
278380b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    return(order);
278480b19092f24410a6b869abf519227686e8f207caDaniel Veillard	return(0);
27854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
27864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (y->value.decimal.frac > x->value.decimal.frac) {
27874255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        swp = y;
27884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        y = x;
27894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        x = swp;
27904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        order = -order;
27914255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
2792e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    p = powten[x->value.decimal.frac - y->value.decimal.frac];
2793e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    tmp = x->value.decimal.lo / p;
2794e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (tmp > y->value.decimal.lo)
27954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (order);
2796e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (tmp < y->value.decimal.lo)
27974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (-order);
2798e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    tmp = y->value.decimal.lo * p;
2799e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (x->value.decimal.lo < tmp)
28004255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (-order);
2801e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (x->value.decimal.lo == tmp)
28024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (0);
28034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return (order);
28044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
28054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
28064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
2807070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xmlSchemaCompareDurations:
2808070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @x:  a first duration value
2809070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @y:  a second duration value
2810070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
2811070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Compare 2 durations
2812070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
2813070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
2814070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * case of error
2815070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
2816070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
2817070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel VeillardxmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y)
2818070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard{
2819070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long carry, mon, day;
2820070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    double sec;
282180b19092f24410a6b869abf519227686e8f207caDaniel Veillard    int invert = 1;
282280b19092f24410a6b869abf519227686e8f207caDaniel Veillard    long xmon, xday, myear, minday, maxday;
2823070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    static const long dayRange [2][12] = {
2824070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        { 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, },
2825070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} };
2826070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2827070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((x == NULL) || (y == NULL))
28285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return -2;
2829070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2830070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* months */
2831070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    mon = x->value.dur.mon - y->value.dur.mon;
2832070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2833070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* seconds */
2834070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    sec = x->value.dur.sec - y->value.dur.sec;
2835070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    carry = (long)sec / SECS_PER_DAY;
2836070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    sec -= (double)(carry * SECS_PER_DAY);
2837070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2838070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* days */
2839070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    day = x->value.dur.day - y->value.dur.day + carry;
2840070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2841070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* easy test */
2842070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (mon == 0) {
2843070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (day == 0)
2844070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (sec == 0.0)
2845070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 0;
2846070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else if (sec < 0.0)
2847070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return -1;
2848070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else
2849070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 1;
2850070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else if (day < 0)
2851070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return -1;
2852070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else
2853070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return 1;
2854070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
2855070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2856070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (mon > 0) {
2857070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if ((day >= 0) && (sec >= 0.0))
2858070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return 1;
2859070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else {
2860070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            xmon = mon;
2861070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            xday = -day;
2862070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        }
2863070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    } else if ((day <= 0) && (sec <= 0.0)) {
2864070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        return -1;
2865070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    } else {
286680b19092f24410a6b869abf519227686e8f207caDaniel Veillard	invert = -1;
2867070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xmon = -mon;
2868070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xday = day;
2869070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
2870070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2871070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    myear = xmon / 12;
287280b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (myear == 0) {
287380b19092f24410a6b869abf519227686e8f207caDaniel Veillard	minday = 0;
287480b19092f24410a6b869abf519227686e8f207caDaniel Veillard	maxday = 0;
287580b19092f24410a6b869abf519227686e8f207caDaniel Veillard    } else {
287680b19092f24410a6b869abf519227686e8f207caDaniel Veillard	maxday = 366 * ((myear + 3) / 4) +
287780b19092f24410a6b869abf519227686e8f207caDaniel Veillard	         365 * ((myear - 1) % 4);
287880b19092f24410a6b869abf519227686e8f207caDaniel Veillard	minday = maxday - 1;
287980b19092f24410a6b869abf519227686e8f207caDaniel Veillard    }
288080b19092f24410a6b869abf519227686e8f207caDaniel Veillard
2881070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmon = xmon % 12;
2882070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    minday += dayRange[0][xmon];
2883070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    maxday += dayRange[1][xmon];
2884070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
288580b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if ((maxday == minday) && (maxday == xday))
288680b19092f24410a6b869abf519227686e8f207caDaniel Veillard	return(0); /* can this really happen ? */
2887070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (maxday < xday)
288880b19092f24410a6b869abf519227686e8f207caDaniel Veillard        return(-invert);
288980b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (minday > xday)
289080b19092f24410a6b869abf519227686e8f207caDaniel Veillard        return(invert);
2891070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
2892070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* indeterminate */
28935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return 2;
28945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
28955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
28965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/*
28975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * macros for adding date/times and durations
28985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
28995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT(a,b)                  (floor(((double)a/(double)b)))
29005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO(a,b)                     (a - FQUOTIENT(a,b) * b)
29015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT_RANGE(a,low,high)     (FQUOTIENT((a-low),(high-low)))
29025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO_RANGE(a,low,high)        ((MODULO((a-low),(high-low)))+low)
29035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
29045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
2905669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * xmlSchemaDupVal:
2906669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @v: the #xmlSchemaValPtr value to duplicate
2907669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard *
2908669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Makes a copy of @v. The calling program is responsible for freeing
2909669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the returned value.
2910669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard *
2911669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * returns a pointer to a duplicated #xmlSchemaValPtr or NULL if error.
2912669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard */
2913669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillardstatic xmlSchemaValPtr
2914669adfcd3af5dfda873b10119d44202a7450bb20Daniel VeillardxmlSchemaDupVal (xmlSchemaValPtr v)
2915669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard{
2916669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaValPtr ret = xmlSchemaNewValue(v->type);
2917669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    if (ret == NULL)
2918669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        return NULL;
2919669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard
2920669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    memcpy(ret, v, sizeof(xmlSchemaVal));
2921669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    return ret;
2922669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard}
2923669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard
2924669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard/**
29255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateAdd:
29265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr
29275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dur: an #xmlSchemaValPtr of type #XS_DURATION
29285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
29295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compute a new date/time from @dt and @dur. This function assumes @dt
29305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH,
2931669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * or #XML_SCHEMAS_GYEAR. The returned #xmlSchemaVal is the same type as
2932669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt. The calling program is responsible for freeing the returned value.
29335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
2934669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a pointer to a new #xmlSchemaVal or NULL if error.
29355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
29365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr
29375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur)
29385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
2939669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaValPtr ret, tmp;
29405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long carry, tempdays, temp;
29415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValDatePtr r, d;
29425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValDurationPtr u;
29435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
29445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((dt == NULL) || (dur == NULL))
29455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
29465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
29475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ret = xmlSchemaNewValue(dt->type);
29485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret == NULL)
29495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
29505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
2951669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    /* make a copy so we don't alter the original value */
2952669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    tmp = xmlSchemaDupVal(dt);
2953669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    if (tmp == NULL) {
2954669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        xmlSchemaFreeValue(ret);
2955669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        return NULL;
2956669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    }
2957669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard
29585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r = &(ret->value.date);
2959669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    d = &(tmp->value.date);
29605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    u = &(dur->value.dur);
29615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
29625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalization */
29635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (d->mon == 0)
29645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        d->mon = 1;
29655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
29665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalize for time zone offset */
29675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    u->sec -= (d->tzo * 60);
29685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    d->tzo = 0;
29695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
29705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalization */
29715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (d->day == 0)
29725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        d->day = 1;
29735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
29745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* month */
29755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry  = d->mon + u->mon;
2976ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->mon = (unsigned int) MODULO_RANGE(carry, 1, 13);
2977ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT_RANGE(carry, 1, 13);
29785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
29795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* year (may be modified later) */
29805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->year = d->year + carry;
29815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (r->year == 0) {
29825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (d->year > 0)
29835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            r->year--;
29845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else
29855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            r->year++;
29865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
29875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
29885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* time zone */
29895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->tzo     = d->tzo;
29905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->tz_flag = d->tz_flag;
29915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
29925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* seconds */
29935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->sec = d->sec + u->sec;
2994ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT((long)r->sec, 60);
29955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (r->sec != 0.0) {
29965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        r->sec = MODULO(r->sec, 60.0);
29975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
29985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
29995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* minute */
30005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry += d->min;
3001ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->min = (unsigned int) MODULO(carry, 60);
3002ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT(carry, 60);
30035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* hours */
30055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry  += d->hour;
3006ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->hour = (unsigned int) MODULO(carry, 24);
3007ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry   = (long)FQUOTIENT(carry, 24);
30085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
30105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * days
30115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * Note we use tempdays because the temporary values may need more
30125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * than 5 bits
30135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
30145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) &&
30155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                  (d->day > MAX_DAYINMONTH(r->year, r->mon)))
30165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = MAX_DAYINMONTH(r->year, r->mon);
30175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (d->day < 1)
30185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = 1;
30195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else
30205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = d->day;
30215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    tempdays += u->day + carry;
30235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    while (1) {
30255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (tempdays < 1) {
3026ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard            long tmon = (long) MODULO_RANGE(r->mon-1, 1, 13);
3027ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard            long tyr  = r->year + (long)FQUOTIENT_RANGE(r->mon-1, 1, 13);
30285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (tyr == 0)
30295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                tyr--;
30305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            tempdays += MAX_DAYINMONTH(tyr, tmon);
30315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            carry = -1;
3032ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard        } else if (tempdays > (long) MAX_DAYINMONTH(r->year, r->mon)) {
30335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon);
30345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            carry = 1;
30355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        } else
30365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
30375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        temp = r->mon + carry;
3039ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard        r->mon = (unsigned int) MODULO_RANGE(temp, 1, 13);
3040ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard        r->year = r->year + (unsigned int) FQUOTIENT_RANGE(temp, 1, 13);
30415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (r->year == 0) {
30425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (temp < 1)
30435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                r->year--;
30445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else
30455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                r->year++;
30465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	}
30475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
30485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->day = tempdays;
30505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
30525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * adjust the date/time type to the date values
30535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
30545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret->type != XML_SCHEMAS_DATETIME) {
30555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if ((r->hour) || (r->min) || (r->sec))
30565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ret->type = XML_SCHEMAS_DATETIME;
30575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (ret->type != XML_SCHEMAS_DATE) {
30585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if ((r->mon != 1) && (r->day != 1))
30595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                ret->type = XML_SCHEMAS_DATE;
30605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1))
30615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                ret->type = XML_SCHEMAS_GYEARMONTH;
30625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
30635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
30645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3065669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaFreeValue(tmp);
30665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
30685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
30695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
30715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaDateNormalize:
3072669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt: an #xmlSchemaValPtr of a date/time type value.
3073669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @offset: number of seconds to adjust @dt by.
30745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3075669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Normalize @dt to GMT time. The @offset parameter is subtracted from
3076669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the return value is a time-zone offset is present on @dt.
30775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3078669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a normalized copy of @dt or NULL if error.
30795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
30805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr
30815a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset)
30825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
30835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValPtr dur, ret;
30845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dt == NULL)
30865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
30875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (((dt->type != XML_SCHEMAS_TIME) &&
30895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard         (dt->type != XML_SCHEMAS_DATETIME)) || (dt->value.date.tzo == 0))
30905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return xmlSchemaDupVal(dt);
30915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION);
30935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dur == NULL)
30945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
30955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    dur->value.date.sec -= offset;
30975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
30985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ret = _xmlSchemaDateAdd(dt, dur);
30995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret == NULL)
31005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
31015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaFreeValue(dur);
31035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* ret->value.date.tzo = 0; */
31055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
31065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
31075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
31095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateCastYMToDays:
31105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr
31115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
31125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Convert mon and year of @dt to total number of days. Take the
31135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * number of years since (or before) 1 AD and add the number of leap
31145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years. This is a function  because negative
31155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years must be handled a little differently and there is no zero year.
31165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
31175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns number of days.
31185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
31195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic long
31205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt)
31215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
31225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long ret;
31235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dt->value.date.year < 0)
31255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ret = (dt->value.date.year * 365) +
31265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+
31275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard               ((dt->value.date.year+1)/400)) +
31285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              DAY_IN_YEAR(0, dt->value.date.mon, dt->value.date.year);
31295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else
31305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ret = ((dt->value.date.year-1) * 365) +
31315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+
31325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard               ((dt->value.date.year-1)/400)) +
31335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              DAY_IN_YEAR(0, dt->value.date.mon, dt->value.date.year);
31345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
31365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
31375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
31395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * TIME_TO_NUMBER:
31405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt:  an #xmlSchemaValPtr
31415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
31425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Calculates the number of seconds in the time portion of @dt.
31435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
31445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns seconds.
31455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
31465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define TIME_TO_NUMBER(dt)                              \
31475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ((double)((dt->value.date.hour * SECS_PER_HOUR) +   \
3148b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard              (dt->value.date.min * SECS_PER_MIN) +	\
3149b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard              (dt->value.date.tzo * SECS_PER_MIN)) +	\
3150b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard               dt->value.date.sec)
31515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
31535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaCompareDates:
31545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @x:  a first date/time value
31555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @y:  a second date/time value
31565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
31575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compare 2 date/times
31585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
31595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
31605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error
31615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
31625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic int
31635a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y)
31645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
31655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    unsigned char xmask, ymask, xor_mask, and_mask;
31665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValPtr p1, p2, q1, q2;
31675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long p1d, p2d, q1d, q2d;
31685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((x == NULL) || (y == NULL))
31705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return -2;
31715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (x->value.date.tz_flag) {
31735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (!y->value.date.tz_flag) {
31755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            p1 = xmlSchemaDateNormalize(x, 0);
31765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
31775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            /* normalize y + 14:00 */
31785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR));
31795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
3181fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            if (p1d < q1d) {
3182fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
3183fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
31845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return -1;
3185fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    } else if (p1d == q1d) {
31865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                double sec;
31875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
31885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
3189fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard                if (sec < 0.0) {
3190fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		    xmlSchemaFreeValue(p1);
3191fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		    xmlSchemaFreeValue(q1);
31925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    return -1;
3193fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		} else {
31944aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    int ret = 0;
31955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    /* normalize y - 14:00 */
31965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR));
31975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day;
31985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    if (p1d > q2d)
31994aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 1;
32005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    else if (p1d == q2d) {
32015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2);
32025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        if (sec > 0.0)
32034aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                            ret = 1;
32045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        else
32054aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                            ret = 2; /* indeterminate */
32065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    }
32074aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(p1);
32084aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(q1);
32094aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(q2);
32104aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    if (ret != 0)
32114aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		        return(ret);
32125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                }
3213fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            } else {
3214fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
3215fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
3216fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    }
32175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
32185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    } else if (y->value.date.tz_flag) {
32195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1 = xmlSchemaDateNormalize(y, 0);
32205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
32215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        /* normalize x - 14:00 */
32235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR));
32245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
32255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3226fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard        if (p1d < q1d) {
3227fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(p1);
3228fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(q1);
32295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
3230fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else if (p1d == q1d) {
32315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            double sec;
32325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
3234fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            if (sec < 0.0) {
3235fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
3236fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
32375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return -1;
3238fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    } else {
32394aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	        int ret = 0;
32405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                /* normalize x + 14:00 */
32415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR));
32425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day;
32435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32446560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                if (p2d > q1d) {
32454aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                    ret = 1;
32466560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		} else if (p2d == q1d) {
32475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1);
32485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    if (sec > 0.0)
32494aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 1;
32505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    else
32514aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 2; /* indeterminate */
32525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                }
32536560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(p1);
32546560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(q1);
32556560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(p2);
32564aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		if (ret != 0)
32574aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    return(ret);
32585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            }
3259fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else {
3260fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(p1);
3261fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(q1);
32625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
32635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
32645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
32665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * if the same type then calculate the difference
32675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
32685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (x->type == y->type) {
32694aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard        int ret = 0;
32705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1 = xmlSchemaDateNormalize(y, 0);
32715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
32725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1 = xmlSchemaDateNormalize(x, 0);
32745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
32755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3276fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard        if (p1d < q1d) {
32774aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard            ret = -1;
3278fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else if (p1d > q1d) {
32794aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard            ret = 1;
3280fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else {
32815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            double sec;
32825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
32845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (sec < 0.0)
32854aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                ret = -1;
32865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else if (sec > 0.0)
32874aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                ret = 1;
32885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
32904aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	xmlSchemaFreeValue(p1);
32914aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	xmlSchemaFreeValue(q1);
32924aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard        return(ret);
32935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
32945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
32955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    switch (x->type) {
32965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
32975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0xf;
32985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
32995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
33005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x7;
33015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
33025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
33035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x1;
33045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
33055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
33065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x2;
33075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
33085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
33095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x3;
33105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
33115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
33125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x3;
33135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
33145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
33155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x6;
33165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
33175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
33185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x8;
33195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
33205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        default:
33215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0;
33225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
33235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
33245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    switch (y->type) {
33265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
33275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0xf;
33285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
33295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
33305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x7;
33315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
33325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
33335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x1;
33345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
33355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
33365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x2;
33375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
33385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
33395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x3;
33405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
33415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
33425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x3;
33435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
33445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
33455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x6;
33465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
33475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
33485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x8;
33495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
33505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        default:
33515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0;
33525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
33535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
33545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xor_mask = xmask ^ ymask;           /* mark type differences */
33565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    and_mask = xmask & ymask;           /* mark field specification */
33575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* year */
33595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 1)
33605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
33615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 1) {
33625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.year < y->value.date.year)
33635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
33645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.year > y->value.date.year)
33655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
33665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
33675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* month */
33695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 2)
33705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
33715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 2) {
33725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.mon < y->value.date.mon)
33735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
33745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.mon > y->value.date.mon)
33755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
33765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
33775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* day */
33795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 4)
33805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
33815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 4) {
33825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.day < y->value.date.day)
33835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
33845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.day > y->value.date.day)
33855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
33865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
33875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
33885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* time */
33895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 8)
33905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
33915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 8) {
33925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.hour < y->value.date.hour)
33935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
33945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.hour > y->value.date.hour)
33955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
33965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.min < y->value.date.min)
33975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
33985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.min > y->value.date.min)
33995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
34005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.sec < y->value.date.sec)
34015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
34025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.sec > y->value.date.sec)
34035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
34045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
34055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3406070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
3407070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
3408070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3409070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
3410c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaCompareNormStrings:
3411c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @x:  a first string value
3412c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @y:  a second string value
3413c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
3414c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Compare 2 string for their normalized values.
3415c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
3416c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
3417c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * case of error
3418c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */
3419c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int
3420c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaCompareNormStrings(xmlSchemaValPtr x, xmlSchemaValPtr y) {
3421c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    const xmlChar *utf1;
3422c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    const xmlChar *utf2;
3423c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    int tmp;
3424c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
3425c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    if ((x == NULL) || (y == NULL))
3426c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	return(-2);
3427c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    utf1 = x->value.str;
3428c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    utf2 = y->value.str;
3429c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
343076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while (IS_BLANK_CH(*utf1)) utf1++;
343176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while (IS_BLANK_CH(*utf2)) utf2++;
3432c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    while ((*utf1 != 0) && (*utf2 != 0)) {
343376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if (IS_BLANK_CH(*utf1)) {
343476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    if (!IS_BLANK_CH(*utf2)) {
3435c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		tmp = *utf1 - *utf2;
3436c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(tmp);
3437c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    }
343876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*utf1)) utf1++;
343976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*utf2)) utf2++;
3440c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	} else {
3441c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    tmp = *utf1++ - *utf2++;
3442c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (tmp < 0)
3443c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(-1);
3444c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (tmp > 0)
3445c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(1);
3446c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	}
3447c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
3448c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    if (*utf1 != 0) {
344976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	while (IS_BLANK_CH(*utf1)) utf1++;
3450c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	if (*utf1 != 0)
3451c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    return(1);
3452c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
3453c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    if (*utf2 != 0) {
345476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	while (IS_BLANK_CH(*utf2)) utf2++;
3455c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	if (*utf2 != 0)
3456c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    return(-1);
3457c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
3458c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    return(0);
3459c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard}
3460c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
3461c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/**
3462b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCompareFloats:
3463b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @x:  a first float or double value
3464b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @y:  a second float or double value
3465b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
3466b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Compare 2 values
3467b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
3468b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
3469b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * case of error
3470b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
3471b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int
3472b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) {
3473b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    double d1, d2;
3474b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
3475b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if ((x == NULL) || (y == NULL))
3476b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
3477b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
3478b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
3479b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * Cast everything to doubles.
3480b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
3481b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (x->type == XML_SCHEMAS_DOUBLE)
3482b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d1 = x->value.d;
3483b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else if (x->type == XML_SCHEMAS_FLOAT)
3484b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d1 = x->value.f;
3485b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else
3486b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
3487b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
3488b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (y->type == XML_SCHEMAS_DOUBLE)
3489b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d2 = y->value.d;
3490b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else if (y->type == XML_SCHEMAS_FLOAT)
3491b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d2 = y->value.f;
3492b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else
3493b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
3494b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
3495b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
3496b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * Check for special cases.
3497b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
3498b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (xmlXPathIsNaN(d1)) {
3499b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (xmlXPathIsNaN(d2))
3500b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
3501b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(1);
3502b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
3503b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (xmlXPathIsNaN(d2))
3504b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-1);
3505b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == xmlXPathPINF) {
3506b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (d2 == xmlXPathPINF)
3507b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
3508b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(1);
3509b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
3510b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d2 == xmlXPathPINF)
3511b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(-1);
3512b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == xmlXPathNINF) {
3513b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (d2 == xmlXPathNINF)
3514b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
3515b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(-1);
3516b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
3517b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d2 == xmlXPathNINF)
3518b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(1);
3519b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
3520b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
3521b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * basic tests, the last one we should have equality, but
3522b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * portability is more important than speed and handling
3523b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * NaN or Inf in a portable way is always a challenge, so ...
3524b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
3525b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 < d2)
3526b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-1);
3527b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 > d2)
3528b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(1);
3529b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == d2)
3530b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(0);
3531b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return(2);
3532b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
3533b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
3534b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
35354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareValues:
35364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x:  a first value
35374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y:  a second value
35384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
35394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 values
35404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
35415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
35425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error
35434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
354480b19092f24410a6b869abf519227686e8f207caDaniel Veillardint
35454255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) {
35464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if ((x == NULL) || (y == NULL))
35474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(-2);
35484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
35494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    switch (x->type) {
355080b19092f24410a6b869abf519227686e8f207caDaniel Veillard	case XML_SCHEMAS_UNKNOWN:
355180b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    return(-2);
355280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_INTEGER:
355380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NPINTEGER:
355480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NINTEGER:
355580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NNINTEGER:
355680b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_PINTEGER:
355780b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_INT:
355880b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_UINT:
355980b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_LONG:
356080b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ULONG:
356180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_SHORT:
356280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_USHORT:
356380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_BYTE:
356480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_UBYTE:
35654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMAS_DECIMAL:
356680b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    if (y->type == x->type)
356780b19092f24410a6b869abf519227686e8f207caDaniel Veillard		return(xmlSchemaCompareDecimals(x, y));
356880b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    if ((y->type == XML_SCHEMAS_DECIMAL) ||
356980b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_INTEGER) ||
357080b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_NPINTEGER) ||
357180b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_NINTEGER) ||
357280b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_NNINTEGER) ||
357380b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_PINTEGER) ||
357480b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_INT) ||
357580b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_UINT) ||
357680b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_LONG) ||
357780b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_ULONG) ||
357880b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_SHORT) ||
357980b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_USHORT) ||
358080b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_BYTE) ||
358180b19092f24410a6b869abf519227686e8f207caDaniel Veillard		(y->type == XML_SCHEMAS_UBYTE))
35824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(xmlSchemaCompareDecimals(x, y));
35835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    return(-2);
3584070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        case XML_SCHEMAS_DURATION:
3585070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (y->type == XML_SCHEMAS_DURATION)
3586070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return(xmlSchemaCompareDurations(x, y));
35875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return(-2);
35885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
35895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
35905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
35915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
35925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
35935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
35945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
35955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
35965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if ((y->type == XML_SCHEMAS_DATETIME)  ||
35975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_TIME)      ||
35985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_GDAY)      ||
35995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_GMONTH)    ||
36005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_GMONTHDAY) ||
36015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_GYEAR)     ||
36025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_DATE)      ||
36035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                (y->type == XML_SCHEMAS_GYEARMONTH))
36045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return (xmlSchemaCompareDates(x, y));
36055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return (-2);
360680b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NORMSTRING:
360780b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_TOKEN:
360880b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_LANGUAGE:
360980b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NMTOKEN:
361080b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NAME:
361180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NCNAME:
361280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ID:
361380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_IDREF:
361480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ENTITY:
361580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NOTATION:
361680b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ANYURI:
3617c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard            if ((y->type == XML_SCHEMAS_NORMSTRING) ||
3618c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_TOKEN) ||
3619c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_LANGUAGE) ||
3620c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_NMTOKEN) ||
3621c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_NAME) ||
3622c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_QNAME) ||
3623c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_NCNAME) ||
3624c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_ID) ||
3625c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_IDREF) ||
3626c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_ENTITY) ||
3627c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_NOTATION) ||
3628c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                (y->type == XML_SCHEMAS_ANYURI))
3629c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard                return (xmlSchemaCompareNormStrings(x, y));
3630c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard            return (-2);
3631e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_QNAME:
3632e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard            if (y->type == XML_SCHEMAS_QNAME) {
3633e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) &&
3634e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    (xmlStrEqual(x->value.qname.uri, y->value.qname.uri)))
3635e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    return(0);
3636e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		return(2);
3637e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    }
3638e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (-2);
3639c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_FLOAT:
3640c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_DOUBLE:
3641b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard            if ((y->type == XML_SCHEMAS_FLOAT) ||
3642b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard                (y->type == XML_SCHEMAS_DOUBLE))
3643b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard                return (xmlSchemaCompareFloats(x, y));
3644b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard            return (-2);
3645c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_BOOLEAN:
3646b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard            if (y->type == XML_SCHEMAS_BOOLEAN) {
3647b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (x->value.b == y->value.b)
3648b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    return(0);
3649b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (x->value.b == 0)
3650b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    return(-1);
3651b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		return(1);
3652b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
3653b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return (-2);
3654560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard        case XML_SCHEMAS_HEXBINARY:
365570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard            if (y->type == XML_SCHEMAS_HEXBINARY) {
365670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	        if (x->value.hex.total == y->value.hex.total) {
365770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    int ret = xmlStrcmp(x->value.hex.str, y->value.hex.str);
365870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    if (ret > 0)
365970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard			return(1);
366070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    else if (ret == 0)
366170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard			return(0);
366270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		}
366370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		else if (x->value.hex.total > y->value.hex.total)
366470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    return(1);
366570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
366670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		return(-1);
366770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard            }
3668560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard            return (-2);
36691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BASE64BINARY:
36701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (y->type == XML_SCHEMAS_BASE64BINARY) {
36711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (x->value.base64.total == y->value.base64.total) {
36721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int ret = xmlStrcmp(x->value.base64.str,
36731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		                        y->value.base64.str);
36741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (ret > 0)
36751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        return(1);
36761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (ret == 0)
36771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        return(0);
36781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
36791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else if (x->value.base64.total > y->value.base64.total)
36801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    return(1);
36811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else
36821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    return(-1);
36831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
36841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            return (-2);
3685c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_STRING:
3686c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_IDREFS:
3687c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ENTITIES:
3688c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NMTOKENS:
3689c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    TODO
3690c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    break;
369196d2effc735fb45cfa363b6a876ff23a862f87a5William M. Brack	case XML_SCHEMAS_ANYTYPE:
369296d2effc735fb45cfa363b6a876ff23a862f87a5William M. Brack	case XML_SCHEMAS_ANYSIMPLETYPE:
369396d2effc735fb45cfa363b6a876ff23a862f87a5William M. Brack	    break;
36944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
36955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return -2;
36964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
36974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
36984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
3699c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaNormLen:
3700c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @value:  a string
3701c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
3702c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Computes the UTF8 length of the normalized value of the string
3703c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
3704c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns the length or -1 in case of error.
3705c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */
3706c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int
3707c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaNormLen(const xmlChar *value) {
3708c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    const xmlChar *utf;
3709c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    int ret = 0;
3710c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
3711c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    if (value == NULL)
3712c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	return(-1);
3713c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    utf = value;
371476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while (IS_BLANK_CH(*utf)) utf++;
3715c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    while (*utf != 0) {
3716c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	if (utf[0] & 0x80) {
3717c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if ((utf[1] & 0xc0) != 0x80)
3718c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(-1);
3719c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if ((utf[0] & 0xe0) == 0xe0) {
3720c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		if ((utf[2] & 0xc0) != 0x80)
3721c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    return(-1);
3722c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		if ((utf[0] & 0xf0) == 0xf0) {
3723c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80)
3724c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard			return(-1);
3725c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    utf += 4;
3726c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		} else {
3727c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    utf += 3;
3728c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		}
3729c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    } else {
3730c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		utf += 2;
3731c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    }
373276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	} else if (IS_BLANK_CH(*utf)) {
373376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*utf)) utf++;
3734c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (*utf == 0)
3735c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		break;
3736c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	} else {
3737c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    utf++;
3738c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	}
3739c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	ret++;
3740c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
3741c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    return(ret);
3742c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard}
3743c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
3744c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardunsigned long
3745c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaGetFacetValueAsULong(xmlSchemaFacetPtr facet)
3746c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{
3747c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    /*
3748c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    * TODO: Check if this is a decimal.
3749c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    */
3750c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    return ((unsigned long) facet->val->value.decimal.lo);
3751c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
3752c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
3753c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/**
375401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateListSimpleTypeFacet:
375501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facet:  the facet to check
375601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @value:  the lexical repr of the value to validate
375701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @actualLen:  the number of list items
375801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @expectedLen: the resulting expected number of list items
375901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
376001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Checks the value of a list simple type against a facet.
376101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
376201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 0 if the value is valid, a positive error code
376301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * number otherwise and -1 in case of an internal error.
376401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
376501fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint
376601fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaValidateListSimpleTypeFacet(xmlSchemaFacetPtr facet,
376701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     const xmlChar *value,
376801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     unsigned long actualLen,
376901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     unsigned long *expectedLen)
377001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
377101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    /*
377201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * TODO: Check if this will work with large numbers.
377301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * (compare value.decimal.mi and value.decimal.hi as well?).
377401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
377501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
377601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen != facet->val->value.decimal.lo) {
3777c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    if (expectedLen != 0)
3778c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
377901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_LENGTH_VALID);
378001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
378101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
378201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen < facet->val->value.decimal.lo) {
3783c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    if (expectedLen != 0)
3784c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
378501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_MINLENGTH_VALID);
378601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
378701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MAXLENGTH) {
378801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen > facet->val->value.decimal.lo) {
3789c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    if (expectedLen != 0)
3790c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
379101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_MAXLENGTH_VALID);
379201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
379301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else
379401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	/*
379501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	* NOTE: That we can pass NULL as xmlSchemaValPtr to
379601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	* xmlSchemaValidateFacet, since the remaining facet types
379701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	* are: XML_SCHEMA_FACET_PATTERN, XML_SCHEMA_FACET_ENUMERATION.
379801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	*/
379901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	return(xmlSchemaValidateFacet(NULL, facet, value, NULL));
380001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    return (0);
380101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
380201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
380301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
38044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaValidateFacet:
3805c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type:  the built-in type
3806c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @facet:  the facet to check
3807c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value:  the lexical repr. of the value to be validated
3808c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val:  the precomputed value
3809c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @length: the actual length of the value
3810c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
3811c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength"
3812c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * facet; sets @length to the computed length of @value.
3813c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
3814c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if the value is valid, a positive error code
3815c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * otherwise and -1 in case of an internal or API error.
3816c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */
3817c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardint
3818c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaValidateLengthFacet(xmlSchemaTypePtr type,
3819c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard			     xmlSchemaFacetPtr facet,
3820c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard			     const xmlChar *value,
3821c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard			     xmlSchemaValPtr val,
3822c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard			     unsigned long *length)
3823c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{
3824c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    unsigned int len = 0;
3825c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
3826c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    *length = 0;
3827c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((facet->type != XML_SCHEMA_FACET_LENGTH) &&
3828c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->type != XML_SCHEMA_FACET_MAXLENGTH) &&
3829c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->type != XML_SCHEMA_FACET_MINLENGTH))
3830c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	return (-1);
3831c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
3832c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((facet->val == NULL) ||
3833c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	((facet->val->type != XML_SCHEMAS_DECIMAL) &&
3834c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
3835c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->val->value.decimal.frac != 0)) {
3836c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	return(-1);
3837c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
3838c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY))
3839c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	len = val->value.hex.total;
3840c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY))
3841c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	len = val->value.base64.total;
3842c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    else {
3843c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	switch (type->builtInType) {
3844c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_IDREF:
3845c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NORMSTRING:
3846c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_TOKEN:
3847c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_LANGUAGE:
3848c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NMTOKEN:
3849c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NAME:
3850c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NCNAME:
3851c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_ID:
3852c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		len = xmlSchemaNormLen(value);
3853c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		break;
3854c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_STRING:
3855c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    /*
3856c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    * FIXME: What exactly to do with anyURI?
3857c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    */
3858c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_ANYURI:
3859c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		if (value != NULL)
3860c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		    len = xmlUTF8Strlen(value);
3861c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		break;
3862c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    default:
3863c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		TODO
3864c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	}
3865c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
3866c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    *length = (unsigned long) len;
3867c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
3868c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len != facet->val->value.decimal.lo)
3869c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_LENGTH_VALID);
3870c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
3871c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len < facet->val->value.decimal.lo)
3872c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_MINLENGTH_VALID);
3873c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    } else {
3874c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len > facet->val->value.decimal.lo)
3875c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXLENGTH_VALID);
3876c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
3877c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
3878c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    return (0);
3879c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
3880c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
3881c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/**
3882c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaValidateFacet:
388301c13b5be2d249ef66d86585adee87901bb8efa2Daniel Veillard * @base:  the base type
38844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @facet:  the facet to check
38854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value:  the lexical repr of the value to validate
38864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val:  the precomputed value
38874255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
38884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Check a value against a facet condition
38894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
38904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if the element is schemas valid, a positive error code
38914255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *     number otherwise and -1 in case of internal or API error.
38924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
38934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardint
3894dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateFacet(xmlSchemaTypePtr base ATTRIBUTE_UNUSED,
3895118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	               xmlSchemaFacetPtr facet,
38964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	               const xmlChar *value, xmlSchemaValPtr val)
38974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{
38984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    int ret;
38994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
39004255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    switch (facet->type) {
39014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMA_FACET_PATTERN:
39024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    ret = xmlRegexpExec(facet->regexp, value);
39034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == 1)
39044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(0);
39054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == 0) {
390601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return(XML_SCHEMAV_CVC_PATTERN_VALID);
39074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    }
39084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    return(ret);
39094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMA_FACET_MAXEXCLUSIVE:
39104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
39114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == -2) {
39128bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		/* TODO error code */
39134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(-1);
39144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    }
39154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == -1)
39164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(0);
39175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    /* error code */
391801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID);
3919070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MAXINCLUSIVE:
3920070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
3921070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret == -2) {
39228bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		/* TODO error code */
3923070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
3924070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }
3925070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((ret == -1) || (ret == 0))
3926070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
39275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    /* error code */
392801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID);
3929070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MINEXCLUSIVE:
3930070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
3931070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret == -2) {
39328bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		/* TODO error code */
3933070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
3934070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }
3935070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret == 1)
3936070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
39375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    /* error code */
393801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID);
3939070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MININCLUSIVE:
3940070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
3941070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret == -2) {
39428bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		/* TODO error code */
3943070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
3944070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }
3945070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((ret == 1) || (ret == 0))
3946070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
39475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    /* error code */
394801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MININCLUSIVE_VALID);
39498651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard	case XML_SCHEMA_FACET_WHITESPACE:
39508bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    /* TODO whitespaces */
395101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    /*
395201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * NOTE: Whitespace should be handled to normalize
395301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * the value to be validated against a the facets;
395401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * not to normalize the value in-between.
395501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    */
39568651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard	    return(0);
39578bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case  XML_SCHEMA_FACET_ENUMERATION:
39588bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    if ((facet->value != NULL) &&
39598bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		(xmlStrEqual(facet->value, value)))
39608bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		return(0);
396101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_ENUMERATION_VALID);
39628bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case XML_SCHEMA_FACET_LENGTH:
3963e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard	case XML_SCHEMA_FACET_MAXLENGTH:
39648bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case XML_SCHEMA_FACET_MINLENGTH: {
39658bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    unsigned int len = 0;
3966e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard
39678bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    if ((facet->val == NULL) ||
3968e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		((facet->val->type != XML_SCHEMAS_DECIMAL) &&
3969e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
39708bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		(facet->val->value.decimal.frac != 0)) {
39718bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		return(-1);
39728bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    }
3973560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY))
397470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		len = val->value.hex.total;
39751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	    else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY))
39761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		len = val->value.base64.total;
39771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	    else {
397801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		switch (base->builtInType) {
3979560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    	    case XML_SCHEMAS_IDREF:
3980560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NORMSTRING:
3981560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_TOKEN:
3982560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_LANGUAGE:
3983560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NMTOKEN:
3984560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NAME:
3985560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NCNAME:
3986560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_ID:
398770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    	len = xmlSchemaNormLen(value);
398870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    	break;
3989560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_STRING:
399001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    /*
399101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    * FIXME: What exactly to do with anyURI?
399201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    */
399301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    case XML_SCHEMAS_ANYURI:
3994fbf2c5eaf550a8e7b94e87d5a4940db53bdffeacWilliam M. Brack		        if (value != NULL)
3995fbf2c5eaf550a8e7b94e87d5a4940db53bdffeacWilliam M. Brack			    len = xmlUTF8Strlen(value);
399670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    	break;
3997560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    default:
3998560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		        TODO
399970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	    	}
40008bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    }
40018bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
4002e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len != facet->val->value.decimal.lo)
400301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_LENGTH_VALID);
40048bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
4005e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len < facet->val->value.decimal.lo)
400601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_MINLENGTH_VALID);
40078bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    } else {
4008e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len > facet->val->value.decimal.lo)
400901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_MAXLENGTH_VALID);
4010e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard	    }
40118bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    break;
40128bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	}
4013560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	case XML_SCHEMA_FACET_TOTALDIGITS:
4014560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	case XML_SCHEMA_FACET_FRACTIONDIGITS:
4015560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
4016560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((facet->val == NULL) ||
4017560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		((facet->val->type != XML_SCHEMAS_DECIMAL) &&
4018560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
4019560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		(facet->val->value.decimal.frac != 0)) {
4020560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		return(-1);
4021560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
4022560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((val == NULL) ||
4023560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		((val->type != XML_SCHEMAS_DECIMAL) &&
4024560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_INTEGER) &&
4025560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NPINTEGER) &&
4026560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NINTEGER) &&
4027560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NNINTEGER) &&
4028560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_PINTEGER) &&
4029560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_INT) &&
4030560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_UINT) &&
4031560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_LONG) &&
4032560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_ULONG) &&
4033560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_SHORT) &&
4034560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_USHORT) &&
4035560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_BYTE) &&
4036560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_UBYTE))) {
4037560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		return(-1);
4038560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
4039560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) {
4040560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	        if (val->value.decimal.total > facet->val->value.decimal.lo)
404101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	            return(XML_SCHEMAV_CVC_TOTALDIGITS_VALID);
4042560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
4043560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) {
4044560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	        if (val->value.decimal.frac > facet->val->value.decimal.lo)
404501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID);
4046560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
4047560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    break;
40484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	default:
40494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    TODO
40504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
40514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return(0);
4052b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
40534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
40544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
40554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#endif /* LIBXML_SCHEMAS_ENABLED */
4056