xmlschemastypes.c revision 5e9576a492e4fb8c2d517ccd6056a139e801ec9f
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
31c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifdef HAVE_FLOAT_H
32c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#include <float.h>
33c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif
34070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define DEBUG
364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
37d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillard#ifndef LIBXML_XPATH_ENABLED
38d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillardextern double xmlXPathNAN;
39d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillardextern double xmlXPathPINF;
40d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillardextern double xmlXPathNINF;
41d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillard#endif
42d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillard
434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define TODO 								\
444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlGenericError(xmlGenericErrorContext,				\
454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    "Unimplemented block at %s:%d\n",				\
464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard            __FILE__, __LINE__);
474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define XML_SCHEMAS_NAMESPACE_NAME \
494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    (const xmlChar *)"http://www.w3.org/2001/XMLSchema"
504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik#define IS_WSP_REPLACE_CH(c)	((((c) == 0x9) || ((c) == 0xa)) || \
526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				 ((c) == 0xd))
536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik#define IS_WSP_SPACE_CH(c)	((c) == 0x20)
556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
56478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik#define IS_WSP_BLANK_CH(c) IS_BLANK_CH(c)
57478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik
58070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* Date value */
59070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef struct _xmlSchemaValDate xmlSchemaValDate;
60070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef xmlSchemaValDate *xmlSchemaValDatePtr;
61070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstruct _xmlSchemaValDate {
62070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long		year;
63070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	mon	:4;	/* 1 <=  mon    <= 12   */
64070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	day	:5;	/* 1 <=  day    <= 31   */
65070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	hour	:5;	/* 0 <=  hour   <= 23   */
66070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	min	:6;	/* 0 <=  min    <= 59	*/
67070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    double		sec;
68a77cf71f453249f224d609f2f20789a897c5bdebDaniel Veillard    unsigned int	tz_flag	:1;	/* is tzo explicitely set? */
69285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik    signed int		tzo	:12;	/* -1440 <= tzo <= 1440;
70285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik					   currently only -840 to +840 are needed */
71070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard};
72070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
73070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* Duration value */
74070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef struct _xmlSchemaValDuration xmlSchemaValDuration;
75070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef xmlSchemaValDuration *xmlSchemaValDurationPtr;
76070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstruct _xmlSchemaValDuration {
77070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long	        mon;		/* mon stores years also */
78070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long        	day;
79070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    double		sec;            /* sec stores min and hour also */
80070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard};
81070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardtypedef struct _xmlSchemaValDecimal xmlSchemaValDecimal;
834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardtypedef xmlSchemaValDecimal *xmlSchemaValDecimalPtr;
844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstruct _xmlSchemaValDecimal {
854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    /* would use long long but not portable */
86e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long lo;
87e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long mi;
88e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long hi;
894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    unsigned int extra;
905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    unsigned int sign:1;
91c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack    unsigned int frac:7;
92c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack    unsigned int total:8;
934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard};
944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
95e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardtypedef struct _xmlSchemaValQName xmlSchemaValQName;
96e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardtypedef xmlSchemaValQName *xmlSchemaValQNamePtr;
97e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstruct _xmlSchemaValQName {
98e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    xmlChar *name;
99e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    xmlChar *uri;
100e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard};
101e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
10270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardtypedef struct _xmlSchemaValHex xmlSchemaValHex;
10370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardtypedef xmlSchemaValHex *xmlSchemaValHexPtr;
10470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardstruct _xmlSchemaValHex {
10570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard    xmlChar     *str;
10670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard    unsigned int total;
10770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard};
10870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
1091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardtypedef struct _xmlSchemaValBase64 xmlSchemaValBase64;
1101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardtypedef xmlSchemaValBase64 *xmlSchemaValBase64Ptr;
1111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstruct _xmlSchemaValBase64 {
1121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    xmlChar     *str;
1131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    unsigned int total;
1141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard};
1151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
1164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstruct _xmlSchemaVal {
1174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValType type;
1184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    struct _xmlSchemaVal *next;
1194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    union {
1205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	xmlSchemaValDecimal     decimal;
121070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xmlSchemaValDate        date;
122070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xmlSchemaValDuration    dur;
123e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	xmlSchemaValQName	qname;
12470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	xmlSchemaValHex		hex;
1251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	xmlSchemaValBase64	base64;
12684d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard	float			f;
12784d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard	double			d;
128c5a70f264550ee39da267e81dccd95508ed367ddDaniel Veillard	int			b;
129c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	xmlChar                *str;
1304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    } value;
1314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard};
1324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
1334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int xmlSchemaTypesInitialized = 0;
1344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlHashTablePtr xmlSchemaTypesBank = NULL;
1354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
136c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard/*
137c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * Basic types
138c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */
1394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeStringDef = NULL;
1404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnyTypeDef = NULL;
1414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnySimpleTypeDef = NULL;
1424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDecimalDef = NULL;
143070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDatetimeDef = NULL;
1444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDateDef = NULL;
145070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeTimeDef = NULL;
146070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGYearDef = NULL;
147070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGYearMonthDef = NULL;
148070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGDayDef = NULL;
149070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGMonthDayDef = NULL;
150070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGMonthDef = NULL;
151070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDurationDef = NULL;
15284d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeFloatDef = NULL;
153c5a70f264550ee39da267e81dccd95508ed367ddDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeBooleanDef = NULL;
15484d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDoubleDef = NULL;
155560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeHexBinaryDef = NULL;
1561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeBase64BinaryDef = NULL;
157e5b110b3844d58ff4bea56bcb699144f6fbe0b83Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnyURIDef = NULL;
1584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
1594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/*
160c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * Derived types
161c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */
162c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypePositiveIntegerDef = NULL;
163c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNonPositiveIntegerDef = NULL;
164c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNegativeIntegerDef = NULL;
165c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNonNegativeIntegerDef = NULL;
166c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIntegerDef = NULL;
167c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeLongDef = NULL;
168c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIntDef = NULL;
169c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeShortDef = NULL;
170c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeByteDef = NULL;
171c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedLongDef = NULL;
172c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedIntDef = NULL;
173c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedShortDef = NULL;
174c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedByteDef = NULL;
1758bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNormStringDef = NULL;
1768bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeTokenDef = NULL;
1778bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeLanguageDef = NULL;
1788bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNameDef = NULL;
1798bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeQNameDef = NULL;
180e5b110b3844d58ff4bea56bcb699144f6fbe0b83Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNCNameDef = NULL;
1818bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdDef = NULL;
1828bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdrefDef = NULL;
1838bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdrefsDef = NULL;
184a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeEntityDef = NULL;
185a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeEntitiesDef = NULL;
186e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNotationDef = NULL;
1878bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNmtokenDef = NULL;
1888bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNmtokensDef = NULL;
189c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard
190d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/************************************************************************
191d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *									*
192d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * 			Datatype error handlers				*
193d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *									*
194d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard ************************************************************************/
195d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/**
196d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * xmlSchemaTypeErrMemory:
197d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * @extra:  extra informations
198d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *
199d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * Handle an out of memory condition
200d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard */
201d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillardstatic void
202d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel VeillardxmlSchemaTypeErrMemory(xmlNodePtr node, const char *extra)
203d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard{
204d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard    __xmlSimpleError(XML_FROM_DATATYPE, XML_ERR_NO_MEMORY, node, NULL, extra);
205d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard}
206d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard
207d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/************************************************************************
208d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *									*
209d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * 			Base types support				*
210d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *									*
211d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard ************************************************************************/
2124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
2134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik/**
2144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * xmlSchemaNewValue:
2154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * @type:  the value type
2164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *
2174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Allocate a new simple type value
2184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *
2194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error
2204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */
2214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikstatic xmlSchemaValPtr
2224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaNewValue(xmlSchemaValType type) {
2234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaValPtr value;
2244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
2254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    value = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal));
2264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (value == NULL) {
2274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return(NULL);
2284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    }
2294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    memset(value, 0, sizeof(xmlSchemaVal));
2304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    value->type = type;
2314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return(value);
2324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
2334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
2344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikstatic xmlSchemaFacetPtr
2354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaNewMinLengthFacet(int value)
2364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{
2374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaFacetPtr ret;
2384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
2394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret = xmlSchemaNewFacet();
2404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->type = XML_SCHEMA_FACET_MINLENGTH;
2414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->val = xmlSchemaNewValue(XML_SCHEMAS_NNINTEGER);
2424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->val->value.decimal.lo = value;
2434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (ret);
2444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
2454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
246c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard/*
2474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitBasicType:
2484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name:  the type name
2498bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard * @type:  the value type associated
2504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
25101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Initialize one primitive built-in type
2524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
2534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr
25401fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaInitBasicType(const char *name, xmlSchemaValType type,
25501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		       xmlSchemaTypePtr baseType) {
2564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypePtr ret;
2574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
2584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType));
2594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (ret == NULL) {
260d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard        xmlSchemaTypeErrMemory(NULL, "could not initialize basic types");
2614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(NULL);
2624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
2634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    memset(ret, 0, sizeof(xmlSchemaType));
264be9c6320d4ed8d5622322014310555bb88b02a85Daniel Veillard    ret->name = (const xmlChar *)name;
2654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->targetNamespace = XML_SCHEMAS_NAMESPACE_NAME;
2664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    ret->type = XML_SCHEMA_TYPE_BASIC;
2674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->baseType = baseType;
2684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->contentType = XML_SCHEMA_CONTENT_BASIC;
26901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    /*
2704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    * Primitive types.
27101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
2724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    switch (type) {
27301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_STRING:
27401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DECIMAL:
27501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATE:
27601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATETIME:
27701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TIME:
27801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEAR:
27901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEARMONTH:
28001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTH:
28101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTHDAY:
28201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GDAY:
28301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DURATION:
28401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_FLOAT:
28501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DOUBLE:
28601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BOOLEAN:
28701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYURI:
28801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_HEXBINARY:
28901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BASE64BINARY:
29001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_QNAME:
29101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NOTATION:
29201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    ret->flags |= XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE;
2934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
29496d2effc735fb45cfa363b6a876ff23a862f87a5William M. Brack	default:
2954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
2964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    }
2974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    /*
2984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    * Set variety.
2994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    */
3004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    switch (type) {
3014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_ANYTYPE:
3024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_ANYSIMPLETYPE:
3034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
3044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_IDREFS:
3054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_NMTOKENS:
3064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_ENTITIES:
3074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    ret->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST;
3084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    ret->facets = xmlSchemaNewMinLengthFacet(1);
3094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    ret->flags |= XML_SCHEMAS_TYPE_HAS_FACETS;
3104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
3114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	default:
3124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    ret->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC;
3134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
31401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
3154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlHashAddEntry2(xmlSchemaTypesBank, ret->name,
3164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	             XML_SCHEMAS_NAMESPACE_NAME, ret);
31701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    ret->builtInType = type;
3184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return(ret);
3194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
3204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
3214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/*
32211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* WARNING: Those type reside normally in xmlschemas.c but are
32311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* redefined here locally in oder of being able to use them for xs:anyType-
32411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* TODO: Remove those definition if we move the types to a header file.
32511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* TODO: Always keep those structs up-to-date with the originals.
32611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik*/
32711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik#define UNBOUNDED (1 << 30)
32811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik
32911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef struct _xmlSchemaTreeItem xmlSchemaTreeItem;
33011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef xmlSchemaTreeItem *xmlSchemaTreeItemPtr;
33111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstruct _xmlSchemaTreeItem {
33211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTypeType type;
33311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaAnnotPtr annot;
33411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTreeItemPtr next;
33511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTreeItemPtr children;
33611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik};
33711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik
33811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef struct _xmlSchemaParticle xmlSchemaParticle;
33911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef xmlSchemaParticle *xmlSchemaParticlePtr;
34011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstruct _xmlSchemaParticle {
34111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTypeType type;
34211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaAnnotPtr annot;
34311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTreeItemPtr next;
34411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTreeItemPtr children;
34511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    int minOccurs;
34611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    int maxOccurs;
34711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlNodePtr node;
34811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik};
34911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik
35011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef struct _xmlSchemaModelGroup xmlSchemaModelGroup;
35111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef xmlSchemaModelGroup *xmlSchemaModelGroupPtr;
35211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstruct _xmlSchemaModelGroup {
35311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTypeType type;
35411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaAnnotPtr annot;
35511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTreeItemPtr next;
35611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTreeItemPtr children;
35711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlNodePtr node;
35811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik};
35911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik
36011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstatic xmlSchemaParticlePtr
36111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. BuchcikxmlSchemaAddParticle(void)
36211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik{
36311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaParticlePtr ret = NULL;
36411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik
36511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    ret = (xmlSchemaParticlePtr)
36611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlMalloc(sizeof(xmlSchemaParticle));
36711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    if (ret == NULL) {
36811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlSchemaTypeErrMemory(NULL, "allocating particle component");
36911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	return (NULL);
37011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    }
37111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    memset(ret, 0, sizeof(xmlSchemaParticle));
37211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    ret->type = XML_SCHEMA_TYPE_PARTICLE;
37311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    ret->minOccurs = 1;
37411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    ret->maxOccurs = 1;
37511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    return (ret);
37611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik}
37711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik
37811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik/*
3794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitTypes:
3804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
3814255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Initialize the default XML Schemas type library
3824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
3834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid
3846560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel VeillardxmlSchemaInitTypes(void)
3856560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard{
3864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized != 0)
3876560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        return;
3884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypesBank = xmlHashCreate(40);
3896560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard
39001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
391c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard    /*
39201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * 3.4.7 Built-in Complex Type Definition
39301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
3948bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeAnyTypeDef = xmlSchemaInitBasicType("anyType",
3952f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack                                                     XML_SCHEMAS_ANYTYPE,
39601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     NULL);
39701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeAnyTypeDef->baseType = xmlSchemaTypeAnyTypeDef;
39801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED;
39911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    /*
40011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    * Init the content type.
40111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    */
40211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED;
40301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    {
40411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlSchemaParticlePtr particle;
40511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlSchemaModelGroupPtr sequence;
40601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaWildcardPtr wild;
40711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* First particle. */
40811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	particle = xmlSchemaAddParticle();
40911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	if (particle == NULL)
41011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    return;
41111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlSchemaTypeAnyTypeDef->subtypes = (xmlSchemaTypePtr) particle;
41211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* Sequence model group. */
41311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	sequence = (xmlSchemaModelGroupPtr)
41411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    xmlMalloc(sizeof(xmlSchemaModelGroup));
41511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	if (sequence == NULL) {
41611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    xmlSchemaTypeErrMemory(NULL, "allocating model group component");
41711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    return;
41811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	}
41911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	memset(sequence, 0, sizeof(xmlSchemaModelGroup));
42011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	sequence->type = XML_SCHEMA_TYPE_SEQUENCE;
42111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	particle->children = (xmlSchemaTreeItemPtr) sequence;
42211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* Second particle. */
42311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	particle = xmlSchemaAddParticle();
42411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	if (particle == NULL)
42511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    return;
42611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	particle->minOccurs = 0;
42711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	particle->maxOccurs = UNBOUNDED;
42811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	sequence->children = (xmlSchemaTreeItemPtr) particle;
42911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* The wildcard */
43011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard));
43111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	if (wild == NULL) {
43211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    xmlSchemaTypeErrMemory(NULL, "allocating wildcard component");
43311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    return;
43411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	}
43511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	memset(wild, 0, sizeof(xmlSchemaWildcard));
43611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	wild->type = XML_SCHEMA_TYPE_ANY;
43769dea3a0c01e8a952b1d2f07ab0a3aa450f0cdfeKasimier T. Buchcik	wild->any = 1;
43811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	wild->processContents = XML_SCHEMAS_ANY_LAX;
43911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	particle->children = (xmlSchemaTreeItemPtr) wild;
44011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/*
44111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	* Create the attribute wildcard.
44211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	*/
44301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard));
44401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (wild == NULL) {
44511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    xmlSchemaTypeErrMemory(NULL, "could not create an attribute "
44611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik		"wildcard on anyType");
44701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return;
44801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
44901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	memset(wild, 0, sizeof(xmlSchemaWildcard));
45001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	wild->any = 1;
45169dea3a0c01e8a952b1d2f07ab0a3aa450f0cdfeKasimier T. Buchcik	wild->processContents = XML_SCHEMAS_ANY_LAX;
45201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeAnyTypeDef->attributeWildcard = wild;
45301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
45401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeAnySimpleTypeDef = xmlSchemaInitBasicType("anySimpleType",
4552f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack                                                           XML_SCHEMAS_ANYSIMPLETYPE,
45601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard							   xmlSchemaTypeAnyTypeDef);
45701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    /*
45801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * primitive datatypes
45901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
46001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeStringDef = xmlSchemaInitBasicType("string",
46101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_STRING,
46201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
4638bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDecimalDef = xmlSchemaInitBasicType("decimal",
46401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_DECIMAL,
46501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeAnySimpleTypeDef);
4668bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDateDef = xmlSchemaInitBasicType("date",
46701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_DATE,
46801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeAnySimpleTypeDef);
4698bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDatetimeDef = xmlSchemaInitBasicType("dateTime",
47001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_DATETIME,
47101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						      xmlSchemaTypeAnySimpleTypeDef);
4728bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeTimeDef = xmlSchemaInitBasicType("time",
47301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_TIME,
47401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeAnySimpleTypeDef);
4758bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGYearDef = xmlSchemaInitBasicType("gYear",
47601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_GYEAR,
47701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeAnySimpleTypeDef);
4788bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGYearMonthDef = xmlSchemaInitBasicType("gYearMonth",
47901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                        XML_SCHEMAS_GYEARMONTH,
48001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard							xmlSchemaTypeAnySimpleTypeDef);
4818bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGMonthDef = xmlSchemaInitBasicType("gMonth",
48201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_GMONTH,
48301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
4848bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGMonthDayDef = xmlSchemaInitBasicType("gMonthDay",
48501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                       XML_SCHEMAS_GMONTHDAY,
48601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						       xmlSchemaTypeAnySimpleTypeDef);
4878bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGDayDef = xmlSchemaInitBasicType("gDay",
48801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_GDAY,
48901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeAnySimpleTypeDef);
4908bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDurationDef = xmlSchemaInitBasicType("duration",
49101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_DURATION,
49201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						      xmlSchemaTypeAnySimpleTypeDef);
4938bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float",
49401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_FLOAT,
49501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeAnySimpleTypeDef);
4968bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double",
49701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_DOUBLE,
49801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
4998bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeBooleanDef = xmlSchemaInitBasicType("boolean",
50001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_BOOLEAN,
50101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeAnySimpleTypeDef);
5028bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeAnyURIDef = xmlSchemaInitBasicType("anyURI",
50301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_ANYURI,
50401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
505560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard    xmlSchemaTypeHexBinaryDef = xmlSchemaInitBasicType("hexBinary",
50601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_HEXBINARY,
50701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeAnySimpleTypeDef);
5081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    xmlSchemaTypeBase64BinaryDef
50901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        = xmlSchemaInitBasicType("base64Binary", XML_SCHEMAS_BASE64BINARY,
51001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeAnySimpleTypeDef);
51101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNotationDef = xmlSchemaInitBasicType("NOTATION",
51201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_NOTATION,
51301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
51401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeQNameDef = xmlSchemaInitBasicType("QName",
51501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_QNAME,
51601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeAnySimpleTypeDef);
5174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
518c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard    /*
519c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard     * derived datatypes
520c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard     */
5218bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeIntegerDef = xmlSchemaInitBasicType("integer",
52201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_INTEGER,
52301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeDecimalDef);
5246560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeNonPositiveIntegerDef =
5256560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        xmlSchemaInitBasicType("nonPositiveInteger",
52601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                               XML_SCHEMAS_NPINTEGER,
52701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard			       xmlSchemaTypeIntegerDef);
5286560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeNegativeIntegerDef =
52901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("negativeInteger", XML_SCHEMAS_NINTEGER,
53001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeNonPositiveIntegerDef);
5316560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeLongDef =
53201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("long", XML_SCHEMAS_LONG,
53301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeIntegerDef);
53401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeIntDef = xmlSchemaInitBasicType("int", XML_SCHEMAS_INT,
53501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeLongDef);
5368bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeShortDef = xmlSchemaInitBasicType("short",
53701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_SHORT,
53801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeIntDef);
5398bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeByteDef = xmlSchemaInitBasicType("byte",
54001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_BYTE,
54101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeShortDef);
5426560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeNonNegativeIntegerDef =
5436560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        xmlSchemaInitBasicType("nonNegativeInteger",
54401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                               XML_SCHEMAS_NNINTEGER,
54501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard			       xmlSchemaTypeIntegerDef);
5466560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedLongDef =
54701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedLong", XML_SCHEMAS_ULONG,
54801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeNonNegativeIntegerDef);
5496560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedIntDef =
55001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedInt", XML_SCHEMAS_UINT,
55101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeUnsignedLongDef);
5526560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedShortDef =
55301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedShort", XML_SCHEMAS_USHORT,
55401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeUnsignedIntDef);
5556560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedByteDef =
55601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedByte", XML_SCHEMAS_UBYTE,
55701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeUnsignedShortDef);
5586560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypePositiveIntegerDef =
55901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("positiveInteger", XML_SCHEMAS_PINTEGER,
56001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeNonNegativeIntegerDef);
5618bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeNormStringDef = xmlSchemaInitBasicType("normalizedString",
56201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                        XML_SCHEMAS_NORMSTRING,
56301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard							xmlSchemaTypeStringDef);
5648bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeTokenDef = xmlSchemaInitBasicType("token",
56501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_TOKEN,
56601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeNormStringDef);
5678bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeLanguageDef = xmlSchemaInitBasicType("language",
56801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_LANGUAGE,
56901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						      xmlSchemaTypeTokenDef);
57001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNameDef = xmlSchemaInitBasicType("Name",
57101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_NAME,
57201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeTokenDef);
57301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNmtokenDef = xmlSchemaInitBasicType("NMTOKEN",
57401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_NMTOKEN,
5754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						     xmlSchemaTypeTokenDef);
57601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNCNameDef = xmlSchemaInitBasicType("NCName",
57701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_NCNAME,
57801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeNameDef);
57901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeIdDef = xmlSchemaInitBasicType("ID", XML_SCHEMAS_ID,
5804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						    xmlSchemaTypeNCNameDef);
5818bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeIdrefDef = xmlSchemaInitBasicType("IDREF",
58201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_IDREF,
5834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						   xmlSchemaTypeNCNameDef);
584a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    xmlSchemaTypeEntityDef = xmlSchemaInitBasicType("ENTITY",
58501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_ENTITY,
58601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeNCNameDef);
5874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    /*
5884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    * Derived list types.
5894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    */
5904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    /* ENTITIES */
591a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    xmlSchemaTypeEntitiesDef = xmlSchemaInitBasicType("ENTITIES",
59201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_ENTITIES,
5934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						      xmlSchemaTypeAnySimpleTypeDef);
5944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaTypeEntitiesDef->subtypes = xmlSchemaTypeEntityDef;
5954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    /* IDREFS */
5964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaTypeIdrefsDef = xmlSchemaInitBasicType("IDREFS",
5974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik                                                    XML_SCHEMAS_IDREFS,
5984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						    xmlSchemaTypeAnySimpleTypeDef);
5994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaTypeIdrefsDef->subtypes = xmlSchemaTypeIdrefDef;
6004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
6014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    /* NMTOKENS */
6024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaTypeNmtokensDef = xmlSchemaInitBasicType("NMTOKENS",
6034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik                                                      XML_SCHEMAS_NMTOKENS,
6044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						      xmlSchemaTypeAnySimpleTypeDef);
6054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaTypeNmtokensDef->subtypes = xmlSchemaTypeNmtokenDef;
6064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
6074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypesInitialized = 1;
6084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
6094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
6104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
6114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCleanupTypes:
6124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
6134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library
6144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
6154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid
6164255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCleanupTypes(void) {
6174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
6184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return;
61911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    /*
62011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    * Free xs:anyType.
62111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    */
62211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    {
62311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlSchemaParticlePtr particle;
62411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* Attribute wildcard. */
62511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlSchemaFreeWildcard(xmlSchemaTypeAnyTypeDef->attributeWildcard);
62611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* Content type. */
62711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	particle = (xmlSchemaParticlePtr) xmlSchemaTypeAnyTypeDef->subtypes;
62811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* Wildcard. */
62911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlSchemaFreeWildcard((xmlSchemaWildcardPtr)
63011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    particle->children->children->children);
63111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlFree((xmlSchemaParticlePtr) particle->children->children);
63211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* Sequence model group. */
63311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlFree((xmlSchemaModelGroupPtr) particle->children);
63411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlFree((xmlSchemaParticlePtr) particle);
63511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlSchemaTypeAnyTypeDef->subtypes = NULL;
63611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    }
6374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlHashFree(xmlSchemaTypesBank, (xmlHashDeallocator) xmlSchemaFreeType);
6384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypesInitialized = 0;
6394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
6404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
6414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
6426927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaIsBuiltInTypeFacet:
64301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in type
64401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facetType:  the facet type
64501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
64601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Evaluates if a specific facet can be
64701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * used in conjunction with a type.
64801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
64901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 1 if the facet can be used with the given built-in type,
65001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 0 otherwise and -1 in case the type is not a built-in type.
65101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
65201fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint
65301fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaIsBuiltInTypeFacet(xmlSchemaTypePtr type, int facetType)
65401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
655ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard    if (type == NULL)
656ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard	return (-1);
65701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if (type->type != XML_SCHEMA_TYPE_BASIC)
65801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	return (-1);
65901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type->builtInType) {
66001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BOOLEAN:
66101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_PATTERN) ||
66201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE))
66301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
66401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
66501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (0);
66601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_STRING:
66701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NOTATION:
66801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_QNAME:
66901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYURI:
67001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BASE64BINARY:
67101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_HEXBINARY:
67201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_LENGTH) ||
67301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MINLENGTH) ||
67401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXLENGTH) ||
67501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_PATTERN) ||
67601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_ENUMERATION) ||
67701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE))
67801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
67901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
68001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (0);
68101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DECIMAL:
68201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_TOTALDIGITS) ||
68301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) ||
68401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_PATTERN) ||
68501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE) ||
68601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_ENUMERATION) ||
68701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) ||
68801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) ||
68901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MININCLUSIVE) ||
69001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MINEXCLUSIVE))
69101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
69201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
69301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (0);
69401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TIME:
69501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GDAY:
69601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTH:
69701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTHDAY:
69801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEAR:
69901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEARMONTH:
70001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATE:
70101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATETIME:
70201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DURATION:
70301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_FLOAT:
70401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DOUBLE:
70501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_PATTERN) ||
70601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_ENUMERATION) ||
70701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE) ||
70801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) ||
70901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) ||
71001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MININCLUSIVE) ||
71101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MINEXCLUSIVE))
71201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
71301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
71401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (0);
71501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	default:
716c7e3cc49bade82dba0cda4ae7c07ffcd1e32fe25Daniel Veillard	    break;
71701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
71801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    return (0);
71901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
72001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
72101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
72201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInType:
72301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type:  the type of the built in type
72401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
72501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Gives you the type struct for a built-in
72601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * type by its type id.
72701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
72801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns the type if found, NULL otherwise.
72901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
73001fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr
73101fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInType(xmlSchemaValType type)
73201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
73301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
73401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaInitTypes();
73501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type) {
73601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
73701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYSIMPLETYPE:
73801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeAnySimpleTypeDef);
73901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_STRING:
74001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeStringDef);
74101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NORMSTRING:
74201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNormStringDef);
74301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DECIMAL:
74401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDecimalDef);
74501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TIME:
74601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeTimeDef);
74701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GDAY:
74801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGDayDef);
74901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTH:
75001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGMonthDef);
75101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTHDAY:
75201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    	    return (xmlSchemaTypeGMonthDayDef);
75301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEAR:
75401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGYearDef);
75501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEARMONTH:
75601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGYearMonthDef);
75701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATE:
75801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDateDef);
75901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATETIME:
76001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDatetimeDef);
76101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DURATION:
76201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDurationDef);
76301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_FLOAT:
76401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeFloatDef);
76501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DOUBLE:
76601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDoubleDef);
76701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BOOLEAN:
76801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeBooleanDef);
76901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TOKEN:
77001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeTokenDef);
77101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_LANGUAGE:
77201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeLanguageDef);
77301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NMTOKEN:
77401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNmtokenDef);
77501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NMTOKENS:
77601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNmtokensDef);
77701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NAME:
77801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNameDef);
77901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_QNAME:
78001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeQNameDef);
78101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NCNAME:
78201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNCNameDef);
78301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ID:
78401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdDef);
78501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_IDREF:
78601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdrefDef);
78701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_IDREFS:
78801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdrefsDef);
78901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ENTITY:
79001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeEntityDef);
79101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ENTITIES:
79201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeEntitiesDef);
79301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NOTATION:
79401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNotationDef);
79501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYURI:
79601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeAnyURIDef);
79701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_INTEGER:
79801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIntegerDef);
79901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NPINTEGER:
80001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNonPositiveIntegerDef);
80101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NINTEGER:
80201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNegativeIntegerDef);
80301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NNINTEGER:
80401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNonNegativeIntegerDef);
80501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_PINTEGER:
80601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypePositiveIntegerDef);
80701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_INT:
80801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIntDef);
80901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_UINT:
81001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedIntDef);
81101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_LONG:
81201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeLongDef);
81301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ULONG:
81401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedLongDef);
81501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_SHORT:
81601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeShortDef);
81701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_USHORT:
81801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedShortDef);
81901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BYTE:
82001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeByteDef);
82101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_UBYTE:
82201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedByteDef);
82301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_HEXBINARY:
82401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeHexBinaryDef);
82501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BASE64BINARY:
82601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeBase64BinaryDef);
82701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYTYPE:
82801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeAnyTypeDef);
82901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	default:
83001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (NULL);
83101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
83201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
83301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
8347f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/**
8357f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueAppend:
8367f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @prev: the value
8377f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @cur: the value to be appended
8387f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
8397f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Appends a next sibling to a list of computed values.
8407f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
8417f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns 0 if succeeded and -1 on API errors.
8427f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */
8434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikint
8444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueAppend(xmlSchemaValPtr prev, xmlSchemaValPtr cur) {
8454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
8464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if ((prev == NULL) || (cur == NULL))
8474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return (-1);
8484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    prev->next = cur;
8494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (0);
8504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
8514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
8527f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/**
8537f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetNext:
8547f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @cur: the value
8557f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
8567f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the next sibling of a list of computed values.
8577f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
8587f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns the next value or NULL if there was none, or on
8597f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *         API errors.
8607f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */
8614efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValPtr
8624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetNext(xmlSchemaValPtr cur) {
8634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
8644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (cur == NULL)
8654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return (NULL);
8664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (cur->next);
8674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
8684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
8697f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/**
8707f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetAsString:
8717f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @val: the value
8727f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
8737f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the string value of a computed value.
8747f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
8757f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns the string value or NULL if there was none, or on
8767f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *         API errors.
8777f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */
8784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikconst xmlChar *
8794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetAsString(xmlSchemaValPtr val)
8804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{
8814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (val == NULL)
8824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return (NULL);
8834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    switch (val->type) {
8844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_STRING:
8854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_NORMSTRING:
8864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_ANYSIMPLETYPE:
8874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_TOKEN:
8884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_LANGUAGE:
8894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_NMTOKEN:
8904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_NAME:
8914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_NCNAME:
8924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_ID:
8934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_IDREF:
8944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_ENTITY:
8954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_ANYURI:
8964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    return (BAD_CAST val->value.str);
8974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	default:
8984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
8994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
9004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (NULL);
9014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
9024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
9037f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/**
9047f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetAsBoolean:
9057f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @val: the value
9067f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
9077f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the boolean value of a computed value.
9087f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
9097f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns 1 if true and 0 if false, or in case of an error. Hmm.
9107f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */
9114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikint
9124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetAsBoolean(xmlSchemaValPtr val)
9134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{
9144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if ((val == NULL) || (val->type != XML_SCHEMAS_BOOLEAN))
9154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return (0);
9164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (val->value.b);
9174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
9184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
9194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
9206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaNewStringValue:
9216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @type:  the value type
922b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @value:  the value
9236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
9246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Allocate a new simple type value. The type can be
9252ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * of XML_SCHEMAS_STRING.
9262ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * WARNING: This one is intended to be expanded for other
9272ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * string based types. We need this for anySimpleType as well.
9284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given value is consumed and freed with the struct.
9296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
9306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error
9316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
9326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaValPtr
9336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaNewStringValue(xmlSchemaValType type,
9346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			const xmlChar *value)
9356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
9366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    xmlSchemaValPtr val;
9376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
9386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (type != XML_SCHEMAS_STRING)
9396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return(NULL);
9406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    val = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal));
9416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (val == NULL) {
9426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return(NULL);
9436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
9446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    memset(val, 0, sizeof(xmlSchemaVal));
9456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    val->type = type;
9466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    val->value.str = (xmlChar *) value;
9476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(val);
9486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
9496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
950b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik/**
951b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * xmlSchemaNewNOTATIONValue:
952b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @name:  the notation name
953b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @ns: the notation namespace name or NULL
954b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik *
955b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * Allocate a new NOTATION value.
9564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given values are consumed and freed with the struct.
957b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik *
958b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error
959b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik */
960b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. BuchcikxmlSchemaValPtr
961b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. BuchcikxmlSchemaNewNOTATIONValue(const xmlChar *name,
962b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik			  const xmlChar *ns)
963b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik{
964b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    xmlSchemaValPtr val;
965b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik
966b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    val = xmlSchemaNewValue(XML_SCHEMAS_NOTATION);
967b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    if (val == NULL)
968b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik	return (NULL);
969b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik
97012d37ab63441baf9e03db70168cc1d0d6f1c2373William M. Brack    val->value.qname.name = (xmlChar *)name;
971b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    if (ns != NULL)
97212d37ab63441baf9e03db70168cc1d0d6f1c2373William M. Brack	val->value.qname.uri = (xmlChar *)ns;
973b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    return(val);
974b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik}
9756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
9766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
9774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * xmlSchemaNewQNameValue:
9784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * @namespaceName: the namespace name
9794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * @localName: the local name
9804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *
9814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Allocate a new QName value.
9824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given values are consumed and freed with the struct.
9834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *
9844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of an error.
9854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */
9864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValPtr
9874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaNewQNameValue(const xmlChar *namespaceName,
9884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		       const xmlChar *localName)
9894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{
9904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaValPtr val;
9914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
9924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    val = xmlSchemaNewValue(XML_SCHEMAS_QNAME);
9934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (val == NULL)
9944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return (NULL);
9954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
9964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    val->value.qname.name = (xmlChar *) localName;
9974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    val->value.qname.uri = (xmlChar *) namespaceName;
9984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return(val);
9994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
10004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
10014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik/**
10024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaFreeValue:
10034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value:  the value to free
10044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
10054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library
10064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
10074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid
10084255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaFreeValue(xmlSchemaValPtr value) {
10094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaValPtr prev;
10104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
10114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    while (value != NULL) {
10124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	switch (value->type) {
10134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_STRING:
10144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NORMSTRING:
10154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_TOKEN:
10164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_LANGUAGE:
10174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NMTOKEN:
10184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NMTOKENS:
10194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NAME:
10204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NCNAME:
10214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ID:
10224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_IDREF:
10234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_IDREFS:
10244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ENTITY:
10254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ENTITIES:
10264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYURI:
10274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYSIMPLETYPE:
10284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (value->value.str != NULL)
10294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlFree(value->value.str);
10304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
10314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NOTATION:
10324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_QNAME:
10334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (value->value.qname.uri != NULL)
10344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlFree(value->value.qname.uri);
10354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (value->value.qname.name != NULL)
10364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlFree(value->value.qname.name);
10374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
10384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_HEXBINARY:
10394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (value->value.hex.str != NULL)
10404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlFree(value->value.hex.str);
10414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
10424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_BASE64BINARY:
10434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (value->value.base64.str != NULL)
10444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlFree(value->value.base64.str);
10454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
10464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    default:
10474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
10484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	}
10494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	prev = value;
10504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	value = value->next;
10514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	xmlFree(prev);
10524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    }
10534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
10544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
10554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
10564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaGetPredefinedType:
10574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name: the type name
10584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @ns:  the URI of the namespace usually "http://www.w3.org/2001/XMLSchema"
10594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
10604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Lookup a type in the default XML Schemas type library
10614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
10624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns the type if found, NULL otherwise
10634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
10644255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaTypePtr
10654255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaGetPredefinedType(const xmlChar *name, const xmlChar *ns) {
10664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
10674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	xmlSchemaInitTypes();
10684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (name == NULL)
10694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(NULL);
10704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return((xmlSchemaTypePtr) xmlHashLookup2(xmlSchemaTypesBank, name, ns));
10714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
1072070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
107301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
107401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInListSimpleTypeItemType:
107501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in simple type.
107601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
10776927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Lookup function
10786927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard *
1079c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns the item type of @type as defined by the built-in datatype
1080c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * hierarchy of XML Schema Part 2: Datatypes, or NULL in case of an error.
108101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
108201fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr
108301fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInListSimpleTypeItemType(xmlSchemaTypePtr type)
108401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
10854259532303e96e089a185c6f55056cb7c4902d71Daniel Veillard    if ((type == NULL) || (type->type != XML_SCHEMA_TYPE_BASIC))
108601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	return (NULL);
108701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type->builtInType) {
108801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NMTOKENS:
108901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNmtokenDef );
109001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_IDREFS:
109101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdrefDef);
109201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ENTITIES:
109301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeEntityDef);
109401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	default:
109501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (NULL);
109601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
109701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
109801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
1099070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/****************************************************************
1100070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
1101070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *		Convenience macros and functions		*
1102070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
1103070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/
1104070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1105070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_TZO_CHAR(c)						\
1106070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	((c == 0) || (c == 'Z') || (c == '+') || (c == '-'))
1107070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1108070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_YEAR(yr)          (yr != 0)
1109070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MONTH(mon)        ((mon >= 1) && (mon <= 12))
1110070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* VALID_DAY should only be used when month is unknown */
1111070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DAY(day)          ((day >= 1) && (day <= 31))
1112070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_HOUR(hr)          ((hr >= 0) && (hr <= 23))
1113070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MIN(min)          ((min >= 0) && (min <= 59))
1114070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_SEC(sec)          ((sec >= 0) && (sec < 60))
1115690a68095f589248c9e962c6b5468aacb6d3aabaKasimier T. Buchcik#define VALID_TZO(tzo)          ((tzo > -840) && (tzo < 840))
1116070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_LEAP(y)						\
1117070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
1118070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1119ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonth[12] =
1120070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
1121ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonthLeap[12] =
1122070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
1123070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
11245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MAX_DAYINMONTH(yr,mon)                                  \
11255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1])
11265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
1127070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MDAY(dt)						\
1128070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(IS_LEAP(dt->year) ?				        \
1129070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (dt->day <= daysInMonthLeap[dt->mon - 1]) :	        \
1130070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (dt->day <= daysInMonth[dt->mon - 1]))
1131070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1132070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATE(dt)						\
1133070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_YEAR(dt->year) && VALID_MONTH(dt->mon) && VALID_MDAY(dt))
1134070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1135070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TIME(dt)						\
1136070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_HOUR(dt->hour) && VALID_MIN(dt->min) &&		\
1137070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 VALID_SEC(dt->sec) && VALID_TZO(dt->tzo))
1138070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1139070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATETIME(dt)					\
1140070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_DATE(dt) && VALID_TIME(dt))
1141070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1142070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_MIN            (60)
1143070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_HOUR           (60 * SECS_PER_MIN)
1144070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_DAY            (24 * SECS_PER_HOUR)
1145070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
11465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInYearByMonth[12] =
11475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
11485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInLeapYearByMonth[12] =
11495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };
11505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
11515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DAY_IN_YEAR(day, month, year)				\
11525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ((IS_LEAP(year) ?					\
11535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                dayInLeapYearByMonth[month - 1] :		\
11545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                dayInYearByMonth[month - 1]) + day)
11555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
11565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#ifdef DEBUG
11575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt)                                                  \
11585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlGenericError(xmlGenericErrorContext,                             \
11595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        "type=%o %04ld-%02u-%02uT%02u:%02u:%03f",                       \
11605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->type,dt->value.date.year,dt->value.date.mon,                \
11615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->value.date.day,dt->value.date.hour,dt->value.date.min,      \
11625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->value.date.sec);                                            \
11635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dt->value.date.tz_flag)                                         \
11645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (dt->value.date.tzo != 0)                                    \
11655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmlGenericError(xmlGenericErrorContext,                     \
11665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                "%+05d\n",dt->value.date.tzo);                          \
11675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else                                                            \
11685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmlGenericError(xmlGenericErrorContext, "Z\n");             \
11695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else                                                                \
11705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        xmlGenericError(xmlGenericErrorContext,"\n")
11715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#else
11725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt)
11735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#endif
11745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
1175070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1176070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGYear:
1177070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1178070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1179070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1180070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gYear without time zone and fills in the appropriate
1181070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1182070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gYear. It is supposed that @dt->year is big enough to contain
1183070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * the year.
1184070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1185070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1186070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1187070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1188070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) {
1189070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str, *firstChar;
1190070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int isneg = 0, digcnt = 0;
1191070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1192070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (((*cur < '0') || (*cur > '9')) &&
1193070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(*cur != '-') && (*cur != '+'))
1194070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1195070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1196070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur == '-') {
1197070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	isneg = 1;
1198070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1199070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1200070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1201070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    firstChar = cur;
1202070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1203070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    while ((*cur >= '0') && (*cur <= '9')) {
1204070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->year = dt->year * 10 + (*cur - '0');
1205070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1206070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	digcnt++;
1207070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1208070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1209070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* year must be at least 4 digits (CCYY); over 4
1210070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * digits cannot have a leading zero. */
1211070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0')))
1212070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1213070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1214070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (isneg)
1215070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->year = - dt->year;
1216070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1217070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (!VALID_YEAR(dt->year))
1218070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1219070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1220070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1221070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1222070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1223070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1224070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1225070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_2_DIGITS:
1226070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the integer to fill in
1227070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1228070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer
1229070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1230070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a 2-digits integer and updates @num with the value. @cur is
1231070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer.
1232070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and
1233070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1234070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1235070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_2_DIGITS(num, cur, invalid)			\
1236070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if ((cur[0] < '0') || (cur[0] > '9') ||			\
1237070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (cur[1] < '0') || (cur[1] > '9'))			\
1238070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    invalid = 1;					\
1239070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	else							\
1240070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    num = (cur[0] - '0') * 10 + (cur[1] - '0');		\
1241070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur += 2;
1242070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1243070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1244070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_FLOAT:
1245070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the double to fill in
1246070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1247070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer
1248070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1249070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float and updates @num with the value. @cur is
1250070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the float. The float must have a
1251070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2-digits integer part and may or may not have a decimal part.
1252070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and
1253070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1254070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1255070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_FLOAT(num, cur, invalid)				\
1256070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(num, cur, invalid);			\
1257070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!invalid && (*cur == '.')) {			\
1258070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    double mult = 1;				        \
1259070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    cur++;						\
1260070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((*cur < '0') || (*cur > '9'))			\
1261070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		invalid = 1;					\
1262070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
1263070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		mult /= 10;					\
1264070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num += (*cur - '0') * mult;			\
1265070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		cur++;						\
1266070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }							\
1267070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1268070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1269070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1270070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGMonth:
1271070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1272070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1273070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1274070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gMonth without time zone and fills in the appropriate
1275070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1276070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gMonth.
1277070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1278070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1279070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1280070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1281070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) {
1282070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
1283070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
128464dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    unsigned int value = 0;
1285070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
128664dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    PARSE_2_DIGITS(value, cur, ret);
1287070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1288070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1289070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
129064dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if (!VALID_MONTH(value))
1291070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1292070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
129364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    dt->mon = value;
129464dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik
1295070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1296070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1297070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1298070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1299070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1300070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGDay:
1301070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1302070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1303070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1304070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gDay without time zone and fills in the appropriate
1305070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1306070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay.
1307070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1308070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1309070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1310070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1311070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) {
1312070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
1313070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
131464dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    unsigned int value = 0;
1315070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
131664dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    PARSE_2_DIGITS(value, cur, ret);
1317070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1318070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1319070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
132064dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if (!VALID_DAY(value))
1321070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1322070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
132364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    dt->day = value;
1324070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1325070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1326070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1327070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1328070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1329070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTime:
1330070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1331070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1332070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1333070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:time without time zone and fills in the appropriate
1334070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * fields of the @dt structure. @str is updated to point just after the
1335070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:time.
1336070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, values of @dt fields are undefined.
1337070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1338070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1339070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1340070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1341070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) {
1342285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik    const xmlChar *cur = *str;
1343070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
1344285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik    int value = 0;
1345070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
134664dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    PARSE_2_DIGITS(value, cur, ret);
1347070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
134864dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik	return ret;
1349070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != ':')
1350070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
135164dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if (!VALID_HOUR(value))
135264dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik	return 2;
1353070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1354070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1355070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* the ':' insures this string is xs:time */
135664dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    dt->hour = value;
1357070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
135864dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    PARSE_2_DIGITS(value, cur, ret);
1359070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1360070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
136164dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if (!VALID_MIN(value))
136264dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik	return 2;
136364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    dt->min = value;
1364070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1365070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != ':')
1366070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1367070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1368070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1369070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_FLOAT(dt->sec, cur, ret);
1370070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1371070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1372070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
137364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if ((!VALID_SEC(dt->sec)) || (!VALID_TZO(dt->tzo)))
1374070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1375070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1376070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1377070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1378070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1379070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1380070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1381070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTimeZone:
1382070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1383070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1384070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1385070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a time zone without time zone and fills in the appropriate
1386070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1387070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * time zone.
1388070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1389070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1390070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1391070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1392070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) {
1393070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
1394070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
1395070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1396070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (str == NULL)
1397070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1398070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1399070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    switch (*cur) {
1400070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case 0:
1401070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tz_flag = 0;
1402070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = 0;
1403070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1404070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1405070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case 'Z':
1406070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tz_flag = 1;
1407070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = 0;
1408070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1409070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1410070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1411070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case '+':
1412070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case '-': {
1413070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	int isneg = 0, tmp = 0;
1414070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	isneg = (*cur == '-');
1415070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1416070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1417070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1418070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(tmp, cur, ret);
1419070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1420070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return ret;
1421070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_HOUR(tmp))
1422070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1423070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1424070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (*cur != ':')
1425070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 1;
1426070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1427070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1428070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = tmp * 60;
1429070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1430070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(tmp, cur, ret);
1431070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1432070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return ret;
1433070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_MIN(tmp))
1434070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1435070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1436070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo += tmp;
1437070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (isneg)
1438070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    dt->tzo = - dt->tzo;
1439070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1440070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_TZO(dt->tzo))
1441070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1442070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
14435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	dt->tz_flag = 1;
1444070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1445070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard      }
1446070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    default:
1447070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1448070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1449070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1450070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1451070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1452070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1453070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
14541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard/**
14551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * _xmlSchemaBase64Decode:
14561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * @ch: a character
14571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *
14581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Converts a base64 encoded character to its base 64 value.
14591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *
14601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Returns 0-63 (value), 64 (pad), or -1 (not recognized)
14611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */
14621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic int
14631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard_xmlSchemaBase64Decode (const xmlChar ch) {
14641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('A' <= ch) && (ch <= 'Z')) return ch - 'A';
14651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('a' <= ch) && (ch <= 'z')) return ch - 'a' + 26;
14661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('0' <= ch) && (ch <= '9')) return ch - '0' + 52;
14671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('+' == ch) return 62;
14681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('/' == ch) return 63;
14691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('=' == ch) return 64;
14701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return -1;
14711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard}
14721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
1473070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/****************************************************************
1474070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
1475070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *	XML Schema Dates/Times Datatypes Handling		*
1476070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
1477070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/
1478070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1479070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1480070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_DIGITS:
1481070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the integer to fill in
1482070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1483070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag
1484070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1485070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a digits integer and updates @num with the value. @cur is
1486070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer.
1487070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and
1488070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1489070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1490070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_DIGITS(num, cur, num_type)	                \
1491070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if ((*cur < '0') || (*cur > '9'))			\
1492070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    num_type = -1;					\
1493070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else                                                    \
1494070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
1495070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	        num = num * 10 + (*cur - '0');		        \
1496070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	        cur++;                                          \
1497070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            }
1498070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1499070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1500070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_NUM:
1501070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the double to fill in
1502070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1503070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag
1504070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1505070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float or integer and updates @num with the value. @cur is
1506070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the number. If the number is a float,
1507070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * then it must have an integer part and a decimal part; @num_type will
1508070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * be set to 1. If there is no decimal part, @num_type is set to zero.
1509070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and
1510070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1511070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1512070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_NUM(num, cur, num_type)				\
1513070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        num = 0;                                                \
1514070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_DIGITS(num, cur, num_type);	                \
1515070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!num_type && (*cur == '.')) {			\
1516070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    double mult = 1;				        \
1517070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    cur++;						\
1518070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((*cur < '0') || (*cur > '9'))			\
1519070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num_type = -1;					\
1520070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else                                                \
1521070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                num_type = 1;                                   \
1522070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
1523070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		mult /= 10;					\
1524070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num += (*cur - '0') * mult;			\
1525070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		cur++;						\
1526070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }							\
1527070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1528070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1529070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
15305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDates:
1531455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard * @type: the expected type or XML_SCHEMAS_UNKNOWN
1532070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dateTime:  string to analyze
1533070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val:  the return computed value
1534070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1535070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @dateTime conforms to the lexical space of one of the date types.
1536070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val.
1537070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1538070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
1539070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *         and -1 in case of internal or API error.
1540070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1541070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1542455cc07308c673b6714e2f5670c2091a1dab95dcDaniel VeillardxmlSchemaValidateDates (xmlSchemaValType type,
15434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	                const xmlChar *dateTime, xmlSchemaValPtr *val,
15444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			int collapse) {
1545070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmlSchemaValPtr dt;
1546070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret;
1547070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = dateTime;
1548070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1549070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define RETURN_TYPE_IF_VALID(t)					\
1550070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (IS_TZO_CHAR(*cur)) {					\
1551070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur);	\
1552070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret == 0) {						\
1553070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (*cur != 0)					\
1554070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		goto error;					\
1555070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    dt->type = t;					\
1556455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard	    goto done;						\
1557070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}							\
1558070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1559070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1560070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dateTime == NULL)
1561070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1562070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
15634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (collapse)
15644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*cur) cur++;
15654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
1566070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((*cur != '-') && (*cur < '0') && (*cur > '9'))
1567070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1568070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1569070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN);
1570070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dt == NULL)
1571070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1572070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1573070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((cur[0] == '-') && (cur[1] == '-')) {
1574070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/*
1575070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * It's an incomplete date (xs:gMonthDay, xs:gMonth or
1576070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * xs:gDay)
1577070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 */
1578070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur += 2;
1579070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1580070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/* is it an xs:gDay? */
1581070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (*cur == '-') {
1582455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard	    if (type == XML_SCHEMAS_GMONTH)
1583455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard		goto error;
1584070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	  ++cur;
1585070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1586070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret != 0)
1587070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		goto error;
1588070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1589070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY);
1590070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1591070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    goto error;
1592070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1593070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1594070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/*
1595070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * it should be an xs:gMonthDay or xs:gMonth
1596070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 */
1597070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur);
1598070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1599070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    goto error;
1600070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1601d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        /*
1602d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a '-' char could indicate this type is xs:gMonthDay or
1603d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a negative time zone offset. Check for xs:gMonthDay first.
1604d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * Also the first three char's of a negative tzo (-MM:SS) can
1605d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * appear to be a valid day; so even if the day portion
1606d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * of the xs:gMonthDay verifies, we must insure it was not
1607d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a tzo.
1608d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         */
1609d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if (*cur == '-') {
1610d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            const xmlChar *rewnd = cur;
1611d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            cur++;
1612d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1613d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard  	    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1614d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            if ((ret == 0) && ((*cur == 0) || (*cur != ':'))) {
1615d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1616d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                /*
1617d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * we can use the VALID_MDAY macro to validate the month
1618d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * and day because the leap year test will flag year zero
1619d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * as a leap year (even though zero is an invalid year).
16204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		 * FUTURE TODO: Zero will become valid in XML Schema 1.1
16214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		 * probably.
1622d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 */
1623d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                if (VALID_MDAY((&(dt->value.date)))) {
1624d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1625d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard	            RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY);
1626070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1627d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                    goto error;
1628d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                }
1629d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            }
1630d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1631d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            /*
1632d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             * not xs:gMonthDay so rewind and check if just xs:gMonth
1633d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             * with an optional time zone.
1634d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             */
1635d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            cur = rewnd;
1636d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        }
1637d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1638d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard	RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH);
1639070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1640070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1641070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1642070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1643070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /*
1644070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * It's a right-truncated date or an xs:time.
1645070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * Try to parse an xs:time then fallback on right-truncated dates.
1646070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     */
1647070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((*cur >= '0') && (*cur <= '9')) {
1648070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseTime(&(dt->value.date), &cur);
1649070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret == 0) {
1650070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    /* it's an xs:time */
1651070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_TIME);
1652070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1653070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1654070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1655070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* fallback on date parsing */
1656070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur = dateTime;
1657070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1658070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGYear(&(dt->value.date), &cur);
1659070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1660070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1661070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1662070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:gYear? */
1663070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEAR);
1664070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1665070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != '-')
1666070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1667070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1668070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1669070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur);
1670070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1671070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1672070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1673070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:gYearMonth? */
1674070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEARMONTH);
1675070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1676070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != '-')
1677070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1678070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1679070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1680070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1681070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((ret != 0) || !VALID_DATE((&(dt->value.date))))
1682070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1683070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1684070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:date? */
1685070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_DATE);
1686070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1687070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != 'T')
1688070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1689070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1690070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1691070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* it should be an xs:dateTime */
1692070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseTime(&(dt->value.date), &cur);
1693070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1694070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1695070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1696070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur);
16974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (collapse)
16984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*cur) cur++;
1699070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((ret != 0) || (*cur != 0) || !VALID_DATETIME((&(dt->value.date))))
1700070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1701070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1702455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard
1703070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dt->type = XML_SCHEMAS_DATETIME;
1704070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1705455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillarddone:
1706d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#if 1
1707d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type))
1708d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        goto error;
1709d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#else
1710d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    /*
1711d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     * insure the parsed type is equal to or less significant (right
1712d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     * truncated) than the desired type.
1713d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     */
1714d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) {
1715d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1716d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        /* time only matches time */
1717d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_TIME) && (dt->type == XML_SCHEMAS_TIME))
1718d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1719d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1720d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_DATETIME) &&
1721d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            ((dt->type != XML_SCHEMAS_DATE) ||
1722d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEARMONTH) ||
1723d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEAR)))
1724d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1725d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1726d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_DATE) &&
1727d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            ((dt->type != XML_SCHEMAS_GYEAR) ||
1728d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEARMONTH)))
1729d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1730d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1731d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_GYEARMONTH) && (dt->type != XML_SCHEMAS_GYEAR))
1732d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1733d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1734d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_GMONTHDAY) && (dt->type != XML_SCHEMAS_GMONTH))
1735d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1736d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    }
1737455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard#endif
1738455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard
1739070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (val != NULL)
1740070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        *val = dt;
174180b19092f24410a6b869abf519227686e8f207caDaniel Veillard    else
174280b19092f24410a6b869abf519227686e8f207caDaniel Veillard	xmlSchemaFreeValue(dt);
1743070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1744070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1745070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1746070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror:
1747070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dt != NULL)
1748070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	xmlSchemaFreeValue(dt);
1749070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 1;
1750070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1751070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1752070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
17535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDuration:
1754070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @type: the predefined type
1755070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @duration:  string to analyze
1756070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val:  the return computed value
1757070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1758070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @duration conforms to the lexical space of the duration type.
1759070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val.
1760070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1761070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
1762070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *         and -1 in case of internal or API error.
1763070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1764070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1765dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
17664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	                   const xmlChar *duration, xmlSchemaValPtr *val,
17674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			   int collapse) {
1768070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar  *cur = duration;
1769070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmlSchemaValPtr dur;
1770070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int isneg = 0;
1771070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int seq = 0;
1772d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    double         num;
1773d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    int            num_type = 0;  /* -1 = invalid, 0 = int, 1 = floating */
1774d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    const xmlChar  desig[]  = {'Y', 'M', 'D', 'H', 'M', 'S'};
1775d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    const double   multi[]  = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0};
1776070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1777070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (duration == NULL)
1778070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1779070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
17804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (collapse)
17814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*cur) cur++;
17824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
1783070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur == '-') {
1784070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        isneg = 1;
1785070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        cur++;
1786070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1787070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1788070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* duration must start with 'P' (after sign) */
1789070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur++ != 'P')
1790070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1791070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
179280b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (*cur == 0)
179380b19092f24410a6b869abf519227686e8f207caDaniel Veillard	return 1;
179480b19092f24410a6b869abf519227686e8f207caDaniel Veillard
1795070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION);
1796070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dur == NULL)
1797070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1798070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1799070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    while (*cur != 0) {
1800070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1801070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* input string should be empty or invalid date/time item */
1802070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (seq >= sizeof(desig))
1803070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1804070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1805070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* T designator must be present for time items */
1806070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (*cur == 'T') {
1807070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (seq <= 3) {
1808070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                seq = 3;
1809070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                cur++;
1810070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            } else
1811070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 1;
1812070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        } else if (seq == 3)
1813070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1814070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1815070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* parse the number portion of the item */
1816070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        PARSE_NUM(num, cur, num_type);
1817070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1818070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if ((num_type == -1) || (*cur == 0))
1819070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1820070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1821070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* update duration based on item type */
1822070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        while (seq < sizeof(desig)) {
1823070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (*cur == desig[seq]) {
1824070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1825070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                /* verify numeric type; only seconds can be float */
1826070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                if ((num_type != 0) && (seq < (sizeof(desig)-1)))
1827070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    goto error;
1828070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1829070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                switch (seq) {
1830070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    case 0:
1831070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.mon = (long)num * 12;
1832070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1833070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    case 1:
1834070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.mon += (long)num;
1835070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1836070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    default:
1837070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        /* convert to seconds using multiplier */
1838070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.sec += num * multi[seq];
1839070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        seq++;
1840070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1841070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                }
1842070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1843070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                break;          /* exit loop */
1844070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            }
1845070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            /* no date designators found? */
1846c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik            if ((++seq == 3) || (seq == 6))
1847070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                goto error;
1848070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        }
18494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	cur++;
18504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	if (collapse)
18514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    while IS_WSP_BLANK_CH(*cur) cur++;
1852070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1853070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1854070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (isneg) {
1855070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.mon = -dur->value.dur.mon;
1856070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.day = -dur->value.dur.day;
1857070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.sec = -dur->value.dur.sec;
1858070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1859070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1860070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (val != NULL)
1861070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        *val = dur;
186280b19092f24410a6b869abf519227686e8f207caDaniel Veillard    else
186380b19092f24410a6b869abf519227686e8f207caDaniel Veillard	xmlSchemaFreeValue(dur);
1864070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1865070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1866070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1867070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror:
1868070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dur != NULL)
1869070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	xmlSchemaFreeValue(dur);
1870070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 1;
1871070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1872070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1873a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard/**
1874a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * xmlSchemaStrip:
1875a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * @value: a value
1876a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *
1877a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Removes the leading and ending spaces of a string
1878a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *
1879a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the new string or NULL if no change was required.
1880a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard */
1881a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlChar *
1882a1a9d0410000cc69874e53e438b250037d3e14cdDaniel VeillardxmlSchemaStrip(const xmlChar *value) {
1883a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    const xmlChar *start = value, *end, *f;
1884a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard
1885a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if (value == NULL) return(NULL);
188676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((*start != 0) && (IS_BLANK_CH(*start))) start++;
1887a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end = start;
1888a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    while (*end != 0) end++;
1889a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    f = end;
1890a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end--;
189176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((end > start) && (IS_BLANK_CH(*end))) end--;
1892a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end++;
1893a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if ((start == value) && (f == end)) return(NULL);
1894a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    return(xmlStrndup(start, end - start));
1895a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard}
189696a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard
189796a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard/**
189891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * xmlSchemaWhiteSpaceReplace:
189991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * @value: a value
190091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik *
190191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Replaces 0xd, 0x9 and 0xa with a space.
190291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik *
190391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Returns the new string or NULL if no change was required.
190491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik */
190591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlChar *
190691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlSchemaWhiteSpaceReplace(const xmlChar *value) {
190791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    const xmlChar *cur = value;
190891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    xmlChar *ret = NULL, *mcur;
190991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
191091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    if (value == NULL)
191191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	return(NULL);
191291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
191391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    while ((*cur != 0) &&
191491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	(((*cur) != 0xd) && ((*cur) != 0x9) && ((*cur) != 0xa))) {
191591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	cur++;
191691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    }
191791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    if (*cur == 0)
191891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	return (NULL);
191991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    ret = xmlStrdup(value);
192091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    /* TODO FIXME: I guess gcc will bark at this. */
192191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    mcur = (xmlChar *)  (ret + (cur - value));
192291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    do {
192391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	if ( ((*mcur) == 0xd) || ((*mcur) == 0x9) || ((*mcur) == 0xa) )
192491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	    *mcur = ' ';
192591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	mcur++;
192691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    } while (*mcur != 0);
192791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    return(ret);
192891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik}
192991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
193091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik/**
1931b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCollapseString:
1932b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: a value
1933b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
1934b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Removes and normalize white spaces in the string
1935b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
1936b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns the new string or NULL if no change was required.
1937b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
193801fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlChar *
1939b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCollapseString(const xmlChar *value) {
1940b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    const xmlChar *start = value, *end, *f;
1941b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    xmlChar *g;
1942b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    int col = 0;
1943b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1944b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (value == NULL) return(NULL);
194576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((*start != 0) && (IS_BLANK_CH(*start))) start++;
1946b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    end = start;
1947b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    while (*end != 0) {
194876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if ((*end == ' ') && (IS_BLANK_CH(end[1]))) {
1949b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    col = end - start;
1950b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    break;
1951b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	} else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) {
1952b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    col = end - start;
1953b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    break;
1954b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	}
1955b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end++;
1956b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1957b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (col == 0) {
1958b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	f = end;
1959b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end--;
196076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	while ((end > start) && (IS_BLANK_CH(*end))) end--;
1961b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end++;
1962b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if ((start == value) && (f == end)) return(NULL);
1963b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(xmlStrndup(start, end - start));
1964b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1965b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    start = xmlStrdup(start);
1966b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (start == NULL) return(NULL);
1967b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    g = (xmlChar *) (start + col);
1968b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    end = g;
1969b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    while (*end != 0) {
197076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if (IS_BLANK_CH(*end)) {
1971b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    end++;
197276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*end)) end++;
1973b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (*end != 0)
1974b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		*g++ = ' ';
1975b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	} else
1976b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    *g++ = *end++;
1977b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1978b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    *g = 0;
1979b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return((xmlChar *) start);
1980b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
1981b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1982b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
198328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * xmlSchemaValAtomicListNode:
198428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @type: the predefined atomic type for a token in the list
198528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @value: the list value to check
198628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @ret:  the return computed value
198728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @node:  the node containing the value
198828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *
198928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Check that a value conforms to the lexical space of the predefined
199028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * list type. if true a value is computed and returned in @ret.
199128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *
1992a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the number of items if this validates, a negative error code
1993a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *         number otherwise
199428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */
199528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillardstatic int
199628c52ab518d34a36fd8da6870a5850088f129a6aDaniel VeillardxmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value,
199728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	                   xmlSchemaValPtr *ret, xmlNodePtr node) {
199828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    xmlChar *val, *cur, *endval;
199928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    int nb_values = 0;
2000580ced8ee28ecd99374da9383897678e4ba6c358Daniel Veillard    int tmp = 0;
200128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard
200228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (value == NULL) {
200328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	return(-1);
200428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
200528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    val = xmlStrdup(value);
200628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (val == NULL) {
200728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	return(-1);
200828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
20096fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    if (ret != NULL) {
20106fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard        *ret = NULL;
20116fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    }
201228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    cur = val;
201328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    /*
201428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard     * Split the list
201528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard     */
201676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while (IS_BLANK_CH(*cur)) *cur++ = 0;
201728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while (*cur != 0) {
201876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if (IS_BLANK_CH(*cur)) {
201928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    *cur = 0;
202028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    cur++;
202176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*cur)) *cur++ = 0;
202228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	} else {
202328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    nb_values++;
202428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    cur++;
202576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++;
202628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	}
202728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
202828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (nb_values == 0) {
202928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	xmlFree(val);
2030a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard	return(nb_values);
203128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
203228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    endval = cur;
203328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    cur = val;
203428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while ((*cur == 0) && (cur != endval)) cur++;
203528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while (cur != endval) {
203628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node);
203728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	if (tmp != 0)
203828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    break;
203928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	while (*cur != 0) cur++;
204028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	while ((*cur == 0) && (cur != endval)) cur++;
204128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
20426fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    /* TODO what return value ? c.f. bug #158628
204328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (ret != NULL) {
204428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	TODO
20456fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    } */
20466fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    xmlFree(val);
2047a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if (tmp == 0)
2048a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard	return(nb_values);
2049a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    return(-1);
205028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard}
205128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard
205228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard/**
2053e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * xmlSchemaParseUInt:
2054e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @str: pointer to the string R/W
2055e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @llo: pointer to the low result
2056e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lmi: pointer to the mid result
2057e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lhi: pointer to the high result
2058e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *
2059e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Parse an unsigned long into 3 fields.
2060e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *
2061ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack * Returns the number of significant digits in the number or
2062ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack * -1 if overflow of the capacity
2063e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard */
2064e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic int
2065e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel VeillardxmlSchemaParseUInt(const xmlChar **str, unsigned long *llo,
2066478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik                   unsigned long *lmi, unsigned long *lhi) {
2067e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long lo = 0, mi = 0, hi = 0;
2068e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    const xmlChar *tmp, *cur = *str;
2069e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    int ret = 0, i = 0;
2070e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
2071478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while (*cur == '0') {        /* ignore leading zeroes */
2072478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        cur++;
2073e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2074e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    tmp = cur;
2075e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) {
2076478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        i++;tmp++;ret++;
2077e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2078e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (i > 24) {
2079478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        *str = tmp;
2080478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        return(-1);
2081e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2082e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 16) {
2083478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        hi = hi * 10 + (*cur++ - '0');
2084478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        i--;
2085e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2086e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 8) {
2087478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        mi = mi * 10 + (*cur++ - '0');
2088478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        i--;
2089e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2090e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 0) {
2091478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        lo = lo * 10 + (*cur++ - '0');
2092478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        i--;
2093e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2094e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
2095e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *str = cur;
2096e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *llo = lo;
2097e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *lmi = mi;
2098e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *lhi = hi;
2099e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    return(ret);
2100e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard}
2101e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
2102e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard/**
2103b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValAtomicType:
21044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type: the predefined type
21054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to check
21064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val:  the return computed value
2107c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @node:  the node containing the value
2108b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * flags:  flags to control the vlidation
21094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
2110b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the atomic type.
21114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * if true a value is computed and returned in @val.
211201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * This checks the value space for list types as well (IDREFS, NMTOKENS).
21134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
21144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
21154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *         and -1 in case of internal or API error.
21164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
2117b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int
21181ac24d36b12487995b659a8fc23a02b9460edb36Daniel VeillardxmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value,
21194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik                       xmlSchemaValPtr * val, xmlNodePtr node, int flags,
21204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		       xmlSchemaWhitespaceValueType ws,
21214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		       int normOnTheFly, int applyNorm, int createStringValue)
21221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard{
21234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValPtr v;
2124b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    xmlChar *norm = NULL;
2125d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    int ret = 0;
21264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
21274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
212801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitTypes();
21294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (type == NULL)
21301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        return (-1);
21315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
2132eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard    /*
2133eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard     * validating a non existant text node is similar to validating
2134eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard     * an empty one.
2135eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard     */
2136eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard    if (value == NULL)
2137eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard        value = BAD_CAST "";
2138eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard
21394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (val != NULL)
21401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        *val = NULL;
2141b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if ((flags == 0) && (value != NULL)) {
214291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
214301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        if ((type->builtInType != XML_SCHEMAS_STRING) &&
214491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	  (type->builtInType != XML_SCHEMAS_ANYTYPE) &&
214591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	  (type->builtInType != XML_SCHEMAS_ANYSIMPLETYPE)) {
214691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	    if (type->builtInType == XML_SCHEMAS_NORMSTRING)
214791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik		norm = xmlSchemaWhiteSpaceReplace(value);
214891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik            else
214991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik		norm = xmlSchemaCollapseString(value);
21501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (norm != NULL)
21511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                value = norm;
21521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        }
2153b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
2154b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
215501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type->builtInType) {
21562f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack        case XML_SCHEMAS_UNKNOWN:
21571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto error;
21582f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	case XML_SCHEMAS_ANYTYPE:
21592f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	case XML_SCHEMAS_ANYSIMPLETYPE:
21604efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if ((createStringValue) && (val != NULL)) {
21614efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		v = xmlSchemaNewValue(XML_SCHEMAS_ANYSIMPLETYPE);
21624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (v != NULL) {
21634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    v->value.str = xmlStrdup(value);
21644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    *val = v;
21654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else {
21664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    goto error;
21674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
21684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    }
21692f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	    goto return0;
21704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_STRING:
21714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if (! normOnTheFly) {
21724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		const xmlChar *cur = value;
21734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
21744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (ws == XML_SCHEMA_WHITESPACE_REPLACE) {
21754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while (*cur != 0) {
21764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
21774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
21784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else {
21794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
21804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			}
21814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
21824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) {
21834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while (*cur != 0) {
21844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
21854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
21864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else if IS_WSP_SPACE_CH(*cur) {
21874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
21884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    if IS_WSP_SPACE_CH(*cur)
21894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik				goto return1;
21904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else {
21914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
21924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			}
21934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
21944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
21954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    }
21964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if (createStringValue && (val != NULL)) {
21974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (applyNorm) {
21984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
21994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			norm = xmlSchemaCollapseString(value);
22004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else if (ws == XML_SCHEMA_WHITESPACE_REPLACE)
22014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			norm = xmlSchemaWhiteSpaceReplace(value);
22024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (norm != NULL)
22034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			value = norm;
22044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
22054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		v = xmlSchemaNewValue(XML_SCHEMAS_STRING);
22064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (v != NULL) {
22074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    v->value.str = xmlStrdup(value);
22084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    *val = v;
22094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else {
22104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    goto error;
22114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
22124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    }
22131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return0;
22141516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard        case XML_SCHEMAS_NORMSTRING:{
22154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly) {
22164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (applyNorm) {
22174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
22184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    norm = xmlSchemaCollapseString(value);
22194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			else
22204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    norm = xmlSchemaWhiteSpaceReplace(value);
22214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if (norm != NULL)
22224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    value = norm;
22234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
22244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else {
22254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    const xmlChar *cur = value;
22264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while (*cur != 0) {
22274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
22284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
22294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else {
22304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
22314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			}
22324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
22334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
22341516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                if (val != NULL) {
22351516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NORMSTRING);
22361516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    if (v != NULL) {
22371516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        v->value.str = xmlStrdup(value);
22381516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        *val = v;
22391516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    } else {
22401516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        goto error;
22411516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    }
22421516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                }
22431516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                goto return0;
22441516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard            }
22451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_DECIMAL:{
2246273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack                const xmlChar *cur = value;
2247273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack                unsigned int len, neg = 0;
2248273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		xmlChar cval[25];
2249273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		xmlChar *cptr = cval;
22509e2110bbff362d12466bfa38cde2842b2a6297ffDaniel Veillard		unsigned int dec = ~0u;
22511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
22521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
22531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
22544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
22554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
22564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
22574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
2258273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		/* First we handle an optional sign */
22591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '+')
22601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
22611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else if (*cur == '-') {
22621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    neg = 1;
22631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
22641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
2265273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		/*
2266273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 * Next we "pre-parse" the number, in preparation for calling
2267273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 * the common routine xmlSchemaParseUInt.  We get rid of any
2268273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 * leading zeroes (because we have reserved only 25 chars),
2269273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 * and note the position of any decimal point.
2270273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 */
2271273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		len = 0;
2272c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/*
2273c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* Skip leading zeroes.
2274c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*/
2275c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		while (*cur == '0')
2276273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		    cur++;
2277c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (*cur != 0) {
2278c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    while (len < 24) {
2279c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			if ((*cur >= '0') && (*cur <= '9')) {
2280c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    *cptr++ = *cur++;
2281c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    len++;
2282c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			} else if (*cur == '.') {
22834f917e241656d7471bcf7b3185a110bf24df1647Daniel Veillard			    if (len == 0)
22844f917e241656d7471bcf7b3185a110bf24df1647Daniel Veillard			        len++;
22859e2110bbff362d12466bfa38cde2842b2a6297ffDaniel Veillard			    if (dec != ~0u)
2286c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik				goto return1;	/* multiple decimal points */
2287c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    cur++;
2288c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    if ((*cur == 0) && (cur -1 == value))
2289c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik				goto return1;
2290c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
2291c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    dec = len;
2292c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    while ((len < 24) && (*cur >= '0') &&
2293c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik				(*cur <= '9')) {
2294c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik				*cptr++ = *cur++;
2295c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik				len++;
2296c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    }
2297c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    break;
2298c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			} else
2299c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    break;
2300c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    }
2301273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		}
23024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
23034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
2304273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		if (*cur != 0)
2305273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		    goto return1;	/* error if any extraneous chars */
23061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
23071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL);
23081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
2309273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			/*
2310273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 	* If a mixed decimal, get rid of trailing zeroes
2311273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 	*/
23129e2110bbff362d12466bfa38cde2842b2a6297ffDaniel Veillard			if (dec != ~0u) {
23139e2110bbff362d12466bfa38cde2842b2a6297ffDaniel Veillard			    while ((len > dec) && (cptr > cval) &&
23146d30ff2c08b381cff003eead71bf1321a0c0feeaKasimier T. Buchcik				(*(cptr-1) == '0')) {
2315273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack				cptr--;
2316273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack				len--;
2317273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			    }
2318273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			}
2319273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			*cptr = 0;	/* Terminate our (preparsed) string */
2320273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			cptr = cval;
2321273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			/*
2322273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 	* Now evaluate the significant digits of the number
2323273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 	*/
2324c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			if (*cptr != 0)
2325c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    xmlSchemaParseUInt((const xmlChar **)&cptr,
2326273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack					    &v->value.decimal.lo,
2327273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack					    &v->value.decimal.mi,
2328273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack					    &v->value.decimal.hi);
2329c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			/*
2330c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			* Set the total digits to 1 if a zero value.
2331c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			*/
2332c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			if (len == 0)
2333c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    len++;
23341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = neg;
23359e2110bbff362d12466bfa38cde2842b2a6297ffDaniel Veillard			if (dec == ~0u) {
2336273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			    v->value.decimal.frac = 0;
2337273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			    v->value.decimal.total = len;
2338273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			} else {
2339c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    v->value.decimal.frac = len - dec;
2340c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    v->value.decimal.total = len;
2341273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			}
23421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
23431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
23441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
23461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2347b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_TIME:
2348b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GDAY:
2349b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GMONTH:
2350b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GMONTHDAY:
2351b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GYEAR:
2352b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GYEARMONTH:
2353b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DATE:
2354b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DATETIME:
23554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik            ret = xmlSchemaValidateDates(type->builtInType, value, val,
23564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		normOnTheFly);
23571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            break;
2358b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DURATION:
23594efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik            ret = xmlSchemaValidateDuration(type, value, val,
23604efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		normOnTheFly);
23611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            break;
2362b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_FLOAT:
23631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_DOUBLE:{
23641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
23651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int neg = 0;
23661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
23681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
23694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
23704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
23714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
23724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
23731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) {
23741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur += 3;
23751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (*cur != 0)
23761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
23771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (val != NULL) {
23781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (type == xmlSchemaTypeFloatDef) {
23791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
23801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
23811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                v->value.f = (float) xmlXPathNAN;
23821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
23831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
23841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
23851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
23861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
23871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
23881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
23891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                v->value.d = xmlXPathNAN;
23901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
23911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
23921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
23931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
23941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
23951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
23961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
23971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return0;
23981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
24001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    neg = 1;
24011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) {
24041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur += 3;
24051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (*cur != 0)
24061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
24071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (val != NULL) {
24081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (type == xmlSchemaTypeFloatDef) {
24091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
24101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
24111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                if (neg)
24121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.f = (float) xmlXPathNINF;
24131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                else
24141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.f = (float) xmlXPathPINF;
24151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
24161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
24171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
24181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
24191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
24201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
24211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
24221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                if (neg)
24231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.d = xmlXPathNINF;
24241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                else
24251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.d = xmlXPathPINF;
24261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
24271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
24281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
24291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
24301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
24311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
24321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
24331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return0;
24341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((neg == 0) && (*cur == '+'))
24361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-'))
24381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
24391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                while ((*cur >= '0') && (*cur <= '9')) {
24401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '.') {
24431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while ((*cur >= '0') && (*cur <= '9'))
24451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
24461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((*cur == 'e') || (*cur == 'E')) {
24481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((*cur == '-') || (*cur == '+'))
24501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
24511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while ((*cur >= '0') && (*cur <= '9'))
24521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
24531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
24554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
24564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
24571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
24581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
24591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
24601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (type == xmlSchemaTypeFloatDef) {
24611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
24621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (v != NULL) {
24636c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    /*
24646c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * TODO: sscanf seems not to give the correct
24656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * value for extremely high/low values.
24666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * E.g. "1E-149" results in zero.
24676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    */
2468d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard                            if (sscanf((const char *) value, "%f",
24691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                 &(v->value.f)) == 1) {
24706c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                                *val = v;
24711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
24721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
24731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
24741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
24751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
24761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto error;
24771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
24781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
24791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
24801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (v != NULL) {
24816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    /*
24826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * TODO: sscanf seems not to give the correct
24836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * value for extremely high/low values.
24846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    */
2485d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard                            if (sscanf((const char *) value, "%lf",
24861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                 &(v->value.d)) == 1) {
24871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                *val = v;
24881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
24891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
24901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
24911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
24921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
24931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto error;
24941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
24951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
24961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
24981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
24991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BOOLEAN:{
25001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
25011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
25024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly) {
25034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
25044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (*cur == '0') {
25054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 0;
25064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			cur++;
25074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    } else if (*cur == '1') {
25084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 1;
25094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			cur++;
25104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    } else if (*cur == 't') {
25114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			cur++;
25124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur++ == 'r') && (*cur++ == 'u') &&
25134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    (*cur++ == 'e')) {
25144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    ret = 1;
25154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else
25164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
25174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    } else if (*cur == 'f') {
25184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			cur++;
25194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur++ == 'a') && (*cur++ == 'l') &&
25204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    (*cur++ == 's') && (*cur++ == 'e')) {
25214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    ret = 0;
25224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else
25234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
25244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
25254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (*cur != 0) {
25264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			while IS_WSP_BLANK_CH(*cur) cur++;
25274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if (*cur != 0)
25284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
25294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
25304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else {
25314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if ((cur[0] == '0') && (cur[1] == 0))
25324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 0;
25334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else if ((cur[0] == '1') && (cur[1] == 0))
25344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 1;
25354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else if ((cur[0] == 't') && (cur[1] == 'r')
25364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			&& (cur[2] == 'u') && (cur[3] == 'e')
25374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			&& (cur[4] == 0))
25384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 1;
25394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else if ((cur[0] == 'f') && (cur[1] == 'a')
25404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			&& (cur[2] == 'l') && (cur[3] == 's')
25414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			&& (cur[4] == 'e') && (cur[5] == 0))
25424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 0;
25434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else
25444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			goto return1;
25454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
25461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
25471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN);
25481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
25491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.b = ret;
25501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
25511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
25521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
25531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
25541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
25551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
25561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
25571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_TOKEN:{
25581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
25591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
25604efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (! normOnTheFly) {
25614efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while (*cur != 0) {
25624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
25634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
25644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else if (*cur == ' ') {
25654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
25664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    if (*cur == 0)
25674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik				goto return1;
25684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    if (*cur == ' ')
25694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik				goto return1;
25704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else {
25714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
25724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			}
25734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
25744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
25751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
25761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN);
25771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
25781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.str = xmlStrdup(value);
25791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
25801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
25811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
25821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
25831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
25841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
25851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2586b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_LANGUAGE:
25874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if (normOnTheFly) {
25884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		norm = xmlSchemaCollapseString(value);
25894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (norm != NULL)
25904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    value = norm;
25914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    }
25921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (xmlCheckLanguageID(value) == 1) {
25931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
25941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE);
25951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
25961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.str = xmlStrdup(value);
25971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
25981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
25991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
26001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
26011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
26031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
26041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return1;
2605b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NMTOKEN:
26061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (xmlValidateNMToken(value, 1) == 0) {
26071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
26081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN);
26091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
26101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.str = xmlStrdup(value);
26111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
26121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
26131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
26141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
26151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
26171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
26181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return1;
2619b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NMTOKENS:
26201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef,
26211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
26221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret > 0)
26231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
26241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
26251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 1;
26261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2627b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NAME:
26281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateName(value, 1);
2629df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard            if ((ret == 0) && (val != NULL) && (value != NULL)) {
2630df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		v = xmlSchemaNewValue(XML_SCHEMAS_NAME);
2631df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		if (v != NULL) {
2632df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     const xmlChar *start = value, *end;
2633df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     while (IS_BLANK_CH(*start)) start++;
2634df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     end = start;
2635df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     while ((*end != 0) && (!IS_BLANK_CH(*end))) end++;
2636df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     v->value.str = xmlStrndup(start, end - start);
2637df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		    *val = v;
2638df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		} else {
2639df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		    goto error;
2640df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		}
26411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
26421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
26431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_QNAME:{
26441c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                const xmlChar *uri = NULL;
26451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *local = NULL;
26461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
26471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateQName(value, 1);
26481c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		if (ret != 0)
26491c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    goto done;
26501c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                if (node != NULL) {
26511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *prefix;
26521c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    xmlNsPtr ns;
26531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
26541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    local = xmlSplitQName2(value, &prefix);
26551c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    ns = xmlSearchNs(node->doc, node, prefix);
26561c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if ((ns == NULL) && (prefix != NULL)) {
26571c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			xmlFree(prefix);
26581c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			if (local != NULL)
26591c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			    xmlFree(local);
26601c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			goto return1;
26611c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    }
26621c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if (ns != NULL)
26631c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			uri = ns->href;
26641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL)
26651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(prefix);
26661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26671c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                if (val != NULL) {
26681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_QNAME);
26691c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                    if (v == NULL) {
26701c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			if (local != NULL)
26711c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			    xmlFree(local);
26721c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			goto error;
26731c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    }
26741c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if (local != NULL)
26751c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			v->value.qname.name = local;
26761c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    else
26771c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			v->value.qname.name = xmlStrdup(value);
26781c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if (uri != NULL)
26791c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			v->value.qname.uri = xmlStrdup(uri);
26801c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    *val = v;
26811c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                } else
26821c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if (local != NULL)
26831c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			xmlFree(local);
26841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
26851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2686b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NCNAME:
26871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
26881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
26891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME);
26901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (v != NULL) {
26911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.str = xmlStrdup(value);
26921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
26931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else {
26941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto error;
26951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
26971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2698b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_ID:
26991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
27001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
27011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                v = xmlSchemaNewValue(XML_SCHEMAS_ID);
27021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (v != NULL) {
27031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.str = xmlStrdup(value);
27041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
27051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else {
27061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto error;
27071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
27101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
27111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
27121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
27131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /*
27141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * NOTE: the IDness might have already be declared in the DTD
27151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 */
27161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (attr->atype != XML_ATTRIBUTE_ID) {
27171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlIDPtr res;
27181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *strip;
27191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
27201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    strip = xmlSchemaStrip(value);
27211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (strip != NULL) {
27221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        res = xmlAddID(NULL, node->doc, strip, attr);
27231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(strip);
27241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else
27251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        res = xmlAddID(NULL, node->doc, value, attr);
27261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (res == NULL) {
27271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 2;
27281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
27291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        attr->atype = XML_ATTRIBUTE_ID;
27301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
27311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2734b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_IDREF:
27351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
27361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
27376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		v = xmlSchemaNewValue(XML_SCHEMAS_IDREF);
27386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (v == NULL)
27396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    goto error;
27406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		v->value.str = xmlStrdup(value);
27416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*val = v;
27421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
27441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
27451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
27461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *strip;
27471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
27481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                strip = xmlSchemaStrip(value);
27491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (strip != NULL) {
27501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAddRef(NULL, node->doc, strip, attr);
27511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlFree(strip);
27521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else
27531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAddRef(NULL, node->doc, value, attr);
27541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_IDREF;
27551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2757b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_IDREFS:
27581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef,
27591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
27601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret < 0)
27611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 2;
27621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
27631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
27641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
27651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
27661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
2767249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard
27681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_IDREFS;
27691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
27711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_ENTITY:{
27721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *strip;
27731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
27741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateNCName(value, 1);
27751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((node == NULL) || (node->doc == NULL))
27761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 3;
27771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret == 0) {
27781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlEntityPtr ent;
27791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
27801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    strip = xmlSchemaStrip(value);
27811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (strip != NULL) {
27821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ent = xmlGetDocEntity(node->doc, strip);
27831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(strip);
27841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
27851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ent = xmlGetDocEntity(node->doc, value);
27861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
27871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((ent == NULL) ||
27881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        (ent->etype !=
27891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         XML_EXTERNAL_GENERAL_UNPARSED_ENTITY))
27901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 4;
27911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (val != NULL)) {
27931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    TODO;
27941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (node != NULL) &&
27961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    (node->type == XML_ATTRIBUTE_NODE)) {
27971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAttrPtr attr = (xmlAttrPtr) node;
2798a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard
27991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    attr->atype = XML_ATTRIBUTE_ENTITY;
28001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
28021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2803b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_ENTITIES:
28041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((node == NULL) || (node->doc == NULL))
28051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return3;
28061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef,
28071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
28081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret <= 0)
28091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 1;
28101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
28111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
28121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
28131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
28141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
28151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_ENTITIES;
28171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
28181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
28191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_NOTATION:{
28201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *uri = NULL;
28211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *local = NULL;
28221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateQName(value, 1);
28241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (node != NULL)) {
28251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *prefix;
28261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    local = xmlSplitQName2(value, &prefix);
28281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL) {
28291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlNsPtr ns;
28301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ns = xmlSearchNs(node->doc, node, prefix);
28321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (ns == NULL)
28331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            ret = 1;
28341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        else if (val != NULL)
28351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            uri = xmlStrdup(ns->href);
28361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
28371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((local != NULL) && ((val == NULL) || (ret != 0)))
28381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(local);
28391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL)
28401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(prefix);
28411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((node == NULL) || (node->doc == NULL))
28431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 3;
28441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret == 0) {
28451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = xmlValidateNotationUse(NULL, node->doc, value);
28461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (ret == 1)
28471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 0;
28481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else
28491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 1;
28501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (val != NULL)) {
28521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION);
28531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
28541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (local != NULL)
28551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.name = local;
28561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        else
28571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.name = xmlStrdup(value);
28581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (uri != NULL)
28591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.uri = uri;
28601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
28621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
28631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (local != NULL)
28641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            xmlFree(local);
28651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (uri != NULL)
28661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            xmlFree(uri);
28671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
28681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
28691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
2871560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard            }
28724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_ANYURI:{
287311c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                if (*value != 0) {
28744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlURIPtr uri;
28754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (normOnTheFly) {
28764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			norm = xmlSchemaCollapseString(value);
28774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if (norm != NULL)
28784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    value = norm;
28794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
28804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik                    uri = xmlParseURI((const char *) value);
288111c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    if (uri == NULL)
288211c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                        goto return1;
288311c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    xmlFreeURI(uri);
288411c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                }
2885560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
28861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
288711c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_ANYURI);
288811c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    if (v == NULL)
288911c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                        goto error;
289011c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    v->value.str = xmlStrdup(value);
289111c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    *val = v;
28921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
28941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
28951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_HEXBINARY:{
28968dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik                const xmlChar *cur = value, *start;
28971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *base;
28981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int total, i = 0;
2899560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
2900f34a20e69dc675cd23d3eb558cad135ea280f472Daniel Veillard                if (cur == NULL)
29011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
2902560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
29034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
29044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
29054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
29068dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik		start = cur;
29071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                while (((*cur >= '0') && (*cur <= '9')) ||
29081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                       ((*cur >= 'A') && (*cur <= 'F')) ||
29091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                       ((*cur >= 'a') && (*cur <= 'f'))) {
29101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    i++;
29111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
29121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
29134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
29144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
2915560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
29161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
29171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
29181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((i % 2) != 0)
291970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard                    goto return1;
2920560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
29211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
29221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
29231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY);
29241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v == NULL)
29251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
29264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    /*
29274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    * Copy only the normalized piece.
29284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    * CRITICAL TODO: Check this.
29294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    */
29308dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik                    cur = xmlStrndup(start, i);
29311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (cur == NULL) {
2932d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard		        xmlSchemaTypeErrMemory(node, "allocating hexbin data");
29331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(v);
29341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
29351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
29361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
29371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total = i / 2;      /* number of octets */
293870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
29391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    base = (xmlChar *) cur;
29401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while (i-- > 0) {
29411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (*base >= 'a')
29421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            *base = *base - ('a' - 'A');
29431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        base++;
29441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
294570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
29461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.hex.str = (xmlChar *) cur;
29471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.hex.total = total;
29481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
29491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
29501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
29511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
29521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BASE64BINARY:{
29531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /* ISSUE:
29541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 *
29551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Ignore all stray characters? (yes, currently)
29561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Worry about long lines? (no, currently)
29571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 *
29581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * rfc2045.txt:
29591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 *
29601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * "The encoded output stream must be represented in lines of
29611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * no more than 76 characters each.  All line breaks or other
29621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * characters not found in Table 1 must be ignored by decoding
29631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * software.  In base64 data, characters other than those in
29641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Table 1, line breaks, and other white space probably
29651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * indicate a transmission error, about which a warning
29661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * message or even a message rejection might be appropriate
29671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * under some circumstances." */
29681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
29691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *base;
29701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int total, i = 0, pad = 0;
29711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
29721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
29731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
29741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
29751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                for (; *cur; ++cur) {
29761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
29771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
29781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    decc = _xmlSchemaBase64Decode(*cur);
29791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc < 0) ;
29801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (decc < 64)
29811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        i++;
29821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else
29831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        break;
29841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
29851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                for (; *cur; ++cur) {
29861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
29871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
29881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    decc = _xmlSchemaBase64Decode(*cur);
29891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc < 0) ;
29901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (decc < 64)
29911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
29921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc == 64)
29931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        pad++;
29941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
29951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
29961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /* rfc2045.txt: "Special processing is performed if fewer than
29971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * 24 bits are available at the end of the data being encoded.
29981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * A full encoding quantum is always completed at the end of a
29991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * body.  When fewer than 24 input bits are available in an
30001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * input group, zero bits are added (on the right) to form an
30011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * integral number of 6-bit groups.  Padding at the end of the
30021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * data is performed using the "=" character.  Since all
30031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * base64 input is an integral number of octets, only the
30041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * following cases can arise: (1) the final quantum of
30051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * encoding input is an integral multiple of 24 bits; here,
30061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * the final unit of encoded output will be an integral
30071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * multiple ofindent: Standard input:701: Warning:old style
30081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		 * assignment ambiguity in "=*".  Assuming "= *" 4 characters
30091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		 * with no "=" padding, (2) the final
30101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * quantum of encoding input is exactly 8 bits; here, the
30111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * final unit of encoded output will be two characters
30121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * followed by two "=" padding characters, or (3) the final
30131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * quantum of encoding input is exactly 16 bits; here, the
30141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * final unit of encoded output will be three characters
30151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * followed by one "=" padding character." */
30161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                total = 3 * (i / 4);
30181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (pad == 0) {
30191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 0)
30201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (pad == 1) {
30221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
30231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 3)
30251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (decc = _xmlSchemaBase64Decode(*cur);
30271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         (decc < 0) || (decc > 63);
30281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         decc = _xmlSchemaBase64Decode(*cur))
30291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        --cur;
30301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 16bits in 24bits means 2 pad bits: nnnnnn nnmmmm mmmm00*/
30311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 00111100 -> 0x3c */
30321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc & ~0x3c)
30331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total += 2;
30351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (pad == 2) {
30361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
30371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 2)
30391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (decc = _xmlSchemaBase64Decode(*cur);
30411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         (decc < 0) || (decc > 63);
30421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         decc = _xmlSchemaBase64Decode(*cur))
30431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        --cur;
30441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 8bits in 12bits means 4 pad bits: nnnnnn nn0000 */
30451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 00110000 -> 0x30 */
30461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc & ~0x30)
30471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total += 1;
30491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else
30501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
30511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
30531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_BASE64BINARY);
30541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v == NULL)
30551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
30561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    base =
30571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        (xmlChar *) xmlMallocAtomic((i + pad + 1) *
30581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                                    sizeof(xmlChar));
30591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (base == NULL) {
3060d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard		        xmlSchemaTypeErrMemory(node, "allocating base64 data");
30611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(v);
30621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
30641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.base64.str = base;
30651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (cur = value; *cur; ++cur)
30661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (_xmlSchemaBase64Decode(*cur) >= 0) {
30671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            *base = *cur;
30681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            ++base;
30691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
30701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *base = 0;
30711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.base64.total = total;
30721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
30731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
30741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
307570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard            }
3076e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_INTEGER:
3077e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_PINTEGER:
3078e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_NPINTEGER:
3079e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_NINTEGER:
30801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_NNINTEGER:{
30811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
30821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
3083ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                int sign = 0;
30841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
30861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
30874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
30884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
30891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
30901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    sign = 1;
30911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
30921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (*cur == '+')
30931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
3094ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
3095ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (ret == -1)
3096ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
30974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
30984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
3099ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (*cur != 0)
3100ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
310101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_NPINTEGER) {
31021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) &&
31031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ((hi != 0) || (mi != 0) || (lo != 0)))
31041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
310501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_PINTEGER) {
31061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (sign == 1)
31071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((hi == 0) && (mi == 0) && (lo == 0))
31091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
311001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_NINTEGER) {
31111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (sign == 0)
31121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((hi == 0) && (mi == 0) && (lo == 0))
31141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
311501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_NNINTEGER) {
31161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) &&
31171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ((hi != 0) || (mi != 0) || (lo != 0)))
31181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
31206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                if (val != NULL) {
312101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
31221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
3123c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			if (ret == 0)
3124c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    ret++;
31251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
31266c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                        v->value.decimal.mi = mi;
31276c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                        v->value.decimal.hi = hi;
31281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = sign;
31291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
3130ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                        v->value.decimal.total = ret;
31311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
31321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
31331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
31341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
31351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
3136e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_LONG:
3137e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_BYTE:
3138e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_SHORT:
31391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_INT:{
3140478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik                 const xmlChar *cur = value;
31411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
31421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int sign = 0;
31431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
31441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
31451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
31461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
31471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    sign = 1;
31481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
31491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (*cur == '+')
31501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
3151ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
3152ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (ret < 0)
3153ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
3154ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (*cur != 0)
3155ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
315601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_LONG) {
31571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi >= 922) {
31581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (hi > 922)
31591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
31601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi >= 33720368) {
31611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (mi > 33720368)
31621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
31631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if ((sign == 0) && (lo > 54775807))
31641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
31651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if ((sign == 1) && (lo > 54775808))
31661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
31671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
31681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
316901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_INT) {
31701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi != 0)
31711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (mi >= 21) {
31731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi > 21)
31741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
31751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if ((sign == 0) && (lo > 47483647))
31761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
31771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if ((sign == 1) && (lo > 47483648))
31781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
31791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
318001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_SHORT) {
31811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
31821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) && (lo > 32768))
31841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) && (lo > 32767))
31861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
318701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_BYTE) {
31881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
31891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) && (lo > 128))
31911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) && (lo > 127))
31931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
31951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
319601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
31971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
31981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
31996c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                        v->value.decimal.mi = mi;
32006c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                        v->value.decimal.hi = hi;
32011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = sign;
32021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
3203ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                        v->value.decimal.total = ret;
32041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
32051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
32061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
32071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
32081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
3209e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_UINT:
3210e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_ULONG:
3211e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_USHORT:
32121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_UBYTE:{
32131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
32141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
32151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
32161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
32171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
3218ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
3219ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (ret < 0)
3220ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
3221ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (*cur != 0)
3222ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
322301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_ULONG) {
32241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi >= 1844) {
32251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (hi > 1844)
32261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
32271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi >= 67440737) {
32281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (mi > 67440737)
32291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
32301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (lo > 9551615)
32311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
32321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
32331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
323401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_UINT) {
32351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi != 0)
32361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (mi >= 42) {
32381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi > 42)
32391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
32401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (lo > 94967295)
32411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
32421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
324301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_USHORT) {
32441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
32451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (lo > 65535)
32471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
324801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_UBYTE) {
32491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
32501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (lo > 255)
32521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
32541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
325501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
32561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
32571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
32581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.mi = mi;
32591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.hi = hi;
32601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = 0;
32611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
3262ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                        v->value.decimal.total = ret;
32631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
32641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
32651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
32661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
32671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
32684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
3269b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
32701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  done:
32711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
32721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
32731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (ret);
32741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return3:
32751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
32761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
32771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (3);
32781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return1:
32791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
32801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
32811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (1);
32821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return0:
32831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
32841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
32851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (0);
32861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  error:
32871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
32881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
32891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (-1);
3290b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
3291b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
3292b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
3293b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValPredefTypeNode:
3294b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @type: the predefined type
3295b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: the value to check
3296b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @val:  the return computed value
3297b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @node:  the node containing the value
3298b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
3299b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the predefined type.
3300b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * if true a value is computed and returned in @val.
3301b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
3302b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns 0 if this validates, a positive error code number otherwise
3303b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *         and -1 in case of internal or API error.
3304b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
3305b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardint
3306b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value,
3307b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	                   xmlSchemaValPtr *val, xmlNodePtr node) {
33084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return(xmlSchemaValAtomicType(type, value, val, node, 0,
33094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 1, 0));
33104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
33114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
33124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
3313c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaValPredefTypeNodeNoNorm:
3314c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the predefined type
3315c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the value to check
3316c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val:  the return computed value
3317c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @node:  the node containing the value
3318c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
3319c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Check that a value conforms to the lexical space of the predefined type.
3320c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * if true a value is computed and returned in @val.
3321c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * This one does apply any normalization to the value.
3322c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
3323c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
3324c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *         and -1 in case of internal or API error.
3325c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */
3326c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardint
3327c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, const xmlChar *value,
3328c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard				 xmlSchemaValPtr *val, xmlNodePtr node) {
33294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return(xmlSchemaValAtomicType(type, value, val, node, 1,
33304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 0, 1));
3331c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
3332c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
3333c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/**
3334c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * xmlSchemaValidatePredefinedType:
3335c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @type: the predefined type
3336c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @value: the value to check
3337c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @val:  the return computed value
3338c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *
3339c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Check that a value conforms to the lexical space of the predefined type.
3340c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * if true a value is computed and returned in @val.
3341c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *
3342c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
3343c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *         and -1 in case of internal or API error.
3344c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard */
3345c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillardint
3346c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel VeillardxmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value,
3347c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard	                        xmlSchemaValPtr *val) {
3348c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard    return(xmlSchemaValPredefTypeNode(type, value, val, NULL));
3349c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard}
3350c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard
3351c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard/**
33524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareDecimals:
33534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x:  a first decimal value
33544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y:  a second decimal value
33554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
33564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 decimals
33574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
33584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error
33594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
33604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int
33614255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y)
33624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{
33634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValPtr swp;
3364273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    int order = 1, integx, integy, dlen;
3365273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    unsigned long hi, mi, lo;
33664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
3367273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    /*
3368273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * First test: If x is -ve and not zero
3369273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     */
3370e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if ((x->value.decimal.sign) &&
3371e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	((x->value.decimal.lo != 0) ||
3372e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	 (x->value.decimal.mi != 0) ||
3373e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	 (x->value.decimal.hi != 0))) {
3374273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	/*
3375273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	 * Then if y is -ve and not zero reverse the compare
3376273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	 */
3377e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	if ((y->value.decimal.sign) &&
3378e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    ((y->value.decimal.lo != 0) ||
3379e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	     (y->value.decimal.mi != 0) ||
3380e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	     (y->value.decimal.hi != 0)))
338180b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    order = -1;
3382273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	/*
3383273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	 * Otherwise (y >= 0) we have the answer
3384273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	 */
338580b19092f24410a6b869abf519227686e8f207caDaniel Veillard	else
338680b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    return (-1);
3387273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    /*
3388273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * If x is not -ve and y is -ve we have the answer
3389273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     */
3390e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    } else if ((y->value.decimal.sign) &&
3391e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	       ((y->value.decimal.lo != 0) ||
3392e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		(y->value.decimal.mi != 0) ||
3393e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		(y->value.decimal.hi != 0))) {
33944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (1);
339580b19092f24410a6b869abf519227686e8f207caDaniel Veillard    }
3396273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    /*
3397273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * If it's not simply determined by a difference in sign,
3398273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * then we need to compare the actual values of the two nums.
3399273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * To do this, we start by looking at the integral parts.
3400273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * If the number of integral digits differ, then we have our
3401273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * answer.
3402273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     */
3403273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    integx = x->value.decimal.total - x->value.decimal.frac;
3404273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    integy = y->value.decimal.total - y->value.decimal.frac;
3405273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    if (integx > integy)
3406273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	return order;
3407273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    else if (integy > integx)
3408273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	return -order;
3409273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    /*
3410273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * If the number of integral digits is the same for both numbers,
3411273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * then things get a little more complicated.  We need to "normalize"
3412273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * the numbers in order to properly compare them.  To do this, we
3413273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * look at the total length of each number (length => number of
3414273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * significant digits), and divide the "shorter" by 10 (decreasing
3415273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * the length) until they are of equal length.
3416273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     */
3417273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    dlen = x->value.decimal.total - y->value.decimal.total;
3418273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    if (dlen < 0) {	/* y has more digits than x */
3419273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	swp = x;
3420273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	hi = y->value.decimal.hi;
3421273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	mi = y->value.decimal.mi;
3422273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	lo = y->value.decimal.lo;
3423273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	dlen = -dlen;
3424273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	order = -order;
3425273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    } else {		/* x has more digits than y */
3426273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	swp = y;
3427273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	hi = x->value.decimal.hi;
3428273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	mi = x->value.decimal.mi;
3429273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	lo = x->value.decimal.lo;
3430273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    }
3431273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    while (dlen > 8) {	/* in effect, right shift by 10**8 */
3432273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	lo = mi;
3433273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	mi = hi;
3434273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	hi = 0;
3435273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	dlen -= 8;
34364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
3437273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    while (dlen > 0) {
3438273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	unsigned long rem1, rem2;
3439273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	rem1 = (hi % 10) * 100000000L;
3440273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	hi = hi / 10;
3441273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	rem2 = (mi % 10) * 100000000L;
3442273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	mi = (mi + rem1) / 10;
3443273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	lo = (lo + rem2) / 10;
3444273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	dlen--;
3445273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    }
3446273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    if (hi > swp->value.decimal.hi) {
3447273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	return order;
3448273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    } else if (hi == swp->value.decimal.hi) {
3449273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	if (mi > swp->value.decimal.mi) {
3450273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	    return order;
3451273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	} else if (mi == swp->value.decimal.mi) {
3452273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	    if (lo > swp->value.decimal.lo) {
3453273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		return order;
3454273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	    } else if (lo == swp->value.decimal.lo) {
3455273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		if (x->value.decimal.total == y->value.decimal.total) {
3456273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		    return 0;
3457273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		} else {
3458273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		    return order;
3459273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		}
3460273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	    }
3461273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	}
34624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
3463273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    return -order;
34644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
34654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
34664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
3467070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xmlSchemaCompareDurations:
3468070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @x:  a first duration value
3469070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @y:  a second duration value
3470070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
3471070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Compare 2 durations
3472070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
3473070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
3474070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * case of error
3475070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
3476070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
3477070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel VeillardxmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y)
3478070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard{
3479070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long carry, mon, day;
3480070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    double sec;
348180b19092f24410a6b869abf519227686e8f207caDaniel Veillard    int invert = 1;
348280b19092f24410a6b869abf519227686e8f207caDaniel Veillard    long xmon, xday, myear, minday, maxday;
3483070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    static const long dayRange [2][12] = {
3484070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        { 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, },
3485070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} };
3486070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3487070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((x == NULL) || (y == NULL))
34885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return -2;
3489070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3490070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* months */
3491070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    mon = x->value.dur.mon - y->value.dur.mon;
3492070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3493070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* seconds */
3494070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    sec = x->value.dur.sec - y->value.dur.sec;
3495070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    carry = (long)sec / SECS_PER_DAY;
3496070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    sec -= (double)(carry * SECS_PER_DAY);
3497070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3498070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* days */
3499070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    day = x->value.dur.day - y->value.dur.day + carry;
3500070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3501070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* easy test */
3502070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (mon == 0) {
3503070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (day == 0)
3504070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (sec == 0.0)
3505070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 0;
3506070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else if (sec < 0.0)
3507070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return -1;
3508070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else
3509070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 1;
3510070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else if (day < 0)
3511070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return -1;
3512070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else
3513070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return 1;
3514070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
3515070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3516070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (mon > 0) {
3517070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if ((day >= 0) && (sec >= 0.0))
3518070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return 1;
3519070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else {
3520070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            xmon = mon;
3521070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            xday = -day;
3522070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        }
3523070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    } else if ((day <= 0) && (sec <= 0.0)) {
3524070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        return -1;
3525070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    } else {
352680b19092f24410a6b869abf519227686e8f207caDaniel Veillard	invert = -1;
3527070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xmon = -mon;
3528070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xday = day;
3529070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
3530070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3531070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    myear = xmon / 12;
353280b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (myear == 0) {
353380b19092f24410a6b869abf519227686e8f207caDaniel Veillard	minday = 0;
353480b19092f24410a6b869abf519227686e8f207caDaniel Veillard	maxday = 0;
353580b19092f24410a6b869abf519227686e8f207caDaniel Veillard    } else {
353680b19092f24410a6b869abf519227686e8f207caDaniel Veillard	maxday = 366 * ((myear + 3) / 4) +
353780b19092f24410a6b869abf519227686e8f207caDaniel Veillard	         365 * ((myear - 1) % 4);
353880b19092f24410a6b869abf519227686e8f207caDaniel Veillard	minday = maxday - 1;
353980b19092f24410a6b869abf519227686e8f207caDaniel Veillard    }
354080b19092f24410a6b869abf519227686e8f207caDaniel Veillard
3541070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmon = xmon % 12;
3542070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    minday += dayRange[0][xmon];
3543070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    maxday += dayRange[1][xmon];
3544070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
354580b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if ((maxday == minday) && (maxday == xday))
354680b19092f24410a6b869abf519227686e8f207caDaniel Veillard	return(0); /* can this really happen ? */
3547070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (maxday < xday)
354880b19092f24410a6b869abf519227686e8f207caDaniel Veillard        return(-invert);
354980b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (minday > xday)
355080b19092f24410a6b869abf519227686e8f207caDaniel Veillard        return(invert);
3551070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3552070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* indeterminate */
35535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return 2;
35545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
35555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
35565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/*
35575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * macros for adding date/times and durations
35585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
35595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT(a,b)                  (floor(((double)a/(double)b)))
35605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO(a,b)                     (a - FQUOTIENT(a,b) * b)
35615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT_RANGE(a,low,high)     (FQUOTIENT((a-low),(high-low)))
35625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO_RANGE(a,low,high)        ((MODULO((a-low),(high-low)))+low)
35635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
35645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
3565669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * xmlSchemaDupVal:
3566669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @v: the #xmlSchemaValPtr value to duplicate
3567669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard *
3568669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Makes a copy of @v. The calling program is responsible for freeing
3569669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the returned value.
3570669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard *
3571669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * returns a pointer to a duplicated #xmlSchemaValPtr or NULL if error.
3572669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard */
3573669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillardstatic xmlSchemaValPtr
3574669adfcd3af5dfda873b10119d44202a7450bb20Daniel VeillardxmlSchemaDupVal (xmlSchemaValPtr v)
3575669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard{
3576669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaValPtr ret = xmlSchemaNewValue(v->type);
3577669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    if (ret == NULL)
3578669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        return NULL;
3579669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard
3580669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    memcpy(ret, v, sizeof(xmlSchemaVal));
35814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->next = NULL;
3582669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    return ret;
3583669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard}
3584669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard
3585669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard/**
3586285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * xmlSchemaCopyValue:
3587285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * @val:  the precomputed value to be copied
3588285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik *
3589285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Copies the precomputed value. This duplicates any string within.
3590285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik *
3591285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Returns the copy or NULL if a copy for a data-type is not implemented.
3592285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik */
3593285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaValPtr
3594285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaCopyValue(xmlSchemaValPtr val)
3595285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik{
35964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaValPtr ret = NULL, prev = NULL, cur;
3597285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik
3598285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    /*
3599285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    * Copy the string values.
3600285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    */
36014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    while (val != NULL) {
36024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	switch (val->type) {
36034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYTYPE:
36044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_IDREFS:
36054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ENTITIES:
36064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NMTOKENS:
36074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		xmlSchemaFreeValue(ret);
36084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		return (NULL);
36094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYSIMPLETYPE:
36104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_STRING:
36114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NORMSTRING:
36124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_TOKEN:
36134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_LANGUAGE:
36144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NAME:
36154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NCNAME:
36164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ID:
36174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_IDREF:
36184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ENTITY:
36194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NMTOKEN:
36204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYURI:
36214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
36224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.str != NULL)
36234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.str = xmlStrdup(BAD_CAST val->value.str);
36244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
36254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_QNAME:
36264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NOTATION:
36274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
36284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.qname.name != NULL)
36294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.qname.name =
3630285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                    xmlStrdup(BAD_CAST val->value.qname.name);
36314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.qname.uri != NULL)
36324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.qname.uri =
3633285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                    xmlStrdup(BAD_CAST val->value.qname.uri);
36344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
36354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_HEXBINARY:
36364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
36374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.hex.str != NULL)
36384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.hex.str = xmlStrdup(BAD_CAST val->value.hex.str);
36394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
36404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_BASE64BINARY:
36414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
36424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.base64.str != NULL)
36434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.base64.str =
3644285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                    xmlStrdup(BAD_CAST val->value.base64.str);
36454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
36464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    default:
36474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
36484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
36494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	}
36504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	if (ret == NULL)
36514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    ret = cur;
36524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	else
36534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    prev->next = cur;
36544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	prev = cur;
36554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	val = val->next;
3656285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    }
36574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (ret);
3658285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik}
3659285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik
3660285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik/**
36615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateAdd:
36625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr
36635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dur: an #xmlSchemaValPtr of type #XS_DURATION
36645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
36655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compute a new date/time from @dt and @dur. This function assumes @dt
36665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH,
3667669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * or #XML_SCHEMAS_GYEAR. The returned #xmlSchemaVal is the same type as
3668669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt. The calling program is responsible for freeing the returned value.
36695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3670669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a pointer to a new #xmlSchemaVal or NULL if error.
36715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
36725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr
36735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur)
36745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
3675669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaValPtr ret, tmp;
36765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long carry, tempdays, temp;
36775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValDatePtr r, d;
36785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValDurationPtr u;
36795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
36805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((dt == NULL) || (dur == NULL))
36815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
36825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
36835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ret = xmlSchemaNewValue(dt->type);
36845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret == NULL)
36855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
36865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3687669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    /* make a copy so we don't alter the original value */
3688669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    tmp = xmlSchemaDupVal(dt);
3689669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    if (tmp == NULL) {
3690669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        xmlSchemaFreeValue(ret);
3691669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        return NULL;
3692669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    }
3693669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard
36945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r = &(ret->value.date);
3695669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    d = &(tmp->value.date);
36965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    u = &(dur->value.dur);
36975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
36985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalization */
36995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (d->mon == 0)
37005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        d->mon = 1;
37015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalize for time zone offset */
37035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    u->sec -= (d->tzo * 60);
37045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    d->tzo = 0;
37055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalization */
37075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (d->day == 0)
37085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        d->day = 1;
37095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* month */
37115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry  = d->mon + u->mon;
3712ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->mon = (unsigned int) MODULO_RANGE(carry, 1, 13);
3713ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT_RANGE(carry, 1, 13);
37145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* year (may be modified later) */
37165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->year = d->year + carry;
37175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (r->year == 0) {
37185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (d->year > 0)
37195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            r->year--;
37205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else
37215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            r->year++;
37225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
37235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* time zone */
37255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->tzo     = d->tzo;
37265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->tz_flag = d->tz_flag;
37275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* seconds */
37295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->sec = d->sec + u->sec;
3730ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT((long)r->sec, 60);
37315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (r->sec != 0.0) {
37325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        r->sec = MODULO(r->sec, 60.0);
37335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
37345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* minute */
37365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry += d->min;
3737ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->min = (unsigned int) MODULO(carry, 60);
3738ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT(carry, 60);
37395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* hours */
37415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry  += d->hour;
3742ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->hour = (unsigned int) MODULO(carry, 24);
3743ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry   = (long)FQUOTIENT(carry, 24);
37445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
37465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * days
37475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * Note we use tempdays because the temporary values may need more
37485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * than 5 bits
37495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
37505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) &&
37515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                  (d->day > MAX_DAYINMONTH(r->year, r->mon)))
37525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = MAX_DAYINMONTH(r->year, r->mon);
37535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (d->day < 1)
37545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = 1;
37555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else
37565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = d->day;
37575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    tempdays += u->day + carry;
37595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    while (1) {
37615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (tempdays < 1) {
37625e9576a492e4fb8c2d517ccd6056a139e801ec9fDaniel Veillard            long tmon = (long) MODULO_RANGE((int)r->mon-1, 1, 13);
37635e9576a492e4fb8c2d517ccd6056a139e801ec9fDaniel Veillard            long tyr  = r->year + (long)FQUOTIENT_RANGE((int)r->mon-1, 1, 13);
37645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (tyr == 0)
37655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                tyr--;
37665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            tempdays += MAX_DAYINMONTH(tyr, tmon);
37675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            carry = -1;
3768ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard        } else if (tempdays > (long) MAX_DAYINMONTH(r->year, r->mon)) {
37695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon);
37705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            carry = 1;
37715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        } else
37725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
37735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        temp = r->mon + carry;
3775ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard        r->mon = (unsigned int) MODULO_RANGE(temp, 1, 13);
3776ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard        r->year = r->year + (unsigned int) FQUOTIENT_RANGE(temp, 1, 13);
37775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (r->year == 0) {
37785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (temp < 1)
37795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                r->year--;
37805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else
37815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                r->year++;
37825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	}
37835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
37845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->day = tempdays;
37865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
37885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * adjust the date/time type to the date values
37895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
37905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret->type != XML_SCHEMAS_DATETIME) {
37915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if ((r->hour) || (r->min) || (r->sec))
37925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ret->type = XML_SCHEMAS_DATETIME;
37935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (ret->type != XML_SCHEMAS_DATE) {
37945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if ((r->mon != 1) && (r->day != 1))
37955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                ret->type = XML_SCHEMAS_DATE;
37965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1))
37975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                ret->type = XML_SCHEMAS_GYEARMONTH;
37985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
37995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
38005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3801669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaFreeValue(tmp);
38025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
38045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
38055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
38075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaDateNormalize:
3808669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt: an #xmlSchemaValPtr of a date/time type value.
3809669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @offset: number of seconds to adjust @dt by.
38105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3811669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Normalize @dt to GMT time. The @offset parameter is subtracted from
3812669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the return value is a time-zone offset is present on @dt.
38135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3814669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a normalized copy of @dt or NULL if error.
38155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
38165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr
38175a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset)
38185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
38195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValPtr dur, ret;
38205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dt == NULL)
38225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
38235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (((dt->type != XML_SCHEMAS_TIME) &&
3825c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik         (dt->type != XML_SCHEMAS_DATETIME) &&
3826c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	 (dt->type != XML_SCHEMAS_DATE)) || (dt->value.date.tzo == 0))
38275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return xmlSchemaDupVal(dt);
38285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION);
38305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dur == NULL)
38315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
38325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    dur->value.date.sec -= offset;
38345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ret = _xmlSchemaDateAdd(dt, dur);
38365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret == NULL)
38375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
38385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaFreeValue(dur);
38405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* ret->value.date.tzo = 0; */
38425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
38435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
38445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
38465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateCastYMToDays:
38475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr
38485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
38495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Convert mon and year of @dt to total number of days. Take the
38505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * number of years since (or before) 1 AD and add the number of leap
38515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years. This is a function  because negative
38525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years must be handled a little differently and there is no zero year.
38535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
38545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns number of days.
38555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
38565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic long
38575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt)
38585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
38595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long ret;
386049e8963c640865343327c67d4755a1af705717d3Daniel Veillard    int mon;
38615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
386249e8963c640865343327c67d4755a1af705717d3Daniel Veillard    mon = dt->value.date.mon;
386349e8963c640865343327c67d4755a1af705717d3Daniel Veillard    if (mon <= 0) mon = 1; /* normalization */
386449e8963c640865343327c67d4755a1af705717d3Daniel Veillard
386549e8963c640865343327c67d4755a1af705717d3Daniel Veillard    if (dt->value.date.year <= 0)
38665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ret = (dt->value.date.year * 365) +
38675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+
38685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard               ((dt->value.date.year+1)/400)) +
386949e8963c640865343327c67d4755a1af705717d3Daniel Veillard              DAY_IN_YEAR(0, mon, dt->value.date.year);
38705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else
38715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ret = ((dt->value.date.year-1) * 365) +
38725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+
38735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard               ((dt->value.date.year-1)/400)) +
387449e8963c640865343327c67d4755a1af705717d3Daniel Veillard              DAY_IN_YEAR(0, mon, dt->value.date.year);
38755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
38775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
38785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
38805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * TIME_TO_NUMBER:
38815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt:  an #xmlSchemaValPtr
38825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
38835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Calculates the number of seconds in the time portion of @dt.
38845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
38855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns seconds.
38865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
38875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define TIME_TO_NUMBER(dt)                              \
38885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ((double)((dt->value.date.hour * SECS_PER_HOUR) +   \
3889b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard              (dt->value.date.min * SECS_PER_MIN) +	\
3890b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard              (dt->value.date.tzo * SECS_PER_MIN)) +	\
3891b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard               dt->value.date.sec)
38925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
38945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaCompareDates:
38955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @x:  a first date/time value
38965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @y:  a second date/time value
38975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
38985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compare 2 date/times
38995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
39005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
39015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error
39025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
39035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic int
39045a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y)
39055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
39065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    unsigned char xmask, ymask, xor_mask, and_mask;
39075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValPtr p1, p2, q1, q2;
39085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long p1d, p2d, q1d, q2d;
39095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((x == NULL) || (y == NULL))
39115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return -2;
39125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (x->value.date.tz_flag) {
39145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (!y->value.date.tz_flag) {
39165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            p1 = xmlSchemaDateNormalize(x, 0);
39175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
39185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            /* normalize y + 14:00 */
39195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR));
39205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
3922fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            if (p1d < q1d) {
3923fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
3924fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
39255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return -1;
3926fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    } else if (p1d == q1d) {
39275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                double sec;
39285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
3930fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard                if (sec < 0.0) {
3931fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		    xmlSchemaFreeValue(p1);
3932fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		    xmlSchemaFreeValue(q1);
39335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    return -1;
3934fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		} else {
39354aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    int ret = 0;
39365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    /* normalize y - 14:00 */
39375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR));
39385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day;
39395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    if (p1d > q2d)
39404aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 1;
39415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    else if (p1d == q2d) {
39425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2);
39435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        if (sec > 0.0)
39444aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                            ret = 1;
39455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        else
39464aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                            ret = 2; /* indeterminate */
39475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    }
39484aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(p1);
39494aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(q1);
39504aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(q2);
39514aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    if (ret != 0)
39524aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		        return(ret);
39535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                }
3954fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            } else {
3955fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
3956fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
3957fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    }
39585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
39595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    } else if (y->value.date.tz_flag) {
39605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1 = xmlSchemaDateNormalize(y, 0);
39615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
39625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        /* normalize x - 14:00 */
39645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR));
39655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
39665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3967fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard        if (p1d < q1d) {
3968fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(p1);
3969fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(q1);
39705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
3971fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else if (p1d == q1d) {
39725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            double sec;
39735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
3975fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            if (sec < 0.0) {
3976fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
3977fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
39785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return -1;
3979fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    } else {
39804aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	        int ret = 0;
39815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                /* normalize x + 14:00 */
39825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR));
39835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day;
39845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39856560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                if (p2d > q1d) {
39864aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                    ret = 1;
39876560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		} else if (p2d == q1d) {
39885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1);
39895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    if (sec > 0.0)
39904aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 1;
39915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    else
39924aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 2; /* indeterminate */
39935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                }
39946560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(p1);
39956560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(q1);
39966560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(p2);
39974aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		if (ret != 0)
39984aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    return(ret);
39995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            }
4000fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else {
4001fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(p1);
4002fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(q1);
40035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
40045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
40055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
40075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * if the same type then calculate the difference
40085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
40095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (x->type == y->type) {
40104aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard        int ret = 0;
40115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1 = xmlSchemaDateNormalize(y, 0);
40125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
40135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1 = xmlSchemaDateNormalize(x, 0);
40155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
40165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
4017fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard        if (p1d < q1d) {
40184aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard            ret = -1;
4019fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else if (p1d > q1d) {
40204aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard            ret = 1;
4021fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else {
40225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            double sec;
40235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
40255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (sec < 0.0)
40264aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                ret = -1;
40275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else if (sec > 0.0)
40284aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                ret = 1;
40295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
40314aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	xmlSchemaFreeValue(p1);
40324aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	xmlSchemaFreeValue(q1);
40334aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard        return(ret);
40345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
40355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    switch (x->type) {
40375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
40385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0xf;
40395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
40405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
40415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x7;
40425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
40435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
40445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x1;
40455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
40465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
40475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x2;
40485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
40495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
40505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x3;
40515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
40525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
40535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x3;
40545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
40555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
40565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x6;
40575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
40585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
40595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x8;
40605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
40615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        default:
40625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0;
40635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
40645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
40655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    switch (y->type) {
40675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
40685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0xf;
40695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
40705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
40715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x7;
40725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
40735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
40745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x1;
40755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
40765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
40775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x2;
40785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
40795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
40805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x3;
40815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
40825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
40835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x3;
40845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
40855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
40865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x6;
40875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
40885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
40895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x8;
40905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
40915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        default:
40925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0;
40935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
40945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
40955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xor_mask = xmask ^ ymask;           /* mark type differences */
40975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    and_mask = xmask & ymask;           /* mark field specification */
40985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* year */
41005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 1)
41015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
41025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 1) {
41035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.year < y->value.date.year)
41045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
41055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.year > y->value.date.year)
41065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
41075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
41085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* month */
41105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 2)
41115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
41125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 2) {
41135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.mon < y->value.date.mon)
41145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
41155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.mon > y->value.date.mon)
41165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
41175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
41185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* day */
41205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 4)
41215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
41225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 4) {
41235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.day < y->value.date.day)
41245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
41255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.day > y->value.date.day)
41265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
41275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
41285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* time */
41305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 8)
41315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
41325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 8) {
41335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.hour < y->value.date.hour)
41345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
41355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.hour > y->value.date.hour)
41365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
41375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.min < y->value.date.min)
41385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
41395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.min > y->value.date.min)
41405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
41415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.sec < y->value.date.sec)
41425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
41435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.sec > y->value.date.sec)
41445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
41455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
41465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
4147070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
4148070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
4149070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
4150070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
41516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveReplaceStrings:
4152478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @x:  a first string value
4153478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @y:  a second string value
41546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @invert: inverts the result if x < y or x > y.
41556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
41566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
41576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is
41586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "replace". I.e. @x could
41596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString".
41606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
41616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
41626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
41636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
41646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
4165478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaComparePreserveReplaceStrings(const xmlChar *x,
4166478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				       const xmlChar *y,
41676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				       int invert)
41686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
41696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
41706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
4171478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4172478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (IS_WSP_REPLACE_CH(*y)) {
4173478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (! IS_WSP_SPACE_CH(*x)) {
4174478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*x - 0x20) < 0) {
41756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
41766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
41776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
41786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
41796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
41806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
41816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
41826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
41836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
41846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
41856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
41866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
4187478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x - *y;
41886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0) {
41896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
41906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
41916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
41926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
41936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
41946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0) {
41956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
41966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
41976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
41986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
41996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
42006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
4201478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	x++;
4202478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	y++;
42036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4204478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0) {
42056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (invert)
42066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(-1);
42076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	else
42086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(1);
42096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4210478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0) {
42116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (invert)
42126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(1);
42136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	else
42146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(-1);
42156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
42166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
42176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
42186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
42196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
42206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings:
42216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
42226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
42236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
42246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
42256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is
42266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could
42276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString".
42286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
42296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
42306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
42316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
42326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
4233478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaComparePreserveCollapseStrings(const xmlChar *x,
4234478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				        const xmlChar *y,
42356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik					int invert)
42366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
42376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
42386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
42396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    /*
42406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    * Skip leading blank chars of the collapsed string.
42416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    */
4242478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while IS_WSP_BLANK_CH(*y)
4243478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	y++;
42446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
4245478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4246478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if IS_WSP_BLANK_CH(*y) {
4247478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (! IS_WSP_SPACE_CH(*x)) {
42486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		/*
4249478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* The yv character would have been replaced to 0x20.
42506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*/
4251478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*x - 0x20) < 0) {
42526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
42536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
42546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
42556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
42566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
42576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
42586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
42596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
42606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
42616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
42626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4263478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    x++;
4264478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    y++;
42656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    /*
42666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    * Skip contiguous blank chars of the collapsed string.
42676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    */
4268478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    while IS_WSP_BLANK_CH(*y)
4269478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		y++;
42706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
4271478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x++ - *y++;
42726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0) {
42736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
42746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
42756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
42766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
42776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
42786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0) {
42796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
42806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
42816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
42826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
42836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
42846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
42856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4286478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0) {
42876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 if (invert)
42886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(-1);
42896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 else
42906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(1);
42916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4292478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0) {
42936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	/*
42946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	* Skip trailing blank chars of the collapsed string.
42956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	*/
4296478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*y)
4297478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    y++;
4298478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (*y != 0) {
42996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (invert)
43006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(1);
43016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    else
43026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(-1);
43036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
43046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
43056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
43066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
43076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
43086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
43096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings:
43106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
43116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
43126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
43136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
43146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is
43156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could
43166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString".
43176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
43186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
43196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
43206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
43216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
4322478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareReplaceCollapseStrings(const xmlChar *x,
4323478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				       const xmlChar *y,
43246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				       int invert)
43256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
43266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
43276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
43286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    /*
43296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    * Skip leading blank chars of the collapsed string.
43306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    */
4331478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while IS_WSP_BLANK_CH(*y)
4332478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	y++;
43336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
4334478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4335478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if IS_WSP_BLANK_CH(*y) {
4336478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (! IS_WSP_BLANK_CH(*x)) {
43376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		/*
4338478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* The yv character would have been replaced to 0x20.
43396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*/
4340478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*x - 0x20) < 0) {
43416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
43426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
43436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
43446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
43456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
43466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
43476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
43486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
43496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
43506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
43516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4352478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    x++;
4353478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    y++;
43546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    /*
43556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    * Skip contiguous blank chars of the collapsed string.
43566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    */
4357478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    while IS_WSP_BLANK_CH(*y)
4358478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		y++;
43596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
4360478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if IS_WSP_BLANK_CH(*x) {
43616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		/*
4362478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* The xv character would have been replaced to 0x20.
43636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*/
4364478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((0x20 - *y) < 0) {
43656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
43666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
43676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
43686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
43696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
43706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
43716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
43726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
43736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
43746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
43756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4376478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x++ - *y++;
43776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0)
43786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(-1);
43796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0)
43806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(1);
43816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
43826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4383478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0) {
43846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 if (invert)
43856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(-1);
43866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 else
43876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(1);
43886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4389478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0) {
43906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	/*
43916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	* Skip trailing blank chars of the collapsed string.
43926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	*/
4393478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*y)
4394478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    y++;
4395478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (*y != 0) {
43966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (invert)
43976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(1);
43986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    else
43996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(-1);
44006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
44016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
44026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
44036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
44046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
44056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
44066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
44076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareReplacedStrings:
44086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
44096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
44106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
44116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
44126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
44136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
44146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
44156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
44166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
4417478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareReplacedStrings(const xmlChar *x,
4418478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				const xmlChar *y)
44196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
44206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
44216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
4422478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4423478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if IS_WSP_BLANK_CH(*y) {
4424478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (! IS_WSP_BLANK_CH(*x)) {
4425478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*x - 0x20) < 0)
44266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    		    return(-1);
44276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
44286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
44296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
44306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
4431478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if IS_WSP_BLANK_CH(*x) {
4432478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((0x20 - *y) < 0)
44336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    		    return(-1);
44346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
44356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
44366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4437478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x - *y;
44386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0)
44396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    		return(-1);
44406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0)
44416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    		return(1);
44426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
4443478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	x++;
4444478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	y++;
44456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4446478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0)
44476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        return(1);
4448478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0)
44496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        return(-1);
44506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
44516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
44526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
44536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
4454c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaCompareNormStrings:
4455c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @x:  a first string value
4456c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @y:  a second string value
4457c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
4458c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Compare 2 string for their normalized values.
4459c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
4460c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
4461c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * case of error
4462c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */
4463c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int
4464478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareNormStrings(const xmlChar *x,
4465478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    const xmlChar *y) {
4466c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    int tmp;
4467c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
4468478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while (IS_BLANK_CH(*x)) x++;
4469478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while (IS_BLANK_CH(*y)) y++;
4470478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4471478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (IS_BLANK_CH(*x)) {
4472478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (!IS_BLANK_CH(*y)) {
4473478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		tmp = *x - *y;
4474c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(tmp);
4475c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    }
4476478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    while (IS_BLANK_CH(*x)) x++;
4477478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    while (IS_BLANK_CH(*y)) y++;
4478c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	} else {
4479478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x++ - *y++;
4480c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (tmp < 0)
4481c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(-1);
4482c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (tmp > 0)
4483c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(1);
4484c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	}
4485c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
4486478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0) {
4487478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	while (IS_BLANK_CH(*x)) x++;
4488478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (*x != 0)
4489c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    return(1);
4490c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
4491478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0) {
4492478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	while (IS_BLANK_CH(*y)) y++;
4493478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (*y != 0)
4494c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    return(-1);
4495c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
4496c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    return(0);
4497c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard}
4498c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
4499c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/**
4500b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCompareFloats:
4501b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @x:  a first float or double value
4502b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @y:  a second float or double value
4503b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
4504b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Compare 2 values
4505b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
4506b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
4507b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * case of error
4508b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
4509b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int
4510b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) {
4511b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    double d1, d2;
4512b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4513b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if ((x == NULL) || (y == NULL))
4514b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
4515b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4516b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
4517b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * Cast everything to doubles.
4518b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
4519b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (x->type == XML_SCHEMAS_DOUBLE)
4520b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d1 = x->value.d;
4521b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else if (x->type == XML_SCHEMAS_FLOAT)
4522b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d1 = x->value.f;
4523b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else
4524b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
4525b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4526b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (y->type == XML_SCHEMAS_DOUBLE)
4527b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d2 = y->value.d;
4528b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else if (y->type == XML_SCHEMAS_FLOAT)
4529b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d2 = y->value.f;
4530b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else
4531b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
4532b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4533b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
4534b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * Check for special cases.
4535b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
4536b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (xmlXPathIsNaN(d1)) {
4537b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (xmlXPathIsNaN(d2))
4538b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
4539b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(1);
4540b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
4541b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (xmlXPathIsNaN(d2))
4542b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-1);
4543b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == xmlXPathPINF) {
4544b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (d2 == xmlXPathPINF)
4545b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
4546b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(1);
4547b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
4548b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d2 == xmlXPathPINF)
4549b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(-1);
4550b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == xmlXPathNINF) {
4551b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (d2 == xmlXPathNINF)
4552b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
4553b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(-1);
4554b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
4555b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d2 == xmlXPathNINF)
4556b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(1);
4557b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4558b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
4559b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * basic tests, the last one we should have equality, but
4560b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * portability is more important than speed and handling
4561b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * NaN or Inf in a portable way is always a challenge, so ...
4562b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
4563b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 < d2)
4564b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-1);
4565b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 > d2)
4566b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(1);
4567b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == d2)
4568b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(0);
4569b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return(2);
4570b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
4571b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4572b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
45734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareValues:
45744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x:  a first value
45756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xvalue: the first value as a string (optional)
45766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xwtsp: the whitespace type
45774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y:  a second value
45786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xvalue: the second value as a string (optional)
45796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @ywtsp: the whitespace type
45804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
45814255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 values
45824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
45834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, 3 if not
45844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * comparable and -2 in case of error
45854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
45866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
45876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaCompareValuesInternal(xmlSchemaValType xtype,
45886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValPtr x,
45896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *xvalue,
45906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType xws,
45916c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValType ytype,
45926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			       xmlSchemaValPtr y,
45936c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *yvalue,
4594478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType yws)
4595478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{
45966c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    switch (xtype) {
459780b19092f24410a6b869abf519227686e8f207caDaniel Veillard	case XML_SCHEMAS_UNKNOWN:
45982f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	case XML_SCHEMAS_ANYTYPE:
459980b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    return(-2);
460080b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_INTEGER:
460180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NPINTEGER:
460280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NINTEGER:
460380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NNINTEGER:
460480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_PINTEGER:
460580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_INT:
460680b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_UINT:
460780b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_LONG:
460880b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ULONG:
460980b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_SHORT:
461080b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_USHORT:
461180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_BYTE:
461280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_UBYTE:
46134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMAS_DECIMAL:
46146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
46156c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
46166c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ytype == xtype)
461780b19092f24410a6b869abf519227686e8f207caDaniel Veillard		return(xmlSchemaCompareDecimals(x, y));
46186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((ytype == XML_SCHEMAS_DECIMAL) ||
46196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_INTEGER) ||
46206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_NPINTEGER) ||
46216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_NINTEGER) ||
46226c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_NNINTEGER) ||
46236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_PINTEGER) ||
46246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_INT) ||
46256c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_UINT) ||
46266c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_LONG) ||
46276c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_ULONG) ||
46286c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_SHORT) ||
46296c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_USHORT) ||
46306c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_BYTE) ||
46316c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_UBYTE))
46324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(xmlSchemaCompareDecimals(x, y));
46335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    return(-2);
4634070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        case XML_SCHEMAS_DURATION:
46356c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
46366c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
4637478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (ytype == XML_SCHEMAS_DURATION)
4638070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return(xmlSchemaCompareDurations(x, y));
46395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return(-2);
46405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
46415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
46425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
46435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
46445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
46455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
46465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
46475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
46486c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
46496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
46506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if ((ytype == XML_SCHEMAS_DATETIME)  ||
46516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_TIME)      ||
46526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GDAY)      ||
46536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GMONTH)    ||
46546c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GMONTHDAY) ||
46556c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GYEAR)     ||
46566c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_DATE)      ||
46576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GYEARMONTH))
46585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return (xmlSchemaCompareDates(x, y));
46595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return (-2);
46602ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	/*
46612ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	* Note that we will support comparison of string types against
46622ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	* anySimpleType as well.
46632ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	*/
46642ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	case XML_SCHEMAS_ANYSIMPLETYPE:
46656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_STRING:
46666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        case XML_SCHEMAS_NORMSTRING:
466780b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_TOKEN:
466880b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_LANGUAGE:
466980b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NMTOKEN:
467080b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NAME:
467180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NCNAME:
467280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ID:
467380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_IDREF:
467480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ENTITY:
467580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ANYURI:
46766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	{
46776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    const xmlChar *xv, *yv;
46786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
46796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (x == NULL)
46806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		xv = xvalue;
46816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    else
46826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		xv = x->value.str;
46836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (y == NULL)
46846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		yv = yvalue;
46856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    else
46866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		yv = y->value.str;
46876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    /*
46886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    * TODO: Compare those against QName.
46896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    */
46906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ytype == XML_SCHEMAS_QNAME) {
46916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		TODO
46926c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		if (y == NULL)
46936c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    return(-2);
46946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return (-2);
46956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
46966c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if ((ytype == XML_SCHEMAS_ANYSIMPLETYPE) ||
46976c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_STRING) ||
46986c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_NORMSTRING) ||
46996c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_TOKEN) ||
47006c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_LANGUAGE) ||
47016c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_NMTOKEN) ||
47026c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_NAME) ||
47036c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_NCNAME) ||
47046c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_ID) ||
47056c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_IDREF) ||
47066c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_ENTITY) ||
47076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_ANYURI)) {
47086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
47096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (xws == XML_SCHEMA_WHITESPACE_PRESERVE) {
47106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
47116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) {
47126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			/* TODO: What about x < y or x > y. */
47136c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			if (xmlStrEqual(xv, yv))
47146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			    return (0);
47156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			else
47166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			    return (2);
47176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    } else if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
47186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaComparePreserveReplaceStrings(xv, yv, 0));
47196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
47206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaComparePreserveCollapseStrings(xv, yv, 0));
47216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
47226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else if (xws == XML_SCHEMA_WHITESPACE_REPLACE) {
47236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
47246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE)
47256c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaComparePreserveReplaceStrings(yv, xv, 1));
47266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
47276c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaCompareReplacedStrings(xv, yv));
47286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
47296c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaCompareReplaceCollapseStrings(xv, yv, 0));
47306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
47316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else if (xws == XML_SCHEMA_WHITESPACE_COLLAPSE) {
47326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
47336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE)
47346c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaComparePreserveCollapseStrings(yv, xv, 1));
47356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
47366c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaCompareReplaceCollapseStrings(yv, xv, 1));
47376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
47386c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaCompareNormStrings(xv, yv));
47396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else
47406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return (-2);
47416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
47426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4743c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard            return (-2);
47446c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	}
4745e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_QNAME:
4746c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_NOTATION:
47476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
47486c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
4749c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik            if ((ytype == XML_SCHEMAS_QNAME) ||
4750c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		(ytype == XML_SCHEMAS_NOTATION)) {
4751e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) &&
4752e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    (xmlStrEqual(x->value.qname.uri, y->value.qname.uri)))
4753e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    return(0);
4754e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		return(2);
4755e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    }
4756e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (-2);
4757c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_FLOAT:
4758c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_DOUBLE:
47596c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
47606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
47616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if ((ytype == XML_SCHEMAS_FLOAT) ||
47626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_DOUBLE))
4763b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard                return (xmlSchemaCompareFloats(x, y));
4764b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard            return (-2);
4765c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_BOOLEAN:
47666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
47676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
47686c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if (ytype == XML_SCHEMAS_BOOLEAN) {
4769b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (x->value.b == y->value.b)
4770b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    return(0);
4771b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (x->value.b == 0)
4772b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    return(-1);
4773b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		return(1);
4774b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
4775b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return (-2);
4776560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard        case XML_SCHEMAS_HEXBINARY:
47776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
47786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
47796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if (ytype == XML_SCHEMAS_HEXBINARY) {
478070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	        if (x->value.hex.total == y->value.hex.total) {
478170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    int ret = xmlStrcmp(x->value.hex.str, y->value.hex.str);
478270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    if (ret > 0)
478370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard			return(1);
478470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    else if (ret == 0)
478570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard			return(0);
478670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		}
478770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		else if (x->value.hex.total > y->value.hex.total)
478870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    return(1);
478970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
479070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		return(-1);
479170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard            }
4792560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard            return (-2);
47931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BASE64BINARY:
47946c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
47956c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
47966c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if (ytype == XML_SCHEMAS_BASE64BINARY) {
47971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (x->value.base64.total == y->value.base64.total) {
47981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int ret = xmlStrcmp(x->value.base64.str,
47991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		                        y->value.base64.str);
48001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (ret > 0)
48011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        return(1);
48021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (ret == 0)
48031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        return(0);
4804d369b1387e592791049a41eb4cc16046fe52e985Daniel Veillard		    else
4805d369b1387e592791049a41eb4cc16046fe52e985Daniel Veillard		        return(-1);
48061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
48071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else if (x->value.base64.total > y->value.base64.total)
48081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    return(1);
48091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else
48101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    return(-1);
48111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
48126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik            return (-2);
4813c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_IDREFS:
4814c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ENTITIES:
4815c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NMTOKENS:
4816c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    TODO
4817c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    break;
48184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
48195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return -2;
48204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
48214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
48224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
48236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValues:
48246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first value
48256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second value
48266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
48276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values
48286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
48296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
48306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
48316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
48326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint
48336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) {
48346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    xmlSchemaWhitespaceValueType xws, yws;
48356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
48365e094143e423c01739ac9221f371846fd290be4eDaniel Veillard    if ((x == NULL) || (y == NULL))
48375e094143e423c01739ac9221f371846fd290be4eDaniel Veillard        return(-2);
48386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (x->type == XML_SCHEMAS_STRING)
48396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	xws = XML_SCHEMA_WHITESPACE_PRESERVE;
48406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else if (x->type == XML_SCHEMAS_NORMSTRING)
48416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        xws = XML_SCHEMA_WHITESPACE_REPLACE;
48426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else
48436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        xws = XML_SCHEMA_WHITESPACE_COLLAPSE;
48446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
48456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (y->type == XML_SCHEMAS_STRING)
48466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	yws = XML_SCHEMA_WHITESPACE_PRESERVE;
48476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else if (x->type == XML_SCHEMAS_NORMSTRING)
48486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        yws = XML_SCHEMA_WHITESPACE_REPLACE;
48496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else
48506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        yws = XML_SCHEMA_WHITESPACE_COLLAPSE;
48516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
48526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type,
48536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	y, NULL, yws));
48546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
48556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
48566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
48576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValuesWhtsp:
48586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first value
48596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xws: the whitespace value of x
48606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second value
48616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @yws: the whitespace value of y
48626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
48636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values
48646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
48656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
48666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
48676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
48686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint
48696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValuesWhtsp(xmlSchemaValPtr x,
48706c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaWhitespaceValueType xws,
48716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaValPtr y,
48726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaWhitespaceValueType yws)
48736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{
48749dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik    if ((x == NULL) || (y == NULL))
48759dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik	return(-2);
48766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type,
48776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	y, NULL, yws));
48786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik}
48796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
48806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/**
48816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaCompareValuesWhtspExt:
48826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @x:  a first value
48836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xws: the whitespace value of x
48846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @y:  a second value
48856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @yws: the whitespace value of y
48866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
48876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Compare 2 values
48886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
48896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
48906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * case of error
48916c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */
48926c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikstatic int
48936c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaCompareValuesWhtspExt(xmlSchemaValType xtype,
48946c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValPtr x,
48956c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *xvalue,
48966c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType xws,
48976c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValType ytype,
48986c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValPtr y,
48996c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *yvalue,
49006c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType yws)
49016c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{
49026c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    return(xmlSchemaCompareValuesInternal(xtype, x, xvalue, xws, ytype, y,
49036c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	yvalue, yws));
49046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
49056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
49066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
4907c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaNormLen:
4908c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @value:  a string
4909c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
4910c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Computes the UTF8 length of the normalized value of the string
4911c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
4912c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns the length or -1 in case of error.
4913c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */
4914c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int
4915c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaNormLen(const xmlChar *value) {
4916c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    const xmlChar *utf;
4917c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    int ret = 0;
4918c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
4919c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    if (value == NULL)
4920c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	return(-1);
4921c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    utf = value;
492276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while (IS_BLANK_CH(*utf)) utf++;
4923c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    while (*utf != 0) {
4924c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	if (utf[0] & 0x80) {
4925c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if ((utf[1] & 0xc0) != 0x80)
4926c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(-1);
4927c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if ((utf[0] & 0xe0) == 0xe0) {
4928c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		if ((utf[2] & 0xc0) != 0x80)
4929c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    return(-1);
4930c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		if ((utf[0] & 0xf0) == 0xf0) {
4931c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80)
4932c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard			return(-1);
4933c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    utf += 4;
4934c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		} else {
4935c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    utf += 3;
4936c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		}
4937c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    } else {
4938c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		utf += 2;
4939c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    }
494076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	} else if (IS_BLANK_CH(*utf)) {
494176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*utf)) utf++;
4942c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (*utf == 0)
4943c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		break;
4944c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	} else {
4945c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    utf++;
4946c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	}
4947c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	ret++;
4948c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
4949c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    return(ret);
4950c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard}
4951c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
49526927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard/**
49536927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaGetFacetValueAsULong:
49546927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * @facet: an schemas type facet
49556927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard *
49566927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Extract the value of a facet
49576927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard *
49586927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Returns the value as a long
49596927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard */
4960c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardunsigned long
4961c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaGetFacetValueAsULong(xmlSchemaFacetPtr facet)
4962c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{
4963c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    /*
4964c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    * TODO: Check if this is a decimal.
4965c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    */
4966094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack    if (facet == NULL)
4967094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack        return 0;
4968c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    return ((unsigned long) facet->val->value.decimal.lo);
4969c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
4970c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
4971c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/**
497201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateListSimpleTypeFacet:
497301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facet:  the facet to check
497401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @value:  the lexical repr of the value to validate
497501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @actualLen:  the number of list items
497601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @expectedLen: the resulting expected number of list items
497701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
497801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Checks the value of a list simple type against a facet.
497901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
498001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 0 if the value is valid, a positive error code
498101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * number otherwise and -1 in case of an internal error.
498201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
498301fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint
498401fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaValidateListSimpleTypeFacet(xmlSchemaFacetPtr facet,
498501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     const xmlChar *value,
498601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     unsigned long actualLen,
498701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     unsigned long *expectedLen)
498801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
4989ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard    if (facet == NULL)
4990ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard        return(-1);
499101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    /*
499201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * TODO: Check if this will work with large numbers.
499301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * (compare value.decimal.mi and value.decimal.hi as well?).
499401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
499501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
499601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen != facet->val->value.decimal.lo) {
4997478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (expectedLen != NULL)
4998c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
499901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_LENGTH_VALID);
500001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
500101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
500201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen < facet->val->value.decimal.lo) {
5003478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (expectedLen != NULL)
5004c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
500501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_MINLENGTH_VALID);
500601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
500701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MAXLENGTH) {
500801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen > facet->val->value.decimal.lo) {
5009478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (expectedLen != NULL)
5010c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
501101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_MAXLENGTH_VALID);
501201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
501301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else
501401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	/*
501501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	* NOTE: That we can pass NULL as xmlSchemaValPtr to
501601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	* xmlSchemaValidateFacet, since the remaining facet types
501701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	* are: XML_SCHEMA_FACET_PATTERN, XML_SCHEMA_FACET_ENUMERATION.
501801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	*/
501901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	return(xmlSchemaValidateFacet(NULL, facet, value, NULL));
502001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    return (0);
502101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
502201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
502301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
50246927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaValidateLengthFacet:
5025c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type:  the built-in type
5026c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @facet:  the facet to check
5027c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value:  the lexical repr. of the value to be validated
5028c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val:  the precomputed value
5029478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value
5030c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @length: the actual length of the value
5031c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
5032c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength"
5033c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * facet; sets @length to the computed length of @value.
5034c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
5035c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if the value is valid, a positive error code
5036c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * otherwise and -1 in case of an internal or API error.
5037c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */
5038478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikstatic int
5039478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacetInternal(xmlSchemaFacetPtr facet,
5040478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				     xmlSchemaTypeType valType,
5041478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				     const xmlChar *value,
5042478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				     xmlSchemaValPtr val,
5043478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				     unsigned long *length,
5044478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				     xmlSchemaWhitespaceValueType ws)
5045c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{
5046c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    unsigned int len = 0;
5047c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
5048478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if ((length == NULL) || (facet == NULL))
5049ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard        return (-1);
5050c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    *length = 0;
5051c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((facet->type != XML_SCHEMA_FACET_LENGTH) &&
5052c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->type != XML_SCHEMA_FACET_MAXLENGTH) &&
5053c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->type != XML_SCHEMA_FACET_MINLENGTH))
5054c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	return (-1);
5055c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
5056478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    /*
5057478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    * TODO: length, maxLength and minLength must be of type
5058478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    * nonNegativeInteger only. Check if decimal is used somehow.
5059478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    */
5060c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((facet->val == NULL) ||
5061c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	((facet->val->type != XML_SCHEMAS_DECIMAL) &&
5062c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
5063c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->val->value.decimal.frac != 0)) {
5064c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	return(-1);
5065c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
5066c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY))
5067c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	len = val->value.hex.total;
5068c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY))
5069c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	len = val->value.base64.total;
5070c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    else {
5071478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	switch (valType) {
5072478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    case XML_SCHEMAS_STRING:
5073c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NORMSTRING:
5074478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) {
5075478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    /*
5076478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * This is to ensure API compatibility with the old
5077478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * xmlSchemaValidateLengthFacet(). Anyway, this was and
5078478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * is not the correct handling.
5079478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * TODO: Get rid of this case somehow.
5080478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    */
5081478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    if (valType == XML_SCHEMAS_STRING)
5082478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			len = xmlUTF8Strlen(value);
5083478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    else
5084478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			len = xmlSchemaNormLen(value);
5085478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		} else if (value != NULL) {
5086478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
5087478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			len = xmlSchemaNormLen(value);
5088478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    else
5089478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    /*
5090478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * Should be OK for "preserve" as well.
5091478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    */
5092478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    len = xmlUTF8Strlen(value);
5093478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		}
5094478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		break;
5095478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    case XML_SCHEMAS_IDREF:
5096c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_TOKEN:
5097c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_LANGUAGE:
5098c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NMTOKEN:
5099c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NAME:
5100c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NCNAME:
5101bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik	    case XML_SCHEMAS_ID:
5102bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik		/*
5103bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik		* FIXME: What exactly to do with anyURI?
5104478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*/
5105c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_ANYURI:
5106c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		if (value != NULL)
5107478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    len = xmlSchemaNormLen(value);
5108c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		break;
5109bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik	    case XML_SCHEMAS_QNAME:
5110bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik 	    case XML_SCHEMAS_NOTATION:
5111bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik 		/*
51124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		* For QName and NOTATION, those facets are
51134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		* deprecated and should be ignored.
5114bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik 		*/
5115bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik		return (0);
5116c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    default:
5117c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		TODO
5118c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	}
5119c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
5120c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    *length = (unsigned long) len;
5121478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    /*
5122478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    * TODO: Return the whole expected value, i.e. "lo", "mi" and "hi".
5123478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    */
5124c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
5125c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len != facet->val->value.decimal.lo)
5126c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_LENGTH_VALID);
5127c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
5128c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len < facet->val->value.decimal.lo)
5129c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_MINLENGTH_VALID);
5130c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    } else {
5131c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len > facet->val->value.decimal.lo)
5132c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXLENGTH_VALID);
5133c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
5134c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
5135c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    return (0);
5136c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
5137c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
5138c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/**
5139478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateLengthFacet:
5140478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @type:  the built-in type
5141478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @facet:  the facet to check
5142478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @value:  the lexical repr. of the value to be validated
5143478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @val:  the precomputed value
5144478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @length: the actual length of the value
5145478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *
5146478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Checka a value against a "length", "minLength" and "maxLength"
5147478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * facet; sets @length to the computed length of @value.
5148478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *
5149478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Returns 0 if the value is valid, a positive error code
5150478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * otherwise and -1 in case of an internal or API error.
5151478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */
5152478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikint
5153478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacet(xmlSchemaTypePtr type,
5154478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			     xmlSchemaFacetPtr facet,
5155478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			     const xmlChar *value,
5156478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			     xmlSchemaValPtr val,
5157478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			     unsigned long *length)
5158478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{
5159cc5e2330ef2432493afce6566d3651195366d822Daniel Veillard    if (type == NULL)
5160cc5e2330ef2432493afce6566d3651195366d822Daniel Veillard        return(-1);
5161478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    return (xmlSchemaValidateLengthFacetInternal(facet,
5162478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	type->builtInType, value, val, length,
5163478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	XML_SCHEMA_WHITESPACE_UNKNOWN));
5164478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik}
5165478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik
5166478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik/**
5167478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateLengthFacetWhtsp:
5168478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @facet:  the facet to check
5169478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @valType:  the built-in type
5170478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @value:  the lexical repr. of the value to be validated
5171478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @val:  the precomputed value
5172478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value
5173478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @length: the actual length of the value
5174478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *
5175478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Checka a value against a "length", "minLength" and "maxLength"
5176478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * facet; sets @length to the computed length of @value.
5177478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *
5178478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Returns 0 if the value is valid, a positive error code
5179478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * otherwise and -1 in case of an internal or API error.
5180478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */
5181478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikint
5182478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacetWhtsp(xmlSchemaFacetPtr facet,
5183478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  xmlSchemaValType valType,
5184478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  const xmlChar *value,
5185478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  xmlSchemaValPtr val,
5186478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  unsigned long *length,
5187478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  xmlSchemaWhitespaceValueType ws)
5188478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{
5189478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    return (xmlSchemaValidateLengthFacetInternal(facet, valType, value, val,
5190478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	length, ws));
5191478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik}
5192478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik
5193478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik/**
51946c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetInternal:
51954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @facet:  the facet to check
5196478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @fws: the whitespace type of the facet's value
5197478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @valType: the built-in type of the value
51984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value:  the lexical repr of the value to validate
51994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val:  the precomputed value
5200478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value
52014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
52024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Check a value against a facet condition
52034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
52044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if the element is schemas valid, a positive error code
52054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *     number otherwise and -1 in case of internal or API error.
52064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
52076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikstatic int
52086c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaValidateFacetInternal(xmlSchemaFacetPtr facet,
52096c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType fws,
5210478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			       xmlSchemaValType valType,
52116c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *value,
5212478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			       xmlSchemaValPtr val,
52136c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType ws)
52144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{
52154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    int ret;
52164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
52176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    if (facet == NULL)
52186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	return(-1);
52196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
52204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    switch (facet->type) {
52214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMA_FACET_PATTERN:
52226c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    /*
52236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    * NOTE that for patterns, the @value needs to be the normalized
52246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    * value, *not* the lexical initial value or the canonical value.
52256c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    */
52266c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (value == NULL)
52276c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-1);
52284255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    ret = xmlRegexpExec(facet->regexp, value);
52294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == 1)
52304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(0);
52316c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == 0)
523201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return(XML_SCHEMAV_CVC_PATTERN_VALID);
52334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    return(ret);
52344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMA_FACET_MAXEXCLUSIVE:
52354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
52366c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == -2)
52374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(-1);
52384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == -1)
52394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(0);
524001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID);
5241070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MAXINCLUSIVE:
5242070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
52436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == -2)
5244070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
5245070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((ret == -1) || (ret == 0))
5246070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
524701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID);
5248070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MINEXCLUSIVE:
5249070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
52506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == -2)
5251070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
5252070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret == 1)
5253070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
525401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID);
5255070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MININCLUSIVE:
5256070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
52576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == -2)
5258070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
5259070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((ret == 1) || (ret == 0))
5260070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
526101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MININCLUSIVE_VALID);
52628651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard	case XML_SCHEMA_FACET_WHITESPACE:
52638bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    /* TODO whitespaces */
526401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    /*
526501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * NOTE: Whitespace should be handled to normalize
526601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * the value to be validated against a the facets;
526701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * not to normalize the value in-between.
526801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    */
52698651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard	    return(0);
52708bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case  XML_SCHEMA_FACET_ENUMERATION:
5271478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) {
5272478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		/*
5273478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* This is to ensure API compatibility with the old
5274478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* xmlSchemaValidateFacet().
5275478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* TODO: Get rid of this case.
5276478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*/
52776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		if ((facet->value != NULL) &&
52786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    (xmlStrEqual(facet->value, value)))
52796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    return(0);
52806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    } else {
52816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		ret = xmlSchemaCompareValuesWhtspExt(facet->val->type,
52826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    facet->val, facet->value, fws, valType, val,
52836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    value, ws);
52846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		if (ret == -2)
52856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    return(-1);
52866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		if (ret == 0)
52876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    return(0);
52886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    }
528901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_ENUMERATION_VALID);
52908bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case XML_SCHEMA_FACET_LENGTH:
5291aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    /*
5292aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    * SPEC (1.3) "if {primitive type definition} is QName or NOTATION,
5293aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    * then any {value} is facet-valid."
5294aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    */
5295aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    if ((valType == XML_SCHEMAS_QNAME) ||
5296aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		(valType == XML_SCHEMAS_NOTATION))
5297aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		return (0);
5298aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    /* No break on purpose. */
5299e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard	case XML_SCHEMA_FACET_MAXLENGTH:
53008bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case XML_SCHEMA_FACET_MINLENGTH: {
53018bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    unsigned int len = 0;
5302e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard
53034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if ((valType == XML_SCHEMAS_QNAME) ||
53044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		(valType == XML_SCHEMAS_NOTATION))
53054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		return (0);
5306478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    /*
5307478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    * TODO: length, maxLength and minLength must be of type
5308478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    * nonNegativeInteger only. Check if decimal is used somehow.
5309478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    */
53108bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    if ((facet->val == NULL) ||
5311e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		((facet->val->type != XML_SCHEMAS_DECIMAL) &&
5312e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
53138bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		(facet->val->value.decimal.frac != 0)) {
53148bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		return(-1);
53158bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    }
5316560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY))
531770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		len = val->value.hex.total;
53181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	    else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY))
53191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		len = val->value.base64.total;
53201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	    else {
53216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		switch (valType) {
5322478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    case XML_SCHEMAS_STRING:
5323478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    case XML_SCHEMAS_NORMSTRING:
5324478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) {
5325478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    /*
5326478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    * This is to ensure API compatibility with the old
5327478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    * xmlSchemaValidateFacet(). Anyway, this was and
5328478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    * is not the correct handling.
5329478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    * TODO: Get rid of this case somehow.
5330478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    */
5331478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    if (valType == XML_SCHEMAS_STRING)
5332478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				len = xmlUTF8Strlen(value);
5333478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    else
5334478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				len = xmlSchemaNormLen(value);
5335478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			} else if (value != NULL) {
5336478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
5337478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				len = xmlSchemaNormLen(value);
5338478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    else
5339478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				/*
5340478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				* Should be OK for "preserve" as well.
5341478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				*/
5342478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				len = xmlUTF8Strlen(value);
5343478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			}
5344478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			break;
5345478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    	    case XML_SCHEMAS_IDREF:
5346560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_TOKEN:
5347560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_LANGUAGE:
5348560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NMTOKEN:
5349560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NAME:
5350560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NCNAME:
5351560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_ID:
535201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    case XML_SCHEMAS_ANYURI:
5353478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			if (value != NULL)
5354478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    	    len = xmlSchemaNormLen(value);
5355478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    	break;
5356560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    default:
5357560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		        TODO
535870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	    	}
53598bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    }
53608bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
5361e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len != facet->val->value.decimal.lo)
536201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_LENGTH_VALID);
53638bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
5364e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len < facet->val->value.decimal.lo)
536501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_MINLENGTH_VALID);
53668bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    } else {
5367e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len > facet->val->value.decimal.lo)
536801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_MAXLENGTH_VALID);
5369e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard	    }
53708bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    break;
53718bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	}
5372560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	case XML_SCHEMA_FACET_TOTALDIGITS:
5373560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	case XML_SCHEMA_FACET_FRACTIONDIGITS:
5374560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
5375560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((facet->val == NULL) ||
537669dea3a0c01e8a952b1d2f07ab0a3aa450f0cdfeKasimier T. Buchcik		((facet->val->type != XML_SCHEMAS_PINTEGER) &&
5377560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
5378560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		(facet->val->value.decimal.frac != 0)) {
5379560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		return(-1);
5380560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
5381560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((val == NULL) ||
5382560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		((val->type != XML_SCHEMAS_DECIMAL) &&
5383560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_INTEGER) &&
5384560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NPINTEGER) &&
5385560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NINTEGER) &&
5386560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NNINTEGER) &&
5387560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_PINTEGER) &&
5388560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_INT) &&
5389560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_UINT) &&
5390560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_LONG) &&
5391560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_ULONG) &&
5392560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_SHORT) &&
5393560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_USHORT) &&
5394560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_BYTE) &&
5395560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_UBYTE))) {
5396560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		return(-1);
5397560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
5398560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) {
5399560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	        if (val->value.decimal.total > facet->val->value.decimal.lo)
540001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	            return(XML_SCHEMAV_CVC_TOTALDIGITS_VALID);
5401560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
5402560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) {
5403560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	        if (val->value.decimal.frac > facet->val->value.decimal.lo)
540401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID);
5405560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
5406560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    break;
54074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	default:
54084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    TODO
54094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
54104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return(0);
5411b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
54124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
54134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
54146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
54156c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacet:
54166c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @base:  the base type
54176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @facet:  the facet to check
54186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @value:  the lexical repr of the value to validate
54196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @val:  the precomputed value
54206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
54216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Check a value against a facet condition
54226c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
54236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns 0 if the element is schemas valid, a positive error code
54246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *     number otherwise and -1 in case of internal or API error.
54256c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */
54266c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikint
54279dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. BuchcikxmlSchemaValidateFacet(xmlSchemaTypePtr base,
54286c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	               xmlSchemaFacetPtr facet,
54296c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	               const xmlChar *value,
54306c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		       xmlSchemaValPtr val)
54316c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{
54326c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    /*
54336c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    * This tries to ensure API compatibility regarding the old
54346c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    * xmlSchemaValidateFacet() and the new xmlSchemaValidateFacetInternal() and
54356c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    * xmlSchemaValidateFacetWhtsp().
54366c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    */
54379dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik    if (val != NULL)
54386c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	return(xmlSchemaValidateFacetInternal(facet,
54399dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik	    XML_SCHEMA_WHITESPACE_UNKNOWN, val->type, value, val,
54406c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    XML_SCHEMA_WHITESPACE_UNKNOWN));
54419dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik    else if (base != NULL)
54426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	return(xmlSchemaValidateFacetInternal(facet,
54439dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik	    XML_SCHEMA_WHITESPACE_UNKNOWN, base->builtInType, value, val,
5444478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    XML_SCHEMA_WHITESPACE_UNKNOWN));
54459dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik    return(-1);
54466c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik}
54476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
54486c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/**
54496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetWhtsp:
54506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @facet:  the facet to check
54516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @fws: the whitespace type of the facet's value
54526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @valType: the built-in type of the value
54536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @value:  the lexical (or normalized for pattern) repr of the value to validate
54546c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @val:  the precomputed value
54556c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @ws: the whitespace type of the value
54566c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
54576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Check a value against a facet condition. This takes value normalization
54586c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * according to the specified whitespace types into account.
54596c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Note that @value needs to be the *normalized* value if the facet
54606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * is of type "pattern".
54616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
54626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns 0 if the element is schemas valid, a positive error code
54636c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *     number otherwise and -1 in case of internal or API error.
54646c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */
54656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikint
54666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaValidateFacetWhtsp(xmlSchemaFacetPtr facet,
54676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaWhitespaceValueType fws,
5468478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    xmlSchemaValType valType,
54696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    const xmlChar *value,
5470478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    xmlSchemaValPtr val,
54716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaWhitespaceValueType ws)
54726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{
54736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik     return(xmlSchemaValidateFacetInternal(facet, fws, valType,
5474478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	 value, val, ws));
54756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik}
54766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
5477c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#if 0
5478c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifndef DBL_DIG
5479c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define DBL_DIG 16
5480c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif
5481c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifndef DBL_EPSILON
5482c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define DBL_EPSILON 1E-9
5483c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif
5484c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5485c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define INTEGER_DIGITS DBL_DIG
5486c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define FRACTION_DIGITS (DBL_DIG + 1)
5487c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define EXPONENT_DIGITS (3 + 2)
5488c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5489c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik/**
5490c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * xmlXPathFormatNumber:
5491c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @number:     number to format
5492c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @buffer:     output buffer
5493c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @buffersize: size of output buffer
5494c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
5495c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Convert the number into a string representation.
5496c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */
5497c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcikstatic void
5498c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. BuchcikxmlSchemaFormatFloat(double number, char buffer[], int buffersize)
5499c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik{
5500c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    switch (xmlXPathIsInf(number)) {
5501c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    case 1:
5502c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	if (buffersize > (int)sizeof("INF"))
5503c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    snprintf(buffer, buffersize, "INF");
5504c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	break;
5505c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    case -1:
5506c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	if (buffersize > (int)sizeof("-INF"))
5507c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    snprintf(buffer, buffersize, "-INF");
5508c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	break;
5509c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    default:
5510c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	if (xmlXPathIsNaN(number)) {
5511c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (buffersize > (int)sizeof("NaN"))
5512c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf(buffer, buffersize, "NaN");
5513c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	} else if (number == 0) {
5514c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    snprintf(buffer, buffersize, "0.0E0");
5515c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	} else {
5516c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /* 3 is sign, decimal point, and terminating zero */
5517c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    char work[DBL_DIG + EXPONENT_DIGITS + 3];
5518c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    int integer_place, fraction_place;
5519c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    char *ptr;
5520c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    char *after_fraction;
5521c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    double absolute_value;
5522c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    int size;
5523c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5524c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    absolute_value = fabs(number);
5525c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5526c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /*
5527c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	     * Result is in work, and after_fraction points
5528c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	     * just past the fractional part.
5529c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	     * Use scientific notation
5530c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    */
5531c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    integer_place = DBL_DIG + EXPONENT_DIGITS + 1;
5532c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    fraction_place = DBL_DIG - 1;
5533c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    snprintf(work, sizeof(work),"%*.*e",
5534c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		integer_place, fraction_place, number);
5535c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    after_fraction = strchr(work + DBL_DIG, 'e');
5536c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /* Remove fractional trailing zeroes */
5537c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    ptr = after_fraction;
5538c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    while (*(--ptr) == '0')
5539c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		;
5540c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (*ptr != '.')
5541c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	        ptr++;
5542c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    while ((*ptr++ = *after_fraction++) != 0);
5543c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5544c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /* Finally copy result back to caller */
5545c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    size = strlen(work) + 1;
5546c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (size > buffersize) {
5547c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		work[buffersize - 1] = 0;
5548c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		size = buffersize;
5549c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5550c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    memmove(buffer, work, size);
5551c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	}
5552c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	break;
5553c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    }
5554c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik}
5555c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif
5556c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
55576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/**
55586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaGetCanonValue:
55596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @val: the precomputed value
55606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @retValue: the returned value
55616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
5562478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Get a the cononical lexical representation of the value.
5563c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * The caller has to FREE the returned retValue.
5564c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
5565478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * WARNING: Some value types are not supported yet, resulting
5566478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * in a @retValue of "???".
5567c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
5568c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: XML Schema 1.0 does not define canonical representations
5569c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * for: duration, gYearMonth, gYear, gMonthDay, gMonth, gDay,
5570c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * anyURI, QName, NOTATION. This will be fixed in XML Schema 1.1.
5571c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
55726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
5573c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Returns 0 if the value could be built, 1 if the value type is
5574c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * not supported yet and -1 in case of API errors.
55756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
55766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint
5577b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel VeillardxmlSchemaGetCanonValue(xmlSchemaValPtr val, const xmlChar **retValue)
55786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
5579b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard    if ((retValue == NULL) || (val == NULL))
55806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return (-1);
55816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    *retValue = NULL;
55826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    switch (val->type) {
5583478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	case XML_SCHEMAS_STRING:
5584478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (val->value.str == NULL)
5585478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
5586478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    else
5587478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue =
5588478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    BAD_CAST xmlStrdup((const xmlChar *) val->value.str);
5589478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    break;
55906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NORMSTRING:
5591478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (val->value.str == NULL)
5592478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
5593478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    else {
5594478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = xmlSchemaWhiteSpaceReplace(
5595478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    (const xmlChar *) val->value.str);
5596478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*retValue) == NULL)
5597478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    *retValue = BAD_CAST xmlStrdup(
5598478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			(const xmlChar *) val->value.str);
5599478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    }
5600478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    break;
56016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_TOKEN:
56026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_LANGUAGE:
56036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NMTOKEN:
5604478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	case XML_SCHEMAS_NAME:
56056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NCNAME:
56066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_ID:
56076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_IDREF:
56086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_ENTITY:
5609c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_NOTATION: /* Unclear */
5610c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_ANYURI:   /* Unclear */
56116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (val->value.str == NULL)
5612478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		return (-1);
5613aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    *retValue =
5614aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		BAD_CAST xmlSchemaCollapseString(BAD_CAST val->value.str);
5615aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    if (*retValue == NULL)
5616aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		*retValue =
5617aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		    BAD_CAST xmlStrdup((const xmlChar *) val->value.str);
5618478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    break;
5619478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	case XML_SCHEMAS_QNAME:
5620c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /* TODO: Unclear in XML Schema 1.0. */
5621478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (val->value.qname.uri == NULL) {
5622478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.qname.name);
5623478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		return (0);
5624478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    } else {
5625478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "{");
5626478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue),
5627478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    BAD_CAST val->value.qname.uri);
5628478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue),
5629478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    BAD_CAST "}");
5630478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue),
5631478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    BAD_CAST val->value.qname.uri);
5632478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    }
5633478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    break;
5634c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_DECIMAL:
5635c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /*
5636c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * TODO: Lookout for a more simple implementation.
5637c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    */
5638c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if ((val->value.decimal.total == 1) &&
5639c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		(val->value.decimal.lo == 0)) {
5640c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlStrdup(BAD_CAST "0.0");
5641c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    } else {
5642c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		xmlSchemaValDecimal dec = val->value.decimal;
5643c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		int bufsize;
5644c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char *buf = NULL, *offs;
5645c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5646c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* Add room for the decimal point as well. */
5647c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		bufsize = dec.total + 2;
5648c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.sign)
5649c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    bufsize++;
5650c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* Add room for leading/trailing zero. */
5651c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if ((dec.frac == 0) || (dec.frac == dec.total))
5652c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    bufsize++;
5653c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		buf = xmlMalloc(bufsize);
5654c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		offs = buf;
5655c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.sign)
5656c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs++ = '-';
5657c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.frac == dec.total) {
5658c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs++ = '0';
5659c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs++ = '.';
5660c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5661c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.hi != 0)
5662c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(offs, bufsize - (offs - buf),
5663c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%lu%lu%lu", dec.hi, dec.mi, dec.lo);
5664c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else if (dec.mi != 0)
5665c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(offs, bufsize - (offs - buf),
5666c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%lu%lu", dec.mi, dec.lo);
5667c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else
5668c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(offs, bufsize - (offs - buf),
5669c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%lu", dec.lo);
5670c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5671c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.frac != 0) {
5672c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (dec.frac != dec.total) {
5673c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			int diff = dec.total - dec.frac;
5674c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			/*
5675c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			* Insert the decimal point.
5676c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			*/
5677c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			memmove(offs + diff + 1, offs + diff, dec.frac +1);
5678c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			offs[diff] = '.';
5679c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    } else {
5680c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			unsigned int i = 0;
5681c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			/*
5682c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			* Insert missing zeroes behind the decimal point.
5683c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			*/
5684c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			while (*(offs + i) != 0)
5685c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    i++;
5686c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			if (i < dec.total) {
5687c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    memmove(offs + (dec.total - i), offs, i +1);
5688c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    memset(offs, '0', dec.total - i);
5689c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			}
5690c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    }
5691c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5692c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    /*
5693c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * Append decimal point and zero.
5694c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    */
5695c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    offs = buf + bufsize - 1;
5696c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs-- = 0;
5697c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs-- = '0';
5698c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs-- = '.';
5699c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5700c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST buf;
5701c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5702c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5703c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_INTEGER:
5704c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_PINTEGER:
5705c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_NPINTEGER:
5706c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_NINTEGER:
5707c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_NNINTEGER:
5708c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_LONG:
5709c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_BYTE:
5710c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_SHORT:
5711c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_INT:
5712c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_UINT:
5713c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_ULONG:
5714c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_USHORT:
5715c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_UBYTE:
5716c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if ((val->value.decimal.total == 1) &&
5717c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		(val->value.decimal.lo == 0))
5718c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlStrdup(BAD_CAST "0");
5719c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else {
5720c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		xmlSchemaValDecimal dec = val->value.decimal;
5721c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		int bufsize = dec.total + 1;
5722c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5723c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* Add room for the decimal point as well. */
5724c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.sign)
5725c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    bufsize++;
5726c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlMalloc(bufsize);
5727c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.hi != 0) {
5728c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (dec.sign)
5729c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize,
5730c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    "-%lu%lu%lu", dec.hi, dec.mi, dec.lo);
5731c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    else
5732c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize,
5733c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    "%lu%lu%lu", dec.hi, dec.mi, dec.lo);
5734c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else if (dec.mi != 0) {
5735c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (dec.sign)
5736c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize,
5737c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    "-%lu%lu", dec.mi, dec.lo);
5738c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    else
5739c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize,
5740c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    "%lu%lu", dec.mi, dec.lo);
5741c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5742c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (dec.sign)
5743c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize, "-%lu", dec.lo);
5744c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    else
5745c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize, "%lu", dec.lo);
5746c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5747c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5748c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5749c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_BOOLEAN:
5750c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (val->value.b)
5751c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "true");
5752c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else
5753c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "false");
5754c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5755c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_DURATION: {
5756c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[100];
5757c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		unsigned long year;
5758c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		unsigned long mon, day, hour = 0, min = 0;
5759c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		double sec = 0, left;
5760c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5761c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5762c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/*
5763c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* TODO: This results in a normalized output of the value
5764c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* - which is NOT conformant to the spec -
5765c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* since the exact values of each property are not
5766c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* recoverable. Think about extending the structure to
5767c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* provide a field for every property.
5768c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*/
5769c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		year = (unsigned long) FQUOTIENT(labs(val->value.dur.mon), 12);
5770c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		mon = labs(val->value.dur.mon) - 12 * year;
5771c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5772c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		day = (unsigned long) FQUOTIENT(fabs(val->value.dur.sec), 86400);
5773c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		left = fabs(val->value.dur.sec) - day * 86400;
5774c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (left > 0) {
5775c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    hour = (unsigned long) FQUOTIENT(left, 3600);
5776c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    left = left - (hour * 3600);
5777c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (left > 0) {
5778c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			min = (unsigned long) FQUOTIENT(left, 60);
5779c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			sec = left - (min * 60);
5780c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    }
5781c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5782c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if ((val->value.dur.mon < 0) || (val->value.dur.sec < 0))
5783c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 100, "P%luY%luM%luDT%luH%luM%.14gS",
5784c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			year, mon, day, hour, min, sec);
5785c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else
5786c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 100, "-P%luY%luM%luDT%luH%luM%.14gS",
5787c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			year, mon, day, hour, min, sec);
5788c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5789c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5790c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5791c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_GYEAR: {
5792c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[30];
5793c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5794c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5795c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf(buf, 30, "%04ld", val->value.date.year);
5796c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5797c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5798c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5799c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_GMONTH: {
5800c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5801c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5802c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlMalloc(5);
5803c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf((char *) *retValue, 6, "--%02u",
5804c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    val->value.date.mon);
5805c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5806c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5807c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_GDAY: {
5808c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5809c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5810c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlMalloc(6);
5811c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf((char *) *retValue, 6, "---%02u",
5812c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    val->value.date.day);
5813c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5814c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5815c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_GMONTHDAY: {
5816c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5817c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5818c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlMalloc(8);
5819c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf((char *) *retValue, 8, "--%02u-%02u",
5820c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    val->value.date.mon, val->value.date.day);
5821c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5822c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5823c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_GYEARMONTH: {
5824c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[35];
5825c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5826c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5827c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (val->value.date.year < 0)
5828c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 35, "-%04ld-%02u",
5829c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			labs(val->value.date.year),
5830c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.mon);
5831c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else
5832c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 35, "%04ld-%02u",
5833c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.year, val->value.date.mon);
5834c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5835c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5836c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5837c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_TIME:
5838c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    {
5839c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[30];
5840c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5841c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (val->value.date.tz_flag) {
5842c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaValPtr norm;
5843c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5844c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    norm = xmlSchemaDateNormalize(val, 0);
5845c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (norm == NULL)
5846c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			return (-1);
5847c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    /*
5848c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * TODO: Check if "%.14g" is portable.
5849c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    */
5850c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 30,
5851c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%02u:%02u:%02.14gZ",
5852c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.hour,
5853c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.min,
5854c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.sec);
5855c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaFreeValue(norm);
5856c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5857c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 30,
5858c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%02u:%02u:%02.14g",
5859c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.hour,
5860c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.min,
5861c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.sec);
5862c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5863c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5864c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5865c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5866c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_DATE:
5867c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    {
5868c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[30];
5869c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5870c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (val->value.date.tz_flag) {
5871c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaValPtr norm;
5872c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5873c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    norm = xmlSchemaDateNormalize(val, 0);
5874c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (norm == NULL)
5875c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			return (-1);
5876c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    /*
5877c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * TODO: Append the canonical value of the
5878c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * recoverable timezone and not "Z".
5879c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    */
5880c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 30,
5881c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%04ld:%02u:%02uZ",
5882c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.year, norm->value.date.mon,
5883c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.day);
5884c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaFreeValue(norm);
5885c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5886c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 30,
5887c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%04ld:%02u:%02u",
5888c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.year, val->value.date.mon,
5889c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.day);
5890c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5891c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5892c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5893c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5894c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_DATETIME:
5895c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    {
5896c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[50];
5897c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5898c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (val->value.date.tz_flag) {
5899c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaValPtr norm;
5900c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5901c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    norm = xmlSchemaDateNormalize(val, 0);
5902c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (norm == NULL)
5903c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			return (-1);
5904c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    /*
5905c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * TODO: Check if "%.14g" is portable.
5906c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    */
5907c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 50,
5908c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%04ld:%02u:%02uT%02u:%02u:%02.14gZ",
5909c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.year, norm->value.date.mon,
5910c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.day, norm->value.date.hour,
5911c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.min, norm->value.date.sec);
5912c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaFreeValue(norm);
5913c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5914c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 50,
5915c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%04ld:%02u:%02uT%02u:%02u:%02.14g",
5916c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.year, val->value.date.mon,
5917c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.day, val->value.date.hour,
5918c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.min, val->value.date.sec);
5919c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5920c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5921c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5922c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5923c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_HEXBINARY:
5924c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.hex.str);
5925c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5926c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_BASE64BINARY:
5927c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /*
5928c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * TODO: Is the following spec piece implemented?:
5929c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * SPEC: "Note: For some values the canonical form defined
5930c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * above does not conform to [RFC 2045], which requires breaking
5931c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * with linefeeds at appropriate intervals."
5932c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    */
5933c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.base64.str);
5934c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5935c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_FLOAT: {
5936c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[30];
5937c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/*
5938c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* |m| < 16777216, -149 <= e <= 104.
5939c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* TODO: Handle, NaN, INF, -INF. The format is not
5940c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* yet conformant. The c type float does not cover
5941c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* the whole range.
5942c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*/
5943c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf(buf, 30, "%01.14e", val->value.f);
5944c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5945c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5946c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5947c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_DOUBLE: {
5948c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[40];
5949c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* |m| < 9007199254740992, -1075 <= e <= 970 */
5950c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/*
5951c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* TODO: Handle, NaN, INF, -INF. The format is not
5952c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* yet conformant. The c type float does not cover
5953c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* the whole range.
5954c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*/
5955c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf(buf, 40, "%01.14e", val->value.d);
5956c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5957c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5958c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
59596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	default:
5960478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    *retValue = BAD_CAST xmlStrdup(BAD_CAST "???");
5961c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    return (1);
59626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
5963478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    return (0);
5964478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik}
5965478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik
5966bda59576670f1cabea3c49520628d82e401702caDaniel Veillard/**
5967c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * xmlSchemaGetCanonValueWhtsp:
5968c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @val: the precomputed value
5969c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @retValue: the returned value
5970c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @ws: the whitespace type of the value
5971c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
5972c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Get a the cononical representation of the value.
5973c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * The caller has to free the returned @retValue.
5974c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
5975c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Returns 0 if the value could be built, 1 if the value type is
5976c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * not supported yet and -1 in case of API errors.
5977c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */
5978c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcikint
5979c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. BuchcikxmlSchemaGetCanonValueWhtsp(xmlSchemaValPtr val,
5980c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    const xmlChar **retValue,
5981c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    xmlSchemaWhitespaceValueType ws)
5982c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik{
5983c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    if ((retValue == NULL) || (val == NULL))
5984c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	return (-1);
5985c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    if ((ws == XML_SCHEMA_WHITESPACE_UNKNOWN) ||
5986c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	(ws > XML_SCHEMA_WHITESPACE_COLLAPSE))
5987c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	return (-1);
5988c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5989c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    *retValue = NULL;
5990c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    switch (val->type) {
5991c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_STRING:
5992c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (val->value.str == NULL)
5993c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
5994c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
5995c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlSchemaCollapseString(val->value.str);
5996c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else if (ws == XML_SCHEMA_WHITESPACE_REPLACE)
5997c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlSchemaWhiteSpaceReplace(val->value.str);
5998c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if ((*retValue) == NULL)
5999c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(val->value.str);
6000c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
6001c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_NORMSTRING:
6002c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (val->value.str == NULL)
6003c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
6004c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else {
6005c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
6006c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *retValue = xmlSchemaCollapseString(val->value.str);
6007c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else
6008c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *retValue = xmlSchemaWhiteSpaceReplace(val->value.str);
6009c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if ((*retValue) == NULL)
6010c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *retValue = BAD_CAST xmlStrdup(val->value.str);
6011c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
6012c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
6013c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	default:
6014c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    return (xmlSchemaGetCanonValue(val, retValue));
6015c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    }
6016c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    return (0);
6017c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik}
6018c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
6019c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik/**
6020bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * xmlSchemaGetValType:
6021bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * @val: a schemas value
6022bda59576670f1cabea3c49520628d82e401702caDaniel Veillard *
6023bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * Accessor for the type of a value
6024bda59576670f1cabea3c49520628d82e401702caDaniel Veillard *
6025bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * Returns the xmlSchemaValType of the value
6026bda59576670f1cabea3c49520628d82e401702caDaniel Veillard */
6027478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValType
6028478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaGetValType(xmlSchemaValPtr val)
6029478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{
6030bda59576670f1cabea3c49520628d82e401702caDaniel Veillard    if (val == NULL)
6031bda59576670f1cabea3c49520628d82e401702caDaniel Veillard        return(XML_SCHEMAS_UNKNOWN);
6032478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    return (val->type);
60336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
60346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
60355d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#define bottom_xmlschemastypes
60365d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#include "elfgcchack.h"
60374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#endif /* LIBXML_SCHEMAS_ENABLED */
6038