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
43f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel 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 */
78f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel 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 *									*
192f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel 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 *									*
209f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel 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();
24014b5643947845df089376106517c4f7ba061e4b0Daniel Veillard    if (ret == NULL) {
24114b5643947845df089376106517c4f7ba061e4b0Daniel Veillard        return(NULL);
24214b5643947845df089376106517c4f7ba061e4b0Daniel Veillard    }
2434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->type = XML_SCHEMA_FACET_MINLENGTH;
2444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->val = xmlSchemaNewValue(XML_SCHEMAS_NNINTEGER);
245717042d2ae21e36c5efda8d2e64fc88385095503Daniel Veillard    if (ret->val == NULL) {
246717042d2ae21e36c5efda8d2e64fc88385095503Daniel Veillard        xmlFree(ret);
247717042d2ae21e36c5efda8d2e64fc88385095503Daniel Veillard	return(NULL);
248717042d2ae21e36c5efda8d2e64fc88385095503Daniel Veillard    }
2494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->val->value.decimal.lo = value;
2504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (ret);
2514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
2524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
253c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard/*
2544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitBasicType:
2554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name:  the type name
2568bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard * @type:  the value type associated
2574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
25801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Initialize one primitive built-in type
2594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
2604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr
261f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel VeillardxmlSchemaInitBasicType(const char *name, xmlSchemaValType type,
26201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		       xmlSchemaTypePtr baseType) {
2634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypePtr ret;
2644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
2654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType));
2664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (ret == NULL) {
267d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard        xmlSchemaTypeErrMemory(NULL, "could not initialize basic types");
2684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(NULL);
2694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
2704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    memset(ret, 0, sizeof(xmlSchemaType));
271be9c6320d4ed8d5622322014310555bb88b02a85Daniel Veillard    ret->name = (const xmlChar *)name;
2724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->targetNamespace = XML_SCHEMAS_NAMESPACE_NAME;
2734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    ret->type = XML_SCHEMA_TYPE_BASIC;
274f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    ret->baseType = baseType;
2754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->contentType = XML_SCHEMA_CONTENT_BASIC;
27601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    /*
2774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    * Primitive types.
27801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
279f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    switch (type) {
280f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_STRING:
281f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_DECIMAL:
282f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_DATE:
283f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_DATETIME:
284f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_TIME:
285f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_GYEAR:
286f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_GYEARMONTH:
287f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_GMONTH:
288f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_GMONTHDAY:
289f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_GDAY:
290f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_DURATION:
291f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_FLOAT:
292f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_DOUBLE:
293f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_BOOLEAN:
294f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_ANYURI:
295f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_HEXBINARY:
296f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_BASE64BINARY:
297f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_QNAME:
298f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_NOTATION:
29901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    ret->flags |= XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE;
3004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
30196d2effc735fb45cfa363b6a876ff23a862f87a5William M. Brack	default:
3024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
3034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    }
3044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    /*
3054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    * Set variety.
3064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    */
3074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    switch (type) {
3084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_ANYTYPE:
3094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_ANYSIMPLETYPE:
3104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
3114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_IDREFS:
3124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_NMTOKENS:
3134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_ENTITIES:
3144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    ret->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST;
3154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    ret->facets = xmlSchemaNewMinLengthFacet(1);
316f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    ret->flags |= XML_SCHEMAS_TYPE_HAS_FACETS;
3174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
3184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	default:
3194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    ret->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC;
3204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
32101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
3224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlHashAddEntry2(xmlSchemaTypesBank, ret->name,
3234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	             XML_SCHEMAS_NAMESPACE_NAME, ret);
32401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    ret->builtInType = type;
3254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return(ret);
3264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
3274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
3284255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/*
32911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* WARNING: Those type reside normally in xmlschemas.c but are
33011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* redefined here locally in oder of being able to use them for xs:anyType-
33111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* TODO: Remove those definition if we move the types to a header file.
33211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* TODO: Always keep those structs up-to-date with the originals.
33311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik*/
33411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik#define UNBOUNDED (1 << 30)
33511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik
33611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef struct _xmlSchemaTreeItem xmlSchemaTreeItem;
33711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef xmlSchemaTreeItem *xmlSchemaTreeItemPtr;
33811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstruct _xmlSchemaTreeItem {
33911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTypeType type;
34011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaAnnotPtr annot;
34111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTreeItemPtr next;
34211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTreeItemPtr children;
34311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik};
34411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik
34511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef struct _xmlSchemaParticle xmlSchemaParticle;
34611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef xmlSchemaParticle *xmlSchemaParticlePtr;
34711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstruct _xmlSchemaParticle {
34811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTypeType type;
34911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaAnnotPtr annot;
35011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTreeItemPtr next;
35111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTreeItemPtr children;
35211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    int minOccurs;
35311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    int maxOccurs;
35411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlNodePtr node;
35511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik};
35611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik
35711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef struct _xmlSchemaModelGroup xmlSchemaModelGroup;
35811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef xmlSchemaModelGroup *xmlSchemaModelGroupPtr;
35911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstruct _xmlSchemaModelGroup {
36011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTypeType type;
36111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaAnnotPtr annot;
36211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTreeItemPtr next;
36311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTreeItemPtr children;
36411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlNodePtr node;
36511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik};
36611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik
36711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstatic xmlSchemaParticlePtr
36811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. BuchcikxmlSchemaAddParticle(void)
36911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik{
37011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaParticlePtr ret = NULL;
37111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik
37211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    ret = (xmlSchemaParticlePtr)
37311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlMalloc(sizeof(xmlSchemaParticle));
37411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    if (ret == NULL) {
37511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlSchemaTypeErrMemory(NULL, "allocating particle component");
37611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	return (NULL);
37711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    }
37811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    memset(ret, 0, sizeof(xmlSchemaParticle));
37911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    ret->type = XML_SCHEMA_TYPE_PARTICLE;
38011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    ret->minOccurs = 1;
38111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    ret->maxOccurs = 1;
38211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    return (ret);
38311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik}
38411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik
38511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik/*
3864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitTypes:
3874255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
3884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Initialize the default XML Schemas type library
3894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
3904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid
3916560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel VeillardxmlSchemaInitTypes(void)
3926560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard{
3934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized != 0)
3946560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        return;
3954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypesBank = xmlHashCreate(40);
3966560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard
397f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
398c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard    /*
39901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * 3.4.7 Built-in Complex Type Definition
40001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
4018bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeAnyTypeDef = xmlSchemaInitBasicType("anyType",
402f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard                                                     XML_SCHEMAS_ANYTYPE,
40301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     NULL);
40401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeAnyTypeDef->baseType = xmlSchemaTypeAnyTypeDef;
40501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED;
40611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    /*
40711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    * Init the content type.
40811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    */
409f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED;
41001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    {
41111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlSchemaParticlePtr particle;
41211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlSchemaModelGroupPtr sequence;
41301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaWildcardPtr wild;
41411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* First particle. */
41511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	particle = xmlSchemaAddParticle();
41611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	if (particle == NULL)
41711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    return;
41811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlSchemaTypeAnyTypeDef->subtypes = (xmlSchemaTypePtr) particle;
41911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* Sequence model group. */
42011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	sequence = (xmlSchemaModelGroupPtr)
42111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    xmlMalloc(sizeof(xmlSchemaModelGroup));
42211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	if (sequence == NULL) {
42311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    xmlSchemaTypeErrMemory(NULL, "allocating model group component");
42411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    return;
42511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	}
42611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	memset(sequence, 0, sizeof(xmlSchemaModelGroup));
427f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	sequence->type = XML_SCHEMA_TYPE_SEQUENCE;
42811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	particle->children = (xmlSchemaTreeItemPtr) sequence;
42911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* Second particle. */
43011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	particle = xmlSchemaAddParticle();
43111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	if (particle == NULL)
43211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    return;
43311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	particle->minOccurs = 0;
43411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	particle->maxOccurs = UNBOUNDED;
43511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	sequence->children = (xmlSchemaTreeItemPtr) particle;
43611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* The wildcard */
43711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard));
43811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	if (wild == NULL) {
43911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    xmlSchemaTypeErrMemory(NULL, "allocating wildcard component");
44011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    return;
44111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	}
44211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	memset(wild, 0, sizeof(xmlSchemaWildcard));
44311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	wild->type = XML_SCHEMA_TYPE_ANY;
444f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	wild->any = 1;
445f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	wild->processContents = XML_SCHEMAS_ANY_LAX;
446f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	particle->children = (xmlSchemaTreeItemPtr) wild;
44711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/*
44811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	* Create the attribute wildcard.
44911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	*/
45001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard));
45101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (wild == NULL) {
45211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    xmlSchemaTypeErrMemory(NULL, "could not create an attribute "
45311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik		"wildcard on anyType");
45401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return;
45501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
45601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	memset(wild, 0, sizeof(xmlSchemaWildcard));
45701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	wild->any = 1;
458f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	wild->processContents = XML_SCHEMAS_ANY_LAX;
45901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeAnyTypeDef->attributeWildcard = wild;
46001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
461f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    xmlSchemaTypeAnySimpleTypeDef = xmlSchemaInitBasicType("anySimpleType",
4622f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack                                                           XML_SCHEMAS_ANYSIMPLETYPE,
46301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard							   xmlSchemaTypeAnyTypeDef);
46401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    /*
46501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * primitive datatypes
46601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
46701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeStringDef = xmlSchemaInitBasicType("string",
46801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_STRING,
46901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
4708bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDecimalDef = xmlSchemaInitBasicType("decimal",
47101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_DECIMAL,
47201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeAnySimpleTypeDef);
4738bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDateDef = xmlSchemaInitBasicType("date",
47401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_DATE,
47501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeAnySimpleTypeDef);
4768bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDatetimeDef = xmlSchemaInitBasicType("dateTime",
47701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_DATETIME,
47801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						      xmlSchemaTypeAnySimpleTypeDef);
4798bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeTimeDef = xmlSchemaInitBasicType("time",
48001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_TIME,
48101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeAnySimpleTypeDef);
4828bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGYearDef = xmlSchemaInitBasicType("gYear",
48301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_GYEAR,
48401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeAnySimpleTypeDef);
4858bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGYearMonthDef = xmlSchemaInitBasicType("gYearMonth",
48601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                        XML_SCHEMAS_GYEARMONTH,
48701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard							xmlSchemaTypeAnySimpleTypeDef);
4888bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGMonthDef = xmlSchemaInitBasicType("gMonth",
48901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_GMONTH,
49001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
4918bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGMonthDayDef = xmlSchemaInitBasicType("gMonthDay",
49201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                       XML_SCHEMAS_GMONTHDAY,
49301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						       xmlSchemaTypeAnySimpleTypeDef);
4948bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGDayDef = xmlSchemaInitBasicType("gDay",
49501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_GDAY,
49601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeAnySimpleTypeDef);
4978bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDurationDef = xmlSchemaInitBasicType("duration",
49801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_DURATION,
49901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						      xmlSchemaTypeAnySimpleTypeDef);
5008bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float",
50101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_FLOAT,
50201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeAnySimpleTypeDef);
5038bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double",
50401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_DOUBLE,
50501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
5068bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeBooleanDef = xmlSchemaInitBasicType("boolean",
50701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_BOOLEAN,
50801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeAnySimpleTypeDef);
5098bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeAnyURIDef = xmlSchemaInitBasicType("anyURI",
51001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_ANYURI,
51101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
512560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard    xmlSchemaTypeHexBinaryDef = xmlSchemaInitBasicType("hexBinary",
51301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_HEXBINARY,
51401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeAnySimpleTypeDef);
5151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    xmlSchemaTypeBase64BinaryDef
51601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        = xmlSchemaInitBasicType("base64Binary", XML_SCHEMAS_BASE64BINARY,
51701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeAnySimpleTypeDef);
51801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNotationDef = xmlSchemaInitBasicType("NOTATION",
51901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_NOTATION,
520f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
52101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeQNameDef = xmlSchemaInitBasicType("QName",
52201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_QNAME,
52301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeAnySimpleTypeDef);
5244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
525c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard    /*
526c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard     * derived datatypes
527c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard     */
5288bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeIntegerDef = xmlSchemaInitBasicType("integer",
52901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_INTEGER,
53001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeDecimalDef);
5316560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeNonPositiveIntegerDef =
5326560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        xmlSchemaInitBasicType("nonPositiveInteger",
53301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                               XML_SCHEMAS_NPINTEGER,
53401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard			       xmlSchemaTypeIntegerDef);
5356560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeNegativeIntegerDef =
53601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("negativeInteger", XML_SCHEMAS_NINTEGER,
53701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeNonPositiveIntegerDef);
5386560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeLongDef =
53901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("long", XML_SCHEMAS_LONG,
54001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeIntegerDef);
54101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeIntDef = xmlSchemaInitBasicType("int", XML_SCHEMAS_INT,
54201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeLongDef);
5438bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeShortDef = xmlSchemaInitBasicType("short",
54401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_SHORT,
54501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeIntDef);
5468bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeByteDef = xmlSchemaInitBasicType("byte",
54701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_BYTE,
54801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeShortDef);
5496560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeNonNegativeIntegerDef =
5506560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        xmlSchemaInitBasicType("nonNegativeInteger",
55101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                               XML_SCHEMAS_NNINTEGER,
55201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard			       xmlSchemaTypeIntegerDef);
5536560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedLongDef =
55401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedLong", XML_SCHEMAS_ULONG,
55501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeNonNegativeIntegerDef);
5566560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedIntDef =
55701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedInt", XML_SCHEMAS_UINT,
55801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeUnsignedLongDef);
5596560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedShortDef =
56001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedShort", XML_SCHEMAS_USHORT,
56101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeUnsignedIntDef);
5626560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedByteDef =
56301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedByte", XML_SCHEMAS_UBYTE,
56401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeUnsignedShortDef);
5656560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypePositiveIntegerDef =
56601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("positiveInteger", XML_SCHEMAS_PINTEGER,
56701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeNonNegativeIntegerDef);
5688bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeNormStringDef = xmlSchemaInitBasicType("normalizedString",
56901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                        XML_SCHEMAS_NORMSTRING,
57001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard							xmlSchemaTypeStringDef);
5718bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeTokenDef = xmlSchemaInitBasicType("token",
57201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_TOKEN,
57301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeNormStringDef);
5748bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeLanguageDef = xmlSchemaInitBasicType("language",
57501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_LANGUAGE,
57601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						      xmlSchemaTypeTokenDef);
57701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNameDef = xmlSchemaInitBasicType("Name",
57801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_NAME,
57901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeTokenDef);
58001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNmtokenDef = xmlSchemaInitBasicType("NMTOKEN",
58101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_NMTOKEN,
5824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						     xmlSchemaTypeTokenDef);
58301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNCNameDef = xmlSchemaInitBasicType("NCName",
58401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_NCNAME,
58501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeNameDef);
58601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeIdDef = xmlSchemaInitBasicType("ID", XML_SCHEMAS_ID,
5874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						    xmlSchemaTypeNCNameDef);
5888bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeIdrefDef = xmlSchemaInitBasicType("IDREF",
58901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_IDREF,
590f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard						   xmlSchemaTypeNCNameDef);
591a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    xmlSchemaTypeEntityDef = xmlSchemaInitBasicType("ENTITY",
59201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_ENTITY,
59301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeNCNameDef);
5944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    /*
5954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    * Derived list types.
5964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    */
5974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    /* ENTITIES */
598a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    xmlSchemaTypeEntitiesDef = xmlSchemaInitBasicType("ENTITIES",
59901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_ENTITIES,
6004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						      xmlSchemaTypeAnySimpleTypeDef);
6014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaTypeEntitiesDef->subtypes = xmlSchemaTypeEntityDef;
6024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    /* IDREFS */
6034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaTypeIdrefsDef = xmlSchemaInitBasicType("IDREFS",
6044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik                                                    XML_SCHEMAS_IDREFS,
6054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						    xmlSchemaTypeAnySimpleTypeDef);
6064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaTypeIdrefsDef->subtypes = xmlSchemaTypeIdrefDef;
6074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
6084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    /* NMTOKENS */
6094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaTypeNmtokensDef = xmlSchemaInitBasicType("NMTOKENS",
6104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik                                                      XML_SCHEMAS_NMTOKENS,
6114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						      xmlSchemaTypeAnySimpleTypeDef);
6124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaTypeNmtokensDef->subtypes = xmlSchemaTypeNmtokenDef;
6134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
6144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypesInitialized = 1;
6154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
6164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
6174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
6184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCleanupTypes:
6194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
6204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library
6214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
622f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillardvoid
6234255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCleanupTypes(void) {
6244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
6254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return;
62611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    /*
62711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    * Free xs:anyType.
62811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    */
62911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    {
63011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlSchemaParticlePtr particle;
63111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* Attribute wildcard. */
63211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlSchemaFreeWildcard(xmlSchemaTypeAnyTypeDef->attributeWildcard);
63311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* Content type. */
63411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	particle = (xmlSchemaParticlePtr) xmlSchemaTypeAnyTypeDef->subtypes;
63511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* Wildcard. */
636f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	xmlSchemaFreeWildcard((xmlSchemaWildcardPtr)
63711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    particle->children->children->children);
63811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlFree((xmlSchemaParticlePtr) particle->children->children);
63911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* Sequence model group. */
64011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlFree((xmlSchemaModelGroupPtr) particle->children);
64111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlFree((xmlSchemaParticlePtr) particle);
642f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	xmlSchemaTypeAnyTypeDef->subtypes = NULL;
64311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    }
6444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlHashFree(xmlSchemaTypesBank, (xmlHashDeallocator) xmlSchemaFreeType);
6454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypesInitialized = 0;
6464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
6474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
6484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
6496927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaIsBuiltInTypeFacet:
65001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in type
65101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facetType:  the facet type
65201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
65301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Evaluates if a specific facet can be
65401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * used in conjunction with a type.
65501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
65601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 1 if the facet can be used with the given built-in type,
65701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 0 otherwise and -1 in case the type is not a built-in type.
65801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
65901fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint
66001fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaIsBuiltInTypeFacet(xmlSchemaTypePtr type, int facetType)
66101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
662ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard    if (type == NULL)
663ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard	return (-1);
66401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if (type->type != XML_SCHEMA_TYPE_BASIC)
66501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	return (-1);
66601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type->builtInType) {
66701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BOOLEAN:
66801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_PATTERN) ||
66901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE))
67001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
67101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
672f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		return (0);
67301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_STRING:
67401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NOTATION:
67501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_QNAME:
676f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_ANYURI:
677f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_BASE64BINARY:
67801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_HEXBINARY:
67901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_LENGTH) ||
68001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MINLENGTH) ||
68101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXLENGTH) ||
68201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_PATTERN) ||
68301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_ENUMERATION) ||
68401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE))
68501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
68601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
68701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (0);
68801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DECIMAL:
68901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_TOTALDIGITS) ||
69001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) ||
69101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_PATTERN) ||
69201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE) ||
69301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_ENUMERATION) ||
69401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) ||
69501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) ||
69601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MININCLUSIVE) ||
69701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MINEXCLUSIVE))
69801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
69901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
700f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		return (0);
70101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TIME:
702f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_GDAY:
70301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTH:
704f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_GMONTHDAY:
705f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_GYEAR:
70601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEARMONTH:
70701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATE:
70801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATETIME:
70901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DURATION:
71001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_FLOAT:
71101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DOUBLE:
71201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_PATTERN) ||
71301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_ENUMERATION) ||
71401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE) ||
71501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) ||
71601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) ||
71701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MININCLUSIVE) ||
71801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MINEXCLUSIVE))
71901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
72001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
721f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		return (0);
72201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	default:
723c7e3cc49bade82dba0cda4ae7c07ffcd1e32fe25Daniel Veillard	    break;
72401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
72501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    return (0);
72601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
72701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
72801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
72901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInType:
73001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type:  the type of the built in type
73101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
73201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Gives you the type struct for a built-in
73301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * type by its type id.
73401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
73501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns the type if found, NULL otherwise.
73601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
73701fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr
73801fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInType(xmlSchemaValType type)
73901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
74001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
74101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaInitTypes();
74201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type) {
743f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
74401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYSIMPLETYPE:
74501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeAnySimpleTypeDef);
74601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_STRING:
74701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeStringDef);
74801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NORMSTRING:
74901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNormStringDef);
75001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DECIMAL:
75101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDecimalDef);
75201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TIME:
75301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeTimeDef);
75401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GDAY:
75501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGDayDef);
75601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTH:
75701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGMonthDef);
75801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTHDAY:
759f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    return (xmlSchemaTypeGMonthDayDef);
76001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEAR:
76101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGYearDef);
76201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEARMONTH:
76301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGYearMonthDef);
76401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATE:
76501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDateDef);
76601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATETIME:
76701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDatetimeDef);
76801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DURATION:
76901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDurationDef);
77001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_FLOAT:
77101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeFloatDef);
77201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DOUBLE:
77301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDoubleDef);
77401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BOOLEAN:
77501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeBooleanDef);
77601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TOKEN:
77701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeTokenDef);
77801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_LANGUAGE:
77901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeLanguageDef);
78001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NMTOKEN:
78101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNmtokenDef);
78201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NMTOKENS:
78301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNmtokensDef);
78401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NAME:
78501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNameDef);
78601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_QNAME:
78701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeQNameDef);
78801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NCNAME:
78901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNCNameDef);
79001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ID:
79101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdDef);
79201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_IDREF:
79301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdrefDef);
79401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_IDREFS:
79501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdrefsDef);
79601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ENTITY:
79701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeEntityDef);
79801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ENTITIES:
79901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeEntitiesDef);
80001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NOTATION:
80101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNotationDef);
80201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYURI:
80301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeAnyURIDef);
80401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_INTEGER:
80501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIntegerDef);
80601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NPINTEGER:
80701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNonPositiveIntegerDef);
80801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NINTEGER:
80901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNegativeIntegerDef);
81001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NNINTEGER:
81101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNonNegativeIntegerDef);
81201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_PINTEGER:
81301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypePositiveIntegerDef);
81401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_INT:
81501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIntDef);
81601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_UINT:
81701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedIntDef);
81801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_LONG:
81901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeLongDef);
82001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ULONG:
82101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedLongDef);
82201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_SHORT:
82301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeShortDef);
82401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_USHORT:
82501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedShortDef);
82601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BYTE:
82701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeByteDef);
82801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_UBYTE:
82901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedByteDef);
83001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_HEXBINARY:
83101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeHexBinaryDef);
83201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BASE64BINARY:
83301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeBase64BinaryDef);
83401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYTYPE:
835f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    return (xmlSchemaTypeAnyTypeDef);
83601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	default:
83701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (NULL);
83801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
83901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
84001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
8417f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/**
8427f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueAppend:
8437f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @prev: the value
8447f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @cur: the value to be appended
8457f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
8467f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Appends a next sibling to a list of computed values.
8477f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
8487f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns 0 if succeeded and -1 on API errors.
8497f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */
8504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikint
8514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueAppend(xmlSchemaValPtr prev, xmlSchemaValPtr cur) {
8524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
8534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if ((prev == NULL) || (cur == NULL))
8544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return (-1);
8554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    prev->next = cur;
8564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (0);
8574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
8584efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
8597f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/**
8607f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetNext:
8617f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @cur: the value
8627f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
8637f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the next sibling of a list of computed values.
8647f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
8657f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns the next value or NULL if there was none, or on
8667f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *         API errors.
8677f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */
8684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValPtr
8694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetNext(xmlSchemaValPtr cur) {
8704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
8714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (cur == NULL)
8724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return (NULL);
8734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (cur->next);
8744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
8754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
8767f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/**
8777f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetAsString:
8787f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @val: the value
8797f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
8807f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the string value of a computed value.
8817f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
8827f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns the string value or NULL if there was none, or on
8837f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *         API errors.
8847f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */
8854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikconst xmlChar *
8864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetAsString(xmlSchemaValPtr val)
887f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard{
8884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (val == NULL)
8894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return (NULL);
8904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    switch (val->type) {
8914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_STRING:
8924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_NORMSTRING:
8934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_ANYSIMPLETYPE:
8944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_TOKEN:
8954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_LANGUAGE:
8964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_NMTOKEN:
8974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_NAME:
8984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_NCNAME:
8994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_ID:
9004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_IDREF:
9014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_ENTITY:
9024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_ANYURI:
9034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    return (BAD_CAST val->value.str);
9044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	default:
9054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
9064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
9074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (NULL);
9084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
9094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
9107f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/**
9117f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetAsBoolean:
9127f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @val: the value
9137f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
9147f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the boolean value of a computed value.
9157f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
9167f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns 1 if true and 0 if false, or in case of an error. Hmm.
9177f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */
9184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikint
9194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetAsBoolean(xmlSchemaValPtr val)
920f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard{
9214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if ((val == NULL) || (val->type != XML_SCHEMAS_BOOLEAN))
9224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return (0);
9234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (val->value.b);
9244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
9254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
9264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
9276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaNewStringValue:
9286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @type:  the value type
929b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @value:  the value
9306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
931f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Allocate a new simple type value. The type can be
932f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * of XML_SCHEMAS_STRING.
9332ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * WARNING: This one is intended to be expanded for other
9342ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * string based types. We need this for anySimpleType as well.
9354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given value is consumed and freed with the struct.
9366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
9376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error
9386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
9396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaValPtr
9406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaNewStringValue(xmlSchemaValType type,
9416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			const xmlChar *value)
9426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
9436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    xmlSchemaValPtr val;
9446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
9456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (type != XML_SCHEMAS_STRING)
9466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return(NULL);
9476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    val = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal));
9486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (val == NULL) {
9496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return(NULL);
9506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
9516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    memset(val, 0, sizeof(xmlSchemaVal));
9526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    val->type = type;
9536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    val->value.str = (xmlChar *) value;
9546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(val);
9556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
9566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
957b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik/**
958b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * xmlSchemaNewNOTATIONValue:
959b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @name:  the notation name
960b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @ns: the notation namespace name or NULL
961b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik *
962b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * Allocate a new NOTATION value.
9634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given values are consumed and freed with the struct.
964b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik *
965b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error
966b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik */
967b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. BuchcikxmlSchemaValPtr
968b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. BuchcikxmlSchemaNewNOTATIONValue(const xmlChar *name,
969b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik			  const xmlChar *ns)
970b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik{
971b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    xmlSchemaValPtr val;
972b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik
973b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    val = xmlSchemaNewValue(XML_SCHEMAS_NOTATION);
974b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    if (val == NULL)
975b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik	return (NULL);
976b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik
97712d37ab63441baf9e03db70168cc1d0d6f1c2373William M. Brack    val->value.qname.name = (xmlChar *)name;
978b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    if (ns != NULL)
97912d37ab63441baf9e03db70168cc1d0d6f1c2373William M. Brack	val->value.qname.uri = (xmlChar *)ns;
980b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    return(val);
981b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik}
9826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
9836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
9844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * xmlSchemaNewQNameValue:
9854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * @namespaceName: the namespace name
9864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * @localName: the local name
9874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *
9884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Allocate a new QName value.
9894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given values are consumed and freed with the struct.
9904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *
9914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of an error.
9924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */
9934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValPtr
9944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaNewQNameValue(const xmlChar *namespaceName,
9954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		       const xmlChar *localName)
9964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{
9974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaValPtr val;
9984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
9994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    val = xmlSchemaNewValue(XML_SCHEMAS_QNAME);
10004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (val == NULL)
10014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return (NULL);
10024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
10034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    val->value.qname.name = (xmlChar *) localName;
10044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    val->value.qname.uri = (xmlChar *) namespaceName;
10054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return(val);
10064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
10074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
10084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik/**
10094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaFreeValue:
10104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value:  the value to free
10114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
10124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library
10134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
1014f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillardvoid
10154255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaFreeValue(xmlSchemaValPtr value) {
10164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaValPtr prev;
10174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
1018f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    while (value != NULL) {
10194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	switch (value->type) {
10204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_STRING:
10214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NORMSTRING:
10224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_TOKEN:
10234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_LANGUAGE:
10244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NMTOKEN:
10254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NMTOKENS:
10264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NAME:
10274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NCNAME:
10284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ID:
10294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_IDREF:
10304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_IDREFS:
10314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ENTITY:
1032f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    case XML_SCHEMAS_ENTITIES:
10334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYURI:
10344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYSIMPLETYPE:
10354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (value->value.str != NULL)
10364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlFree(value->value.str);
10374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
10384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NOTATION:
10394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_QNAME:
10404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (value->value.qname.uri != NULL)
10414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlFree(value->value.qname.uri);
10424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (value->value.qname.name != NULL)
10434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlFree(value->value.qname.name);
10444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
10454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_HEXBINARY:
10464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (value->value.hex.str != NULL)
10474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlFree(value->value.hex.str);
10484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
10494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_BASE64BINARY:
10504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (value->value.base64.str != NULL)
10514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlFree(value->value.base64.str);
10524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
10534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    default:
10544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
10554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	}
10564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	prev = value;
10574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	value = value->next;
10584efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	xmlFree(prev);
1059f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    }
10604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
10614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
10624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
10634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaGetPredefinedType:
10644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name: the type name
10654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @ns:  the URI of the namespace usually "http://www.w3.org/2001/XMLSchema"
10664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
10674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Lookup a type in the default XML Schemas type library
10684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
10694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns the type if found, NULL otherwise
10704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
10714255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaTypePtr
10724255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaGetPredefinedType(const xmlChar *name, const xmlChar *ns) {
10734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
10744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	xmlSchemaInitTypes();
10754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (name == NULL)
10764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(NULL);
10774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return((xmlSchemaTypePtr) xmlHashLookup2(xmlSchemaTypesBank, name, ns));
10784255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
1079070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
108001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
108101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInListSimpleTypeItemType:
108201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in simple type.
108301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
10846927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Lookup function
10856927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard *
1086c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns the item type of @type as defined by the built-in datatype
1087c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * hierarchy of XML Schema Part 2: Datatypes, or NULL in case of an error.
108801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
108901fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr
109001fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInListSimpleTypeItemType(xmlSchemaTypePtr type)
109101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
10924259532303e96e089a185c6f55056cb7c4902d71Daniel Veillard    if ((type == NULL) || (type->type != XML_SCHEMA_TYPE_BASIC))
109301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	return (NULL);
109401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type->builtInType) {
1095f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_NMTOKENS:
109601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNmtokenDef );
1097f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_IDREFS:
109801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdrefDef);
109901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ENTITIES:
110001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeEntityDef);
110101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	default:
110201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (NULL);
110301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
110401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
110501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
1106070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/****************************************************************
1107070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
1108070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *		Convenience macros and functions		*
1109070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
1110070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/
1111070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1112070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_TZO_CHAR(c)						\
1113070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	((c == 0) || (c == 'Z') || (c == '+') || (c == '-'))
1114070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1115070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_YEAR(yr)          (yr != 0)
1116070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MONTH(mon)        ((mon >= 1) && (mon <= 12))
1117070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* VALID_DAY should only be used when month is unknown */
1118070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DAY(day)          ((day >= 1) && (day <= 31))
1119070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_HOUR(hr)          ((hr >= 0) && (hr <= 23))
1120070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MIN(min)          ((min >= 0) && (min <= 59))
1121070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_SEC(sec)          ((sec >= 0) && (sec < 60))
1122690a68095f589248c9e962c6b5468aacb6d3aabaKasimier T. Buchcik#define VALID_TZO(tzo)          ((tzo > -840) && (tzo < 840))
1123070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_LEAP(y)						\
1124070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
1125070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1126ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonth[12] =
1127070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
1128ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonthLeap[12] =
1129070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
1130070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
11315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MAX_DAYINMONTH(yr,mon)                                  \
11325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1])
11335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
1134070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MDAY(dt)						\
1135070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(IS_LEAP(dt->year) ?				        \
1136070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (dt->day <= daysInMonthLeap[dt->mon - 1]) :	        \
1137070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (dt->day <= daysInMonth[dt->mon - 1]))
1138070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1139070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATE(dt)						\
1140070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_YEAR(dt->year) && VALID_MONTH(dt->mon) && VALID_MDAY(dt))
1141070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1142070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TIME(dt)						\
1143070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_HOUR(dt->hour) && VALID_MIN(dt->min) &&		\
1144070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 VALID_SEC(dt->sec) && VALID_TZO(dt->tzo))
1145070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1146070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATETIME(dt)					\
1147070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_DATE(dt) && VALID_TIME(dt))
1148070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1149070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_MIN            (60)
1150070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_HOUR           (60 * SECS_PER_MIN)
1151070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_DAY            (24 * SECS_PER_HOUR)
1152070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
11535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInYearByMonth[12] =
11545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
11555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInLeapYearByMonth[12] =
11565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };
11575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
11585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DAY_IN_YEAR(day, month, year)				\
11595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ((IS_LEAP(year) ?					\
11605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                dayInLeapYearByMonth[month - 1] :		\
11615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                dayInYearByMonth[month - 1]) + day)
11625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
11635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#ifdef DEBUG
11645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt)                                                  \
11655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlGenericError(xmlGenericErrorContext,                             \
11665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        "type=%o %04ld-%02u-%02uT%02u:%02u:%03f",                       \
11675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->type,dt->value.date.year,dt->value.date.mon,                \
11685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->value.date.day,dt->value.date.hour,dt->value.date.min,      \
11695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->value.date.sec);                                            \
11705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dt->value.date.tz_flag)                                         \
11715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (dt->value.date.tzo != 0)                                    \
11725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmlGenericError(xmlGenericErrorContext,                     \
11735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                "%+05d\n",dt->value.date.tzo);                          \
11745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else                                                            \
11755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmlGenericError(xmlGenericErrorContext, "Z\n");             \
11765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else                                                                \
11775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        xmlGenericError(xmlGenericErrorContext,"\n")
11785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#else
11795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt)
11805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#endif
11815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
1182070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1183070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGYear:
1184070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1185070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1186070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1187070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gYear without time zone and fills in the appropriate
1188070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1189070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gYear. It is supposed that @dt->year is big enough to contain
1190070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * the year.
1191070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1192070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1193070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1194070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1195070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) {
1196070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str, *firstChar;
1197070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int isneg = 0, digcnt = 0;
1198070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1199070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (((*cur < '0') || (*cur > '9')) &&
1200070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(*cur != '-') && (*cur != '+'))
1201070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1202070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1203070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur == '-') {
1204070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	isneg = 1;
1205070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1206070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1207070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1208070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    firstChar = cur;
1209070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1210070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    while ((*cur >= '0') && (*cur <= '9')) {
1211070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->year = dt->year * 10 + (*cur - '0');
1212070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1213070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	digcnt++;
1214070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1215070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1216070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* year must be at least 4 digits (CCYY); over 4
1217070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * digits cannot have a leading zero. */
1218070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0')))
1219070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1220070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1221070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (isneg)
1222070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->year = - dt->year;
1223070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1224070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (!VALID_YEAR(dt->year))
1225070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1226070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1227070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1228070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1229070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1230070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1231070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1232070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_2_DIGITS:
1233070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the integer to fill in
1234070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1235070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer
1236070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1237070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a 2-digits integer and updates @num with the value. @cur is
1238070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer.
1239070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and
1240070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1241070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1242070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_2_DIGITS(num, cur, invalid)			\
1243070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if ((cur[0] < '0') || (cur[0] > '9') ||			\
1244070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (cur[1] < '0') || (cur[1] > '9'))			\
1245070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    invalid = 1;					\
1246070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	else							\
1247070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    num = (cur[0] - '0') * 10 + (cur[1] - '0');		\
1248070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur += 2;
1249070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1250070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1251070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_FLOAT:
1252070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the double to fill in
1253070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1254070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer
1255070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1256070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float and updates @num with the value. @cur is
1257070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the float. The float must have a
1258070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2-digits integer part and may or may not have a decimal part.
1259070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and
1260070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1261070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1262070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_FLOAT(num, cur, invalid)				\
1263070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(num, cur, invalid);			\
1264070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!invalid && (*cur == '.')) {			\
1265070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    double mult = 1;				        \
1266070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    cur++;						\
1267070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((*cur < '0') || (*cur > '9'))			\
1268070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		invalid = 1;					\
1269070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
1270070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		mult /= 10;					\
1271070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num += (*cur - '0') * mult;			\
1272070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		cur++;						\
1273070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }							\
1274070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1275070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1276070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1277070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGMonth:
1278070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1279070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1280070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1281070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gMonth without time zone and fills in the appropriate
1282070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1283070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gMonth.
1284070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1285070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1286070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1287070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1288070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) {
1289070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
1290070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
129164dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    unsigned int value = 0;
1292070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
129364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    PARSE_2_DIGITS(value, cur, ret);
1294070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1295070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1296070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
129764dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if (!VALID_MONTH(value))
1298070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1299070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
130064dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    dt->mon = value;
130164dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik
1302070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1303070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1304070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1305070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1306070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1307070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGDay:
1308070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1309070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1310070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1311070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gDay without time zone and fills in the appropriate
1312070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1313070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay.
1314070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1315070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1316070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1317070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1318070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) {
1319070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
1320070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
132164dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    unsigned int value = 0;
1322070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
132364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    PARSE_2_DIGITS(value, cur, ret);
1324070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1325070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1326070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
132764dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if (!VALID_DAY(value))
1328070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1329070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
133064dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    dt->day = value;
1331070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1332070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1333070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1334070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1335070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1336070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTime:
1337070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1338070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1339070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1340070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:time without time zone and fills in the appropriate
1341070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * fields of the @dt structure. @str is updated to point just after the
1342070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:time.
1343070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, values of @dt fields are undefined.
1344070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1345070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1346070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1347070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1348070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) {
1349f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    const xmlChar *cur = *str;
1350070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
1351285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik    int value = 0;
1352070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
135364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    PARSE_2_DIGITS(value, cur, ret);
1354070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1355f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	return ret;
1356070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != ':')
1357070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
135864dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if (!VALID_HOUR(value))
135964dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik	return 2;
1360070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1361070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1362070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* the ':' insures this string is xs:time */
136364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    dt->hour = value;
1364070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
136564dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    PARSE_2_DIGITS(value, cur, ret);
1366070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1367070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
136864dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if (!VALID_MIN(value))
136964dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik	return 2;
137064dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    dt->min = value;
1371070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1372070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != ':')
1373070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1374070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1375070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1376070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_FLOAT(dt->sec, cur, ret);
1377070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1378070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1379070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
138064dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if ((!VALID_SEC(dt->sec)) || (!VALID_TZO(dt->tzo)))
1381070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1382070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1383070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1384070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1385070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1386070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1387070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1388070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTimeZone:
1389070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1390070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1391070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1392070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a time zone without time zone and fills in the appropriate
1393070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1394070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * time zone.
1395070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1396070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1397070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1398070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1399070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) {
140014b5643947845df089376106517c4f7ba061e4b0Daniel Veillard    const xmlChar *cur;
1401070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
1402070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1403070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (str == NULL)
1404070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
140514b5643947845df089376106517c4f7ba061e4b0Daniel Veillard    cur = *str;
1406070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1407070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    switch (*cur) {
1408070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case 0:
1409070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tz_flag = 0;
1410070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = 0;
1411070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1412070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1413070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case 'Z':
1414070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tz_flag = 1;
1415070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = 0;
1416070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1417070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1418070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1419070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case '+':
1420070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case '-': {
1421070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	int isneg = 0, tmp = 0;
1422070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	isneg = (*cur == '-');
1423070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1424070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1425070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1426070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(tmp, cur, ret);
1427070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1428070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return ret;
1429070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_HOUR(tmp))
1430070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1431070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1432070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (*cur != ':')
1433070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 1;
1434070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1435070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1436070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = tmp * 60;
1437070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1438070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(tmp, cur, ret);
1439070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1440070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return ret;
1441070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_MIN(tmp))
1442070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1443070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1444070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo += tmp;
1445070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (isneg)
1446070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    dt->tzo = - dt->tzo;
1447070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1448070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_TZO(dt->tzo))
1449070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1450070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
14515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	dt->tz_flag = 1;
1452070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1453070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard      }
1454070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    default:
1455070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1456070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1457070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1458070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1459070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1460070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1461070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
14621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard/**
14631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * _xmlSchemaBase64Decode:
14641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * @ch: a character
14651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *
14661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Converts a base64 encoded character to its base 64 value.
14671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *
14681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Returns 0-63 (value), 64 (pad), or -1 (not recognized)
14691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */
14701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic int
14711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard_xmlSchemaBase64Decode (const xmlChar ch) {
14721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('A' <= ch) && (ch <= 'Z')) return ch - 'A';
14731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('a' <= ch) && (ch <= 'z')) return ch - 'a' + 26;
14741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('0' <= ch) && (ch <= '9')) return ch - '0' + 52;
14751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('+' == ch) return 62;
14761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('/' == ch) return 63;
14771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('=' == ch) return 64;
14781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return -1;
14791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard}
14801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
1481070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/****************************************************************
1482070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
1483070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *	XML Schema Dates/Times Datatypes Handling		*
1484070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
1485070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/
1486070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1487070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1488070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_DIGITS:
1489070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the integer to fill in
1490070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1491070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag
1492070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1493070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a digits integer and updates @num with the value. @cur is
1494070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer.
1495070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and
1496070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1497070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1498070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_DIGITS(num, cur, num_type)	                \
1499070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if ((*cur < '0') || (*cur > '9'))			\
1500070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    num_type = -1;					\
1501070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else                                                    \
1502070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
1503070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	        num = num * 10 + (*cur - '0');		        \
1504070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	        cur++;                                          \
1505070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            }
1506070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1507070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1508070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_NUM:
1509070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the double to fill in
1510070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1511070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag
1512070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1513070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float or integer and updates @num with the value. @cur is
1514070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the number. If the number is a float,
1515070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * then it must have an integer part and a decimal part; @num_type will
1516070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * be set to 1. If there is no decimal part, @num_type is set to zero.
1517070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and
1518070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1519070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1520070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_NUM(num, cur, num_type)				\
1521070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        num = 0;                                                \
1522070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_DIGITS(num, cur, num_type);	                \
1523070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!num_type && (*cur == '.')) {			\
1524070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    double mult = 1;				        \
1525070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    cur++;						\
1526070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((*cur < '0') || (*cur > '9'))			\
1527070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num_type = -1;					\
1528070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else                                                \
1529070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                num_type = 1;                                   \
1530070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
1531070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		mult /= 10;					\
1532070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num += (*cur - '0') * mult;			\
1533070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		cur++;						\
1534070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }							\
1535070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1536070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1537070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
15385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDates:
1539455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard * @type: the expected type or XML_SCHEMAS_UNKNOWN
1540070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dateTime:  string to analyze
1541070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val:  the return computed value
1542070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1543070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @dateTime conforms to the lexical space of one of the date types.
1544070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val.
1545070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1546070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
1547070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *         and -1 in case of internal or API error.
1548070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1549070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1550455cc07308c673b6714e2f5670c2091a1dab95dcDaniel VeillardxmlSchemaValidateDates (xmlSchemaValType type,
15514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	                const xmlChar *dateTime, xmlSchemaValPtr *val,
15524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			int collapse) {
1553070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmlSchemaValPtr dt;
1554070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret;
1555070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = dateTime;
1556070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1557070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define RETURN_TYPE_IF_VALID(t)					\
1558070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (IS_TZO_CHAR(*cur)) {					\
1559070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur);	\
1560070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret == 0) {						\
1561070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (*cur != 0)					\
1562070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		goto error;					\
1563070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    dt->type = t;					\
1564455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard	    goto done;						\
1565070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}							\
1566070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1567070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1568070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dateTime == NULL)
1569070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1570070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
15714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (collapse)
15724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*cur) cur++;
15734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
1574070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((*cur != '-') && (*cur < '0') && (*cur > '9'))
1575070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1576070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1577070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN);
1578070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dt == NULL)
1579070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1580070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1581070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((cur[0] == '-') && (cur[1] == '-')) {
1582070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/*
1583070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * It's an incomplete date (xs:gMonthDay, xs:gMonth or
1584070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * xs:gDay)
1585070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 */
1586070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur += 2;
1587070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1588070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/* is it an xs:gDay? */
1589070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (*cur == '-') {
1590455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard	    if (type == XML_SCHEMAS_GMONTH)
1591455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard		goto error;
1592070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	  ++cur;
1593070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1594070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret != 0)
1595070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		goto error;
1596070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1597070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY);
1598070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1599070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    goto error;
1600070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1601070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1602070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/*
1603070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * it should be an xs:gMonthDay or xs:gMonth
1604070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 */
1605070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur);
1606070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1607070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    goto error;
1608070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1609d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        /*
1610d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a '-' char could indicate this type is xs:gMonthDay or
1611d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a negative time zone offset. Check for xs:gMonthDay first.
1612d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * Also the first three char's of a negative tzo (-MM:SS) can
1613d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * appear to be a valid day; so even if the day portion
1614d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * of the xs:gMonthDay verifies, we must insure it was not
1615d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a tzo.
1616d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         */
1617d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if (*cur == '-') {
1618d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            const xmlChar *rewnd = cur;
1619d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            cur++;
1620d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1621f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1622d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            if ((ret == 0) && ((*cur == 0) || (*cur != ':'))) {
1623d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1624d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                /*
1625d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * we can use the VALID_MDAY macro to validate the month
1626d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * and day because the leap year test will flag year zero
1627d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * as a leap year (even though zero is an invalid year).
16284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		 * FUTURE TODO: Zero will become valid in XML Schema 1.1
16294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		 * probably.
1630d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 */
1631d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                if (VALID_MDAY((&(dt->value.date)))) {
1632d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1633d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard	            RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY);
1634070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1635d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                    goto error;
1636d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                }
1637d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            }
1638d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1639d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            /*
1640d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             * not xs:gMonthDay so rewind and check if just xs:gMonth
1641d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             * with an optional time zone.
1642d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             */
1643d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            cur = rewnd;
1644d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        }
1645d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1646d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard	RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH);
1647070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1648070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1649070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1650070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1651070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /*
1652070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * It's a right-truncated date or an xs:time.
1653070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * Try to parse an xs:time then fallback on right-truncated dates.
1654070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     */
1655070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((*cur >= '0') && (*cur <= '9')) {
1656070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseTime(&(dt->value.date), &cur);
1657070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret == 0) {
1658070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    /* it's an xs:time */
1659070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_TIME);
1660070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1661070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1662070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1663070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* fallback on date parsing */
1664070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur = dateTime;
1665070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1666070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGYear(&(dt->value.date), &cur);
1667070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1668070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1669070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1670070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:gYear? */
1671070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEAR);
1672070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1673070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != '-')
1674070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1675070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1676070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1677070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur);
1678070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1679070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1680070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1681070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:gYearMonth? */
1682070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEARMONTH);
1683070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1684070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != '-')
1685070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1686070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1687070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1688070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1689070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((ret != 0) || !VALID_DATE((&(dt->value.date))))
1690070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1691070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1692070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:date? */
1693070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_DATE);
1694070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1695070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != 'T')
1696070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1697070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1698070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1699070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* it should be an xs:dateTime */
1700070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseTime(&(dt->value.date), &cur);
1701070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1702070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1703070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1704070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur);
17054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (collapse)
17064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*cur) cur++;
17076a0baa0cd89b402cdfbb63e9c40f291ebd191f1dDaniel Veillard    if ((ret != 0) || (*cur != 0) || (!(VALID_DATETIME((&(dt->value.date))))))
1708070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1709070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1710455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard
1711070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dt->type = XML_SCHEMAS_DATETIME;
1712070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1713455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillarddone:
1714d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#if 1
1715d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type))
1716d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        goto error;
1717d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#else
1718d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    /*
1719d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     * insure the parsed type is equal to or less significant (right
1720d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     * truncated) than the desired type.
1721d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     */
1722d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) {
1723d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1724d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        /* time only matches time */
1725d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_TIME) && (dt->type == XML_SCHEMAS_TIME))
1726d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1727d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1728d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_DATETIME) &&
1729d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            ((dt->type != XML_SCHEMAS_DATE) ||
1730d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEARMONTH) ||
1731d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEAR)))
1732d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1733d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1734d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_DATE) &&
1735d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            ((dt->type != XML_SCHEMAS_GYEAR) ||
1736d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEARMONTH)))
1737d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1738d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1739d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_GYEARMONTH) && (dt->type != XML_SCHEMAS_GYEAR))
1740d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1741d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1742d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_GMONTHDAY) && (dt->type != XML_SCHEMAS_GMONTH))
1743d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1744d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    }
1745455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard#endif
1746455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard
1747070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (val != NULL)
1748070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        *val = dt;
174980b19092f24410a6b869abf519227686e8f207caDaniel Veillard    else
175080b19092f24410a6b869abf519227686e8f207caDaniel Veillard	xmlSchemaFreeValue(dt);
1751070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1752070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1753070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1754070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror:
1755070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dt != NULL)
1756070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	xmlSchemaFreeValue(dt);
1757070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 1;
1758070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1759070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1760070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
17615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDuration:
1762070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @type: the predefined type
1763070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @duration:  string to analyze
1764070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val:  the return computed value
1765070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1766070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @duration conforms to the lexical space of the duration type.
1767070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val.
1768070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1769070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
1770070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *         and -1 in case of internal or API error.
1771070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1772070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1773dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
17744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	                   const xmlChar *duration, xmlSchemaValPtr *val,
17754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			   int collapse) {
1776070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar  *cur = duration;
1777070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmlSchemaValPtr dur;
1778070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int isneg = 0;
1779070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int seq = 0;
1780d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    double         num;
1781d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    int            num_type = 0;  /* -1 = invalid, 0 = int, 1 = floating */
1782d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    const xmlChar  desig[]  = {'Y', 'M', 'D', 'H', 'M', 'S'};
1783d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    const double   multi[]  = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0};
1784070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1785070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (duration == NULL)
1786070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1787070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
17884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (collapse)
17894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*cur) cur++;
17904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
1791070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur == '-') {
1792070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        isneg = 1;
1793070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        cur++;
1794070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1795070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1796070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* duration must start with 'P' (after sign) */
1797070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur++ != 'P')
1798070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1799070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
180080b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (*cur == 0)
180180b19092f24410a6b869abf519227686e8f207caDaniel Veillard	return 1;
180280b19092f24410a6b869abf519227686e8f207caDaniel Veillard
1803070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION);
1804070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dur == NULL)
1805070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1806070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1807070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    while (*cur != 0) {
1808070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1809070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* input string should be empty or invalid date/time item */
1810070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (seq >= sizeof(desig))
1811070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1812070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1813070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* T designator must be present for time items */
1814070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (*cur == 'T') {
1815070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (seq <= 3) {
1816070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                seq = 3;
1817070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                cur++;
1818070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            } else
1819070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 1;
1820070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        } else if (seq == 3)
1821070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1822070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1823070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* parse the number portion of the item */
1824070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        PARSE_NUM(num, cur, num_type);
1825070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1826070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if ((num_type == -1) || (*cur == 0))
1827070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1828070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1829070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* update duration based on item type */
1830070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        while (seq < sizeof(desig)) {
1831070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (*cur == desig[seq]) {
1832070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1833070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                /* verify numeric type; only seconds can be float */
1834070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                if ((num_type != 0) && (seq < (sizeof(desig)-1)))
1835070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    goto error;
1836070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1837070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                switch (seq) {
1838070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    case 0:
1839070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.mon = (long)num * 12;
1840070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1841070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    case 1:
1842070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.mon += (long)num;
1843070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1844070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    default:
1845070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        /* convert to seconds using multiplier */
1846070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.sec += num * multi[seq];
1847070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        seq++;
1848070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1849070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                }
1850070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1851070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                break;          /* exit loop */
1852070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            }
1853070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            /* no date designators found? */
1854c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik            if ((++seq == 3) || (seq == 6))
1855070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                goto error;
1856070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        }
18574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	cur++;
18584efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	if (collapse)
1859f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    while IS_WSP_BLANK_CH(*cur) cur++;
1860070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1861070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1862070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (isneg) {
1863070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.mon = -dur->value.dur.mon;
1864070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.day = -dur->value.dur.day;
1865070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.sec = -dur->value.dur.sec;
1866070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1867070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1868070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (val != NULL)
1869070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        *val = dur;
187080b19092f24410a6b869abf519227686e8f207caDaniel Veillard    else
187180b19092f24410a6b869abf519227686e8f207caDaniel Veillard	xmlSchemaFreeValue(dur);
1872070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1873070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1874070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1875070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror:
1876070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dur != NULL)
1877070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	xmlSchemaFreeValue(dur);
1878070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 1;
1879070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1880070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1881a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard/**
1882a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * xmlSchemaStrip:
1883a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * @value: a value
1884a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *
1885a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Removes the leading and ending spaces of a string
1886a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *
1887a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the new string or NULL if no change was required.
1888a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard */
1889a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlChar *
1890a1a9d0410000cc69874e53e438b250037d3e14cdDaniel VeillardxmlSchemaStrip(const xmlChar *value) {
1891a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    const xmlChar *start = value, *end, *f;
1892a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard
1893a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if (value == NULL) return(NULL);
189476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((*start != 0) && (IS_BLANK_CH(*start))) start++;
1895a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end = start;
1896a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    while (*end != 0) end++;
1897a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    f = end;
1898a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end--;
189976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((end > start) && (IS_BLANK_CH(*end))) end--;
1900a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end++;
1901a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if ((start == value) && (f == end)) return(NULL);
1902a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    return(xmlStrndup(start, end - start));
1903a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard}
190496a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard
190596a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard/**
190691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * xmlSchemaWhiteSpaceReplace:
190791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * @value: a value
190891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik *
190991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Replaces 0xd, 0x9 and 0xa with a space.
191091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik *
191191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Returns the new string or NULL if no change was required.
191291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik */
191391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlChar *
191491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlSchemaWhiteSpaceReplace(const xmlChar *value) {
1915f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    const xmlChar *cur = value;
1916f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    xmlChar *ret = NULL, *mcur;
191791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
1918f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    if (value == NULL)
191991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	return(NULL);
1920f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
1921f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    while ((*cur != 0) &&
192291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	(((*cur) != 0xd) && ((*cur) != 0x9) && ((*cur) != 0xa))) {
192391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	cur++;
192491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    }
192591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    if (*cur == 0)
192691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	return (NULL);
192791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    ret = xmlStrdup(value);
192891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    /* TODO FIXME: I guess gcc will bark at this. */
192991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    mcur = (xmlChar *)  (ret + (cur - value));
193091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    do {
193191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	if ( ((*mcur) == 0xd) || ((*mcur) == 0x9) || ((*mcur) == 0xa) )
193291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	    *mcur = ' ';
193391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	mcur++;
1934f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    } while (*mcur != 0);
193591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    return(ret);
193691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik}
193791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
193891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik/**
1939b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCollapseString:
1940b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: a value
1941b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
1942b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Removes and normalize white spaces in the string
1943b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
1944b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns the new string or NULL if no change was required.
1945b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
194601fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlChar *
1947b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCollapseString(const xmlChar *value) {
1948b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    const xmlChar *start = value, *end, *f;
1949b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    xmlChar *g;
1950b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    int col = 0;
1951b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1952b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (value == NULL) return(NULL);
195376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((*start != 0) && (IS_BLANK_CH(*start))) start++;
1954b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    end = start;
1955b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    while (*end != 0) {
195676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if ((*end == ' ') && (IS_BLANK_CH(end[1]))) {
1957b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    col = end - start;
1958b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    break;
1959b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	} else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) {
1960b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    col = end - start;
1961b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    break;
1962b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	}
1963b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end++;
1964b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1965b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (col == 0) {
1966b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	f = end;
1967b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end--;
196876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	while ((end > start) && (IS_BLANK_CH(*end))) end--;
1969b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end++;
1970b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if ((start == value) && (f == end)) return(NULL);
1971b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(xmlStrndup(start, end - start));
1972b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1973b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    start = xmlStrdup(start);
1974b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (start == NULL) return(NULL);
1975b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    g = (xmlChar *) (start + col);
1976b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    end = g;
1977b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    while (*end != 0) {
197876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if (IS_BLANK_CH(*end)) {
1979b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    end++;
198076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*end)) end++;
1981b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (*end != 0)
1982b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		*g++ = ' ';
1983b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	} else
1984b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    *g++ = *end++;
1985b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1986b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    *g = 0;
1987b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return((xmlChar *) start);
1988b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
1989b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1990b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
199128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * xmlSchemaValAtomicListNode:
199228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @type: the predefined atomic type for a token in the list
199328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @value: the list value to check
199428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @ret:  the return computed value
199528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @node:  the node containing the value
199628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *
199728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Check that a value conforms to the lexical space of the predefined
199828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * list type. if true a value is computed and returned in @ret.
199928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *
2000a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the number of items if this validates, a negative error code
2001a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *         number otherwise
200228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */
200328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillardstatic int
200428c52ab518d34a36fd8da6870a5850088f129a6aDaniel VeillardxmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value,
200528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	                   xmlSchemaValPtr *ret, xmlNodePtr node) {
200628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    xmlChar *val, *cur, *endval;
200728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    int nb_values = 0;
2008580ced8ee28ecd99374da9383897678e4ba6c358Daniel Veillard    int tmp = 0;
200928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard
201028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (value == NULL) {
201128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	return(-1);
201228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
201328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    val = xmlStrdup(value);
201428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (val == NULL) {
201528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	return(-1);
201628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
20176fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    if (ret != NULL) {
20186fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard        *ret = NULL;
20196fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    }
202028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    cur = val;
202128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    /*
202228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard     * Split the list
202328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard     */
202476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while (IS_BLANK_CH(*cur)) *cur++ = 0;
202528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while (*cur != 0) {
202676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if (IS_BLANK_CH(*cur)) {
202728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    *cur = 0;
202828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    cur++;
202976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*cur)) *cur++ = 0;
203028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	} else {
203128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    nb_values++;
203228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    cur++;
203376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++;
203428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	}
203528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
203628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (nb_values == 0) {
203728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	xmlFree(val);
2038a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard	return(nb_values);
203928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
204028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    endval = cur;
204128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    cur = val;
204228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while ((*cur == 0) && (cur != endval)) cur++;
204328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while (cur != endval) {
204428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node);
204528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	if (tmp != 0)
204628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    break;
204728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	while (*cur != 0) cur++;
204828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	while ((*cur == 0) && (cur != endval)) cur++;
204928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
20506fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    /* TODO what return value ? c.f. bug #158628
205128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (ret != NULL) {
205228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	TODO
20536fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    } */
20546fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    xmlFree(val);
2055a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if (tmp == 0)
2056a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard	return(nb_values);
2057a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    return(-1);
205828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard}
205928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard
206028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard/**
2061e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * xmlSchemaParseUInt:
2062e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @str: pointer to the string R/W
2063e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @llo: pointer to the low result
2064e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lmi: pointer to the mid result
2065e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lhi: pointer to the high result
2066e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *
2067e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Parse an unsigned long into 3 fields.
2068e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *
2069ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack * Returns the number of significant digits in the number or
2070bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard * -1 if overflow of the capacity and -2 if it's not a number.
2071e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard */
2072e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic int
2073e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel VeillardxmlSchemaParseUInt(const xmlChar **str, unsigned long *llo,
2074478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik                   unsigned long *lmi, unsigned long *lhi) {
2075e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long lo = 0, mi = 0, hi = 0;
2076e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    const xmlChar *tmp, *cur = *str;
2077e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    int ret = 0, i = 0;
2078e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
2079f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    if (!((*cur >= '0') && (*cur <= '9')))
2080bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard        return(-2);
2081bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard
2082478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while (*cur == '0') {        /* ignore leading zeroes */
2083478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        cur++;
2084e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2085e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    tmp = cur;
2086e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) {
2087478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        i++;tmp++;ret++;
2088e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2089e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (i > 24) {
2090478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        *str = tmp;
2091478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        return(-1);
2092e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2093e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 16) {
2094478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        hi = hi * 10 + (*cur++ - '0');
2095478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        i--;
2096e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2097e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 8) {
2098478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        mi = mi * 10 + (*cur++ - '0');
2099478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        i--;
2100e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2101e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 0) {
2102478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        lo = lo * 10 + (*cur++ - '0');
2103478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        i--;
2104e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2105e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
2106e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *str = cur;
2107e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *llo = lo;
2108e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *lmi = mi;
2109e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *lhi = hi;
2110e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    return(ret);
2111e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard}
2112e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
2113e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard/**
2114b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValAtomicType:
21154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type: the predefined type
21164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to check
21174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val:  the return computed value
2118c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @node:  the node containing the value
2119b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * flags:  flags to control the vlidation
21204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
2121b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the atomic type.
21224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * if true a value is computed and returned in @val.
212301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * This checks the value space for list types as well (IDREFS, NMTOKENS).
21244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
21254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
21264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *         and -1 in case of internal or API error.
21274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
2128b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int
21291ac24d36b12487995b659a8fc23a02b9460edb36Daniel VeillardxmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value,
21304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik                       xmlSchemaValPtr * val, xmlNodePtr node, int flags,
21314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		       xmlSchemaWhitespaceValueType ws,
21324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		       int normOnTheFly, int applyNorm, int createStringValue)
21331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard{
21344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValPtr v;
2135b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    xmlChar *norm = NULL;
2136d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    int ret = 0;
21374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
21384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
213901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitTypes();
21404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (type == NULL)
21411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        return (-1);
21425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
2143eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard    /*
2144eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard     * validating a non existant text node is similar to validating
2145eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard     * an empty one.
2146eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard     */
2147eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard    if (value == NULL)
2148eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard        value = BAD_CAST "";
2149eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard
21504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (val != NULL)
21511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        *val = NULL;
2152b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if ((flags == 0) && (value != NULL)) {
215391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
215401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        if ((type->builtInType != XML_SCHEMAS_STRING) &&
2155f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	  (type->builtInType != XML_SCHEMAS_ANYTYPE) &&
215691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	  (type->builtInType != XML_SCHEMAS_ANYSIMPLETYPE)) {
215791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	    if (type->builtInType == XML_SCHEMAS_NORMSTRING)
215891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik		norm = xmlSchemaWhiteSpaceReplace(value);
215991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik            else
216091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik		norm = xmlSchemaCollapseString(value);
21611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (norm != NULL)
21621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                value = norm;
21631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        }
2164b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
2165b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
216601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type->builtInType) {
2167f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard        case XML_SCHEMAS_UNKNOWN:
21681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto error;
21692f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	case XML_SCHEMAS_ANYTYPE:
21702f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	case XML_SCHEMAS_ANYSIMPLETYPE:
21714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if ((createStringValue) && (val != NULL)) {
21724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		v = xmlSchemaNewValue(XML_SCHEMAS_ANYSIMPLETYPE);
21734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (v != NULL) {
21744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    v->value.str = xmlStrdup(value);
21754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    *val = v;
21764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else {
21774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    goto error;
2178f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		}
21794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    }
21802f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	    goto return0;
2181f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard        case XML_SCHEMAS_STRING:
21824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if (! normOnTheFly) {
21834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		const xmlChar *cur = value;
21844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
21854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (ws == XML_SCHEMA_WHITESPACE_REPLACE) {
21864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while (*cur != 0) {
21874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
21884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
21894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else {
21904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
21914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			}
21924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
21934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) {
21944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while (*cur != 0) {
21954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
21964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
21974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else if IS_WSP_SPACE_CH(*cur) {
21984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
21994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    if IS_WSP_SPACE_CH(*cur)
22004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik				goto return1;
22014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else {
22024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
22034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			}
22044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
22054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
22064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    }
22074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if (createStringValue && (val != NULL)) {
22084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (applyNorm) {
22094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
22104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			norm = xmlSchemaCollapseString(value);
22114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else if (ws == XML_SCHEMA_WHITESPACE_REPLACE)
22124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			norm = xmlSchemaWhiteSpaceReplace(value);
22134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (norm != NULL)
22144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			value = norm;
22154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
22164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		v = xmlSchemaNewValue(XML_SCHEMAS_STRING);
22174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (v != NULL) {
22184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    v->value.str = xmlStrdup(value);
22194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    *val = v;
22204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else {
22214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    goto error;
22224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
22234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    }
22241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return0;
22251516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard        case XML_SCHEMAS_NORMSTRING:{
22264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly) {
22274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (applyNorm) {
22284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
22294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    norm = xmlSchemaCollapseString(value);
22304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			else
22314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    norm = xmlSchemaWhiteSpaceReplace(value);
22324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if (norm != NULL)
22334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    value = norm;
22344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
22354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else {
22364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    const xmlChar *cur = value;
22374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while (*cur != 0) {
22384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
22394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
22404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else {
22414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
22424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			}
22434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
22444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
22451516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                if (val != NULL) {
22461516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NORMSTRING);
22471516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    if (v != NULL) {
22481516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        v->value.str = xmlStrdup(value);
22491516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        *val = v;
22501516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    } else {
22511516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        goto error;
22521516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    }
22531516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                }
22541516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                goto return0;
22551516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard            }
22561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_DECIMAL:{
2257273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack                const xmlChar *cur = value;
225872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik                unsigned int len, neg, integ, hasLeadingZeroes;
2259273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		xmlChar cval[25];
2260f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		xmlChar *cptr = cval;
22611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
226272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik                if ((cur == NULL) || (*cur == 0))
22631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
22644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
226572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		/*
226672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		* xs:decimal has a whitespace-facet value of 'collapse'.
226772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		*/
22684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
22694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
22704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
227172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		/*
227272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		* First we handle an optional sign.
227372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		*/
227472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		neg = 0;
227572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik                if (*cur == '-') {
227672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		    neg = 1;
22771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
227872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		} else if (*cur == '+')
22791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
228072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		/*
228172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		* Disallow: "", "-", "- "
228272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		*/
228372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		if (*cur == 0)
228472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		    goto return1;
2285273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		/*
2286273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 * Next we "pre-parse" the number, in preparation for calling
2287273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 * the common routine xmlSchemaParseUInt.  We get rid of any
2288273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 * leading zeroes (because we have reserved only 25 chars),
228972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		 * and note the position of a decimal point.
2290273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 */
2291273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		len = 0;
229272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		integ = ~0u;
229372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		hasLeadingZeroes = 0;
2294c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/*
2295c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* Skip leading zeroes.
2296c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*/
229772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		while (*cur == '0') {
2298273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		    cur++;
229972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		    hasLeadingZeroes = 1;
230072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		}
2301c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (*cur != 0) {
230272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		    do {
2303c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			if ((*cur >= '0') && (*cur <= '9')) {
2304c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    *cptr++ = *cur++;
2305c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    len++;
2306c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			} else if (*cur == '.') {
2307c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    cur++;
230872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    integ = len;
230972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    do {
231072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				if ((*cur >= '0') && (*cur <= '9')) {
231172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    *cptr++ = *cur++;
231272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    len++;
231372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				} else
231472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    break;
231572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    } while (len < 24);
231672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    /*
231772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    * Disallow "." but allow "00."
231872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    */
231972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    if ((len == 0) && (!hasLeadingZeroes))
2320c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik				goto return1;
2321c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    break;
2322c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			} else
2323c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    break;
232472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		    } while (len < 24);
2325273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		}
23264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
23274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
2328273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		if (*cur != 0)
232972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		    goto return1; /* error if any extraneous chars */
23301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
23311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL);
23321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
2333273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			/*
2334f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard			* Now evaluate the significant digits of the number
2335f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard			*/
233672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			if (len != 0) {
2337f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
233872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    if (integ != ~0u) {
233972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				/*
234072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				* Get rid of trailing zeroes in the
234172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				* fractional part.
234272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				*/
234372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				while ((len != integ) && (*(cptr-1) == '0')) {
234472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    cptr--;
234572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    len--;
234672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				}
234772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    }
234872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    /*
234972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    * Terminate the (preparsed) string.
235072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    */
235172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    if (len != 0) {
2352bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard				*cptr = 0;
235372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				cptr = cval;
2354bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard
235572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				xmlSchemaParseUInt((const xmlChar **)&cptr,
235672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    &v->value.decimal.lo,
235772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    &v->value.decimal.mi,
235872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    &v->value.decimal.hi);
2359273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			    }
2360273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			}
2361c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			/*
2362c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			* Set the total digits to 1 if a zero value.
2363c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			*/
23641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = neg;
236572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			if (len == 0) {
236672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    /* Speedup for zero values. */
236772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    v->value.decimal.total = 1;
2368273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			} else {
2369c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    v->value.decimal.total = len;
237072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    if (integ == ~0u)
237172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				v->value.decimal.frac = 0;
237272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    else
237372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				v->value.decimal.frac = len - integ;
2374273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			}
23751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
23761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
23771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
23791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2380b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_TIME:
2381b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GDAY:
2382b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GMONTH:
2383b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GMONTHDAY:
2384b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GYEAR:
2385b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GYEARMONTH:
2386b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DATE:
2387b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DATETIME:
23884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik            ret = xmlSchemaValidateDates(type->builtInType, value, val,
23894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		normOnTheFly);
23901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            break;
2391b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DURATION:
23924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik            ret = xmlSchemaValidateDuration(type, value, val,
23934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		normOnTheFly);
23941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            break;
2395b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_FLOAT:
23965f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly        case XML_SCHEMAS_DOUBLE: {
23971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
23981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int neg = 0;
23995f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly                int digits_before = 0;
24005f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly                int digits_after = 0;
24011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
24024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
24034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
24044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
24051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) {
24061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur += 3;
24071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (*cur != 0)
24081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
24091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (val != NULL) {
24101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (type == xmlSchemaTypeFloatDef) {
24111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
24121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
24131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                v->value.f = (float) xmlXPathNAN;
24141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
24151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
24161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
24171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
24181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
24191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
24201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
24211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                v->value.d = xmlXPathNAN;
24221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
24231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
24241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
24251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
24261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
24271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
24281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
24291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return0;
24301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
24321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    neg = 1;
24331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) {
24361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur += 3;
24371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (*cur != 0)
24381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
24391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (val != NULL) {
24401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (type == xmlSchemaTypeFloatDef) {
24411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
24421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
24431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                if (neg)
24441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.f = (float) xmlXPathNINF;
24451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                else
24461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.f = (float) xmlXPathPINF;
24471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
24481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
24491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
24501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
24511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
24521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
24531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
24541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                if (neg)
24551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.d = xmlXPathNINF;
24561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                else
24571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.d = xmlXPathPINF;
24581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
24591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
24601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
24611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
24621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
24631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
24641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
24651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return0;
24661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((neg == 0) && (*cur == '+'))
24681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-'))
24701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
24711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                while ((*cur >= '0') && (*cur <= '9')) {
24721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24735f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly                    digits_before++;
24741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '.') {
24761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24775f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly                    while ((*cur >= '0') && (*cur <= '9')) {
24781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
24795f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly                        digits_after++;
24805f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly                    }
24811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24821ea95900468ec45c251dd44093830569af28e657Daniel Veillard                if ((digits_before == 0) && (digits_after == 0))
24835f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly                    goto return1;
24841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((*cur == 'e') || (*cur == 'E')) {
24851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((*cur == '-') || (*cur == '+'))
24871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
24881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while ((*cur >= '0') && (*cur <= '9'))
24891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
24901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
24924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
24934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
24941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
24951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
24961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
24971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (type == xmlSchemaTypeFloatDef) {
24981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
24991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (v != NULL) {
25006c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    /*
25016c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * TODO: sscanf seems not to give the correct
25026c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * value for extremely high/low values.
25036c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * E.g. "1E-149" results in zero.
25046c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    */
2505d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard                            if (sscanf((const char *) value, "%f",
25061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                 &(v->value.f)) == 1) {
25076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                                *val = v;
25081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
25091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
25101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
25111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
25121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
25131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto error;
25141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
25151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
25161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
25171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (v != NULL) {
25186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    /*
25196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * TODO: sscanf seems not to give the correct
25206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * value for extremely high/low values.
25216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    */
2522d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard                            if (sscanf((const char *) value, "%lf",
25231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                 &(v->value.d)) == 1) {
25241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                *val = v;
25251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
25261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
25271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
25281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
25291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
25301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto error;
25311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
25321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
25331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
25341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
25351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
25361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BOOLEAN:{
25371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
25381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
25394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly) {
25404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
25414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (*cur == '0') {
25424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 0;
25434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			cur++;
25444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    } else if (*cur == '1') {
25454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 1;
25464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			cur++;
25474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    } else if (*cur == 't') {
25484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			cur++;
25494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur++ == 'r') && (*cur++ == 'u') &&
25504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    (*cur++ == 'e')) {
25514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    ret = 1;
25524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else
25534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
25544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    } else if (*cur == 'f') {
25554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			cur++;
25564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur++ == 'a') && (*cur++ == 'l') &&
25574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    (*cur++ == 's') && (*cur++ == 'e')) {
25584efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    ret = 0;
25594efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else
25604efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
25611869be56906ed5488b7db6d7c16f1c473af1485dKasimier T. Buchcik		    } else
25621869be56906ed5488b7db6d7c16f1c473af1485dKasimier T. Buchcik			goto return1;
25634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (*cur != 0) {
25644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			while IS_WSP_BLANK_CH(*cur) cur++;
25654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if (*cur != 0)
25664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
25674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
25684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else {
25694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if ((cur[0] == '0') && (cur[1] == 0))
25704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 0;
25714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else if ((cur[0] == '1') && (cur[1] == 0))
25724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 1;
25734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else if ((cur[0] == 't') && (cur[1] == 'r')
25744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			&& (cur[2] == 'u') && (cur[3] == 'e')
25754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			&& (cur[4] == 0))
25764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 1;
25774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else if ((cur[0] == 'f') && (cur[1] == 'a')
25784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			&& (cur[2] == 'l') && (cur[3] == 's')
25794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			&& (cur[4] == 'e') && (cur[5] == 0))
25804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 0;
25814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else
25824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			goto return1;
25834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
25841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
25851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN);
25861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
25871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.b = ret;
25881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
25891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
25901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
25911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
25921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
25931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
25941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
25951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_TOKEN:{
25961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
25971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
25984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (! normOnTheFly) {
25994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while (*cur != 0) {
26004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
26014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
26024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else if (*cur == ' ') {
26034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
26044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    if (*cur == 0)
26054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik				goto return1;
26064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    if (*cur == ' ')
26074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik				goto return1;
26084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else {
26094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
26104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			}
2611f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		    }
2612f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		}
26131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
26141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN);
26151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
26161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.str = xmlStrdup(value);
26171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
26181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
26191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
26201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
26211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
26231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2624b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_LANGUAGE:
2625f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    if (normOnTheFly) {
26264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		norm = xmlSchemaCollapseString(value);
26274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (norm != NULL)
26284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    value = norm;
26294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    }
26301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (xmlCheckLanguageID(value) == 1) {
26311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
26321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE);
26331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
26341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.str = xmlStrdup(value);
26351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
26361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
26371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
26381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
26391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
26411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
26421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return1;
2643b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NMTOKEN:
26441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (xmlValidateNMToken(value, 1) == 0) {
26451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
26461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN);
26471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
26481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.str = xmlStrdup(value);
26491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
26501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
26511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
26521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
26531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
26551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
26561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return1;
2657b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NMTOKENS:
26581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef,
26591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
26601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret > 0)
26611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
26621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
26631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 1;
26641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2665b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NAME:
26661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateName(value, 1);
2667df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard            if ((ret == 0) && (val != NULL) && (value != NULL)) {
2668df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		v = xmlSchemaNewValue(XML_SCHEMAS_NAME);
2669df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		if (v != NULL) {
2670df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     const xmlChar *start = value, *end;
2671df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     while (IS_BLANK_CH(*start)) start++;
2672df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     end = start;
2673df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     while ((*end != 0) && (!IS_BLANK_CH(*end))) end++;
2674df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     v->value.str = xmlStrndup(start, end - start);
2675df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		    *val = v;
2676df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		} else {
2677df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		    goto error;
2678df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		}
26791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
26801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
26811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_QNAME:{
26821c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                const xmlChar *uri = NULL;
26831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *local = NULL;
26841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
26851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateQName(value, 1);
26861c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		if (ret != 0)
26871c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    goto done;
26881c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                if (node != NULL) {
26891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *prefix;
26901c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    xmlNsPtr ns;
26911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
26921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    local = xmlSplitQName2(value, &prefix);
26931c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    ns = xmlSearchNs(node->doc, node, prefix);
26941c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if ((ns == NULL) && (prefix != NULL)) {
26951c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			xmlFree(prefix);
26961c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			if (local != NULL)
26971c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			    xmlFree(local);
26981c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			goto return1;
26991c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    }
27001c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if (ns != NULL)
27011c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			uri = ns->href;
27021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL)
27031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(prefix);
27041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27051c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                if (val != NULL) {
27061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_QNAME);
27071c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                    if (v == NULL) {
27081c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			if (local != NULL)
27091c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			    xmlFree(local);
27101c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			goto error;
27111c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    }
27121c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if (local != NULL)
27131c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			v->value.qname.name = local;
27141c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    else
27151c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			v->value.qname.name = xmlStrdup(value);
27161c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if (uri != NULL)
27171c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			v->value.qname.uri = xmlStrdup(uri);
27181c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    *val = v;
27191c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                } else
27201c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if (local != NULL)
27211c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			xmlFree(local);
27221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
27231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2724b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NCNAME:
27251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
27261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
27271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME);
27281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (v != NULL) {
27291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.str = xmlStrdup(value);
27301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
27311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else {
27321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto error;
27331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2736b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_ID:
27371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
27381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
27391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                v = xmlSchemaNewValue(XML_SCHEMAS_ID);
27401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (v != NULL) {
27411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.str = xmlStrdup(value);
27421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
27431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else {
27441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto error;
27451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
27481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
27491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
27501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
27511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /*
27521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * NOTE: the IDness might have already be declared in the DTD
27531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 */
27541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (attr->atype != XML_ATTRIBUTE_ID) {
27551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlIDPtr res;
27561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *strip;
27571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
27581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    strip = xmlSchemaStrip(value);
27591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (strip != NULL) {
27601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        res = xmlAddID(NULL, node->doc, strip, attr);
27611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(strip);
27621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else
27631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        res = xmlAddID(NULL, node->doc, value, attr);
27641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (res == NULL) {
27651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 2;
27661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
27671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        attr->atype = XML_ATTRIBUTE_ID;
27681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
27691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2772b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_IDREF:
27731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
27741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
27756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		v = xmlSchemaNewValue(XML_SCHEMAS_IDREF);
27766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (v == NULL)
27776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    goto error;
27786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		v->value.str = xmlStrdup(value);
27796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*val = v;
27801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
27821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
27831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
27841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *strip;
27851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
27861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                strip = xmlSchemaStrip(value);
27871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (strip != NULL) {
27881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAddRef(NULL, node->doc, strip, attr);
27891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlFree(strip);
27901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else
27911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAddRef(NULL, node->doc, value, attr);
27921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_IDREF;
27931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2795b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_IDREFS:
27961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef,
27971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
27981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret < 0)
27991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 2;
28001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
28011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
28021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
28031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
28041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
2805249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard
28061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_IDREFS;
28071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
28081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
28091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_ENTITY:{
28101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *strip;
28111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateNCName(value, 1);
28131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((node == NULL) || (node->doc == NULL))
28141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 3;
28151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret == 0) {
28161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlEntityPtr ent;
28171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    strip = xmlSchemaStrip(value);
28191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (strip != NULL) {
28201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ent = xmlGetDocEntity(node->doc, strip);
28211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(strip);
28221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
28231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ent = xmlGetDocEntity(node->doc, value);
28241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
28251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((ent == NULL) ||
28261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        (ent->etype !=
28271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         XML_EXTERNAL_GENERAL_UNPARSED_ENTITY))
28281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 4;
28291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (val != NULL)) {
28311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    TODO;
28321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (node != NULL) &&
28341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    (node->type == XML_ATTRIBUTE_NODE)) {
28351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAttrPtr attr = (xmlAttrPtr) node;
2836a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard
28371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    attr->atype = XML_ATTRIBUTE_ENTITY;
28381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
28401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2841b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_ENTITIES:
28421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((node == NULL) || (node->doc == NULL))
28431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return3;
28441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef,
28451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
28461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret <= 0)
28471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 1;
28481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
28491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
28501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
28511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
28521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
28531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_ENTITIES;
28551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
28561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
28571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_NOTATION:{
28581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *uri = NULL;
28591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *local = NULL;
28601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateQName(value, 1);
28621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (node != NULL)) {
28631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *prefix;
28641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    local = xmlSplitQName2(value, &prefix);
28661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL) {
28671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlNsPtr ns;
28681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ns = xmlSearchNs(node->doc, node, prefix);
28701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (ns == NULL)
28711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            ret = 1;
28721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        else if (val != NULL)
28731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            uri = xmlStrdup(ns->href);
28741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
28751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((local != NULL) && ((val == NULL) || (ret != 0)))
28761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(local);
28771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL)
28781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(prefix);
28791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((node == NULL) || (node->doc == NULL))
28811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 3;
28821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret == 0) {
28831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = xmlValidateNotationUse(NULL, node->doc, value);
28841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (ret == 1)
28851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 0;
28861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else
28871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 1;
28881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (val != NULL)) {
28901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION);
28911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
28921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (local != NULL)
28931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.name = local;
28941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        else
28951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.name = xmlStrdup(value);
28961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (uri != NULL)
28971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.uri = uri;
28981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
29001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
29011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (local != NULL)
29021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            xmlFree(local);
29031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (uri != NULL)
29041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            xmlFree(uri);
29051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
29061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
29071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
29081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
2909560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard            }
2910f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard        case XML_SCHEMAS_ANYURI:{
291111c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                if (*value != 0) {
29124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlURIPtr uri;
2913933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre		    xmlChar *tmpval, *cur;
2914f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		    if (normOnTheFly) {
29154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			norm = xmlSchemaCollapseString(value);
29164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if (norm != NULL)
29174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    value = norm;
29184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
2919933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre		    tmpval = xmlStrdup(value);
2920933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre		    for (cur = tmpval; *cur; ++cur) {
2921933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre			if (*cur < 32 || *cur >= 127 || *cur == ' ' ||
2922933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre			    *cur == '<' || *cur == '>' || *cur == '"' ||
2923933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre			    *cur == '{' || *cur == '}' || *cur == '|' ||
2924933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre			    *cur == '\\' || *cur == '^' || *cur == '`' ||
2925933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre			    *cur == '\'')
2926933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre			    *cur = '_';
2927933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre		    }
2928933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre                    uri = xmlParseURI((const char *) tmpval);
2929933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre		    xmlFree(tmpval);
293011c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    if (uri == NULL)
293111c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                        goto return1;
293211c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    xmlFreeURI(uri);
293311c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                }
2934560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
29351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
293611c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_ANYURI);
293711c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    if (v == NULL)
293811c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                        goto error;
293911c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    v->value.str = xmlStrdup(value);
294011c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    *val = v;
29411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
29421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
29431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
29441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_HEXBINARY:{
29458dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik                const xmlChar *cur = value, *start;
29461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *base;
29471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int total, i = 0;
2948560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
2949f34a20e69dc675cd23d3eb558cad135ea280f472Daniel Veillard                if (cur == NULL)
29501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
2951560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
29524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
29534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
29544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
29558dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik		start = cur;
29561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                while (((*cur >= '0') && (*cur <= '9')) ||
29571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                       ((*cur >= 'A') && (*cur <= 'F')) ||
29581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                       ((*cur >= 'a') && (*cur <= 'f'))) {
29591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    i++;
29601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
29611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
29624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
29634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
2964560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
29651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
29661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
29671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((i % 2) != 0)
296870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard                    goto return1;
2969560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
29701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
29711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
29721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY);
29731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v == NULL)
29741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
29754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    /*
29764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    * Copy only the normalized piece.
29774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    * CRITICAL TODO: Check this.
29784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    */
29798dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik                    cur = xmlStrndup(start, i);
29801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (cur == NULL) {
2981d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard		        xmlSchemaTypeErrMemory(node, "allocating hexbin data");
29821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(v);
29831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
29841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
29851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
29861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total = i / 2;      /* number of octets */
298770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
29881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    base = (xmlChar *) cur;
29891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while (i-- > 0) {
29901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (*base >= 'a')
29911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            *base = *base - ('a' - 'A');
29921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        base++;
29931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
299470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
29951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.hex.str = (xmlChar *) cur;
29961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.hex.total = total;
29971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
29981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
29991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
30001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
30011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BASE64BINARY:{
30021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /* ISSUE:
3003f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard                 *
30041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Ignore all stray characters? (yes, currently)
30051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Worry about long lines? (no, currently)
3006f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard                 *
30071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * rfc2045.txt:
3008f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard                 *
30091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * "The encoded output stream must be represented in lines of
30101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * no more than 76 characters each.  All line breaks or other
30111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * characters not found in Table 1 must be ignored by decoding
30121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * software.  In base64 data, characters other than those in
30131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Table 1, line breaks, and other white space probably
30141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * indicate a transmission error, about which a warning
30151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * message or even a message rejection might be appropriate
30161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * under some circumstances." */
30171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
30181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *base;
30191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int total, i = 0, pad = 0;
30201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
30221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
30231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                for (; *cur; ++cur) {
30251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
30261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    decc = _xmlSchemaBase64Decode(*cur);
30281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc < 0) ;
30291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (decc < 64)
30301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        i++;
30311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else
30321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        break;
30331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
30341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                for (; *cur; ++cur) {
30351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
30361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    decc = _xmlSchemaBase64Decode(*cur);
30381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc < 0) ;
30391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (decc < 64)
30401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc == 64)
30421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        pad++;
30431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
30441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /* rfc2045.txt: "Special processing is performed if fewer than
30461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * 24 bits are available at the end of the data being encoded.
30471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * A full encoding quantum is always completed at the end of a
30481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * body.  When fewer than 24 input bits are available in an
30491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * input group, zero bits are added (on the right) to form an
30501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * integral number of 6-bit groups.  Padding at the end of the
30511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * data is performed using the "=" character.  Since all
30521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * base64 input is an integral number of octets, only the
30531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * following cases can arise: (1) the final quantum of
30541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * encoding input is an integral multiple of 24 bits; here,
30551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * the final unit of encoded output will be an integral
30561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * multiple ofindent: Standard input:701: Warning:old style
30571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		 * assignment ambiguity in "=*".  Assuming "= *" 4 characters
30581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		 * with no "=" padding, (2) the final
30591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * quantum of encoding input is exactly 8 bits; here, the
30601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * final unit of encoded output will be two characters
30611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * followed by two "=" padding characters, or (3) the final
30621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * quantum of encoding input is exactly 16 bits; here, the
30631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * final unit of encoded output will be three characters
30641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * followed by one "=" padding character." */
30651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                total = 3 * (i / 4);
30671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (pad == 0) {
30681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 0)
30691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (pad == 1) {
30711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
30721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 3)
30741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (decc = _xmlSchemaBase64Decode(*cur);
30761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         (decc < 0) || (decc > 63);
30771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         decc = _xmlSchemaBase64Decode(*cur))
30781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        --cur;
30791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 16bits in 24bits means 2 pad bits: nnnnnn nnmmmm mmmm00*/
30801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 00111100 -> 0x3c */
30811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc & ~0x3c)
30821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total += 2;
30841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (pad == 2) {
30851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
30861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 2)
30881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (decc = _xmlSchemaBase64Decode(*cur);
30901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         (decc < 0) || (decc > 63);
30911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         decc = _xmlSchemaBase64Decode(*cur))
30921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        --cur;
30931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 8bits in 12bits means 4 pad bits: nnnnnn nn0000 */
30941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 00110000 -> 0x30 */
30951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc & ~0x30)
30961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total += 1;
30981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else
30991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
31001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
31011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
31021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_BASE64BINARY);
31031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v == NULL)
31041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
31051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    base =
31061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        (xmlChar *) xmlMallocAtomic((i + pad + 1) *
31071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                                    sizeof(xmlChar));
31081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (base == NULL) {
3109d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard		        xmlSchemaTypeErrMemory(node, "allocating base64 data");
31101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(v);
31111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
31131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.base64.str = base;
31141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (cur = value; *cur; ++cur)
31151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (_xmlSchemaBase64Decode(*cur) >= 0) {
31161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            *base = *cur;
31171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            ++base;
31181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
31191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *base = 0;
31201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.base64.total = total;
31211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
31221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
31231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
312470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard            }
3125e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_INTEGER:
3126e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_PINTEGER:
3127e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_NPINTEGER:
3128e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_NINTEGER:
31291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_NNINTEGER:{
31301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
31311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
3132ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                int sign = 0;
31331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
31341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
31351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
31364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
31374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
31381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
31391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    sign = 1;
31401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
31411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (*cur == '+')
31421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
3143ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
3144bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard                if (ret < 0)
3145ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
31464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
31474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
3148ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (*cur != 0)
3149ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
315001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_NPINTEGER) {
31511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) &&
31521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ((hi != 0) || (mi != 0) || (lo != 0)))
31531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
315401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_PINTEGER) {
31551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (sign == 1)
31561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((hi == 0) && (mi == 0) && (lo == 0))
31581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
315901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_NINTEGER) {
31601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (sign == 0)
31611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((hi == 0) && (mi == 0) && (lo == 0))
31631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
316401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_NNINTEGER) {
31651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) &&
31661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ((hi != 0) || (mi != 0) || (lo != 0)))
31671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
31696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                if (val != NULL) {
317001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
31711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
3172c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			if (ret == 0)
3173c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    ret++;
31741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
31756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                        v->value.decimal.mi = mi;
31766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                        v->value.decimal.hi = hi;
31771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = sign;
31781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
3179ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                        v->value.decimal.total = ret;
31801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
31811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
31821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
31831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
31841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
3185e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_LONG:
3186e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_BYTE:
3187e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_SHORT:
31881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_INT:{
3189bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard                const xmlChar *cur = value;
31901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
31911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int sign = 0;
31921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
31931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
31941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
31951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
31961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    sign = 1;
31971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
31981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (*cur == '+')
31991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
3200ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
3201ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (ret < 0)
3202ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
3203ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (*cur != 0)
3204ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
320501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_LONG) {
32061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi >= 922) {
32071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (hi > 922)
32081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
32091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi >= 33720368) {
32101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (mi > 33720368)
32111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
32121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if ((sign == 0) && (lo > 54775807))
32131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
32141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if ((sign == 1) && (lo > 54775808))
32151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
32161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
32171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
321801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_INT) {
32191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi != 0)
32201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (mi >= 21) {
32221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi > 21)
32231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
32241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if ((sign == 0) && (lo > 47483647))
32251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
32261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if ((sign == 1) && (lo > 47483648))
32271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
32281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
322901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_SHORT) {
32301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
32311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) && (lo > 32768))
32331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) && (lo > 32767))
32351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
323601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_BYTE) {
32371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
32381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) && (lo > 128))
32401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) && (lo > 127))
32421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
32441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
324501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
32461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
32471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
32486c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                        v->value.decimal.mi = mi;
32496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                        v->value.decimal.hi = hi;
32501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = sign;
32511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
3252ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                        v->value.decimal.total = ret;
32531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
32541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
32551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
32561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
32571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
3258e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_UINT:
3259e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_ULONG:
3260e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_USHORT:
32611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_UBYTE:{
32621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
32631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
32641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
32651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
32661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
3267ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
3268ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (ret < 0)
3269ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
3270ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (*cur != 0)
3271ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
327201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_ULONG) {
32731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi >= 1844) {
32741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (hi > 1844)
32751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
32761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi >= 67440737) {
32771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (mi > 67440737)
32781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
32791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (lo > 9551615)
32801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
32811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
32821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
328301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_UINT) {
32841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi != 0)
32851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (mi >= 42) {
32871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi > 42)
32881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
32891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (lo > 94967295)
32901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
32911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
329201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_USHORT) {
32931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
32941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (lo > 65535)
32961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
329701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_UBYTE) {
32981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
32991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
33001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (lo > 255)
33011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
33021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
33031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
330401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
33051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
33061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
33071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.mi = mi;
33081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.hi = hi;
33091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = 0;
33101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
3311ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                        v->value.decimal.total = ret;
33121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
33131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
33141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
33151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
33161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
33174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
3318b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
33191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  done:
33201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
33211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
33221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (ret);
33231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return3:
33241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
33251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
33261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (3);
33271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return1:
33281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
33291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
33301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (1);
33311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return0:
33321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
33331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
33341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (0);
33351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  error:
33361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
33371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
33381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (-1);
3339b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
3340b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
3341b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
3342b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValPredefTypeNode:
3343b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @type: the predefined type
3344b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: the value to check
3345b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @val:  the return computed value
3346b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @node:  the node containing the value
3347b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
3348b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the predefined type.
3349b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * if true a value is computed and returned in @val.
3350b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
3351b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns 0 if this validates, a positive error code number otherwise
3352b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *         and -1 in case of internal or API error.
3353b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
3354b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardint
3355b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value,
3356b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	                   xmlSchemaValPtr *val, xmlNodePtr node) {
33574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return(xmlSchemaValAtomicType(type, value, val, node, 0,
33584efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 1, 0));
33594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
33604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
33614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
3362c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaValPredefTypeNodeNoNorm:
3363c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the predefined type
3364c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the value to check
3365c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val:  the return computed value
3366c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @node:  the node containing the value
3367c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
3368c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Check that a value conforms to the lexical space of the predefined type.
3369c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * if true a value is computed and returned in @val.
3370c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * This one does apply any normalization to the value.
3371c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
3372c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
3373c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *         and -1 in case of internal or API error.
3374c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */
3375c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardint
3376c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, const xmlChar *value,
3377c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard				 xmlSchemaValPtr *val, xmlNodePtr node) {
33784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return(xmlSchemaValAtomicType(type, value, val, node, 1,
33794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 0, 1));
3380c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
3381c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
3382c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/**
3383c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * xmlSchemaValidatePredefinedType:
3384c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @type: the predefined type
3385c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @value: the value to check
3386c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @val:  the return computed value
3387c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *
3388c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Check that a value conforms to the lexical space of the predefined type.
3389c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * if true a value is computed and returned in @val.
3390c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *
3391c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
3392c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *         and -1 in case of internal or API error.
3393c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard */
3394c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillardint
3395c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel VeillardxmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value,
3396c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard	                        xmlSchemaValPtr *val) {
3397c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard    return(xmlSchemaValPredefTypeNode(type, value, val, NULL));
3398c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard}
3399c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard
3400c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard/**
34014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareDecimals:
34024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x:  a first decimal value
34034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y:  a second decimal value
34044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
34054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 decimals
34064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
34074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error
34084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
34094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int
34104255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y)
34114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{
34124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValPtr swp;
3413273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    int order = 1, integx, integy, dlen;
3414273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    unsigned long hi, mi, lo;
34154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
3416273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    /*
3417273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * First test: If x is -ve and not zero
3418273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     */
3419f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    if ((x->value.decimal.sign) &&
3420e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	((x->value.decimal.lo != 0) ||
3421e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	 (x->value.decimal.mi != 0) ||
3422e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	 (x->value.decimal.hi != 0))) {
3423273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	/*
3424273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	 * Then if y is -ve and not zero reverse the compare
3425273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	 */
3426e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	if ((y->value.decimal.sign) &&
3427e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    ((y->value.decimal.lo != 0) ||
3428e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	     (y->value.decimal.mi != 0) ||
3429e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	     (y->value.decimal.hi != 0)))
343080b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    order = -1;
3431273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	/*
3432273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	 * Otherwise (y >= 0) we have the answer
3433273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	 */
343480b19092f24410a6b869abf519227686e8f207caDaniel Veillard	else
343580b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    return (-1);
3436273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    /*
3437273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * If x is not -ve and y is -ve we have the answer
3438273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     */
3439e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    } else if ((y->value.decimal.sign) &&
3440e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	       ((y->value.decimal.lo != 0) ||
3441e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		(y->value.decimal.mi != 0) ||
3442e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		(y->value.decimal.hi != 0))) {
34434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (1);
344480b19092f24410a6b869abf519227686e8f207caDaniel Veillard    }
3445273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    /*
3446273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * If it's not simply determined by a difference in sign,
3447273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * then we need to compare the actual values of the two nums.
3448273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * To do this, we start by looking at the integral parts.
3449273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * If the number of integral digits differ, then we have our
3450273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * answer.
3451273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     */
3452273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    integx = x->value.decimal.total - x->value.decimal.frac;
3453273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    integy = y->value.decimal.total - y->value.decimal.frac;
345472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    /*
345572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    * NOTE: We changed the "total" for values like "0.1"
345672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    *   (or "-0.1" or ".1") to be 1, which was 2 previously.
345772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    *   Therefore the special case, when such values are
345872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    *   compared with 0, needs to be handled separately;
345972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    *   otherwise a zero would be recognized incorrectly as
346072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    *   greater than those values. This has the nice side effect
346172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    *   that we gain an overall optimized comparison with zeroes.
346272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    * Note that a "0" has a "total" of 1 already.
346372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    */
346472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    if (integx == 1) {
346572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	if (x->value.decimal.lo == 0) {
346672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	    if (integy != 1)
346772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		return -order;
346872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	    else if (y->value.decimal.lo != 0)
346972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		return -order;
347072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	    else
347172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		return(0);
347272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	}
347372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    }
347472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    if (integy == 1) {
347572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	if (y->value.decimal.lo == 0) {
347672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	    if (integx != 1)
347772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		return order;
347872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	    else if (x->value.decimal.lo != 0)
347972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		return order;
348072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	    else
348172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		return(0);
348272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	}
348372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    }
348472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik
3485273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    if (integx > integy)
3486273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	return order;
3487273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    else if (integy > integx)
3488273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	return -order;
348972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik
3490273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    /*
3491273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * If the number of integral digits is the same for both numbers,
3492273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * then things get a little more complicated.  We need to "normalize"
3493273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * the numbers in order to properly compare them.  To do this, we
3494273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * look at the total length of each number (length => number of
3495273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * significant digits), and divide the "shorter" by 10 (decreasing
3496273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * the length) until they are of equal length.
3497273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     */
3498273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    dlen = x->value.decimal.total - y->value.decimal.total;
3499273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    if (dlen < 0) {	/* y has more digits than x */
3500273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	swp = x;
3501273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	hi = y->value.decimal.hi;
3502273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	mi = y->value.decimal.mi;
3503273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	lo = y->value.decimal.lo;
3504273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	dlen = -dlen;
3505273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	order = -order;
3506273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    } else {		/* x has more digits than y */
3507273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	swp = y;
3508273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	hi = x->value.decimal.hi;
3509273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	mi = x->value.decimal.mi;
3510273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	lo = x->value.decimal.lo;
3511273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    }
3512273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    while (dlen > 8) {	/* in effect, right shift by 10**8 */
3513273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	lo = mi;
3514273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	mi = hi;
3515273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	hi = 0;
3516273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	dlen -= 8;
35174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
3518273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    while (dlen > 0) {
3519273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	unsigned long rem1, rem2;
3520273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	rem1 = (hi % 10) * 100000000L;
3521273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	hi = hi / 10;
3522273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	rem2 = (mi % 10) * 100000000L;
3523273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	mi = (mi + rem1) / 10;
3524273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	lo = (lo + rem2) / 10;
3525273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	dlen--;
3526273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    }
3527273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    if (hi > swp->value.decimal.hi) {
3528273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	return order;
3529273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    } else if (hi == swp->value.decimal.hi) {
3530273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	if (mi > swp->value.decimal.mi) {
3531273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	    return order;
3532273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	} else if (mi == swp->value.decimal.mi) {
3533273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	    if (lo > swp->value.decimal.lo) {
3534273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		return order;
3535273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	    } else if (lo == swp->value.decimal.lo) {
3536273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		if (x->value.decimal.total == y->value.decimal.total) {
3537273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		    return 0;
3538273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		} else {
3539273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		    return order;
3540273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		}
3541273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	    }
3542273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	}
35434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
3544273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    return -order;
35454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
35464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
35474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
3548070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xmlSchemaCompareDurations:
3549070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @x:  a first duration value
3550070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @y:  a second duration value
3551070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
3552070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Compare 2 durations
3553070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
3554070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
3555070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * case of error
3556070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
3557070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
3558070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel VeillardxmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y)
3559070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard{
3560070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long carry, mon, day;
3561070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    double sec;
356280b19092f24410a6b869abf519227686e8f207caDaniel Veillard    int invert = 1;
356380b19092f24410a6b869abf519227686e8f207caDaniel Veillard    long xmon, xday, myear, minday, maxday;
3564070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    static const long dayRange [2][12] = {
3565070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        { 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, },
3566070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} };
3567070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3568070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((x == NULL) || (y == NULL))
35695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return -2;
3570070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3571070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* months */
3572070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    mon = x->value.dur.mon - y->value.dur.mon;
3573070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3574070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* seconds */
3575070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    sec = x->value.dur.sec - y->value.dur.sec;
3576bbcf1275fec28915b170db31fa9ea9bed0ea39a4Daniel Veillard    carry = (long)(sec / SECS_PER_DAY);
3577bbcf1275fec28915b170db31fa9ea9bed0ea39a4Daniel Veillard    sec -= ((double)carry) * SECS_PER_DAY;
3578070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3579070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* days */
3580070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    day = x->value.dur.day - y->value.dur.day + carry;
3581070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3582070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* easy test */
3583070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (mon == 0) {
3584070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (day == 0)
3585070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (sec == 0.0)
3586070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 0;
3587070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else if (sec < 0.0)
3588070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return -1;
3589070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else
3590070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 1;
3591070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else if (day < 0)
3592070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return -1;
3593070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else
3594070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return 1;
3595070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
3596070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3597070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (mon > 0) {
3598070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if ((day >= 0) && (sec >= 0.0))
3599070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return 1;
3600070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else {
3601070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            xmon = mon;
3602070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            xday = -day;
3603070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        }
3604070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    } else if ((day <= 0) && (sec <= 0.0)) {
3605070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        return -1;
3606070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    } else {
360780b19092f24410a6b869abf519227686e8f207caDaniel Veillard	invert = -1;
3608070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xmon = -mon;
3609070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xday = day;
3610070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
3611070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3612070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    myear = xmon / 12;
361380b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (myear == 0) {
361480b19092f24410a6b869abf519227686e8f207caDaniel Veillard	minday = 0;
361580b19092f24410a6b869abf519227686e8f207caDaniel Veillard	maxday = 0;
361680b19092f24410a6b869abf519227686e8f207caDaniel Veillard    } else {
361780b19092f24410a6b869abf519227686e8f207caDaniel Veillard	maxday = 366 * ((myear + 3) / 4) +
361880b19092f24410a6b869abf519227686e8f207caDaniel Veillard	         365 * ((myear - 1) % 4);
361980b19092f24410a6b869abf519227686e8f207caDaniel Veillard	minday = maxday - 1;
362080b19092f24410a6b869abf519227686e8f207caDaniel Veillard    }
362180b19092f24410a6b869abf519227686e8f207caDaniel Veillard
3622070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmon = xmon % 12;
3623070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    minday += dayRange[0][xmon];
3624070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    maxday += dayRange[1][xmon];
3625070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
362680b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if ((maxday == minday) && (maxday == xday))
362780b19092f24410a6b869abf519227686e8f207caDaniel Veillard	return(0); /* can this really happen ? */
3628070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (maxday < xday)
362980b19092f24410a6b869abf519227686e8f207caDaniel Veillard        return(-invert);
363080b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (minday > xday)
363180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        return(invert);
3632070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3633070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* indeterminate */
36345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return 2;
36355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
36365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
36375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/*
36385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * macros for adding date/times and durations
36395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
36405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT(a,b)                  (floor(((double)a/(double)b)))
36415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO(a,b)                     (a - FQUOTIENT(a,b) * b)
36425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT_RANGE(a,low,high)     (FQUOTIENT((a-low),(high-low)))
36435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO_RANGE(a,low,high)        ((MODULO((a-low),(high-low)))+low)
36445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
36455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
3646669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * xmlSchemaDupVal:
3647669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @v: the #xmlSchemaValPtr value to duplicate
3648669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard *
3649669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Makes a copy of @v. The calling program is responsible for freeing
3650669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the returned value.
3651669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard *
3652669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * returns a pointer to a duplicated #xmlSchemaValPtr or NULL if error.
3653669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard */
3654669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillardstatic xmlSchemaValPtr
3655669adfcd3af5dfda873b10119d44202a7450bb20Daniel VeillardxmlSchemaDupVal (xmlSchemaValPtr v)
3656669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard{
3657669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaValPtr ret = xmlSchemaNewValue(v->type);
3658669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    if (ret == NULL)
3659669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        return NULL;
3660f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
3661669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    memcpy(ret, v, sizeof(xmlSchemaVal));
36624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->next = NULL;
3663669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    return ret;
3664669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard}
3665669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard
3666669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard/**
3667285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * xmlSchemaCopyValue:
3668285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * @val:  the precomputed value to be copied
3669285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik *
3670285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Copies the precomputed value. This duplicates any string within.
3671285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik *
3672285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Returns the copy or NULL if a copy for a data-type is not implemented.
3673285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik */
3674285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaValPtr
3675285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaCopyValue(xmlSchemaValPtr val)
3676285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik{
36774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaValPtr ret = NULL, prev = NULL, cur;
3678285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik
3679285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    /*
3680285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    * Copy the string values.
3681285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    */
36824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    while (val != NULL) {
36834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	switch (val->type) {
36844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYTYPE:
36854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_IDREFS:
36864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ENTITIES:
36874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NMTOKENS:
36884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		xmlSchemaFreeValue(ret);
36894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		return (NULL);
36904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYSIMPLETYPE:
36914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_STRING:
36924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NORMSTRING:
36934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_TOKEN:
36944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_LANGUAGE:
36954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NAME:
36964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NCNAME:
36974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ID:
36984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_IDREF:
36994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ENTITY:
37004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NMTOKEN:
37014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYURI:
37024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
37034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.str != NULL)
37044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.str = xmlStrdup(BAD_CAST val->value.str);
37054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
3706f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    case XML_SCHEMAS_QNAME:
37074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NOTATION:
37084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
37094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.qname.name != NULL)
37104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.qname.name =
3711285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                    xmlStrdup(BAD_CAST val->value.qname.name);
37124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.qname.uri != NULL)
37134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.qname.uri =
3714285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                    xmlStrdup(BAD_CAST val->value.qname.uri);
37154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
37164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_HEXBINARY:
37174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
37184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.hex.str != NULL)
37194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.hex.str = xmlStrdup(BAD_CAST val->value.hex.str);
37204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
37214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_BASE64BINARY:
37224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
37234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.base64.str != NULL)
37244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.base64.str =
3725285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                    xmlStrdup(BAD_CAST val->value.base64.str);
37264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
37274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    default:
37284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
37294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
37304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	}
37314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	if (ret == NULL)
37324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    ret = cur;
37334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	else
37344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    prev->next = cur;
37354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	prev = cur;
37364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	val = val->next;
3737285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    }
37384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (ret);
3739285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik}
3740285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik
3741285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik/**
37425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateAdd:
37435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr
37445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dur: an #xmlSchemaValPtr of type #XS_DURATION
37455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
37465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compute a new date/time from @dt and @dur. This function assumes @dt
37475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH,
3748669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * or #XML_SCHEMAS_GYEAR. The returned #xmlSchemaVal is the same type as
3749669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt. The calling program is responsible for freeing the returned value.
37505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3751669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a pointer to a new #xmlSchemaVal or NULL if error.
37525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
37535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr
37545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur)
37555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
3756669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaValPtr ret, tmp;
37575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long carry, tempdays, temp;
37585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValDatePtr r, d;
37595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValDurationPtr u;
37605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((dt == NULL) || (dur == NULL))
37625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
37635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ret = xmlSchemaNewValue(dt->type);
37655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret == NULL)
37665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
37675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3768669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    /* make a copy so we don't alter the original value */
3769669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    tmp = xmlSchemaDupVal(dt);
3770669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    if (tmp == NULL) {
3771669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        xmlSchemaFreeValue(ret);
3772669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        return NULL;
3773669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    }
3774669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard
37755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r = &(ret->value.date);
3776669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    d = &(tmp->value.date);
37775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    u = &(dur->value.dur);
37785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalization */
37805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (d->mon == 0)
37815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        d->mon = 1;
37825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalize for time zone offset */
37845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    u->sec -= (d->tzo * 60);
37855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    d->tzo = 0;
37865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalization */
37885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (d->day == 0)
37895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        d->day = 1;
37905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* month */
37925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry  = d->mon + u->mon;
3793ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->mon = (unsigned int) MODULO_RANGE(carry, 1, 13);
3794ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT_RANGE(carry, 1, 13);
37955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* year (may be modified later) */
37975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->year = d->year + carry;
37985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (r->year == 0) {
37995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (d->year > 0)
38005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            r->year--;
38015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else
38025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            r->year++;
38035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
38045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* time zone */
38065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->tzo     = d->tzo;
38075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->tz_flag = d->tz_flag;
38085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* seconds */
38105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->sec = d->sec + u->sec;
3811ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT((long)r->sec, 60);
38125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (r->sec != 0.0) {
38135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        r->sec = MODULO(r->sec, 60.0);
38145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
38155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* minute */
38175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry += d->min;
3818ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->min = (unsigned int) MODULO(carry, 60);
3819ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT(carry, 60);
38205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* hours */
38225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry  += d->hour;
3823ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->hour = (unsigned int) MODULO(carry, 24);
3824ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry   = (long)FQUOTIENT(carry, 24);
38255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
38275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * days
38285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * Note we use tempdays because the temporary values may need more
38295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * than 5 bits
38305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
38315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) &&
38325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                  (d->day > MAX_DAYINMONTH(r->year, r->mon)))
38335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = MAX_DAYINMONTH(r->year, r->mon);
38345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (d->day < 1)
38355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = 1;
38365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else
38375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = d->day;
38385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    tempdays += u->day + carry;
38405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    while (1) {
38425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (tempdays < 1) {
38435e9576a492e4fb8c2d517ccd6056a139e801ec9fDaniel Veillard            long tmon = (long) MODULO_RANGE((int)r->mon-1, 1, 13);
38445e9576a492e4fb8c2d517ccd6056a139e801ec9fDaniel Veillard            long tyr  = r->year + (long)FQUOTIENT_RANGE((int)r->mon-1, 1, 13);
38455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (tyr == 0)
38465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                tyr--;
384714b5643947845df089376106517c4f7ba061e4b0Daniel Veillard	    /*
3848f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	     * Coverity detected an overrun in daysInMonth
384914b5643947845df089376106517c4f7ba061e4b0Daniel Veillard	     * of size 12 at position 12 with index variable "((r)->mon - 1)"
385014b5643947845df089376106517c4f7ba061e4b0Daniel Veillard	     */
385130cf439efcea9732d0ecd33b7955666ce264129bDavid Kilzer	    if (tmon < 1)
385230cf439efcea9732d0ecd33b7955666ce264129bDavid Kilzer	        tmon = 1;
385314b5643947845df089376106517c4f7ba061e4b0Daniel Veillard	    if (tmon > 12)
385414b5643947845df089376106517c4f7ba061e4b0Daniel Veillard	        tmon = 12;
38555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            tempdays += MAX_DAYINMONTH(tyr, tmon);
38565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            carry = -1;
38574ba5d3176938d3435ddc7347cdc904658e2999eePhilip Withnall        } else if (VALID_YEAR(r->year) && VALID_MONTH(r->mon) &&
38584ba5d3176938d3435ddc7347cdc904658e2999eePhilip Withnall                   tempdays > (long) MAX_DAYINMONTH(r->year, r->mon)) {
38595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon);
38605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            carry = 1;
38615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        } else
38625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
38635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        temp = r->mon + carry;
3865ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard        r->mon = (unsigned int) MODULO_RANGE(temp, 1, 13);
3866ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard        r->year = r->year + (unsigned int) FQUOTIENT_RANGE(temp, 1, 13);
38675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (r->year == 0) {
38685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (temp < 1)
38695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                r->year--;
38705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else
38715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                r->year++;
38725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	}
38735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
3874f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
38755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->day = tempdays;
38765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
38785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * adjust the date/time type to the date values
38795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
38805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret->type != XML_SCHEMAS_DATETIME) {
38815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if ((r->hour) || (r->min) || (r->sec))
38825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ret->type = XML_SCHEMAS_DATETIME;
38835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (ret->type != XML_SCHEMAS_DATE) {
38845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if ((r->mon != 1) && (r->day != 1))
38855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                ret->type = XML_SCHEMAS_DATE;
38865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1))
38875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                ret->type = XML_SCHEMAS_GYEARMONTH;
38885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
38895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
38905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3891669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaFreeValue(tmp);
38925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
38945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
38955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
38975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaDateNormalize:
3898669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt: an #xmlSchemaValPtr of a date/time type value.
3899669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @offset: number of seconds to adjust @dt by.
39005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3901669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Normalize @dt to GMT time. The @offset parameter is subtracted from
3902669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the return value is a time-zone offset is present on @dt.
39035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3904669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a normalized copy of @dt or NULL if error.
39055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
39065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr
39075a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset)
39085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
39095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValPtr dur, ret;
39105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dt == NULL)
39125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
39135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (((dt->type != XML_SCHEMAS_TIME) &&
3915c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik         (dt->type != XML_SCHEMAS_DATETIME) &&
3916c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	 (dt->type != XML_SCHEMAS_DATE)) || (dt->value.date.tzo == 0))
39175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return xmlSchemaDupVal(dt);
39185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION);
39205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dur == NULL)
39215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
39225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    dur->value.date.sec -= offset;
39245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ret = _xmlSchemaDateAdd(dt, dur);
39265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret == NULL)
39275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
39285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaFreeValue(dur);
39305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* ret->value.date.tzo = 0; */
39325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
39335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
39345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
39365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateCastYMToDays:
39375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr
39385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3939f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Convert mon and year of @dt to total number of days. Take the
39405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * number of years since (or before) 1 AD and add the number of leap
39415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years. This is a function  because negative
39425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years must be handled a little differently and there is no zero year.
39435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
39445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns number of days.
39455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
39465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic long
39475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt)
39485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
39495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long ret;
395049e8963c640865343327c67d4755a1af705717d3Daniel Veillard    int mon;
39515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
395249e8963c640865343327c67d4755a1af705717d3Daniel Veillard    mon = dt->value.date.mon;
395349e8963c640865343327c67d4755a1af705717d3Daniel Veillard    if (mon <= 0) mon = 1; /* normalization */
395449e8963c640865343327c67d4755a1af705717d3Daniel Veillard
395549e8963c640865343327c67d4755a1af705717d3Daniel Veillard    if (dt->value.date.year <= 0)
39565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ret = (dt->value.date.year * 365) +
39575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+
39585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard               ((dt->value.date.year+1)/400)) +
395949e8963c640865343327c67d4755a1af705717d3Daniel Veillard              DAY_IN_YEAR(0, mon, dt->value.date.year);
39605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else
39615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ret = ((dt->value.date.year-1) * 365) +
39625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+
39635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard               ((dt->value.date.year-1)/400)) +
396449e8963c640865343327c67d4755a1af705717d3Daniel Veillard              DAY_IN_YEAR(0, mon, dt->value.date.year);
39655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
39675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
39685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
39705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * TIME_TO_NUMBER:
39715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt:  an #xmlSchemaValPtr
39725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
39735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Calculates the number of seconds in the time portion of @dt.
39745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
39755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns seconds.
39765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
39775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define TIME_TO_NUMBER(dt)                              \
39785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ((double)((dt->value.date.hour * SECS_PER_HOUR) +   \
3979b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard              (dt->value.date.min * SECS_PER_MIN) +	\
3980b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard              (dt->value.date.tzo * SECS_PER_MIN)) +	\
3981b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard               dt->value.date.sec)
39825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
39845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaCompareDates:
39855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @x:  a first date/time value
39865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @y:  a second date/time value
39875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
39885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compare 2 date/times
39895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
39905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
39915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error
39925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
39935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic int
39945a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y)
39955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
39965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    unsigned char xmask, ymask, xor_mask, and_mask;
39975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValPtr p1, p2, q1, q2;
39985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long p1d, p2d, q1d, q2d;
39995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((x == NULL) || (y == NULL))
40015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return -2;
40025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (x->value.date.tz_flag) {
40045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (!y->value.date.tz_flag) {
40065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            p1 = xmlSchemaDateNormalize(x, 0);
40075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
40085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            /* normalize y + 14:00 */
40095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR));
40105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
4012fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            if (p1d < q1d) {
4013fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
4014fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
40155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return -1;
4016fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    } else if (p1d == q1d) {
40175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                double sec;
40185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
4020fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard                if (sec < 0.0) {
4021fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		    xmlSchemaFreeValue(p1);
4022fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		    xmlSchemaFreeValue(q1);
40235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    return -1;
4024fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		} else {
40254aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    int ret = 0;
40265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    /* normalize y - 14:00 */
40275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR));
40285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day;
40295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    if (p1d > q2d)
40304aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 1;
40315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    else if (p1d == q2d) {
40325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2);
40335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        if (sec > 0.0)
40344aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                            ret = 1;
40355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        else
40364aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                            ret = 2; /* indeterminate */
40375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    }
40384aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(p1);
40394aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(q1);
40404aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(q2);
40414aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    if (ret != 0)
40424aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		        return(ret);
40435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                }
4044fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            } else {
4045fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
4046fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
4047fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    }
40485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
40495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    } else if (y->value.date.tz_flag) {
40505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1 = xmlSchemaDateNormalize(y, 0);
40515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
40525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        /* normalize x - 14:00 */
40545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR));
40555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
40565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
4057fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard        if (p1d < q1d) {
4058fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(p1);
4059fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(q1);
40605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
4061fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else if (p1d == q1d) {
40625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            double sec;
40635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
4065fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            if (sec < 0.0) {
4066fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
4067fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
40685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return -1;
4069fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    } else {
40704aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	        int ret = 0;
40715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                /* normalize x + 14:00 */
40725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR));
40735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day;
40745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40756560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                if (p2d > q1d) {
40764aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                    ret = 1;
40776560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		} else if (p2d == q1d) {
40785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1);
40795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    if (sec > 0.0)
40804aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 1;
40815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    else
40824aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 2; /* indeterminate */
40835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                }
40846560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(p1);
40856560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(q1);
40866560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(p2);
40874aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		if (ret != 0)
40884aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    return(ret);
40895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            }
4090fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else {
4091fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(p1);
4092fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(q1);
40935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
40945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
40955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
40975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * if the same type then calculate the difference
40985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
40995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (x->type == y->type) {
41004aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard        int ret = 0;
41015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1 = xmlSchemaDateNormalize(y, 0);
41025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
41035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1 = xmlSchemaDateNormalize(x, 0);
41055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
41065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
4107fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard        if (p1d < q1d) {
41084aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard            ret = -1;
4109fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else if (p1d > q1d) {
41104aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard            ret = 1;
4111fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else {
41125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            double sec;
41135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
41155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (sec < 0.0)
41164aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                ret = -1;
41175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else if (sec > 0.0)
41184aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                ret = 1;
4119f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
41205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
41214aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	xmlSchemaFreeValue(p1);
41224aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	xmlSchemaFreeValue(q1);
41234aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard        return(ret);
41245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
41255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    switch (x->type) {
41275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
41285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0xf;
41295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
41315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x7;
41325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
41345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x1;
41355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
41375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x2;
41385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
41405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x3;
41415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
41435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x3;
41445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
41465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x6;
41475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
41495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x8;
41505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        default:
41525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0;
41535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
41555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    switch (y->type) {
41575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
41585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0xf;
41595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
41615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x7;
41625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
41645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x1;
41655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
41675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x2;
41685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
41705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x3;
41715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
41735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x3;
41745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
41765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x6;
41775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
41795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x8;
41805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        default:
41825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0;
41835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
41855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xor_mask = xmask ^ ymask;           /* mark type differences */
41875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    and_mask = xmask & ymask;           /* mark field specification */
41885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* year */
41905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 1)
41915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
41925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 1) {
41935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.year < y->value.date.year)
41945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
41955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.year > y->value.date.year)
41965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
41975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
41985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* month */
42005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 2)
42015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
42025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 2) {
42035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.mon < y->value.date.mon)
42045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
42055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.mon > y->value.date.mon)
42065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
42075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
42085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
42095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* day */
42105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 4)
42115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
42125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 4) {
42135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.day < y->value.date.day)
42145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
42155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.day > y->value.date.day)
42165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
42175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
42185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
42195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* time */
42205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 8)
42215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
42225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 8) {
42235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.hour < y->value.date.hour)
42245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
42255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.hour > y->value.date.hour)
42265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
42275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.min < y->value.date.min)
42285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
42295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.min > y->value.date.min)
42305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
42315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.sec < y->value.date.sec)
42325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
42335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.sec > y->value.date.sec)
42345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
42355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
42365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
4237070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
4238070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
4239070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
4240070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
42416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveReplaceStrings:
4242478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @x:  a first string value
4243478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @y:  a second string value
42446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @invert: inverts the result if x < y or x > y.
42456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
42466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
42476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is
42486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "replace". I.e. @x could
42496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString".
42506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
42516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
42526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
42536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
42546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
4255478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaComparePreserveReplaceStrings(const xmlChar *x,
4256478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				       const xmlChar *y,
42576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				       int invert)
42586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
42596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
4260f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
4261478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4262478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (IS_WSP_REPLACE_CH(*y)) {
4263478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (! IS_WSP_SPACE_CH(*x)) {
4264478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*x - 0x20) < 0) {
42656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
42666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
42676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
42686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
42696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
42706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
42716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
42726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
42736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
42746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
4275f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    }
42766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
4277478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x - *y;
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	    if (tmp > 0) {
42856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
42866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
42876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
42886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
42896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
42906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
4291478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	x++;
4292478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	y++;
42936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4294478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0) {
42956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (invert)
42966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(-1);
42976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	else
42986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(1);
42996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4300478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0) {
43016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (invert)
43026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(1);
43036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	else
43046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(-1);
43056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
43066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
43076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
43086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
43096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
43106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings:
43116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
43126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
43136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
43146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
43156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is
43166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could
43176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString".
43186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
43196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
43206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
43216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
43226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
4323478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaComparePreserveCollapseStrings(const xmlChar *x,
4324478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				        const xmlChar *y,
43256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik					int invert)
43266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
43276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
43286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
4329f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    /*
43306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    * Skip leading blank chars of the collapsed string.
43316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    */
4332478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while IS_WSP_BLANK_CH(*y)
4333478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	y++;
43346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
4335478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4336478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if IS_WSP_BLANK_CH(*y) {
4337478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (! IS_WSP_SPACE_CH(*x)) {
43386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		/*
4339478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* The yv character would have been replaced to 0x20.
43406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*/
4341478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*x - 0x20) < 0) {
43426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
43436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
43446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
43456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
43466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
43476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
43486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
43496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
43506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
43516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
43526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4353478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    x++;
4354478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    y++;
43556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    /*
43566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    * Skip contiguous blank chars of the collapsed string.
43576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    */
4358478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    while IS_WSP_BLANK_CH(*y)
4359478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		y++;
43606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
4361478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x++ - *y++;
43626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0) {
43636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
43646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
43656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
43666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
43676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
43686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0) {
43696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
43706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
43716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
43726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
43736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
43746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
43756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4376478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0) {
43776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 if (invert)
43786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(-1);
43796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 else
43806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(1);
43816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4382478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0) {
43836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	/*
43846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	* Skip trailing blank chars of the collapsed string.
43856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	*/
4386478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*y)
4387478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    y++;
4388478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (*y != 0) {
43896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (invert)
43906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(1);
43916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    else
43926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(-1);
43936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
43946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
43956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
43966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
43976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
43986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
43996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings:
44006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
44016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
44026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
44036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
44046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is
44056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could
44066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString".
44076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
44086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
44096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
44106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
44116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
4412478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareReplaceCollapseStrings(const xmlChar *x,
4413478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				       const xmlChar *y,
44146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				       int invert)
44156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
44166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
44176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
4418f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    /*
44196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    * Skip leading blank chars of the collapsed string.
44206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    */
4421478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while IS_WSP_BLANK_CH(*y)
4422478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	y++;
4423f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
4424478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4425478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if IS_WSP_BLANK_CH(*y) {
4426478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (! IS_WSP_BLANK_CH(*x)) {
44276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		/*
4428478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* The yv character would have been replaced to 0x20.
44296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*/
4430478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*x - 0x20) < 0) {
44316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
44326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
44336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
44346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
44356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
44366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
44376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
44386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
44396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
44406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
44416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4442478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    x++;
4443f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    y++;
4444f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    /*
44456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    * Skip contiguous blank chars of the collapsed string.
44466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    */
4447478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    while IS_WSP_BLANK_CH(*y)
4448478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		y++;
44496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
4450478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if IS_WSP_BLANK_CH(*x) {
44516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		/*
4452478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* The xv character would have been replaced to 0x20.
44536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*/
4454478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((0x20 - *y) < 0) {
44556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
44566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
44576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
44586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
44596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
44606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
44616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
44626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
44636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
44646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
44656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4466478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x++ - *y++;
44676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0)
44686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(-1);
44696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0)
44706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(1);
44716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
44726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4473478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0) {
44746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 if (invert)
44756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(-1);
44766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 else
44776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(1);
4478f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    }
4479478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0) {
44806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	/*
44816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	* Skip trailing blank chars of the collapsed string.
44826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	*/
4483478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*y)
4484478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    y++;
4485478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (*y != 0) {
44866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (invert)
44876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(1);
44886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    else
44896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(-1);
44906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
44916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
44926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
44936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
44946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
44956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
44966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
44976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareReplacedStrings:
44986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
44996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
45006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
45016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
45026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
45036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
45046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
45056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
45066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
4507478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareReplacedStrings(const xmlChar *x,
4508478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				const xmlChar *y)
45096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
45106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
4511f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
4512478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4513478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if IS_WSP_BLANK_CH(*y) {
4514478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (! IS_WSP_BLANK_CH(*x)) {
4515478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*x - 0x20) < 0)
4516f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		    return(-1);
45176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
45186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
4519f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    }
45206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
4521478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if IS_WSP_BLANK_CH(*x) {
4522478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((0x20 - *y) < 0)
4523f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		    return(-1);
45246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
45256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
45266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4527478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x - *y;
45286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0)
4529f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		return(-1);
45306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0)
4531f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		return(1);
45326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
4533478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	x++;
4534478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	y++;
45356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4536478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0)
45376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        return(1);
4538478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0)
45396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        return(-1);
45406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
45416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
45426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
45436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
4544c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaCompareNormStrings:
4545c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @x:  a first string value
4546c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @y:  a second string value
4547c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
4548c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Compare 2 string for their normalized values.
4549c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
4550c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
4551c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * case of error
4552c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */
4553c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int
4554478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareNormStrings(const xmlChar *x,
4555478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    const xmlChar *y) {
4556c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    int tmp;
4557f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
4558478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while (IS_BLANK_CH(*x)) x++;
4559478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while (IS_BLANK_CH(*y)) y++;
4560478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4561478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (IS_BLANK_CH(*x)) {
4562478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (!IS_BLANK_CH(*y)) {
4563478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		tmp = *x - *y;
4564c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(tmp);
4565c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    }
4566478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    while (IS_BLANK_CH(*x)) x++;
4567478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    while (IS_BLANK_CH(*y)) y++;
4568c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	} else {
4569478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x++ - *y++;
4570c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (tmp < 0)
4571c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(-1);
4572c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (tmp > 0)
4573c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(1);
4574c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	}
4575c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
4576478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0) {
4577478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	while (IS_BLANK_CH(*x)) x++;
4578478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (*x != 0)
4579c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    return(1);
4580c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
4581478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0) {
4582478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	while (IS_BLANK_CH(*y)) y++;
4583478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (*y != 0)
4584c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    return(-1);
4585c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
4586c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    return(0);
4587c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard}
4588c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
4589c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/**
4590b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCompareFloats:
4591b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @x:  a first float or double value
4592b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @y:  a second float or double value
4593b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
4594b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Compare 2 values
4595b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
4596b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
4597b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * case of error
4598b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
4599b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int
4600b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) {
4601b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    double d1, d2;
4602b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4603b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if ((x == NULL) || (y == NULL))
4604b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
4605b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4606b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
4607b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * Cast everything to doubles.
4608b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
4609b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (x->type == XML_SCHEMAS_DOUBLE)
4610b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d1 = x->value.d;
4611b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else if (x->type == XML_SCHEMAS_FLOAT)
4612b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d1 = x->value.f;
4613b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else
4614b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
4615b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4616b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (y->type == XML_SCHEMAS_DOUBLE)
4617b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d2 = y->value.d;
4618b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else if (y->type == XML_SCHEMAS_FLOAT)
4619b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d2 = y->value.f;
4620b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else
4621b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
4622b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4623b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
4624b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * Check for special cases.
4625b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
4626b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (xmlXPathIsNaN(d1)) {
4627b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (xmlXPathIsNaN(d2))
4628b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
4629b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(1);
4630b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
4631b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (xmlXPathIsNaN(d2))
4632b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-1);
4633b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == xmlXPathPINF) {
4634b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (d2 == xmlXPathPINF)
4635b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
4636b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(1);
4637b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
4638b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d2 == xmlXPathPINF)
4639b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(-1);
4640b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == xmlXPathNINF) {
4641b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (d2 == xmlXPathNINF)
4642b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
4643b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(-1);
4644b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
4645b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d2 == xmlXPathNINF)
4646b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(1);
4647b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4648b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
4649b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * basic tests, the last one we should have equality, but
4650b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * portability is more important than speed and handling
4651b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * NaN or Inf in a portable way is always a challenge, so ...
4652b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
4653b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 < d2)
4654b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-1);
4655b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 > d2)
4656b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(1);
4657b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == d2)
4658b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(0);
4659b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return(2);
4660b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
4661b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4662b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
46634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareValues:
46644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x:  a first value
46656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xvalue: the first value as a string (optional)
46666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xwtsp: the whitespace type
46674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y:  a second value
46686c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xvalue: the second value as a string (optional)
46696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @ywtsp: the whitespace type
46704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
46714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 values
46724255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
46734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, 3 if not
46744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * comparable and -2 in case of error
46754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
46766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
46776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaCompareValuesInternal(xmlSchemaValType xtype,
46786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValPtr x,
46796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *xvalue,
46806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType xws,
46816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValType ytype,
46826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			       xmlSchemaValPtr y,
46836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *yvalue,
4684478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType yws)
4685478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{
46866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    switch (xtype) {
468780b19092f24410a6b869abf519227686e8f207caDaniel Veillard	case XML_SCHEMAS_UNKNOWN:
46882f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	case XML_SCHEMAS_ANYTYPE:
468980b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    return(-2);
469080b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_INTEGER:
469180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NPINTEGER:
469280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NINTEGER:
469380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NNINTEGER:
469480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_PINTEGER:
469580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_INT:
469680b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_UINT:
469780b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_LONG:
469880b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ULONG:
469980b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_SHORT:
470080b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_USHORT:
470180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_BYTE:
470280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_UBYTE:
47034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMAS_DECIMAL:
47046c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
47056c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
47066c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ytype == xtype)
470780b19092f24410a6b869abf519227686e8f207caDaniel Veillard		return(xmlSchemaCompareDecimals(x, y));
47086c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((ytype == XML_SCHEMAS_DECIMAL) ||
47096c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_INTEGER) ||
47106c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_NPINTEGER) ||
47116c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_NINTEGER) ||
47126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_NNINTEGER) ||
47136c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_PINTEGER) ||
47146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_INT) ||
47156c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_UINT) ||
47166c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_LONG) ||
47176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_ULONG) ||
47186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_SHORT) ||
47196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_USHORT) ||
47206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_BYTE) ||
47216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_UBYTE))
47224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(xmlSchemaCompareDecimals(x, y));
47235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    return(-2);
4724070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        case XML_SCHEMAS_DURATION:
47256c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
47266c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
4727478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (ytype == XML_SCHEMAS_DURATION)
4728070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return(xmlSchemaCompareDurations(x, y));
47295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return(-2);
47305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
47315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
47325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
47335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
47345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
47355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
47365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
47375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
47386c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
47396c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
47406c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if ((ytype == XML_SCHEMAS_DATETIME)  ||
47416c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_TIME)      ||
47426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GDAY)      ||
47436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GMONTH)    ||
47446c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GMONTHDAY) ||
47456c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GYEAR)     ||
47466c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_DATE)      ||
47476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GYEARMONTH))
47485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return (xmlSchemaCompareDates(x, y));
47495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return (-2);
4750f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	/*
47512ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	* Note that we will support comparison of string types against
47522ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	* anySimpleType as well.
47532ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	*/
47542ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	case XML_SCHEMAS_ANYSIMPLETYPE:
47556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_STRING:
4756f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard        case XML_SCHEMAS_NORMSTRING:
475780b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_TOKEN:
475880b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_LANGUAGE:
475980b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NMTOKEN:
476080b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NAME:
476180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NCNAME:
476280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ID:
476380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_IDREF:
476480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ENTITY:
476580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ANYURI:
47666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	{
47676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    const xmlChar *xv, *yv;
47686c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
47696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (x == NULL)
47706c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		xv = xvalue;
47716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    else
47726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		xv = x->value.str;
47736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (y == NULL)
47746c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		yv = yvalue;
47756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    else
47766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		yv = y->value.str;
47776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    /*
47786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    * TODO: Compare those against QName.
47796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    */
4780f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    if (ytype == XML_SCHEMAS_QNAME) {
47816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		TODO
47826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		if (y == NULL)
4783f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		    return(-2);
47846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return (-2);
47856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
47866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if ((ytype == XML_SCHEMAS_ANYSIMPLETYPE) ||
47876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_STRING) ||
47886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_NORMSTRING) ||
47896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_TOKEN) ||
47906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_LANGUAGE) ||
47916c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_NMTOKEN) ||
47926c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_NAME) ||
47936c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_NCNAME) ||
47946c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_ID) ||
47956c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_IDREF) ||
47966c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_ENTITY) ||
47976c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_ANYURI)) {
47986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
47996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (xws == XML_SCHEMA_WHITESPACE_PRESERVE) {
48006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
48016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) {
48026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			/* TODO: What about x < y or x > y. */
48036c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			if (xmlStrEqual(xv, yv))
48046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			    return (0);
4805f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard			else
48066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			    return (2);
48076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    } else if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
48086c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaComparePreserveReplaceStrings(xv, yv, 0));
48096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
48106c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaComparePreserveCollapseStrings(xv, yv, 0));
48116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
48126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else if (xws == XML_SCHEMA_WHITESPACE_REPLACE) {
48136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
48146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE)
48156c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaComparePreserveReplaceStrings(yv, xv, 1));
48166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
48176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaCompareReplacedStrings(xv, yv));
48186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
48196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaCompareReplaceCollapseStrings(xv, yv, 0));
48206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
48216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else if (xws == XML_SCHEMA_WHITESPACE_COLLAPSE) {
48226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
48236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE)
48246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaComparePreserveCollapseStrings(yv, xv, 1));
48256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
48266c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaCompareReplaceCollapseStrings(yv, xv, 1));
48276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
48286c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaCompareNormStrings(xv, yv));
48296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else
48306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return (-2);
4831f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
48326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4833c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard            return (-2);
48346c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	}
4835e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_QNAME:
4836c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_NOTATION:
48376c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
48386c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
4839c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik            if ((ytype == XML_SCHEMAS_QNAME) ||
4840c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		(ytype == XML_SCHEMAS_NOTATION)) {
4841e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) &&
4842e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    (xmlStrEqual(x->value.qname.uri, y->value.qname.uri)))
4843e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    return(0);
4844e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		return(2);
4845e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    }
4846e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (-2);
4847c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_FLOAT:
4848c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_DOUBLE:
48496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
48506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
48516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if ((ytype == XML_SCHEMAS_FLOAT) ||
48526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_DOUBLE))
4853b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard                return (xmlSchemaCompareFloats(x, y));
4854b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard            return (-2);
4855c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_BOOLEAN:
48566c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
48576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
48586c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if (ytype == XML_SCHEMAS_BOOLEAN) {
4859b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (x->value.b == y->value.b)
4860b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    return(0);
4861b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (x->value.b == 0)
4862b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    return(-1);
4863b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		return(1);
4864b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
4865b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return (-2);
4866560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard        case XML_SCHEMAS_HEXBINARY:
48676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
48686c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
48696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if (ytype == XML_SCHEMAS_HEXBINARY) {
487070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	        if (x->value.hex.total == y->value.hex.total) {
487170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    int ret = xmlStrcmp(x->value.hex.str, y->value.hex.str);
487270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    if (ret > 0)
487370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard			return(1);
487470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    else if (ret == 0)
487570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard			return(0);
487670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		}
487770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		else if (x->value.hex.total > y->value.hex.total)
487870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    return(1);
487970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
488070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		return(-1);
488170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard            }
4882560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard            return (-2);
48831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BASE64BINARY:
48846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
48856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
48866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if (ytype == XML_SCHEMAS_BASE64BINARY) {
48871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (x->value.base64.total == y->value.base64.total) {
48881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int ret = xmlStrcmp(x->value.base64.str,
48891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		                        y->value.base64.str);
48901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (ret > 0)
48911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        return(1);
48921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (ret == 0)
48931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        return(0);
4894d369b1387e592791049a41eb4cc16046fe52e985Daniel Veillard		    else
4895d369b1387e592791049a41eb4cc16046fe52e985Daniel Veillard		        return(-1);
48961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
48971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else if (x->value.base64.total > y->value.base64.total)
48981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    return(1);
48991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else
49001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    return(-1);
49011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
4902f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard            return (-2);
4903c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_IDREFS:
4904c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ENTITIES:
4905c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NMTOKENS:
4906c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    TODO
4907c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    break;
49084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
49095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return -2;
49104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
49114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
49124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
49136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValues:
49146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first value
49156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second value
49166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
49176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values
49186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
49196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
49206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
49216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
49226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint
49236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) {
49246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    xmlSchemaWhitespaceValueType xws, yws;
49256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
49265e094143e423c01739ac9221f371846fd290be4eDaniel Veillard    if ((x == NULL) || (y == NULL))
49275e094143e423c01739ac9221f371846fd290be4eDaniel Veillard        return(-2);
49286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (x->type == XML_SCHEMAS_STRING)
49296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	xws = XML_SCHEMA_WHITESPACE_PRESERVE;
49306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else if (x->type == XML_SCHEMAS_NORMSTRING)
49316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        xws = XML_SCHEMA_WHITESPACE_REPLACE;
49326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else
49336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        xws = XML_SCHEMA_WHITESPACE_COLLAPSE;
49346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
49356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (y->type == XML_SCHEMAS_STRING)
49366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	yws = XML_SCHEMA_WHITESPACE_PRESERVE;
4937e79226ccdb377cb61fdee69aaf366bb9c5838de9Gaurav    else if (y->type == XML_SCHEMAS_NORMSTRING)
49386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        yws = XML_SCHEMA_WHITESPACE_REPLACE;
49396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else
49406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        yws = XML_SCHEMA_WHITESPACE_COLLAPSE;
49416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
49426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type,
49436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	y, NULL, yws));
49446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
49456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
49466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
49476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValuesWhtsp:
49486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first value
49496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xws: the whitespace value of x
49506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second value
49516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @yws: the whitespace value of y
49526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
49536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values
49546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
49556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
49566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
49576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
49586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint
49596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValuesWhtsp(xmlSchemaValPtr x,
49606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaWhitespaceValueType xws,
49616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaValPtr y,
49626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaWhitespaceValueType yws)
49636c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{
49649dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik    if ((x == NULL) || (y == NULL))
49659dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik	return(-2);
49666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type,
49676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	y, NULL, yws));
49686c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik}
49696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
49706c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/**
49716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaCompareValuesWhtspExt:
49726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @x:  a first value
49736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xws: the whitespace value of x
49746c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @y:  a second value
49756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @yws: the whitespace value of y
49766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
49776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Compare 2 values
49786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
49796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
49806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * case of error
49816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */
49826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikstatic int
49836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaCompareValuesWhtspExt(xmlSchemaValType xtype,
49846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValPtr x,
49856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *xvalue,
49866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType xws,
49876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValType ytype,
49886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValPtr y,
49896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *yvalue,
49906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType yws)
49916c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{
49926c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    return(xmlSchemaCompareValuesInternal(xtype, x, xvalue, xws, ytype, y,
49936c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	yvalue, yws));
49946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
49956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
49966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
4997c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaNormLen:
4998c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @value:  a string
4999c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
5000c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Computes the UTF8 length of the normalized value of the string
5001c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
5002c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns the length or -1 in case of error.
5003c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */
5004c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int
5005c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaNormLen(const xmlChar *value) {
5006c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    const xmlChar *utf;
5007c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    int ret = 0;
5008c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
5009c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    if (value == NULL)
5010c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	return(-1);
5011c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    utf = value;
501276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while (IS_BLANK_CH(*utf)) utf++;
5013c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    while (*utf != 0) {
5014c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	if (utf[0] & 0x80) {
5015c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if ((utf[1] & 0xc0) != 0x80)
5016c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(-1);
5017c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if ((utf[0] & 0xe0) == 0xe0) {
5018c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		if ((utf[2] & 0xc0) != 0x80)
5019c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    return(-1);
5020c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		if ((utf[0] & 0xf0) == 0xf0) {
5021c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80)
5022c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard			return(-1);
5023c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    utf += 4;
5024c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		} else {
5025c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    utf += 3;
5026c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		}
5027c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    } else {
5028c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		utf += 2;
5029c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    }
503076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	} else if (IS_BLANK_CH(*utf)) {
503176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*utf)) utf++;
5032c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (*utf == 0)
5033c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		break;
5034c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	} else {
5035c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    utf++;
5036c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	}
5037c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	ret++;
5038c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
5039c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    return(ret);
5040c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard}
5041c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
50426927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard/**
50436927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaGetFacetValueAsULong:
50446927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * @facet: an schemas type facet
50456927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard *
50466927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Extract the value of a facet
50476927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard *
50486927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Returns the value as a long
50496927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard */
5050c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardunsigned long
5051c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaGetFacetValueAsULong(xmlSchemaFacetPtr facet)
5052c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{
5053c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    /*
5054c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    * TODO: Check if this is a decimal.
5055c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    */
5056094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack    if (facet == NULL)
5057094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack        return 0;
5058c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    return ((unsigned long) facet->val->value.decimal.lo);
5059c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
5060c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
5061c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/**
506201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateListSimpleTypeFacet:
506301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facet:  the facet to check
506401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @value:  the lexical repr of the value to validate
506501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @actualLen:  the number of list items
506601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @expectedLen: the resulting expected number of list items
506701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
506801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Checks the value of a list simple type against a facet.
506901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
507001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 0 if the value is valid, a positive error code
507101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * number otherwise and -1 in case of an internal error.
507201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
507301fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint
507401fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaValidateListSimpleTypeFacet(xmlSchemaFacetPtr facet,
507501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     const xmlChar *value,
507601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     unsigned long actualLen,
507701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     unsigned long *expectedLen)
507801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
5079ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard    if (facet == NULL)
5080ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard        return(-1);
508101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    /*
508201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * TODO: Check if this will work with large numbers.
508301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * (compare value.decimal.mi and value.decimal.hi as well?).
508401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
508501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
508601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen != facet->val->value.decimal.lo) {
5087478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (expectedLen != NULL)
5088c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
508901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_LENGTH_VALID);
5090f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	}
509101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
509201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen < facet->val->value.decimal.lo) {
5093478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (expectedLen != NULL)
5094c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
509501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_MINLENGTH_VALID);
509601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
509701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MAXLENGTH) {
509801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen > facet->val->value.decimal.lo) {
5099478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (expectedLen != NULL)
5100c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
510101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_MAXLENGTH_VALID);
510201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
510301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else
5104f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	/*
5105f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	* NOTE: That we can pass NULL as xmlSchemaValPtr to
510601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	* xmlSchemaValidateFacet, since the remaining facet types
5107f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	* are: XML_SCHEMA_FACET_PATTERN, XML_SCHEMA_FACET_ENUMERATION.
510801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	*/
5109f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	return(xmlSchemaValidateFacet(NULL, facet, value, NULL));
511001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    return (0);
511101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
511201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
511301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
51146927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaValidateLengthFacet:
5115c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type:  the built-in type
5116c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @facet:  the facet to check
5117c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value:  the lexical repr. of the value to be validated
5118c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val:  the precomputed value
5119478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value
5120c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @length: the actual length of the value
5121c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
5122f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength"
5123c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * facet; sets @length to the computed length of @value.
5124c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
5125c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if the value is valid, a positive error code
5126c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * otherwise and -1 in case of an internal or API error.
5127c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */
5128478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikstatic int
5129478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacetInternal(xmlSchemaFacetPtr facet,
5130aae48e64dfbf2b46b157a4c1857e30645116388fNico Weber				     xmlSchemaValType valType,
5131478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				     const xmlChar *value,
5132aae48e64dfbf2b46b157a4c1857e30645116388fNico Weber				     xmlSchemaValPtr val,
5133478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				     unsigned long *length,
5134f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard				     xmlSchemaWhitespaceValueType ws)
5135c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{
5136c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    unsigned int len = 0;
5137c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
5138478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if ((length == NULL) || (facet == NULL))
5139ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard        return (-1);
5140c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    *length = 0;
5141c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((facet->type != XML_SCHEMA_FACET_LENGTH) &&
5142c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->type != XML_SCHEMA_FACET_MAXLENGTH) &&
5143c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->type != XML_SCHEMA_FACET_MINLENGTH))
5144c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	return (-1);
5145f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
5146478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    /*
5147478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    * TODO: length, maxLength and minLength must be of type
5148478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    * nonNegativeInteger only. Check if decimal is used somehow.
5149478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    */
5150c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((facet->val == NULL) ||
5151c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	((facet->val->type != XML_SCHEMAS_DECIMAL) &&
5152c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
5153c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->val->value.decimal.frac != 0)) {
5154c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	return(-1);
5155c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
5156c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY))
5157c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	len = val->value.hex.total;
5158c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY))
5159c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	len = val->value.base64.total;
5160c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    else {
5161478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	switch (valType) {
5162478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    case XML_SCHEMAS_STRING:
5163c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NORMSTRING:
5164478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) {
5165478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    /*
5166478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * This is to ensure API compatibility with the old
5167478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * xmlSchemaValidateLengthFacet(). Anyway, this was and
5168478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * is not the correct handling.
5169478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * TODO: Get rid of this case somehow.
5170478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    */
5171478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    if (valType == XML_SCHEMAS_STRING)
5172478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			len = xmlUTF8Strlen(value);
5173478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    else
5174478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			len = xmlSchemaNormLen(value);
5175478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		} else if (value != NULL) {
5176478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
5177478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			len = xmlSchemaNormLen(value);
5178478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    else
5179f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		    /*
5180478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * Should be OK for "preserve" as well.
5181478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    */
5182478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    len = xmlUTF8Strlen(value);
5183478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		}
5184478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		break;
5185478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    case XML_SCHEMAS_IDREF:
5186c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_TOKEN:
5187c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_LANGUAGE:
5188c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NMTOKEN:
5189c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NAME:
5190c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NCNAME:
5191f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    case XML_SCHEMAS_ID:
5192bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik		/*
5193bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik		* FIXME: What exactly to do with anyURI?
5194478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*/
5195c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_ANYURI:
5196c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		if (value != NULL)
5197478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    len = xmlSchemaNormLen(value);
5198c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		break;
5199bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik	    case XML_SCHEMAS_QNAME:
5200f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    case XML_SCHEMAS_NOTATION:
5201f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		/*
52024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		* For QName and NOTATION, those facets are
52034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		* deprecated and should be ignored.
5204f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		*/
5205bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik		return (0);
5206c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    default:
5207c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		TODO
5208c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	}
5209c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
5210c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    *length = (unsigned long) len;
5211478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    /*
5212478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    * TODO: Return the whole expected value, i.e. "lo", "mi" and "hi".
5213478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    */
5214c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
5215c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len != facet->val->value.decimal.lo)
5216c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_LENGTH_VALID);
5217c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
5218c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len < facet->val->value.decimal.lo)
5219c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_MINLENGTH_VALID);
5220c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    } else {
5221c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len > facet->val->value.decimal.lo)
5222c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXLENGTH_VALID);
5223c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
5224f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
5225c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    return (0);
5226c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
5227c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
5228c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/**
5229478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateLengthFacet:
5230478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @type:  the built-in type
5231478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @facet:  the facet to check
5232478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @value:  the lexical repr. of the value to be validated
5233478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @val:  the precomputed value
5234478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @length: the actual length of the value
5235478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *
5236f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength"
5237478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * facet; sets @length to the computed length of @value.
5238478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *
5239478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Returns 0 if the value is valid, a positive error code
5240478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * otherwise and -1 in case of an internal or API error.
5241478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */
5242478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikint
5243f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel VeillardxmlSchemaValidateLengthFacet(xmlSchemaTypePtr type,
5244478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			     xmlSchemaFacetPtr facet,
5245478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			     const xmlChar *value,
5246478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			     xmlSchemaValPtr val,
5247f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard			     unsigned long *length)
5248478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{
5249cc5e2330ef2432493afce6566d3651195366d822Daniel Veillard    if (type == NULL)
5250cc5e2330ef2432493afce6566d3651195366d822Daniel Veillard        return(-1);
5251478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    return (xmlSchemaValidateLengthFacetInternal(facet,
5252478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	type->builtInType, value, val, length,
5253478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	XML_SCHEMA_WHITESPACE_UNKNOWN));
5254478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik}
5255478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik
5256478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik/**
5257f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * xmlSchemaValidateLengthFacetWhtsp:
5258478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @facet:  the facet to check
5259478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @valType:  the built-in type
5260478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @value:  the lexical repr. of the value to be validated
5261478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @val:  the precomputed value
5262478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value
5263478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @length: the actual length of the value
5264478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *
5265f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength"
5266478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * facet; sets @length to the computed length of @value.
5267478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *
5268478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Returns 0 if the value is valid, a positive error code
5269478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * otherwise and -1 in case of an internal or API error.
5270478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */
5271478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikint
5272478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacetWhtsp(xmlSchemaFacetPtr facet,
5273478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  xmlSchemaValType valType,
5274478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  const xmlChar *value,
5275478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  xmlSchemaValPtr val,
5276478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  unsigned long *length,
5277478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  xmlSchemaWhitespaceValueType ws)
5278478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{
5279478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    return (xmlSchemaValidateLengthFacetInternal(facet, valType, value, val,
5280478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	length, ws));
5281478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik}
5282478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik
5283478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik/**
52846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetInternal:
52854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @facet:  the facet to check
5286478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @fws: the whitespace type of the facet's value
5287478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @valType: the built-in type of the value
52884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value:  the lexical repr of the value to validate
52894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val:  the precomputed value
5290478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value
52914255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
52924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Check a value against a facet condition
52934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
52944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if the element is schemas valid, a positive error code
52954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *     number otherwise and -1 in case of internal or API error.
52964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
52976c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikstatic int
52986c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaValidateFacetInternal(xmlSchemaFacetPtr facet,
52996c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType fws,
5300f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard			       xmlSchemaValType valType,
53016c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *value,
5302478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			       xmlSchemaValPtr val,
53036c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType ws)
53044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{
53054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    int ret;
53064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
53076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    if (facet == NULL)
53086c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	return(-1);
53096c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
53104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    switch (facet->type) {
53114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMA_FACET_PATTERN:
5312f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    /*
53136c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    * NOTE that for patterns, the @value needs to be the normalized
53146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    * value, *not* the lexical initial value or the canonical value.
53156c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    */
53166c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (value == NULL)
53176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-1);
53184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    ret = xmlRegexpExec(facet->regexp, value);
53194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == 1)
53204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(0);
53216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == 0)
532201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return(XML_SCHEMAV_CVC_PATTERN_VALID);
53234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    return(ret);
53244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMA_FACET_MAXEXCLUSIVE:
53254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
53266c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == -2)
53274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(-1);
53284255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == -1)
53294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(0);
533001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID);
5331070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MAXINCLUSIVE:
5332070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
53336c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == -2)
5334070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
5335070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((ret == -1) || (ret == 0))
5336070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
533701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID);
5338070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MINEXCLUSIVE:
5339070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
53406c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == -2)
5341070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
5342070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret == 1)
5343070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
534401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID);
5345070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MININCLUSIVE:
5346070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
53476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == -2)
5348070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
5349070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((ret == 1) || (ret == 0))
5350070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
535101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MININCLUSIVE_VALID);
53528651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard	case XML_SCHEMA_FACET_WHITESPACE:
53538bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    /* TODO whitespaces */
535401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    /*
535501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * NOTE: Whitespace should be handled to normalize
535601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * the value to be validated against a the facets;
535701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * not to normalize the value in-between.
535801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    */
53598651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard	    return(0);
53608bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case  XML_SCHEMA_FACET_ENUMERATION:
5361478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) {
5362478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		/*
5363478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* This is to ensure API compatibility with the old
5364478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* xmlSchemaValidateFacet().
5365478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* TODO: Get rid of this case.
5366478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*/
53676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		if ((facet->value != NULL) &&
53686c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    (xmlStrEqual(facet->value, value)))
53696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    return(0);
53706c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    } else {
53716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		ret = xmlSchemaCompareValuesWhtspExt(facet->val->type,
53726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    facet->val, facet->value, fws, valType, val,
53736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    value, ws);
53746c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		if (ret == -2)
53756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    return(-1);
53766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		if (ret == 0)
53776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    return(0);
53786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    }
537901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_ENUMERATION_VALID);
53808bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case XML_SCHEMA_FACET_LENGTH:
5381aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    /*
5382aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    * SPEC (1.3) "if {primitive type definition} is QName or NOTATION,
5383aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    * then any {value} is facet-valid."
5384aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    */
5385aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    if ((valType == XML_SCHEMAS_QNAME) ||
5386aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		(valType == XML_SCHEMAS_NOTATION))
5387aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		return (0);
5388aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    /* No break on purpose. */
5389e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard	case XML_SCHEMA_FACET_MAXLENGTH:
53908bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case XML_SCHEMA_FACET_MINLENGTH: {
53918bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    unsigned int len = 0;
5392e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard
53934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if ((valType == XML_SCHEMAS_QNAME) ||
53944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		(valType == XML_SCHEMAS_NOTATION))
53954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		return (0);
5396478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    /*
5397478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    * TODO: length, maxLength and minLength must be of type
5398478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    * nonNegativeInteger only. Check if decimal is used somehow.
5399478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    */
54008bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    if ((facet->val == NULL) ||
5401e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		((facet->val->type != XML_SCHEMAS_DECIMAL) &&
5402e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
54038bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		(facet->val->value.decimal.frac != 0)) {
54048bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		return(-1);
54058bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    }
5406560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY))
540770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		len = val->value.hex.total;
54081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	    else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY))
54091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		len = val->value.base64.total;
54101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	    else {
54116c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		switch (valType) {
5412478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    case XML_SCHEMAS_STRING:
5413f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		    case XML_SCHEMAS_NORMSTRING:
5414478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) {
5415478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    /*
5416478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    * This is to ensure API compatibility with the old
5417478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    * xmlSchemaValidateFacet(). Anyway, this was and
5418478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    * is not the correct handling.
5419478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    * TODO: Get rid of this case somehow.
5420478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    */
5421478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    if (valType == XML_SCHEMAS_STRING)
5422478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				len = xmlUTF8Strlen(value);
5423478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    else
5424478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				len = xmlSchemaNormLen(value);
5425478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			} else if (value != NULL) {
5426478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
5427478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				len = xmlSchemaNormLen(value);
5428478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    else
5429f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard				/*
5430478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				* Should be OK for "preserve" as well.
5431478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				*/
5432478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				len = xmlUTF8Strlen(value);
5433478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			}
5434478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			break;
5435f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		    case XML_SCHEMAS_IDREF:
5436560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_TOKEN:
5437560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_LANGUAGE:
5438560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NMTOKEN:
5439560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NAME:
5440560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NCNAME:
5441560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_ID:
544201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    case XML_SCHEMAS_ANYURI:
5443478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			if (value != NULL)
5444f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard			    len = xmlSchemaNormLen(value);
5445f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard			break;
5446560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    default:
5447560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		        TODO
5448f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		}
54498bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    }
54508bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
5451e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len != facet->val->value.decimal.lo)
545201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_LENGTH_VALID);
54538bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
5454e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len < facet->val->value.decimal.lo)
545501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_MINLENGTH_VALID);
54568bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    } else {
5457e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len > facet->val->value.decimal.lo)
545801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_MAXLENGTH_VALID);
5459e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard	    }
54608bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    break;
54618bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	}
5462560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	case XML_SCHEMA_FACET_TOTALDIGITS:
5463560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	case XML_SCHEMA_FACET_FRACTIONDIGITS:
5464560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
5465560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((facet->val == NULL) ||
546669dea3a0c01e8a952b1d2f07ab0a3aa450f0cdfeKasimier T. Buchcik		((facet->val->type != XML_SCHEMAS_PINTEGER) &&
5467560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
5468560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		(facet->val->value.decimal.frac != 0)) {
5469560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		return(-1);
5470560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
5471560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((val == NULL) ||
5472560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		((val->type != XML_SCHEMAS_DECIMAL) &&
5473560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_INTEGER) &&
5474560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NPINTEGER) &&
5475560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NINTEGER) &&
5476560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NNINTEGER) &&
5477560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_PINTEGER) &&
5478560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_INT) &&
5479560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_UINT) &&
5480560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_LONG) &&
5481560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_ULONG) &&
5482560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_SHORT) &&
5483560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_USHORT) &&
5484560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_BYTE) &&
5485560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_UBYTE))) {
5486560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		return(-1);
5487560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
5488560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) {
5489560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	        if (val->value.decimal.total > facet->val->value.decimal.lo)
549001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	            return(XML_SCHEMAV_CVC_TOTALDIGITS_VALID);
5491560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
5492560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) {
5493560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	        if (val->value.decimal.frac > facet->val->value.decimal.lo)
549401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID);
5495560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
5496560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    break;
54974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	default:
54984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    TODO
54994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
55004255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return(0);
5501b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
55024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
55034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
55046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
55056c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacet:
55066c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @base:  the base type
55076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @facet:  the facet to check
55086c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @value:  the lexical repr of the value to validate
55096c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @val:  the precomputed value
55106c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
55116c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Check a value against a facet condition
55126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
55136c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns 0 if the element is schemas valid, a positive error code
55146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *     number otherwise and -1 in case of internal or API error.
55156c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */
55166c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikint
55179dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. BuchcikxmlSchemaValidateFacet(xmlSchemaTypePtr base,
55186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	               xmlSchemaFacetPtr facet,
55196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	               const xmlChar *value,
55206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		       xmlSchemaValPtr val)
55216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{
55226c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    /*
55236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    * This tries to ensure API compatibility regarding the old
55246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    * xmlSchemaValidateFacet() and the new xmlSchemaValidateFacetInternal() and
55256c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    * xmlSchemaValidateFacetWhtsp().
55266c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    */
55279dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik    if (val != NULL)
55286c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	return(xmlSchemaValidateFacetInternal(facet,
55299dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik	    XML_SCHEMA_WHITESPACE_UNKNOWN, val->type, value, val,
55306c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    XML_SCHEMA_WHITESPACE_UNKNOWN));
55319dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik    else if (base != NULL)
55326c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	return(xmlSchemaValidateFacetInternal(facet,
55339dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik	    XML_SCHEMA_WHITESPACE_UNKNOWN, base->builtInType, value, val,
5534478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    XML_SCHEMA_WHITESPACE_UNKNOWN));
55359dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik    return(-1);
55366c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik}
55376c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
55386c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/**
55396c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetWhtsp:
55406c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @facet:  the facet to check
55416c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @fws: the whitespace type of the facet's value
55426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @valType: the built-in type of the value
55436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @value:  the lexical (or normalized for pattern) repr of the value to validate
55446c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @val:  the precomputed value
55456c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @ws: the whitespace type of the value
55466c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
55476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Check a value against a facet condition. This takes value normalization
55486c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * according to the specified whitespace types into account.
55496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Note that @value needs to be the *normalized* value if the facet
55506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * is of type "pattern".
55516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
55526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns 0 if the element is schemas valid, a positive error code
55536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *     number otherwise and -1 in case of internal or API error.
55546c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */
55556c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikint
55566c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaValidateFacetWhtsp(xmlSchemaFacetPtr facet,
55576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaWhitespaceValueType fws,
5558f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard			    xmlSchemaValType valType,
55596c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    const xmlChar *value,
5560478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    xmlSchemaValPtr val,
55616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaWhitespaceValueType ws)
55626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{
55636c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik     return(xmlSchemaValidateFacetInternal(facet, fws, valType,
5564478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	 value, val, ws));
55656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik}
55666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
5567c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#if 0
5568c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifndef DBL_DIG
5569c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define DBL_DIG 16
5570c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif
5571c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifndef DBL_EPSILON
5572c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define DBL_EPSILON 1E-9
5573c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif
5574c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5575c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define INTEGER_DIGITS DBL_DIG
5576c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define FRACTION_DIGITS (DBL_DIG + 1)
5577c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define EXPONENT_DIGITS (3 + 2)
5578c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5579c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik/**
5580c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * xmlXPathFormatNumber:
5581c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @number:     number to format
5582c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @buffer:     output buffer
5583c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @buffersize: size of output buffer
5584c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
5585c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Convert the number into a string representation.
5586c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */
5587c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcikstatic void
5588c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. BuchcikxmlSchemaFormatFloat(double number, char buffer[], int buffersize)
5589c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik{
5590c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    switch (xmlXPathIsInf(number)) {
5591c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    case 1:
5592c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	if (buffersize > (int)sizeof("INF"))
5593c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    snprintf(buffer, buffersize, "INF");
5594c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	break;
5595c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    case -1:
5596c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	if (buffersize > (int)sizeof("-INF"))
5597c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    snprintf(buffer, buffersize, "-INF");
5598c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	break;
5599c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    default:
5600c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	if (xmlXPathIsNaN(number)) {
5601c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (buffersize > (int)sizeof("NaN"))
5602c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf(buffer, buffersize, "NaN");
5603c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	} else if (number == 0) {
5604c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    snprintf(buffer, buffersize, "0.0E0");
5605c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	} else {
5606c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /* 3 is sign, decimal point, and terminating zero */
5607c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    char work[DBL_DIG + EXPONENT_DIGITS + 3];
5608c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    int integer_place, fraction_place;
5609c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    char *ptr;
5610c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    char *after_fraction;
5611c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    double absolute_value;
5612c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    int size;
5613c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5614c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    absolute_value = fabs(number);
5615c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5616c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /*
5617c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	     * Result is in work, and after_fraction points
5618c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	     * just past the fractional part.
5619f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	     * Use scientific notation
5620c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    */
5621c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    integer_place = DBL_DIG + EXPONENT_DIGITS + 1;
5622c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    fraction_place = DBL_DIG - 1;
5623c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    snprintf(work, sizeof(work),"%*.*e",
5624c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		integer_place, fraction_place, number);
5625f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    after_fraction = strchr(work + DBL_DIG, 'e');
5626c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /* Remove fractional trailing zeroes */
5627c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    ptr = after_fraction;
5628c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    while (*(--ptr) == '0')
5629c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		;
5630c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (*ptr != '.')
5631c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	        ptr++;
5632c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    while ((*ptr++ = *after_fraction++) != 0);
5633c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5634c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /* Finally copy result back to caller */
5635c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    size = strlen(work) + 1;
5636c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (size > buffersize) {
5637c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		work[buffersize - 1] = 0;
5638c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		size = buffersize;
5639c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5640c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    memmove(buffer, work, size);
5641c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	}
5642c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	break;
5643c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    }
5644c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik}
5645c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif
5646c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
56476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/**
56486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaGetCanonValue:
56496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @val: the precomputed value
56506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @retValue: the returned value
56516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
56527a7cad6ed40dff815fd26416192bfbae1b44923fJan Pokorný * Get the canonical lexical representation of the value.
5653c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * The caller has to FREE the returned retValue.
5654c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
5655478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * WARNING: Some value types are not supported yet, resulting
5656478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * in a @retValue of "???".
5657f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard *
5658c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: XML Schema 1.0 does not define canonical representations
5659c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * for: duration, gYearMonth, gYear, gMonthDay, gMonth, gDay,
5660c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * anyURI, QName, NOTATION. This will be fixed in XML Schema 1.1.
5661c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
56626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
5663c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Returns 0 if the value could be built, 1 if the value type is
5664c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * not supported yet and -1 in case of API errors.
56656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
56666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint
5667b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel VeillardxmlSchemaGetCanonValue(xmlSchemaValPtr val, const xmlChar **retValue)
56686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
5669b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard    if ((retValue == NULL) || (val == NULL))
56706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return (-1);
56716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    *retValue = NULL;
56726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    switch (val->type) {
5673478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	case XML_SCHEMAS_STRING:
5674478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (val->value.str == NULL)
5675478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
5676478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    else
5677f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		*retValue =
5678478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    BAD_CAST xmlStrdup((const xmlChar *) val->value.str);
5679478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    break;
56806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NORMSTRING:
5681478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (val->value.str == NULL)
5682478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
5683478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    else {
5684478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = xmlSchemaWhiteSpaceReplace(
5685478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    (const xmlChar *) val->value.str);
5686478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*retValue) == NULL)
5687478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    *retValue = BAD_CAST xmlStrdup(
5688478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			(const xmlChar *) val->value.str);
5689478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    }
5690478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    break;
56916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_TOKEN:
56926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_LANGUAGE:
56936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NMTOKEN:
5694f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_NAME:
56956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NCNAME:
56966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_ID:
56976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_IDREF:
56986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_ENTITY:
5699c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_NOTATION: /* Unclear */
5700c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_ANYURI:   /* Unclear */
57016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (val->value.str == NULL)
5702478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		return (-1);
5703f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    *retValue =
5704aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		BAD_CAST xmlSchemaCollapseString(BAD_CAST val->value.str);
5705aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    if (*retValue == NULL)
5706f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		*retValue =
5707aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		    BAD_CAST xmlStrdup((const xmlChar *) val->value.str);
5708478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    break;
5709478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	case XML_SCHEMAS_QNAME:
5710c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /* TODO: Unclear in XML Schema 1.0. */
5711478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (val->value.qname.uri == NULL) {
5712478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.qname.name);
5713478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		return (0);
5714478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    } else {
5715478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "{");
5716478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue),
5717478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    BAD_CAST val->value.qname.uri);
5718478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue),
5719478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    BAD_CAST "}");
5720478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue),
5721478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    BAD_CAST val->value.qname.uri);
5722478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    }
5723478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    break;
5724c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_DECIMAL:
5725c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /*
5726c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * TODO: Lookout for a more simple implementation.
5727c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    */
5728f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    if ((val->value.decimal.total == 1) &&
5729c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		(val->value.decimal.lo == 0)) {
5730c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlStrdup(BAD_CAST "0.0");
5731c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    } else {
5732c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		xmlSchemaValDecimal dec = val->value.decimal;
5733c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		int bufsize;
5734c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char *buf = NULL, *offs;
5735c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5736c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* Add room for the decimal point as well. */
5737c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		bufsize = dec.total + 2;
5738c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.sign)
5739c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    bufsize++;
5740c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* Add room for leading/trailing zero. */
5741c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if ((dec.frac == 0) || (dec.frac == dec.total))
5742c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    bufsize++;
5743c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		buf = xmlMalloc(bufsize);
574426ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard		if (buf == NULL)
574526ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard		    return(-1);
5746c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		offs = buf;
5747c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.sign)
5748c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs++ = '-';
5749c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.frac == dec.total) {
5750c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs++ = '0';
5751c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs++ = '.';
5752c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5753c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.hi != 0)
5754c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(offs, bufsize - (offs - buf),
5755c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%lu%lu%lu", dec.hi, dec.mi, dec.lo);
5756c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else if (dec.mi != 0)
5757c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(offs, bufsize - (offs - buf),
5758c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%lu%lu", dec.mi, dec.lo);
5759c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else
5760c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(offs, bufsize - (offs - buf),
5761c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%lu", dec.lo);
5762f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
5763c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.frac != 0) {
5764c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (dec.frac != dec.total) {
5765c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			int diff = dec.total - dec.frac;
5766c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			/*
5767c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			* Insert the decimal point.
5768c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			*/
5769c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			memmove(offs + diff + 1, offs + diff, dec.frac +1);
5770c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			offs[diff] = '.';
5771c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    } else {
5772c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			unsigned int i = 0;
5773c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			/*
5774c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			* Insert missing zeroes behind the decimal point.
5775f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard			*/
5776c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			while (*(offs + i) != 0)
5777c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    i++;
5778c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			if (i < dec.total) {
5779c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    memmove(offs + (dec.total - i), offs, i +1);
5780c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    memset(offs, '0', dec.total - i);
5781c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			}
5782c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    }
5783c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5784c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    /*
5785c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * Append decimal point and zero.
5786c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    */
5787c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    offs = buf + bufsize - 1;
5788c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs-- = 0;
5789c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs-- = '0';
5790c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs-- = '.';
5791c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5792c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST buf;
5793c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5794c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5795c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_INTEGER:
5796c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_PINTEGER:
5797c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_NPINTEGER:
5798c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_NINTEGER:
5799c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_NNINTEGER:
5800c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_LONG:
5801c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_BYTE:
5802c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_SHORT:
5803c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_INT:
5804c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_UINT:
5805c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_ULONG:
5806c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_USHORT:
5807c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_UBYTE:
5808c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if ((val->value.decimal.total == 1) &&
5809c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		(val->value.decimal.lo == 0))
5810c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlStrdup(BAD_CAST "0");
5811c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else {
5812c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		xmlSchemaValDecimal dec = val->value.decimal;
5813c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		int bufsize = dec.total + 1;
5814c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5815c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* Add room for the decimal point as well. */
5816c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.sign)
5817c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    bufsize++;
5818c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlMalloc(bufsize);
581926ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard		if (*retValue == NULL)
582026ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard		    return(-1);
5821c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.hi != 0) {
5822c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (dec.sign)
5823c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize,
5824c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    "-%lu%lu%lu", dec.hi, dec.mi, dec.lo);
5825c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    else
5826c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize,
5827c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    "%lu%lu%lu", dec.hi, dec.mi, dec.lo);
5828c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else if (dec.mi != 0) {
5829c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (dec.sign)
5830c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize,
5831c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    "-%lu%lu", dec.mi, dec.lo);
5832c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    else
5833c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize,
5834c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    "%lu%lu", dec.mi, dec.lo);
5835c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5836c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (dec.sign)
5837c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize, "-%lu", dec.lo);
5838c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    else
5839c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize, "%lu", dec.lo);
5840c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5841c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5842c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5843c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_BOOLEAN:
5844c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (val->value.b)
5845c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "true");
5846c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else
5847c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "false");
5848c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5849c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_DURATION: {
5850c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[100];
5851c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		unsigned long year;
5852c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		unsigned long mon, day, hour = 0, min = 0;
5853c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		double sec = 0, left;
5854c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5855c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5856c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/*
5857c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* TODO: This results in a normalized output of the value
5858c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* - which is NOT conformant to the spec -
5859c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* since the exact values of each property are not
5860c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* recoverable. Think about extending the structure to
5861c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* provide a field for every property.
5862c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*/
5863c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		year = (unsigned long) FQUOTIENT(labs(val->value.dur.mon), 12);
5864c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		mon = labs(val->value.dur.mon) - 12 * year;
5865c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5866c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		day = (unsigned long) FQUOTIENT(fabs(val->value.dur.sec), 86400);
5867c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		left = fabs(val->value.dur.sec) - day * 86400;
5868c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (left > 0) {
5869c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    hour = (unsigned long) FQUOTIENT(left, 3600);
5870c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    left = left - (hour * 3600);
5871c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (left > 0) {
5872c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			min = (unsigned long) FQUOTIENT(left, 60);
5873c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			sec = left - (min * 60);
5874c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    }
5875c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5876c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if ((val->value.dur.mon < 0) || (val->value.dur.sec < 0))
5877c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 100, "P%luY%luM%luDT%luH%luM%.14gS",
5878c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			year, mon, day, hour, min, sec);
5879c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else
5880c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 100, "-P%luY%luM%luDT%luH%luM%.14gS",
5881c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			year, mon, day, hour, min, sec);
5882c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5883c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5884c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5885c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_GYEAR: {
5886c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[30];
5887c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5888c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5889c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf(buf, 30, "%04ld", val->value.date.year);
5890c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5891c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5892c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5893c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_GMONTH: {
5894c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5895c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
589626ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard		*retValue = xmlMalloc(6);
589726ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard		if (*retValue == NULL)
589826ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard		    return(-1);
5899c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf((char *) *retValue, 6, "--%02u",
5900c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    val->value.date.mon);
5901c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5902c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5903c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_GDAY: {
5904c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5905c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5906c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlMalloc(6);
590726ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard		if (*retValue == NULL)
590826ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard		    return(-1);
5909c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf((char *) *retValue, 6, "---%02u",
5910c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    val->value.date.day);
5911c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5912f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    break;
5913c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_GMONTHDAY: {
5914c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5915c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5916c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlMalloc(8);
591726ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard		if (*retValue == NULL)
591826ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard		    return(-1);
5919c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf((char *) *retValue, 8, "--%02u-%02u",
5920c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    val->value.date.mon, val->value.date.day);
5921c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5922c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5923c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_GYEARMONTH: {
5924c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[35];
5925c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5926c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5927c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (val->value.date.year < 0)
5928c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 35, "-%04ld-%02u",
5929f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard			labs(val->value.date.year),
5930c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.mon);
5931c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else
5932c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 35, "%04ld-%02u",
5933c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.year, val->value.date.mon);
5934c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5935c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5936f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    break;
5937c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_TIME:
5938c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    {
5939c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[30];
5940c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5941c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (val->value.date.tz_flag) {
5942c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaValPtr norm;
5943c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5944c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    norm = xmlSchemaDateNormalize(val, 0);
5945c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (norm == NULL)
5946c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			return (-1);
5947f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		    /*
5948f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		    * TODO: Check if "%.14g" is portable.
5949c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    */
5950c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 30,
5951c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%02u:%02u:%02.14gZ",
5952c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.hour,
5953c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.min,
5954c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.sec);
5955c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaFreeValue(norm);
5956c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5957c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 30,
5958c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%02u:%02u:%02.14g",
5959c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.hour,
5960c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.min,
5961c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.sec);
5962c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5963c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5964f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    }
5965c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5966c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_DATE:
5967c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    {
5968c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[30];
5969c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5970c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (val->value.date.tz_flag) {
5971c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaValPtr norm;
5972c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5973c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    norm = xmlSchemaDateNormalize(val, 0);
5974c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (norm == NULL)
5975c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			return (-1);
5976c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    /*
5977c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * TODO: Append the canonical value of the
5978c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * recoverable timezone and not "Z".
5979c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    */
5980c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 30,
5981c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%04ld:%02u:%02uZ",
5982c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.year, norm->value.date.mon,
5983c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.day);
5984c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaFreeValue(norm);
5985c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5986c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 30,
5987c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%04ld:%02u:%02u",
5988c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.year, val->value.date.mon,
5989c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.day);
5990c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5991c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5992f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    }
5993c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5994c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_DATETIME:
5995c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    {
5996c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[50];
5997c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5998c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (val->value.date.tz_flag) {
5999c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaValPtr norm;
6000c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
6001c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    norm = xmlSchemaDateNormalize(val, 0);
6002c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (norm == NULL)
6003c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			return (-1);
6004c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    /*
6005c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * TODO: Check if "%.14g" is portable.
6006c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    */
6007c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 50,
6008c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%04ld:%02u:%02uT%02u:%02u:%02.14gZ",
6009c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.year, norm->value.date.mon,
6010c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.day, norm->value.date.hour,
6011c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.min, norm->value.date.sec);
6012c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaFreeValue(norm);
6013c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
6014c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 50,
6015c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%04ld:%02u:%02uT%02u:%02u:%02.14g",
6016c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.year, val->value.date.mon,
6017c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.day, val->value.date.hour,
6018c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.min, val->value.date.sec);
6019c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
6020c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
6021c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
6022c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
6023c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_HEXBINARY:
6024c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.hex.str);
6025c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
6026c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_BASE64BINARY:
6027c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /*
6028c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * TODO: Is the following spec piece implemented?:
6029c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * SPEC: "Note: For some values the canonical form defined
6030c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * above does not conform to [RFC 2045], which requires breaking
6031c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * with linefeeds at appropriate intervals."
6032c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    */
6033c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.base64.str);
6034c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
6035c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_FLOAT: {
6036f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		char buf[30];
6037f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		/*
6038c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* |m| < 16777216, -149 <= e <= 104.
6039c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* TODO: Handle, NaN, INF, -INF. The format is not
6040c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* yet conformant. The c type float does not cover
6041c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* the whole range.
6042c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*/
6043c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf(buf, 30, "%01.14e", val->value.f);
6044c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
6045c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
6046c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
6047c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_DOUBLE: {
6048c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[40];
6049c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* |m| < 9007199254740992, -1075 <= e <= 970 */
6050c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/*
6051c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* TODO: Handle, NaN, INF, -INF. The format is not
6052c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* yet conformant. The c type float does not cover
6053c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* the whole range.
6054c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*/
6055c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf(buf, 40, "%01.14e", val->value.d);
6056c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
6057c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
6058f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    break;
60596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	default:
6060478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    *retValue = BAD_CAST xmlStrdup(BAD_CAST "???");
6061c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    return (1);
60626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
606326ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard    if (*retValue == NULL)
606426ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard	return(-1);
6065478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    return (0);
6066478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik}
6067478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik
6068bda59576670f1cabea3c49520628d82e401702caDaniel Veillard/**
6069c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * xmlSchemaGetCanonValueWhtsp:
6070c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @val: the precomputed value
6071c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @retValue: the returned value
6072c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @ws: the whitespace type of the value
6073c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
60747a7cad6ed40dff815fd26416192bfbae1b44923fJan Pokorný * Get the canonical representation of the value.
6075c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * The caller has to free the returned @retValue.
6076c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
6077c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Returns 0 if the value could be built, 1 if the value type is
6078c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * not supported yet and -1 in case of API errors.
6079c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */
6080c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcikint
6081c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. BuchcikxmlSchemaGetCanonValueWhtsp(xmlSchemaValPtr val,
6082c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    const xmlChar **retValue,
6083c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    xmlSchemaWhitespaceValueType ws)
6084c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik{
6085c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    if ((retValue == NULL) || (val == NULL))
6086c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	return (-1);
6087c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    if ((ws == XML_SCHEMA_WHITESPACE_UNKNOWN) ||
6088c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	(ws > XML_SCHEMA_WHITESPACE_COLLAPSE))
6089c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	return (-1);
6090c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
6091c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    *retValue = NULL;
6092c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    switch (val->type) {
6093c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_STRING:
6094c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (val->value.str == NULL)
6095c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
6096c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
6097c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlSchemaCollapseString(val->value.str);
6098c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else if (ws == XML_SCHEMA_WHITESPACE_REPLACE)
6099c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlSchemaWhiteSpaceReplace(val->value.str);
6100c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if ((*retValue) == NULL)
6101c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(val->value.str);
6102c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
6103c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_NORMSTRING:
6104c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (val->value.str == NULL)
6105c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
6106c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else {
6107c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
6108c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *retValue = xmlSchemaCollapseString(val->value.str);
6109c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else
6110c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *retValue = xmlSchemaWhiteSpaceReplace(val->value.str);
6111c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if ((*retValue) == NULL)
6112c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *retValue = BAD_CAST xmlStrdup(val->value.str);
6113c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
6114c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
6115c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	default:
6116c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    return (xmlSchemaGetCanonValue(val, retValue));
6117f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    }
6118c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    return (0);
6119c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik}
6120c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
6121c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik/**
6122bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * xmlSchemaGetValType:
6123bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * @val: a schemas value
6124bda59576670f1cabea3c49520628d82e401702caDaniel Veillard *
6125bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * Accessor for the type of a value
6126bda59576670f1cabea3c49520628d82e401702caDaniel Veillard *
6127bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * Returns the xmlSchemaValType of the value
6128bda59576670f1cabea3c49520628d82e401702caDaniel Veillard */
6129478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValType
6130478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaGetValType(xmlSchemaValPtr val)
6131478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{
6132bda59576670f1cabea3c49520628d82e401702caDaniel Veillard    if (val == NULL)
6133bda59576670f1cabea3c49520628d82e401702caDaniel Veillard        return(XML_SCHEMAS_UNKNOWN);
6134478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    return (val->type);
61356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
61366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
61375d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#define bottom_xmlschemastypes
61385d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#include "elfgcchack.h"
61394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#endif /* LIBXML_SCHEMAS_ENABLED */
6140