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   */
65a1dca81df7c352cd9a14ab678750b1623f8f8ed7Patrick Monnerat    unsigned int	hour	:5;	/* 0 <=  hour   <= 24   */
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
1142a1dca81df7c352cd9a14ab678750b1623f8f8ed7Patrick Monnerat#define VALID_END_OF_DAY(dt)					\
1143a1dca81df7c352cd9a14ab678750b1623f8f8ed7Patrick Monnerat	((dt)->hour == 24 && (dt)->min == 0 && (dt)->sec == 0)
1144a1dca81df7c352cd9a14ab678750b1623f8f8ed7Patrick Monnerat
1145070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TIME(dt)						\
1146a1dca81df7c352cd9a14ab678750b1623f8f8ed7Patrick Monnerat	(((VALID_HOUR(dt->hour) && VALID_MIN(dt->min) &&	\
1147a1dca81df7c352cd9a14ab678750b1623f8f8ed7Patrick Monnerat	  VALID_SEC(dt->sec)) || VALID_END_OF_DAY(dt)) &&	\
1148a1dca81df7c352cd9a14ab678750b1623f8f8ed7Patrick Monnerat	 VALID_TZO(dt->tzo))
1149070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1150070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATETIME(dt)					\
1151070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_DATE(dt) && VALID_TIME(dt))
1152070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1153070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_MIN            (60)
1154070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_HOUR           (60 * SECS_PER_MIN)
1155070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_DAY            (24 * SECS_PER_HOUR)
1156070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
11575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInYearByMonth[12] =
11585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
11595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInLeapYearByMonth[12] =
11605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };
11615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
11625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DAY_IN_YEAR(day, month, year)				\
11635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ((IS_LEAP(year) ?					\
11645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                dayInLeapYearByMonth[month - 1] :		\
11655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                dayInYearByMonth[month - 1]) + day)
11665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
11675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#ifdef DEBUG
11685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt)                                                  \
11695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlGenericError(xmlGenericErrorContext,                             \
11705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        "type=%o %04ld-%02u-%02uT%02u:%02u:%03f",                       \
11715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->type,dt->value.date.year,dt->value.date.mon,                \
11725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->value.date.day,dt->value.date.hour,dt->value.date.min,      \
11735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->value.date.sec);                                            \
11745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dt->value.date.tz_flag)                                         \
11755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (dt->value.date.tzo != 0)                                    \
11765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmlGenericError(xmlGenericErrorContext,                     \
11775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                "%+05d\n",dt->value.date.tzo);                          \
11785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else                                                            \
11795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmlGenericError(xmlGenericErrorContext, "Z\n");             \
11805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else                                                                \
11815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        xmlGenericError(xmlGenericErrorContext,"\n")
11825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#else
11835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt)
11845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#endif
11855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
1186070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1187070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGYear:
1188070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1189070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1190070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1191070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gYear without time zone and fills in the appropriate
1192070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1193070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gYear. It is supposed that @dt->year is big enough to contain
1194070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * the year.
1195070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1196070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1197070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1198070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1199070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) {
1200070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str, *firstChar;
1201070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int isneg = 0, digcnt = 0;
1202070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1203070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (((*cur < '0') || (*cur > '9')) &&
1204070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(*cur != '-') && (*cur != '+'))
1205070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1206070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1207070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur == '-') {
1208070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	isneg = 1;
1209070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1210070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1211070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1212070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    firstChar = cur;
1213070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1214070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    while ((*cur >= '0') && (*cur <= '9')) {
1215070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->year = dt->year * 10 + (*cur - '0');
1216070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1217070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	digcnt++;
1218070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1219070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1220070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* year must be at least 4 digits (CCYY); over 4
1221070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * digits cannot have a leading zero. */
1222070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0')))
1223070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1224070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1225070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (isneg)
1226070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->year = - dt->year;
1227070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1228070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (!VALID_YEAR(dt->year))
1229070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1230070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1231070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1232070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1233070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1234070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1235070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1236070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_2_DIGITS:
1237070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the integer to fill in
1238070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1239070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer
1240070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1241070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a 2-digits integer and updates @num with the value. @cur is
1242070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer.
1243070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and
1244070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1245070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1246070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_2_DIGITS(num, cur, invalid)			\
1247070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if ((cur[0] < '0') || (cur[0] > '9') ||			\
1248070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (cur[1] < '0') || (cur[1] > '9'))			\
1249070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    invalid = 1;					\
1250070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	else							\
1251070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    num = (cur[0] - '0') * 10 + (cur[1] - '0');		\
1252070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur += 2;
1253070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1254070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1255070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_FLOAT:
1256070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the double to fill in
1257070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1258070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer
1259070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1260070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float and updates @num with the value. @cur is
1261070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the float. The float must have a
1262070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2-digits integer part and may or may not have a decimal part.
1263070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and
1264070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1265070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1266070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_FLOAT(num, cur, invalid)				\
1267070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(num, cur, invalid);			\
1268070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!invalid && (*cur == '.')) {			\
1269070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    double mult = 1;				        \
1270070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    cur++;						\
1271070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((*cur < '0') || (*cur > '9'))			\
1272070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		invalid = 1;					\
1273070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
1274070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		mult /= 10;					\
1275070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num += (*cur - '0') * mult;			\
1276070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		cur++;						\
1277070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }							\
1278070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1279070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1280070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1281070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGMonth:
1282070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1283070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1284070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1285070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gMonth without time zone and fills in the appropriate
1286070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1287070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gMonth.
1288070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1289070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1290070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1291070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1292070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) {
1293070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
1294070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
129564dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    unsigned int value = 0;
1296070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
129764dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    PARSE_2_DIGITS(value, cur, ret);
1298070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1299070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1300070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
130164dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if (!VALID_MONTH(value))
1302070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1303070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
130464dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    dt->mon = value;
130564dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik
1306070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1307070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1308070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1309070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1310070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1311070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGDay:
1312070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1313070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1314070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1315070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gDay without time zone and fills in the appropriate
1316070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1317070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay.
1318070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1319070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1320070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1321070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1322070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) {
1323070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
1324070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
132564dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    unsigned int value = 0;
1326070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
132764dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    PARSE_2_DIGITS(value, cur, ret);
1328070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1329070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1330070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
133164dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if (!VALID_DAY(value))
1332070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1333070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
133464dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    dt->day = value;
1335070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1336070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1337070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1338070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1339070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1340070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTime:
1341070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1342070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1343070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1344070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:time without time zone and fills in the appropriate
1345070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * fields of the @dt structure. @str is updated to point just after the
1346070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:time.
1347070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, values of @dt fields are undefined.
1348070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1349070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1350070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1351070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1352070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) {
1353f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    const xmlChar *cur = *str;
1354070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
1355285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik    int value = 0;
1356070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
135764dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    PARSE_2_DIGITS(value, cur, ret);
1358070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1359f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	return ret;
1360070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != ':')
1361070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1362a1dca81df7c352cd9a14ab678750b1623f8f8ed7Patrick Monnerat    if (!VALID_HOUR(value) && value != 24 /* Allow end-of-day hour */)
136364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik	return 2;
1364070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1365070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1366070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* the ':' insures this string is xs:time */
136764dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    dt->hour = value;
1368070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
136964dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    PARSE_2_DIGITS(value, cur, ret);
1370070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1371070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
137264dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if (!VALID_MIN(value))
137364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik	return 2;
137464dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    dt->min = value;
1375070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1376070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != ':')
1377070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1378070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1379070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1380070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_FLOAT(dt->sec, cur, ret);
1381070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1382070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1383070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1384a1dca81df7c352cd9a14ab678750b1623f8f8ed7Patrick Monnerat    if (!VALID_TIME(dt))
1385070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1386070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1387070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1388070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1389070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1390070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1391070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1392070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTimeZone:
1393070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1394070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1395070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1396070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a time zone without time zone and fills in the appropriate
1397070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1398070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * time zone.
1399070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1400070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1401070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1402070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1403070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) {
140414b5643947845df089376106517c4f7ba061e4b0Daniel Veillard    const xmlChar *cur;
1405070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
1406070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1407070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (str == NULL)
1408070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
140914b5643947845df089376106517c4f7ba061e4b0Daniel Veillard    cur = *str;
1410070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1411070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    switch (*cur) {
1412070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case 0:
1413070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tz_flag = 0;
1414070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = 0;
1415070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1416070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1417070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case 'Z':
1418070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tz_flag = 1;
1419070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = 0;
1420070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1421070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1422070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1423070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case '+':
1424070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case '-': {
1425070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	int isneg = 0, tmp = 0;
1426070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	isneg = (*cur == '-');
1427070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1428070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1429070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1430070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(tmp, cur, ret);
1431070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1432070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return ret;
1433070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_HOUR(tmp))
1434070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1435070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1436070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (*cur != ':')
1437070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 1;
1438070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1439070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1440070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = tmp * 60;
1441070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1442070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(tmp, cur, ret);
1443070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1444070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return ret;
1445070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_MIN(tmp))
1446070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1447070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1448070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo += tmp;
1449070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (isneg)
1450070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    dt->tzo = - dt->tzo;
1451070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1452070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_TZO(dt->tzo))
1453070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1454070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
14555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	dt->tz_flag = 1;
1456070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1457070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard      }
1458070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    default:
1459070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1460070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1461070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1462070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1463070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1464070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1465070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
14661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard/**
14671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * _xmlSchemaBase64Decode:
14681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * @ch: a character
14691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *
14701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Converts a base64 encoded character to its base 64 value.
14711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *
14721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Returns 0-63 (value), 64 (pad), or -1 (not recognized)
14731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */
14741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic int
14751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard_xmlSchemaBase64Decode (const xmlChar ch) {
14761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('A' <= ch) && (ch <= 'Z')) return ch - 'A';
14771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('a' <= ch) && (ch <= 'z')) return ch - 'a' + 26;
14781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('0' <= ch) && (ch <= '9')) return ch - '0' + 52;
14791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('+' == ch) return 62;
14801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('/' == ch) return 63;
14811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('=' == ch) return 64;
14821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return -1;
14831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard}
14841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
1485070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/****************************************************************
1486070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
1487070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *	XML Schema Dates/Times Datatypes Handling		*
1488070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
1489070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/
1490070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1491070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1492070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_DIGITS:
1493070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the integer to fill in
1494070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1495070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag
1496070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1497070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a digits integer and updates @num with the value. @cur is
1498070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer.
1499070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and
1500070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1501070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1502070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_DIGITS(num, cur, num_type)	                \
1503070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if ((*cur < '0') || (*cur > '9'))			\
1504070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    num_type = -1;					\
1505070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else                                                    \
1506070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
1507070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	        num = num * 10 + (*cur - '0');		        \
1508070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	        cur++;                                          \
1509070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            }
1510070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1511070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1512070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_NUM:
1513070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the double to fill in
1514070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1515070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag
1516070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1517070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float or integer and updates @num with the value. @cur is
1518070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the number. If the number is a float,
1519070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * then it must have an integer part and a decimal part; @num_type will
1520070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * be set to 1. If there is no decimal part, @num_type is set to zero.
1521070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and
1522070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1523070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1524070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_NUM(num, cur, num_type)				\
1525070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        num = 0;                                                \
1526070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_DIGITS(num, cur, num_type);	                \
1527070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!num_type && (*cur == '.')) {			\
1528070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    double mult = 1;				        \
1529070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    cur++;						\
1530070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((*cur < '0') || (*cur > '9'))			\
1531070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num_type = -1;					\
1532070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else                                                \
1533070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                num_type = 1;                                   \
1534070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
1535070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		mult /= 10;					\
1536070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num += (*cur - '0') * mult;			\
1537070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		cur++;						\
1538070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }							\
1539070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1540070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1541070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
15425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDates:
1543455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard * @type: the expected type or XML_SCHEMAS_UNKNOWN
1544070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dateTime:  string to analyze
1545070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val:  the return computed value
1546070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1547070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @dateTime conforms to the lexical space of one of the date types.
1548070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val.
1549070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1550070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
1551070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *         and -1 in case of internal or API error.
1552070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1553070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1554455cc07308c673b6714e2f5670c2091a1dab95dcDaniel VeillardxmlSchemaValidateDates (xmlSchemaValType type,
15554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	                const xmlChar *dateTime, xmlSchemaValPtr *val,
15564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			int collapse) {
1557070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmlSchemaValPtr dt;
1558070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret;
1559070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = dateTime;
1560070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1561070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define RETURN_TYPE_IF_VALID(t)					\
1562070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (IS_TZO_CHAR(*cur)) {					\
1563070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur);	\
1564070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret == 0) {						\
1565070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (*cur != 0)					\
1566070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		goto error;					\
1567070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    dt->type = t;					\
1568455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard	    goto done;						\
1569070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}							\
1570070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1571070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1572070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dateTime == NULL)
1573070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1574070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
15754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (collapse)
15764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*cur) cur++;
15774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
1578070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((*cur != '-') && (*cur < '0') && (*cur > '9'))
1579070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1580070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1581070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN);
1582070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dt == NULL)
1583070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1584070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1585070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((cur[0] == '-') && (cur[1] == '-')) {
1586070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/*
1587070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * It's an incomplete date (xs:gMonthDay, xs:gMonth or
1588070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * xs:gDay)
1589070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 */
1590070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur += 2;
1591070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1592070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/* is it an xs:gDay? */
1593070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (*cur == '-') {
1594455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard	    if (type == XML_SCHEMAS_GMONTH)
1595455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard		goto error;
1596070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	  ++cur;
1597070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1598070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret != 0)
1599070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		goto error;
1600070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1601070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY);
1602070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1603070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    goto error;
1604070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1605070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1606070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/*
1607070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * it should be an xs:gMonthDay or xs:gMonth
1608070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 */
1609070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur);
1610070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1611070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    goto error;
1612070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1613d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        /*
1614d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a '-' char could indicate this type is xs:gMonthDay or
1615d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a negative time zone offset. Check for xs:gMonthDay first.
1616d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * Also the first three char's of a negative tzo (-MM:SS) can
1617d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * appear to be a valid day; so even if the day portion
1618d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * of the xs:gMonthDay verifies, we must insure it was not
1619d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a tzo.
1620d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         */
1621d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if (*cur == '-') {
1622d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            const xmlChar *rewnd = cur;
1623d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            cur++;
1624d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1625f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1626d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            if ((ret == 0) && ((*cur == 0) || (*cur != ':'))) {
1627d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1628d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                /*
1629d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * we can use the VALID_MDAY macro to validate the month
1630d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * and day because the leap year test will flag year zero
1631d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * as a leap year (even though zero is an invalid year).
16324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		 * FUTURE TODO: Zero will become valid in XML Schema 1.1
16334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		 * probably.
1634d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 */
1635d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                if (VALID_MDAY((&(dt->value.date)))) {
1636d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1637d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard	            RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY);
1638070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1639d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                    goto error;
1640d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                }
1641d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            }
1642d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1643d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            /*
1644d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             * not xs:gMonthDay so rewind and check if just xs:gMonth
1645d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             * with an optional time zone.
1646d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             */
1647d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            cur = rewnd;
1648d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        }
1649d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1650d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard	RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH);
1651070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1652070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1653070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1654070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1655070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /*
1656070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * It's a right-truncated date or an xs:time.
1657070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * Try to parse an xs:time then fallback on right-truncated dates.
1658070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     */
1659070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((*cur >= '0') && (*cur <= '9')) {
1660070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseTime(&(dt->value.date), &cur);
1661070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret == 0) {
1662070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    /* it's an xs:time */
1663070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_TIME);
1664070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1665070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1666070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1667070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* fallback on date parsing */
1668070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur = dateTime;
1669070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1670070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGYear(&(dt->value.date), &cur);
1671070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1672070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1673070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1674070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:gYear? */
1675070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEAR);
1676070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1677070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != '-')
1678070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1679070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1680070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1681070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur);
1682070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1683070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1684070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1685070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:gYearMonth? */
1686070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEARMONTH);
1687070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1688070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != '-')
1689070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1690070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1691070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1692070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1693070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((ret != 0) || !VALID_DATE((&(dt->value.date))))
1694070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1695070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1696070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:date? */
1697070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_DATE);
1698070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1699070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != 'T')
1700070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1701070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1702070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1703070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* it should be an xs:dateTime */
1704070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseTime(&(dt->value.date), &cur);
1705070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1706070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1707070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1708070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur);
17094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (collapse)
17104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*cur) cur++;
17116a0baa0cd89b402cdfbb63e9c40f291ebd191f1dDaniel Veillard    if ((ret != 0) || (*cur != 0) || (!(VALID_DATETIME((&(dt->value.date))))))
1712070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1713070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1714455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard
1715070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dt->type = XML_SCHEMAS_DATETIME;
1716070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1717455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillarddone:
1718d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#if 1
1719d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type))
1720d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        goto error;
1721d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#else
1722d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    /*
1723d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     * insure the parsed type is equal to or less significant (right
1724d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     * truncated) than the desired type.
1725d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     */
1726d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) {
1727d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1728d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        /* time only matches time */
1729d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_TIME) && (dt->type == XML_SCHEMAS_TIME))
1730d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1731d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1732d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_DATETIME) &&
1733d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            ((dt->type != XML_SCHEMAS_DATE) ||
1734d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEARMONTH) ||
1735d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEAR)))
1736d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1737d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1738d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_DATE) &&
1739d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            ((dt->type != XML_SCHEMAS_GYEAR) ||
1740d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEARMONTH)))
1741d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1742d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1743d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_GYEARMONTH) && (dt->type != XML_SCHEMAS_GYEAR))
1744d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1745d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1746d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_GMONTHDAY) && (dt->type != XML_SCHEMAS_GMONTH))
1747d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1748d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    }
1749455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard#endif
1750455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard
1751070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (val != NULL)
1752070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        *val = dt;
175380b19092f24410a6b869abf519227686e8f207caDaniel Veillard    else
175480b19092f24410a6b869abf519227686e8f207caDaniel Veillard	xmlSchemaFreeValue(dt);
1755070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1756070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1757070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1758070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror:
1759070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dt != NULL)
1760070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	xmlSchemaFreeValue(dt);
1761070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 1;
1762070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1763070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1764070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
17655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDuration:
1766070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @type: the predefined type
1767070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @duration:  string to analyze
1768070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val:  the return computed value
1769070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1770070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @duration conforms to the lexical space of the duration type.
1771070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val.
1772070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1773070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
1774070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *         and -1 in case of internal or API error.
1775070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1776070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1777dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
17784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	                   const xmlChar *duration, xmlSchemaValPtr *val,
17794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			   int collapse) {
1780070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar  *cur = duration;
1781070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmlSchemaValPtr dur;
1782070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int isneg = 0;
1783070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int seq = 0;
1784d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    double         num;
1785d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    int            num_type = 0;  /* -1 = invalid, 0 = int, 1 = floating */
1786d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    const xmlChar  desig[]  = {'Y', 'M', 'D', 'H', 'M', 'S'};
1787d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    const double   multi[]  = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0};
1788070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1789070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (duration == NULL)
1790070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1791070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
17924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (collapse)
17934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*cur) cur++;
17944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
1795070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur == '-') {
1796070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        isneg = 1;
1797070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        cur++;
1798070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1799070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1800070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* duration must start with 'P' (after sign) */
1801070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur++ != 'P')
1802070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1803070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
180480b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (*cur == 0)
180580b19092f24410a6b869abf519227686e8f207caDaniel Veillard	return 1;
180680b19092f24410a6b869abf519227686e8f207caDaniel Veillard
1807070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION);
1808070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dur == NULL)
1809070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1810070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1811070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    while (*cur != 0) {
1812070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1813070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* input string should be empty or invalid date/time item */
1814070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (seq >= sizeof(desig))
1815070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1816070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1817070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* T designator must be present for time items */
1818070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (*cur == 'T') {
1819070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (seq <= 3) {
1820070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                seq = 3;
1821070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                cur++;
1822070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            } else
1823070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 1;
1824070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        } else if (seq == 3)
1825070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1826070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1827070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* parse the number portion of the item */
1828070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        PARSE_NUM(num, cur, num_type);
1829070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1830070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if ((num_type == -1) || (*cur == 0))
1831070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1832070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1833070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* update duration based on item type */
1834070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        while (seq < sizeof(desig)) {
1835070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (*cur == desig[seq]) {
1836070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1837070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                /* verify numeric type; only seconds can be float */
1838070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                if ((num_type != 0) && (seq < (sizeof(desig)-1)))
1839070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    goto error;
1840070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1841070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                switch (seq) {
1842070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    case 0:
1843070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.mon = (long)num * 12;
1844070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1845070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    case 1:
1846070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.mon += (long)num;
1847070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1848070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    default:
1849070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        /* convert to seconds using multiplier */
1850070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.sec += num * multi[seq];
1851070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        seq++;
1852070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1853070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                }
1854070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1855070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                break;          /* exit loop */
1856070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            }
1857070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            /* no date designators found? */
1858c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik            if ((++seq == 3) || (seq == 6))
1859070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                goto error;
1860070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        }
18614efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	cur++;
18624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	if (collapse)
1863f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    while IS_WSP_BLANK_CH(*cur) cur++;
1864070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1865070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1866070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (isneg) {
1867070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.mon = -dur->value.dur.mon;
1868070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.day = -dur->value.dur.day;
1869070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.sec = -dur->value.dur.sec;
1870070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1871070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1872070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (val != NULL)
1873070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        *val = dur;
187480b19092f24410a6b869abf519227686e8f207caDaniel Veillard    else
187580b19092f24410a6b869abf519227686e8f207caDaniel Veillard	xmlSchemaFreeValue(dur);
1876070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1877070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1878070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1879070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror:
1880070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dur != NULL)
1881070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	xmlSchemaFreeValue(dur);
1882070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 1;
1883070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1884070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1885a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard/**
1886a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * xmlSchemaStrip:
1887a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * @value: a value
1888a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *
1889a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Removes the leading and ending spaces of a string
1890a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *
1891a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the new string or NULL if no change was required.
1892a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard */
1893a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlChar *
1894a1a9d0410000cc69874e53e438b250037d3e14cdDaniel VeillardxmlSchemaStrip(const xmlChar *value) {
1895a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    const xmlChar *start = value, *end, *f;
1896a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard
1897a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if (value == NULL) return(NULL);
189876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((*start != 0) && (IS_BLANK_CH(*start))) start++;
1899a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end = start;
1900a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    while (*end != 0) end++;
1901a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    f = end;
1902a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end--;
190376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((end > start) && (IS_BLANK_CH(*end))) end--;
1904a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end++;
1905a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if ((start == value) && (f == end)) return(NULL);
1906a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    return(xmlStrndup(start, end - start));
1907a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard}
190896a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard
190996a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard/**
191091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * xmlSchemaWhiteSpaceReplace:
191191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * @value: a value
191291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik *
191391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Replaces 0xd, 0x9 and 0xa with a space.
191491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik *
191591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Returns the new string or NULL if no change was required.
191691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik */
191791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlChar *
191891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlSchemaWhiteSpaceReplace(const xmlChar *value) {
1919f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    const xmlChar *cur = value;
1920f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    xmlChar *ret = NULL, *mcur;
192191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
1922f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    if (value == NULL)
192391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	return(NULL);
1924f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
1925f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    while ((*cur != 0) &&
192691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	(((*cur) != 0xd) && ((*cur) != 0x9) && ((*cur) != 0xa))) {
192791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	cur++;
192891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    }
192991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    if (*cur == 0)
193091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	return (NULL);
193191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    ret = xmlStrdup(value);
193291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    /* TODO FIXME: I guess gcc will bark at this. */
193391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    mcur = (xmlChar *)  (ret + (cur - value));
193491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    do {
193591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	if ( ((*mcur) == 0xd) || ((*mcur) == 0x9) || ((*mcur) == 0xa) )
193691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	    *mcur = ' ';
193791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	mcur++;
1938f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    } while (*mcur != 0);
193991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    return(ret);
194091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik}
194191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
194291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik/**
1943b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCollapseString:
1944b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: a value
1945b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
1946b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Removes and normalize white spaces in the string
1947b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
1948b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns the new string or NULL if no change was required.
1949b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
195001fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlChar *
1951b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCollapseString(const xmlChar *value) {
1952b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    const xmlChar *start = value, *end, *f;
1953b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    xmlChar *g;
1954b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    int col = 0;
1955b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1956b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (value == NULL) return(NULL);
195776e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((*start != 0) && (IS_BLANK_CH(*start))) start++;
1958b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    end = start;
1959b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    while (*end != 0) {
196076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if ((*end == ' ') && (IS_BLANK_CH(end[1]))) {
1961b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    col = end - start;
1962b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    break;
1963b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	} else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) {
1964b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    col = end - start;
1965b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    break;
1966b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	}
1967b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end++;
1968b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1969b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (col == 0) {
1970b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	f = end;
1971b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end--;
197276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	while ((end > start) && (IS_BLANK_CH(*end))) end--;
1973b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end++;
1974b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if ((start == value) && (f == end)) return(NULL);
1975b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(xmlStrndup(start, end - start));
1976b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1977b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    start = xmlStrdup(start);
1978b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (start == NULL) return(NULL);
1979b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    g = (xmlChar *) (start + col);
1980b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    end = g;
1981b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    while (*end != 0) {
198276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if (IS_BLANK_CH(*end)) {
1983b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    end++;
198476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*end)) end++;
1985b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (*end != 0)
1986b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		*g++ = ' ';
1987b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	} else
1988b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    *g++ = *end++;
1989b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1990b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    *g = 0;
1991b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return((xmlChar *) start);
1992b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
1993b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1994b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
199528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * xmlSchemaValAtomicListNode:
199628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @type: the predefined atomic type for a token in the list
199728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @value: the list value to check
199828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @ret:  the return computed value
199928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @node:  the node containing the value
200028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *
200128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Check that a value conforms to the lexical space of the predefined
200228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * list type. if true a value is computed and returned in @ret.
200328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *
2004a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the number of items if this validates, a negative error code
2005a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *         number otherwise
200628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */
200728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillardstatic int
200828c52ab518d34a36fd8da6870a5850088f129a6aDaniel VeillardxmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value,
200928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	                   xmlSchemaValPtr *ret, xmlNodePtr node) {
201028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    xmlChar *val, *cur, *endval;
201128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    int nb_values = 0;
2012580ced8ee28ecd99374da9383897678e4ba6c358Daniel Veillard    int tmp = 0;
201328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard
201428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (value == NULL) {
201528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	return(-1);
201628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
201728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    val = xmlStrdup(value);
201828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (val == NULL) {
201928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	return(-1);
202028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
20216fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    if (ret != NULL) {
20226fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard        *ret = NULL;
20236fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    }
202428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    cur = val;
202528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    /*
202628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard     * Split the list
202728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard     */
202876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while (IS_BLANK_CH(*cur)) *cur++ = 0;
202928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while (*cur != 0) {
203076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if (IS_BLANK_CH(*cur)) {
203128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    *cur = 0;
203228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    cur++;
203376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*cur)) *cur++ = 0;
203428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	} else {
203528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    nb_values++;
203628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    cur++;
203776e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++;
203828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	}
203928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
204028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (nb_values == 0) {
204128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	xmlFree(val);
2042a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard	return(nb_values);
204328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
204428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    endval = cur;
204528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    cur = val;
204628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while ((*cur == 0) && (cur != endval)) cur++;
204728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while (cur != endval) {
204828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node);
204928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	if (tmp != 0)
205028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    break;
205128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	while (*cur != 0) cur++;
205228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	while ((*cur == 0) && (cur != endval)) cur++;
205328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
20546fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    /* TODO what return value ? c.f. bug #158628
205528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (ret != NULL) {
205628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	TODO
20576fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    } */
20586fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    xmlFree(val);
2059a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if (tmp == 0)
2060a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard	return(nb_values);
2061a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    return(-1);
206228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard}
206328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard
206428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard/**
2065e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * xmlSchemaParseUInt:
2066e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @str: pointer to the string R/W
2067e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @llo: pointer to the low result
2068e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lmi: pointer to the mid result
2069e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lhi: pointer to the high result
2070e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *
2071e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Parse an unsigned long into 3 fields.
2072e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *
2073ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack * Returns the number of significant digits in the number or
2074bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard * -1 if overflow of the capacity and -2 if it's not a number.
2075e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard */
2076e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic int
2077e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel VeillardxmlSchemaParseUInt(const xmlChar **str, unsigned long *llo,
2078478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik                   unsigned long *lmi, unsigned long *lhi) {
2079e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long lo = 0, mi = 0, hi = 0;
2080e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    const xmlChar *tmp, *cur = *str;
2081e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    int ret = 0, i = 0;
2082e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
2083f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    if (!((*cur >= '0') && (*cur <= '9')))
2084bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard        return(-2);
2085bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard
2086478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while (*cur == '0') {        /* ignore leading zeroes */
2087478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        cur++;
2088e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2089e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    tmp = cur;
2090e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) {
2091478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        i++;tmp++;ret++;
2092e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2093e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (i > 24) {
2094478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        *str = tmp;
2095478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        return(-1);
2096e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2097e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 16) {
2098478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        hi = hi * 10 + (*cur++ - '0');
2099478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        i--;
2100e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2101e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 8) {
2102478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        mi = mi * 10 + (*cur++ - '0');
2103478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        i--;
2104e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2105e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 0) {
2106478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        lo = lo * 10 + (*cur++ - '0');
2107478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        i--;
2108e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2109e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
2110e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *str = cur;
2111e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *llo = lo;
2112e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *lmi = mi;
2113e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *lhi = hi;
2114e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    return(ret);
2115e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard}
2116e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
2117e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard/**
2118b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValAtomicType:
21194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type: the predefined type
21204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to check
21214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val:  the return computed value
2122c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @node:  the node containing the value
2123b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * flags:  flags to control the vlidation
21244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
2125b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the atomic type.
21264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * if true a value is computed and returned in @val.
212701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * This checks the value space for list types as well (IDREFS, NMTOKENS).
21284255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
21294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
21304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *         and -1 in case of internal or API error.
21314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
2132b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int
21331ac24d36b12487995b659a8fc23a02b9460edb36Daniel VeillardxmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value,
21344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik                       xmlSchemaValPtr * val, xmlNodePtr node, int flags,
21354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		       xmlSchemaWhitespaceValueType ws,
21364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		       int normOnTheFly, int applyNorm, int createStringValue)
21371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard{
21384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValPtr v;
2139b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    xmlChar *norm = NULL;
2140d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    int ret = 0;
21414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
21424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
214301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitTypes();
21444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (type == NULL)
21451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        return (-1);
21465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
2147eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard    /*
2148eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard     * validating a non existant text node is similar to validating
2149eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard     * an empty one.
2150eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard     */
2151eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard    if (value == NULL)
2152eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard        value = BAD_CAST "";
2153eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard
21544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (val != NULL)
21551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        *val = NULL;
2156b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if ((flags == 0) && (value != NULL)) {
215791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
215801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        if ((type->builtInType != XML_SCHEMAS_STRING) &&
2159f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	  (type->builtInType != XML_SCHEMAS_ANYTYPE) &&
216091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	  (type->builtInType != XML_SCHEMAS_ANYSIMPLETYPE)) {
216191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	    if (type->builtInType == XML_SCHEMAS_NORMSTRING)
216291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik		norm = xmlSchemaWhiteSpaceReplace(value);
216391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik            else
216491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik		norm = xmlSchemaCollapseString(value);
21651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (norm != NULL)
21661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                value = norm;
21671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        }
2168b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
2169b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
217001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type->builtInType) {
2171f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard        case XML_SCHEMAS_UNKNOWN:
21721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto error;
21732f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	case XML_SCHEMAS_ANYTYPE:
21742f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	case XML_SCHEMAS_ANYSIMPLETYPE:
21754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if ((createStringValue) && (val != NULL)) {
21764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		v = xmlSchemaNewValue(XML_SCHEMAS_ANYSIMPLETYPE);
21774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (v != NULL) {
21784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    v->value.str = xmlStrdup(value);
21794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    *val = v;
21804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else {
21814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    goto error;
2182f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		}
21834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    }
21842f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	    goto return0;
2185f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard        case XML_SCHEMAS_STRING:
21864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if (! normOnTheFly) {
21874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		const xmlChar *cur = value;
21884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
21894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (ws == XML_SCHEMA_WHITESPACE_REPLACE) {
21904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while (*cur != 0) {
21914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
21924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
21934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else {
21944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
21954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			}
21964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
21974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) {
21984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while (*cur != 0) {
21994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
22004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
22014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else if IS_WSP_SPACE_CH(*cur) {
22024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
22034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    if IS_WSP_SPACE_CH(*cur)
22044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik				goto return1;
22054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else {
22064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
22074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			}
22084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
22094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
22104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    }
22114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if (createStringValue && (val != NULL)) {
22124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (applyNorm) {
22134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
22144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			norm = xmlSchemaCollapseString(value);
22154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else if (ws == XML_SCHEMA_WHITESPACE_REPLACE)
22164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			norm = xmlSchemaWhiteSpaceReplace(value);
22174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (norm != NULL)
22184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			value = norm;
22194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
22204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		v = xmlSchemaNewValue(XML_SCHEMAS_STRING);
22214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (v != NULL) {
22224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    v->value.str = xmlStrdup(value);
22234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    *val = v;
22244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else {
22254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    goto error;
22264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
22274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    }
22281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return0;
22291516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard        case XML_SCHEMAS_NORMSTRING:{
22304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly) {
22314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (applyNorm) {
22324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
22334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    norm = xmlSchemaCollapseString(value);
22344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			else
22354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    norm = xmlSchemaWhiteSpaceReplace(value);
22364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if (norm != NULL)
22374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    value = norm;
22384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
22394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else {
22404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    const xmlChar *cur = value;
22414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while (*cur != 0) {
22424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
22434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
22444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else {
22454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
22464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			}
22474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
22484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
22491516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                if (val != NULL) {
22501516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NORMSTRING);
22511516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    if (v != NULL) {
22521516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        v->value.str = xmlStrdup(value);
22531516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        *val = v;
22541516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    } else {
22551516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        goto error;
22561516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    }
22571516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                }
22581516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                goto return0;
22591516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard            }
22601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_DECIMAL:{
2261273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack                const xmlChar *cur = value;
226272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik                unsigned int len, neg, integ, hasLeadingZeroes;
2263273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		xmlChar cval[25];
2264f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		xmlChar *cptr = cval;
22651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
226672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik                if ((cur == NULL) || (*cur == 0))
22671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
22684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
226972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		/*
227072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		* xs:decimal has a whitespace-facet value of 'collapse'.
227172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		*/
22724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
22734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
22744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
227572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		/*
227672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		* First we handle an optional sign.
227772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		*/
227872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		neg = 0;
227972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik                if (*cur == '-') {
228072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		    neg = 1;
22811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
228272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		} else if (*cur == '+')
22831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
228472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		/*
228572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		* Disallow: "", "-", "- "
228672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		*/
228772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		if (*cur == 0)
228872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		    goto return1;
2289273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		/*
2290273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 * Next we "pre-parse" the number, in preparation for calling
2291273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 * the common routine xmlSchemaParseUInt.  We get rid of any
2292273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 * leading zeroes (because we have reserved only 25 chars),
229372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		 * and note the position of a decimal point.
2294273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 */
2295273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		len = 0;
229672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		integ = ~0u;
229772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		hasLeadingZeroes = 0;
2298c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/*
2299c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* Skip leading zeroes.
2300c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*/
230172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		while (*cur == '0') {
2302273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		    cur++;
230372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		    hasLeadingZeroes = 1;
230472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		}
2305c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (*cur != 0) {
230672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		    do {
2307c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			if ((*cur >= '0') && (*cur <= '9')) {
2308c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    *cptr++ = *cur++;
2309c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    len++;
2310c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			} else if (*cur == '.') {
2311c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    cur++;
231272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    integ = len;
231372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    do {
231472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				if ((*cur >= '0') && (*cur <= '9')) {
231572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    *cptr++ = *cur++;
231672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    len++;
231772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				} else
231872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    break;
231972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    } while (len < 24);
232072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    /*
232172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    * Disallow "." but allow "00."
232272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    */
232372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    if ((len == 0) && (!hasLeadingZeroes))
2324c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik				goto return1;
2325c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    break;
2326c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			} else
2327c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    break;
232872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		    } while (len < 24);
2329273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		}
23304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
23314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
2332273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		if (*cur != 0)
233372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		    goto return1; /* error if any extraneous chars */
23341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
23351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL);
23361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
2337273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			/*
2338f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard			* Now evaluate the significant digits of the number
2339f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard			*/
234072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			if (len != 0) {
2341f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
234272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    if (integ != ~0u) {
234372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				/*
234472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				* Get rid of trailing zeroes in the
234572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				* fractional part.
234672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				*/
234772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				while ((len != integ) && (*(cptr-1) == '0')) {
234872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    cptr--;
234972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    len--;
235072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				}
235172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    }
235272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    /*
235372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    * Terminate the (preparsed) string.
235472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    */
235572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    if (len != 0) {
2356bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard				*cptr = 0;
235772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				cptr = cval;
2358bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard
235972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				xmlSchemaParseUInt((const xmlChar **)&cptr,
236072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    &v->value.decimal.lo,
236172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    &v->value.decimal.mi,
236272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    &v->value.decimal.hi);
2363273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			    }
2364273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			}
2365c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			/*
2366c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			* Set the total digits to 1 if a zero value.
2367c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			*/
23681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = neg;
236972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			if (len == 0) {
237072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    /* Speedup for zero values. */
237172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    v->value.decimal.total = 1;
2372273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			} else {
2373c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    v->value.decimal.total = len;
237472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    if (integ == ~0u)
237572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				v->value.decimal.frac = 0;
237672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    else
237772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				v->value.decimal.frac = len - integ;
2378273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			}
23791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
23801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
23811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
23831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2384b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_TIME:
2385b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GDAY:
2386b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GMONTH:
2387b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GMONTHDAY:
2388b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GYEAR:
2389b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GYEARMONTH:
2390b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DATE:
2391b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DATETIME:
23924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik            ret = xmlSchemaValidateDates(type->builtInType, value, val,
23934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		normOnTheFly);
23941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            break;
2395b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DURATION:
23964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik            ret = xmlSchemaValidateDuration(type, value, val,
23974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		normOnTheFly);
23981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            break;
2399b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_FLOAT:
24005f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly        case XML_SCHEMAS_DOUBLE: {
24011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
24021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int neg = 0;
24035f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly                int digits_before = 0;
24045f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly                int digits_after = 0;
24051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
24064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
24074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
24084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
24091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) {
24101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur += 3;
24111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (*cur != 0)
24121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
24131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (val != NULL) {
24141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (type == xmlSchemaTypeFloatDef) {
24151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
24161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
24171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                v->value.f = (float) xmlXPathNAN;
24181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
24191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
24201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
24211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
24221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
24231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
24241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
24251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                v->value.d = xmlXPathNAN;
24261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
24271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
24281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
24291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
24301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
24311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
24321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
24331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return0;
24341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
24361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    neg = 1;
24371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) {
24401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur += 3;
24411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (*cur != 0)
24421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
24431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (val != NULL) {
24441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (type == xmlSchemaTypeFloatDef) {
24451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
24461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
24471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                if (neg)
24481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.f = (float) xmlXPathNINF;
24491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                else
24501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.f = (float) xmlXPathPINF;
24511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
24521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
24531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
24541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
24551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
24561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
24571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
24581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                if (neg)
24591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.d = xmlXPathNINF;
24601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                else
24611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.d = xmlXPathPINF;
24621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
24631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
24641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
24651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
24661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
24671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
24681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
24691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return0;
24701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((neg == 0) && (*cur == '+'))
24721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-'))
24741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
24751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                while ((*cur >= '0') && (*cur <= '9')) {
24761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24775f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly                    digits_before++;
24781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '.') {
24801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24815f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly                    while ((*cur >= '0') && (*cur <= '9')) {
24821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
24835f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly                        digits_after++;
24845f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly                    }
24851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24861ea95900468ec45c251dd44093830569af28e657Daniel Veillard                if ((digits_before == 0) && (digits_after == 0))
24875f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly                    goto return1;
24881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((*cur == 'e') || (*cur == 'E')) {
24891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((*cur == '-') || (*cur == '+'))
24911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
24921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while ((*cur >= '0') && (*cur <= '9'))
24931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
24941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
24964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
24974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
24981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
24991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
25001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
25011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (type == xmlSchemaTypeFloatDef) {
25021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
25031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (v != NULL) {
25046c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    /*
25056c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * TODO: sscanf seems not to give the correct
25066c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * value for extremely high/low values.
25076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * E.g. "1E-149" results in zero.
25086c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    */
2509d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard                            if (sscanf((const char *) value, "%f",
25101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                 &(v->value.f)) == 1) {
25116c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                                *val = v;
25121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
25131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
25141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
25151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
25161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
25171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto error;
25181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
25191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
25201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
25211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (v != NULL) {
25226c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    /*
25236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * TODO: sscanf seems not to give the correct
25246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * value for extremely high/low values.
25256c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    */
2526d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard                            if (sscanf((const char *) value, "%lf",
25271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                 &(v->value.d)) == 1) {
25281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                *val = v;
25291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
25301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
25311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
25321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
25331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
25341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto error;
25351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
25361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
25371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
25381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
25391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
25401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BOOLEAN:{
25411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
25421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
25434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly) {
25444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
25454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (*cur == '0') {
25464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 0;
25474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			cur++;
25484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    } else if (*cur == '1') {
25494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 1;
25504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			cur++;
25514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    } else if (*cur == 't') {
25524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			cur++;
25534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur++ == 'r') && (*cur++ == 'u') &&
25544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    (*cur++ == 'e')) {
25554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    ret = 1;
25564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else
25574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
25584efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    } else if (*cur == 'f') {
25594efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			cur++;
25604efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur++ == 'a') && (*cur++ == 'l') &&
25614efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    (*cur++ == 's') && (*cur++ == 'e')) {
25624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    ret = 0;
25634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else
25644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
25651869be56906ed5488b7db6d7c16f1c473af1485dKasimier T. Buchcik		    } else
25661869be56906ed5488b7db6d7c16f1c473af1485dKasimier T. Buchcik			goto return1;
25674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (*cur != 0) {
25684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			while IS_WSP_BLANK_CH(*cur) cur++;
25694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if (*cur != 0)
25704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
25714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
25724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else {
25734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if ((cur[0] == '0') && (cur[1] == 0))
25744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 0;
25754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else if ((cur[0] == '1') && (cur[1] == 0))
25764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 1;
25774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else if ((cur[0] == 't') && (cur[1] == 'r')
25784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			&& (cur[2] == 'u') && (cur[3] == 'e')
25794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			&& (cur[4] == 0))
25804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 1;
25814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else if ((cur[0] == 'f') && (cur[1] == 'a')
25824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			&& (cur[2] == 'l') && (cur[3] == 's')
25834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			&& (cur[4] == 'e') && (cur[5] == 0))
25844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 0;
25854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else
25864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			goto return1;
25874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
25881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
25891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN);
25901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
25911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.b = ret;
25921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
25931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
25941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
25951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
25961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
25971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
25981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
25991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_TOKEN:{
26001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
26011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
26024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (! normOnTheFly) {
26034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while (*cur != 0) {
26044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
26054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
26064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else if (*cur == ' ') {
26074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
26084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    if (*cur == 0)
26094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik				goto return1;
26104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    if (*cur == ' ')
26114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik				goto return1;
26124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else {
26134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
26144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			}
2615f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		    }
2616f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		}
26171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
26181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN);
26191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
26201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.str = xmlStrdup(value);
26211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
26221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
26231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
26241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
26251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
26271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2628b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_LANGUAGE:
2629f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    if (normOnTheFly) {
26304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		norm = xmlSchemaCollapseString(value);
26314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (norm != NULL)
26324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    value = norm;
26334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    }
26341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (xmlCheckLanguageID(value) == 1) {
26351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
26361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE);
26371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
26381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.str = xmlStrdup(value);
26391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
26401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
26411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
26421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
26431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
26451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
26461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return1;
2647b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NMTOKEN:
26481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (xmlValidateNMToken(value, 1) == 0) {
26491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
26501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN);
26511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
26521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.str = xmlStrdup(value);
26531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
26541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
26551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
26561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
26571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
26591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
26601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return1;
2661b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NMTOKENS:
26621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef,
26631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
26641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret > 0)
26651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
26661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
26671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 1;
26681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2669b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NAME:
26701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateName(value, 1);
2671df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard            if ((ret == 0) && (val != NULL) && (value != NULL)) {
2672df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		v = xmlSchemaNewValue(XML_SCHEMAS_NAME);
2673df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		if (v != NULL) {
2674df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     const xmlChar *start = value, *end;
2675df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     while (IS_BLANK_CH(*start)) start++;
2676df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     end = start;
2677df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     while ((*end != 0) && (!IS_BLANK_CH(*end))) end++;
2678df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     v->value.str = xmlStrndup(start, end - start);
2679df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		    *val = v;
2680df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		} else {
2681df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		    goto error;
2682df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		}
26831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
26841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
26851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_QNAME:{
26861c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                const xmlChar *uri = NULL;
26871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *local = NULL;
26881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
26891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateQName(value, 1);
26901c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		if (ret != 0)
26911c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    goto done;
26921c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                if (node != NULL) {
26931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *prefix;
26941c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    xmlNsPtr ns;
26951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
26961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    local = xmlSplitQName2(value, &prefix);
26971c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    ns = xmlSearchNs(node->doc, node, prefix);
26981c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if ((ns == NULL) && (prefix != NULL)) {
26991c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			xmlFree(prefix);
27001c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			if (local != NULL)
27011c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			    xmlFree(local);
27021c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			goto return1;
27031c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    }
27041c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if (ns != NULL)
27051c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			uri = ns->href;
27061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL)
27071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(prefix);
27081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27091c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                if (val != NULL) {
27101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_QNAME);
27111c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                    if (v == NULL) {
27121c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			if (local != NULL)
27131c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			    xmlFree(local);
27141c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			goto error;
27151c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    }
27161c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if (local != NULL)
27171c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			v->value.qname.name = local;
27181c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    else
27191c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			v->value.qname.name = xmlStrdup(value);
27201c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if (uri != NULL)
27211c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			v->value.qname.uri = xmlStrdup(uri);
27221c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    *val = v;
27231c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                } else
27241c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if (local != NULL)
27251c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			xmlFree(local);
27261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
27271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2728b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NCNAME:
27291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
27301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
27311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME);
27321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (v != NULL) {
27331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.str = xmlStrdup(value);
27341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
27351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else {
27361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto error;
27371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2740b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_ID:
27411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
27421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
27431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                v = xmlSchemaNewValue(XML_SCHEMAS_ID);
27441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (v != NULL) {
27451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.str = xmlStrdup(value);
27461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
27471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else {
27481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto error;
27491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
27521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
27531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
27541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
27551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /*
27561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * NOTE: the IDness might have already be declared in the DTD
27571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 */
27581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (attr->atype != XML_ATTRIBUTE_ID) {
27591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlIDPtr res;
27601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *strip;
27611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
27621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    strip = xmlSchemaStrip(value);
27631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (strip != NULL) {
27641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        res = xmlAddID(NULL, node->doc, strip, attr);
27651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(strip);
27661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else
27671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        res = xmlAddID(NULL, node->doc, value, attr);
27681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (res == NULL) {
27691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 2;
27701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
27711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        attr->atype = XML_ATTRIBUTE_ID;
27721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
27731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2776b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_IDREF:
27771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
27781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
27796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		v = xmlSchemaNewValue(XML_SCHEMAS_IDREF);
27806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (v == NULL)
27816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    goto error;
27826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		v->value.str = xmlStrdup(value);
27836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*val = v;
27841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
27861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
27871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
27881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *strip;
27891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
27901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                strip = xmlSchemaStrip(value);
27911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (strip != NULL) {
27921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAddRef(NULL, node->doc, strip, attr);
27931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlFree(strip);
27941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else
27951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAddRef(NULL, node->doc, value, attr);
27961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_IDREF;
27971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2799b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_IDREFS:
28001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef,
28011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
28021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret < 0)
28031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 2;
28041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
28051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
28061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
28071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
28081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
2809249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard
28101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_IDREFS;
28111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
28121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
28131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_ENTITY:{
28141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *strip;
28151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateNCName(value, 1);
28171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((node == NULL) || (node->doc == NULL))
28181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 3;
28191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret == 0) {
28201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlEntityPtr ent;
28211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    strip = xmlSchemaStrip(value);
28231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (strip != NULL) {
28241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ent = xmlGetDocEntity(node->doc, strip);
28251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(strip);
28261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
28271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ent = xmlGetDocEntity(node->doc, value);
28281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
28291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((ent == NULL) ||
28301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        (ent->etype !=
28311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         XML_EXTERNAL_GENERAL_UNPARSED_ENTITY))
28321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 4;
28331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (val != NULL)) {
28351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    TODO;
28361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (node != NULL) &&
28381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    (node->type == XML_ATTRIBUTE_NODE)) {
28391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAttrPtr attr = (xmlAttrPtr) node;
2840a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard
28411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    attr->atype = XML_ATTRIBUTE_ENTITY;
28421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
28441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2845b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_ENTITIES:
28461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((node == NULL) || (node->doc == NULL))
28471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return3;
28481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef,
28491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
28501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret <= 0)
28511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 1;
28521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
28531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
28541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
28551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
28561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
28571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_ENTITIES;
28591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
28601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
28611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_NOTATION:{
28621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *uri = NULL;
28631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *local = NULL;
28641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateQName(value, 1);
28661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (node != NULL)) {
28671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *prefix;
28681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    local = xmlSplitQName2(value, &prefix);
28701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL) {
28711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlNsPtr ns;
28721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ns = xmlSearchNs(node->doc, node, prefix);
28741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (ns == NULL)
28751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            ret = 1;
28761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        else if (val != NULL)
28771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            uri = xmlStrdup(ns->href);
28781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
28791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((local != NULL) && ((val == NULL) || (ret != 0)))
28801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(local);
28811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL)
28821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(prefix);
28831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((node == NULL) || (node->doc == NULL))
28851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 3;
28861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret == 0) {
28871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = xmlValidateNotationUse(NULL, node->doc, value);
28881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (ret == 1)
28891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 0;
28901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else
28911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 1;
28921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (val != NULL)) {
28941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION);
28951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
28961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (local != NULL)
28971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.name = local;
28981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        else
28991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.name = xmlStrdup(value);
29001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (uri != NULL)
29011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.uri = uri;
29021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
29031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
29041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
29051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (local != NULL)
29061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            xmlFree(local);
29071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (uri != NULL)
29081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            xmlFree(uri);
29091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
29101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
29111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
29121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
2913560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard            }
2914f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard        case XML_SCHEMAS_ANYURI:{
291511c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                if (*value != 0) {
29164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlURIPtr uri;
2917933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre		    xmlChar *tmpval, *cur;
2918f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		    if (normOnTheFly) {
29194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			norm = xmlSchemaCollapseString(value);
29204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if (norm != NULL)
29214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    value = norm;
29224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
2923933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre		    tmpval = xmlStrdup(value);
2924933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre		    for (cur = tmpval; *cur; ++cur) {
2925933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre			if (*cur < 32 || *cur >= 127 || *cur == ' ' ||
2926933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre			    *cur == '<' || *cur == '>' || *cur == '"' ||
2927933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre			    *cur == '{' || *cur == '}' || *cur == '|' ||
2928933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre			    *cur == '\\' || *cur == '^' || *cur == '`' ||
2929933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre			    *cur == '\'')
2930933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre			    *cur = '_';
2931933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre		    }
2932933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre                    uri = xmlParseURI((const char *) tmpval);
2933933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre		    xmlFree(tmpval);
293411c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    if (uri == NULL)
293511c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                        goto return1;
293611c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    xmlFreeURI(uri);
293711c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                }
2938560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
29391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
294011c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_ANYURI);
294111c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    if (v == NULL)
294211c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                        goto error;
294311c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    v->value.str = xmlStrdup(value);
294411c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    *val = v;
29451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
29461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
29471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
29481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_HEXBINARY:{
29498dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik                const xmlChar *cur = value, *start;
29501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *base;
29511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int total, i = 0;
2952560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
2953f34a20e69dc675cd23d3eb558cad135ea280f472Daniel Veillard                if (cur == NULL)
29541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
2955560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
29564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
29574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
29584efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
29598dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik		start = cur;
29601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                while (((*cur >= '0') && (*cur <= '9')) ||
29611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                       ((*cur >= 'A') && (*cur <= 'F')) ||
29621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                       ((*cur >= 'a') && (*cur <= 'f'))) {
29631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    i++;
29641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
29651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
29664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
29674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
2968560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
29691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
29701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
29711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((i % 2) != 0)
297270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard                    goto return1;
2973560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
29741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
29751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
29761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY);
29771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v == NULL)
29781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
29794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    /*
29804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    * Copy only the normalized piece.
29814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    * CRITICAL TODO: Check this.
29824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    */
29838dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik                    cur = xmlStrndup(start, i);
29841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (cur == NULL) {
2985d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard		        xmlSchemaTypeErrMemory(node, "allocating hexbin data");
29861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(v);
29871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
29881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
29891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
29901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total = i / 2;      /* number of octets */
299170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
29921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    base = (xmlChar *) cur;
29931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while (i-- > 0) {
29941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (*base >= 'a')
29951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            *base = *base - ('a' - 'A');
29961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        base++;
29971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
299870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
29991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.hex.str = (xmlChar *) cur;
30001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.hex.total = total;
30011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
30021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
30031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
30041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
30051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BASE64BINARY:{
30061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /* ISSUE:
3007f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard                 *
30081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Ignore all stray characters? (yes, currently)
30091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Worry about long lines? (no, currently)
3010f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard                 *
30111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * rfc2045.txt:
3012f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard                 *
30131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * "The encoded output stream must be represented in lines of
30141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * no more than 76 characters each.  All line breaks or other
30151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * characters not found in Table 1 must be ignored by decoding
30161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * software.  In base64 data, characters other than those in
30171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Table 1, line breaks, and other white space probably
30181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * indicate a transmission error, about which a warning
30191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * message or even a message rejection might be appropriate
30201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * under some circumstances." */
30211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
30221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *base;
30231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int total, i = 0, pad = 0;
30241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
30261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
30271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                for (; *cur; ++cur) {
30291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
30301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    decc = _xmlSchemaBase64Decode(*cur);
30321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc < 0) ;
30331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (decc < 64)
30341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        i++;
30351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else
30361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        break;
30371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
30381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                for (; *cur; ++cur) {
30391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
30401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    decc = _xmlSchemaBase64Decode(*cur);
30421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc < 0) ;
30431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (decc < 64)
30441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc == 64)
30461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        pad++;
30471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
30481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /* rfc2045.txt: "Special processing is performed if fewer than
30501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * 24 bits are available at the end of the data being encoded.
30511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * A full encoding quantum is always completed at the end of a
30521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * body.  When fewer than 24 input bits are available in an
30531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * input group, zero bits are added (on the right) to form an
30541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * integral number of 6-bit groups.  Padding at the end of the
30551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * data is performed using the "=" character.  Since all
30561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * base64 input is an integral number of octets, only the
30571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * following cases can arise: (1) the final quantum of
30581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * encoding input is an integral multiple of 24 bits; here,
30591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * the final unit of encoded output will be an integral
30601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * multiple ofindent: Standard input:701: Warning:old style
30611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		 * assignment ambiguity in "=*".  Assuming "= *" 4 characters
30621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		 * with no "=" padding, (2) the final
30631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * quantum of encoding input is exactly 8 bits; here, the
30641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * final unit of encoded output will be two characters
30651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * followed by two "=" padding characters, or (3) the final
30661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * quantum of encoding input is exactly 16 bits; here, the
30671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * final unit of encoded output will be three characters
30681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * followed by one "=" padding character." */
30691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                total = 3 * (i / 4);
30711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (pad == 0) {
30721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 0)
30731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (pad == 1) {
30751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
30761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 3)
30781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (decc = _xmlSchemaBase64Decode(*cur);
30801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         (decc < 0) || (decc > 63);
30811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         decc = _xmlSchemaBase64Decode(*cur))
30821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        --cur;
30831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 16bits in 24bits means 2 pad bits: nnnnnn nnmmmm mmmm00*/
30841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 00111100 -> 0x3c */
30851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc & ~0x3c)
30861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total += 2;
30881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (pad == 2) {
30891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
30901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 2)
30921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (decc = _xmlSchemaBase64Decode(*cur);
30941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         (decc < 0) || (decc > 63);
30951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         decc = _xmlSchemaBase64Decode(*cur))
30961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        --cur;
30971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 8bits in 12bits means 4 pad bits: nnnnnn nn0000 */
30981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 00110000 -> 0x30 */
30991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc & ~0x30)
31001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total += 1;
31021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else
31031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
31041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
31051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
31061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_BASE64BINARY);
31071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v == NULL)
31081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
31091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    base =
31101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        (xmlChar *) xmlMallocAtomic((i + pad + 1) *
31111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                                    sizeof(xmlChar));
31121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (base == NULL) {
3113d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard		        xmlSchemaTypeErrMemory(node, "allocating base64 data");
31141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(v);
31151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
31171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.base64.str = base;
31181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (cur = value; *cur; ++cur)
31191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (_xmlSchemaBase64Decode(*cur) >= 0) {
31201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            *base = *cur;
31211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            ++base;
31221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
31231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *base = 0;
31241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.base64.total = total;
31251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
31261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
31271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
312870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard            }
3129e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_INTEGER:
3130e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_PINTEGER:
3131e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_NPINTEGER:
3132e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_NINTEGER:
31331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_NNINTEGER:{
31341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
31351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
3136ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                int sign = 0;
31371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
31381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
31391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
31404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
31414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
31421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
31431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    sign = 1;
31441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
31451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (*cur == '+')
31461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
3147ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
3148bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard                if (ret < 0)
3149ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
31504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
31514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
3152ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (*cur != 0)
3153ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
315401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_NPINTEGER) {
31551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) &&
31561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ((hi != 0) || (mi != 0) || (lo != 0)))
31571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
315801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_PINTEGER) {
31591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (sign == 1)
31601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((hi == 0) && (mi == 0) && (lo == 0))
31621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
316301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_NINTEGER) {
31641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (sign == 0)
31651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((hi == 0) && (mi == 0) && (lo == 0))
31671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
316801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_NNINTEGER) {
31691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) &&
31701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ((hi != 0) || (mi != 0) || (lo != 0)))
31711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
31736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                if (val != NULL) {
317401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
31751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
3176c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			if (ret == 0)
3177c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    ret++;
31781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
31796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                        v->value.decimal.mi = mi;
31806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                        v->value.decimal.hi = hi;
31811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = sign;
31821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
3183ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                        v->value.decimal.total = ret;
31841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
31851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
31861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
31871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
31881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
3189e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_LONG:
3190e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_BYTE:
3191e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_SHORT:
31921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_INT:{
3193bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard                const xmlChar *cur = value;
31941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
31951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int sign = 0;
31961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
31971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
31981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
31991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
32001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    sign = 1;
32011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
32021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (*cur == '+')
32031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
3204ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
3205ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (ret < 0)
3206ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
3207ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (*cur != 0)
3208ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
320901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_LONG) {
32101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi >= 922) {
32111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (hi > 922)
32121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
32131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi >= 33720368) {
32141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (mi > 33720368)
32151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
32161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if ((sign == 0) && (lo > 54775807))
32171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
32181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if ((sign == 1) && (lo > 54775808))
32191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
32201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
32211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
322201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_INT) {
32231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi != 0)
32241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (mi >= 21) {
32261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi > 21)
32271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
32281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if ((sign == 0) && (lo > 47483647))
32291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
32301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if ((sign == 1) && (lo > 47483648))
32311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
32321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
323301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_SHORT) {
32341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
32351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) && (lo > 32768))
32371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) && (lo > 32767))
32391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
324001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_BYTE) {
32411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
32421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) && (lo > 128))
32441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) && (lo > 127))
32461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
32481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
324901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
32501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
32511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
32526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                        v->value.decimal.mi = mi;
32536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                        v->value.decimal.hi = hi;
32541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = sign;
32551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
3256ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                        v->value.decimal.total = ret;
32571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
32581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
32591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
32601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
32611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
3262e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_UINT:
3263e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_ULONG:
3264e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_USHORT:
32651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_UBYTE:{
32661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
32671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
32681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
32691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
32701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
3271ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
3272ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (ret < 0)
3273ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
3274ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (*cur != 0)
3275ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
327601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_ULONG) {
32771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi >= 1844) {
32781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (hi > 1844)
32791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
32801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi >= 67440737) {
32811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (mi > 67440737)
32821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
32831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (lo > 9551615)
32841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
32851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
32861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
328701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_UINT) {
32881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi != 0)
32891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (mi >= 42) {
32911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi > 42)
32921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
32931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (lo > 94967295)
32941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
32951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
329601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_USHORT) {
32971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
32981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (lo > 65535)
33001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
330101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_UBYTE) {
33021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
33031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
33041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (lo > 255)
33051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
33061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
33071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
330801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
33091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
33101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
33111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.mi = mi;
33121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.hi = hi;
33131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = 0;
33141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
3315ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                        v->value.decimal.total = ret;
33161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
33171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
33181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
33191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
33201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
33214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
3322b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
33231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  done:
33241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
33251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
33261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (ret);
33271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return3:
33281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
33291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
33301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (3);
33311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return1:
33321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
33331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
33341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (1);
33351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return0:
33361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
33371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
33381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (0);
33391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  error:
33401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
33411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
33421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (-1);
3343b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
3344b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
3345b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
3346b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValPredefTypeNode:
3347b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @type: the predefined type
3348b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: the value to check
3349b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @val:  the return computed value
3350b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @node:  the node containing the value
3351b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
3352b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the predefined type.
3353b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * if true a value is computed and returned in @val.
3354b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
3355b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns 0 if this validates, a positive error code number otherwise
3356b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *         and -1 in case of internal or API error.
3357b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
3358b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardint
3359b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value,
3360b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	                   xmlSchemaValPtr *val, xmlNodePtr node) {
33614efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return(xmlSchemaValAtomicType(type, value, val, node, 0,
33624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 1, 0));
33634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
33644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
33654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
3366c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaValPredefTypeNodeNoNorm:
3367c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the predefined type
3368c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the value to check
3369c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val:  the return computed value
3370c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @node:  the node containing the value
3371c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
3372c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Check that a value conforms to the lexical space of the predefined type.
3373c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * if true a value is computed and returned in @val.
3374c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * This one does apply any normalization to the value.
3375c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
3376c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
3377c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *         and -1 in case of internal or API error.
3378c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */
3379c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardint
3380c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, const xmlChar *value,
3381c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard				 xmlSchemaValPtr *val, xmlNodePtr node) {
33824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return(xmlSchemaValAtomicType(type, value, val, node, 1,
33834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 0, 1));
3384c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
3385c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
3386c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/**
3387c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * xmlSchemaValidatePredefinedType:
3388c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @type: the predefined type
3389c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @value: the value to check
3390c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @val:  the return computed value
3391c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *
3392c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Check that a value conforms to the lexical space of the predefined type.
3393c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * if true a value is computed and returned in @val.
3394c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *
3395c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
3396c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *         and -1 in case of internal or API error.
3397c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard */
3398c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillardint
3399c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel VeillardxmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value,
3400c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard	                        xmlSchemaValPtr *val) {
3401c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard    return(xmlSchemaValPredefTypeNode(type, value, val, NULL));
3402c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard}
3403c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard
3404c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard/**
34054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareDecimals:
34064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x:  a first decimal value
34074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y:  a second decimal value
34084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
34094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 decimals
34104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
34114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error
34124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
34134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int
34144255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y)
34154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{
34164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValPtr swp;
3417273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    int order = 1, integx, integy, dlen;
3418273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    unsigned long hi, mi, lo;
34194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
3420273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    /*
3421273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * First test: If x is -ve and not zero
3422273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     */
3423f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    if ((x->value.decimal.sign) &&
3424e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	((x->value.decimal.lo != 0) ||
3425e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	 (x->value.decimal.mi != 0) ||
3426e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	 (x->value.decimal.hi != 0))) {
3427273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	/*
3428273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	 * Then if y is -ve and not zero reverse the compare
3429273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	 */
3430e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	if ((y->value.decimal.sign) &&
3431e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    ((y->value.decimal.lo != 0) ||
3432e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	     (y->value.decimal.mi != 0) ||
3433e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	     (y->value.decimal.hi != 0)))
343480b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    order = -1;
3435273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	/*
3436273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	 * Otherwise (y >= 0) we have the answer
3437273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	 */
343880b19092f24410a6b869abf519227686e8f207caDaniel Veillard	else
343980b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    return (-1);
3440273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    /*
3441273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * If x is not -ve and y is -ve we have the answer
3442273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     */
3443e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    } else if ((y->value.decimal.sign) &&
3444e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	       ((y->value.decimal.lo != 0) ||
3445e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		(y->value.decimal.mi != 0) ||
3446e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		(y->value.decimal.hi != 0))) {
34474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (1);
344880b19092f24410a6b869abf519227686e8f207caDaniel Veillard    }
3449273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    /*
3450273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * If it's not simply determined by a difference in sign,
3451273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * then we need to compare the actual values of the two nums.
3452273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * To do this, we start by looking at the integral parts.
3453273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * If the number of integral digits differ, then we have our
3454273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * answer.
3455273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     */
3456273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    integx = x->value.decimal.total - x->value.decimal.frac;
3457273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    integy = y->value.decimal.total - y->value.decimal.frac;
345872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    /*
345972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    * NOTE: We changed the "total" for values like "0.1"
346072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    *   (or "-0.1" or ".1") to be 1, which was 2 previously.
346172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    *   Therefore the special case, when such values are
346272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    *   compared with 0, needs to be handled separately;
346372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    *   otherwise a zero would be recognized incorrectly as
346472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    *   greater than those values. This has the nice side effect
346572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    *   that we gain an overall optimized comparison with zeroes.
346672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    * Note that a "0" has a "total" of 1 already.
346772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    */
346872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    if (integx == 1) {
346972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	if (x->value.decimal.lo == 0) {
347072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	    if (integy != 1)
347172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		return -order;
347272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	    else if (y->value.decimal.lo != 0)
347372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		return -order;
347472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	    else
347572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		return(0);
347672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	}
347772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    }
347872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    if (integy == 1) {
347972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	if (y->value.decimal.lo == 0) {
348072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	    if (integx != 1)
348172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		return order;
348272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	    else if (x->value.decimal.lo != 0)
348372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		return order;
348472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	    else
348572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		return(0);
348672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	}
348772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    }
348872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik
3489273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    if (integx > integy)
3490273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	return order;
3491273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    else if (integy > integx)
3492273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	return -order;
349372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik
3494273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    /*
3495273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * If the number of integral digits is the same for both numbers,
3496273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * then things get a little more complicated.  We need to "normalize"
3497273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * the numbers in order to properly compare them.  To do this, we
3498273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * look at the total length of each number (length => number of
3499273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * significant digits), and divide the "shorter" by 10 (decreasing
3500273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * the length) until they are of equal length.
3501273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     */
3502273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    dlen = x->value.decimal.total - y->value.decimal.total;
3503273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    if (dlen < 0) {	/* y has more digits than x */
3504273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	swp = x;
3505273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	hi = y->value.decimal.hi;
3506273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	mi = y->value.decimal.mi;
3507273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	lo = y->value.decimal.lo;
3508273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	dlen = -dlen;
3509273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	order = -order;
3510273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    } else {		/* x has more digits than y */
3511273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	swp = y;
3512273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	hi = x->value.decimal.hi;
3513273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	mi = x->value.decimal.mi;
3514273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	lo = x->value.decimal.lo;
3515273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    }
3516273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    while (dlen > 8) {	/* in effect, right shift by 10**8 */
3517273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	lo = mi;
3518273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	mi = hi;
3519273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	hi = 0;
3520273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	dlen -= 8;
35214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
3522273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    while (dlen > 0) {
3523273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	unsigned long rem1, rem2;
3524273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	rem1 = (hi % 10) * 100000000L;
3525273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	hi = hi / 10;
3526273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	rem2 = (mi % 10) * 100000000L;
3527273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	mi = (mi + rem1) / 10;
3528273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	lo = (lo + rem2) / 10;
3529273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	dlen--;
3530273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    }
3531273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    if (hi > swp->value.decimal.hi) {
3532273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	return order;
3533273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    } else if (hi == swp->value.decimal.hi) {
3534273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	if (mi > swp->value.decimal.mi) {
3535273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	    return order;
3536273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	} else if (mi == swp->value.decimal.mi) {
3537273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	    if (lo > swp->value.decimal.lo) {
3538273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		return order;
3539273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	    } else if (lo == swp->value.decimal.lo) {
3540273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		if (x->value.decimal.total == y->value.decimal.total) {
3541273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		    return 0;
3542273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		} else {
3543273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		    return order;
3544273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		}
3545273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	    }
3546273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	}
35474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
3548273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    return -order;
35494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
35504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
35514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
3552070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xmlSchemaCompareDurations:
3553070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @x:  a first duration value
3554070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @y:  a second duration value
3555070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
3556070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Compare 2 durations
3557070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
3558070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
3559070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * case of error
3560070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
3561070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
3562070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel VeillardxmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y)
3563070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard{
3564070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long carry, mon, day;
3565070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    double sec;
356680b19092f24410a6b869abf519227686e8f207caDaniel Veillard    int invert = 1;
356780b19092f24410a6b869abf519227686e8f207caDaniel Veillard    long xmon, xday, myear, minday, maxday;
3568070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    static const long dayRange [2][12] = {
3569070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        { 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, },
3570070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} };
3571070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3572070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((x == NULL) || (y == NULL))
35735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return -2;
3574070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3575070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* months */
3576070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    mon = x->value.dur.mon - y->value.dur.mon;
3577070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3578070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* seconds */
3579070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    sec = x->value.dur.sec - y->value.dur.sec;
3580bbcf1275fec28915b170db31fa9ea9bed0ea39a4Daniel Veillard    carry = (long)(sec / SECS_PER_DAY);
3581bbcf1275fec28915b170db31fa9ea9bed0ea39a4Daniel Veillard    sec -= ((double)carry) * SECS_PER_DAY;
3582070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3583070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* days */
3584070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    day = x->value.dur.day - y->value.dur.day + carry;
3585070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3586070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* easy test */
3587070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (mon == 0) {
3588070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (day == 0)
3589070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (sec == 0.0)
3590070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 0;
3591070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else if (sec < 0.0)
3592070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return -1;
3593070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else
3594070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 1;
3595070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else if (day < 0)
3596070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return -1;
3597070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else
3598070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return 1;
3599070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
3600070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3601070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (mon > 0) {
3602070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if ((day >= 0) && (sec >= 0.0))
3603070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return 1;
3604070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else {
3605070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            xmon = mon;
3606070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            xday = -day;
3607070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        }
3608070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    } else if ((day <= 0) && (sec <= 0.0)) {
3609070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        return -1;
3610070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    } else {
361180b19092f24410a6b869abf519227686e8f207caDaniel Veillard	invert = -1;
3612070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xmon = -mon;
3613070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xday = day;
3614070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
3615070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3616070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    myear = xmon / 12;
361780b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (myear == 0) {
361880b19092f24410a6b869abf519227686e8f207caDaniel Veillard	minday = 0;
361980b19092f24410a6b869abf519227686e8f207caDaniel Veillard	maxday = 0;
362080b19092f24410a6b869abf519227686e8f207caDaniel Veillard    } else {
362180b19092f24410a6b869abf519227686e8f207caDaniel Veillard	maxday = 366 * ((myear + 3) / 4) +
362280b19092f24410a6b869abf519227686e8f207caDaniel Veillard	         365 * ((myear - 1) % 4);
362380b19092f24410a6b869abf519227686e8f207caDaniel Veillard	minday = maxday - 1;
362480b19092f24410a6b869abf519227686e8f207caDaniel Veillard    }
362580b19092f24410a6b869abf519227686e8f207caDaniel Veillard
3626070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmon = xmon % 12;
3627070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    minday += dayRange[0][xmon];
3628070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    maxday += dayRange[1][xmon];
3629070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
363080b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if ((maxday == minday) && (maxday == xday))
363180b19092f24410a6b869abf519227686e8f207caDaniel Veillard	return(0); /* can this really happen ? */
3632070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (maxday < xday)
363380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        return(-invert);
363480b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (minday > xday)
363580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        return(invert);
3636070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3637070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* indeterminate */
36385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return 2;
36395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
36405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
36415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/*
36425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * macros for adding date/times and durations
36435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
36445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT(a,b)                  (floor(((double)a/(double)b)))
36455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO(a,b)                     (a - FQUOTIENT(a,b) * b)
36465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT_RANGE(a,low,high)     (FQUOTIENT((a-low),(high-low)))
36475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO_RANGE(a,low,high)        ((MODULO((a-low),(high-low)))+low)
36485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
36495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
3650669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * xmlSchemaDupVal:
3651669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @v: the #xmlSchemaValPtr value to duplicate
3652669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard *
3653669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Makes a copy of @v. The calling program is responsible for freeing
3654669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the returned value.
3655669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard *
3656669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * returns a pointer to a duplicated #xmlSchemaValPtr or NULL if error.
3657669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard */
3658669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillardstatic xmlSchemaValPtr
3659669adfcd3af5dfda873b10119d44202a7450bb20Daniel VeillardxmlSchemaDupVal (xmlSchemaValPtr v)
3660669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard{
3661669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaValPtr ret = xmlSchemaNewValue(v->type);
3662669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    if (ret == NULL)
3663669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        return NULL;
3664f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
3665669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    memcpy(ret, v, sizeof(xmlSchemaVal));
36664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->next = NULL;
3667669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    return ret;
3668669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard}
3669669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard
3670669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard/**
3671285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * xmlSchemaCopyValue:
3672285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * @val:  the precomputed value to be copied
3673285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik *
3674285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Copies the precomputed value. This duplicates any string within.
3675285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik *
3676285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Returns the copy or NULL if a copy for a data-type is not implemented.
3677285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik */
3678285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaValPtr
3679285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaCopyValue(xmlSchemaValPtr val)
3680285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik{
36814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaValPtr ret = NULL, prev = NULL, cur;
3682285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik
3683285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    /*
3684285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    * Copy the string values.
3685285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    */
36864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    while (val != NULL) {
36874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	switch (val->type) {
36884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYTYPE:
36894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_IDREFS:
36904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ENTITIES:
36914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NMTOKENS:
36924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		xmlSchemaFreeValue(ret);
36934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		return (NULL);
36944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYSIMPLETYPE:
36954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_STRING:
36964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NORMSTRING:
36974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_TOKEN:
36984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_LANGUAGE:
36994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NAME:
37004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NCNAME:
37014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ID:
37024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_IDREF:
37034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ENTITY:
37044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NMTOKEN:
37054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYURI:
37064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
37074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.str != NULL)
37084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.str = xmlStrdup(BAD_CAST val->value.str);
37094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
3710f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    case XML_SCHEMAS_QNAME:
37114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NOTATION:
37124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
37134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.qname.name != NULL)
37144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.qname.name =
3715285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                    xmlStrdup(BAD_CAST val->value.qname.name);
37164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.qname.uri != NULL)
37174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.qname.uri =
3718285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                    xmlStrdup(BAD_CAST val->value.qname.uri);
37194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
37204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_HEXBINARY:
37214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
37224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.hex.str != NULL)
37234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.hex.str = xmlStrdup(BAD_CAST val->value.hex.str);
37244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
37254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_BASE64BINARY:
37264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
37274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.base64.str != NULL)
37284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.base64.str =
3729285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                    xmlStrdup(BAD_CAST val->value.base64.str);
37304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
37314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    default:
37324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
37334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
37344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	}
37354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	if (ret == NULL)
37364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    ret = cur;
37374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	else
37384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    prev->next = cur;
37394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	prev = cur;
37404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	val = val->next;
3741285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    }
37424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (ret);
3743285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik}
3744285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik
3745285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik/**
37465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateAdd:
37475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr
37485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dur: an #xmlSchemaValPtr of type #XS_DURATION
37495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
37505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compute a new date/time from @dt and @dur. This function assumes @dt
37515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH,
3752669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * or #XML_SCHEMAS_GYEAR. The returned #xmlSchemaVal is the same type as
3753669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt. The calling program is responsible for freeing the returned value.
37545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3755669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a pointer to a new #xmlSchemaVal or NULL if error.
37565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
37575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr
37585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur)
37595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
3760669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaValPtr ret, tmp;
37615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long carry, tempdays, temp;
37625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValDatePtr r, d;
37635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValDurationPtr u;
37645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((dt == NULL) || (dur == NULL))
37665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
37675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ret = xmlSchemaNewValue(dt->type);
37695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret == NULL)
37705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
37715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3772669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    /* make a copy so we don't alter the original value */
3773669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    tmp = xmlSchemaDupVal(dt);
3774669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    if (tmp == NULL) {
3775669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        xmlSchemaFreeValue(ret);
3776669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        return NULL;
3777669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    }
3778669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard
37795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r = &(ret->value.date);
3780669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    d = &(tmp->value.date);
37815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    u = &(dur->value.dur);
37825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalization */
37845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (d->mon == 0)
37855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        d->mon = 1;
37865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalize for time zone offset */
37885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    u->sec -= (d->tzo * 60);
37895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    d->tzo = 0;
37905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalization */
37925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (d->day == 0)
37935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        d->day = 1;
37945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* month */
37965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry  = d->mon + u->mon;
3797ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->mon = (unsigned int) MODULO_RANGE(carry, 1, 13);
3798ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT_RANGE(carry, 1, 13);
37995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* year (may be modified later) */
38015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->year = d->year + carry;
38025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (r->year == 0) {
38035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (d->year > 0)
38045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            r->year--;
38055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else
38065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            r->year++;
38075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
38085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* time zone */
38105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->tzo     = d->tzo;
38115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->tz_flag = d->tz_flag;
38125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* seconds */
38145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->sec = d->sec + u->sec;
3815ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT((long)r->sec, 60);
38165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (r->sec != 0.0) {
38175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        r->sec = MODULO(r->sec, 60.0);
38185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
38195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* minute */
38215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry += d->min;
3822ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->min = (unsigned int) MODULO(carry, 60);
3823ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT(carry, 60);
38245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* hours */
38265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry  += d->hour;
3827ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->hour = (unsigned int) MODULO(carry, 24);
3828ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry   = (long)FQUOTIENT(carry, 24);
38295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
38315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * days
38325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * Note we use tempdays because the temporary values may need more
38335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * than 5 bits
38345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
38355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) &&
38365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                  (d->day > MAX_DAYINMONTH(r->year, r->mon)))
38375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = MAX_DAYINMONTH(r->year, r->mon);
38385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (d->day < 1)
38395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = 1;
38405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else
38415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = d->day;
38425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    tempdays += u->day + carry;
38445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    while (1) {
38465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (tempdays < 1) {
38475e9576a492e4fb8c2d517ccd6056a139e801ec9fDaniel Veillard            long tmon = (long) MODULO_RANGE((int)r->mon-1, 1, 13);
38485e9576a492e4fb8c2d517ccd6056a139e801ec9fDaniel Veillard            long tyr  = r->year + (long)FQUOTIENT_RANGE((int)r->mon-1, 1, 13);
38495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (tyr == 0)
38505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                tyr--;
385114b5643947845df089376106517c4f7ba061e4b0Daniel Veillard	    /*
3852f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	     * Coverity detected an overrun in daysInMonth
385314b5643947845df089376106517c4f7ba061e4b0Daniel Veillard	     * of size 12 at position 12 with index variable "((r)->mon - 1)"
385414b5643947845df089376106517c4f7ba061e4b0Daniel Veillard	     */
385530cf439efcea9732d0ecd33b7955666ce264129bDavid Kilzer	    if (tmon < 1)
385630cf439efcea9732d0ecd33b7955666ce264129bDavid Kilzer	        tmon = 1;
385714b5643947845df089376106517c4f7ba061e4b0Daniel Veillard	    if (tmon > 12)
385814b5643947845df089376106517c4f7ba061e4b0Daniel Veillard	        tmon = 12;
38595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            tempdays += MAX_DAYINMONTH(tyr, tmon);
38605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            carry = -1;
38614ba5d3176938d3435ddc7347cdc904658e2999eePhilip Withnall        } else if (VALID_YEAR(r->year) && VALID_MONTH(r->mon) &&
38624ba5d3176938d3435ddc7347cdc904658e2999eePhilip Withnall                   tempdays > (long) MAX_DAYINMONTH(r->year, r->mon)) {
38635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon);
38645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            carry = 1;
38655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        } else
38665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
38675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        temp = r->mon + carry;
3869ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard        r->mon = (unsigned int) MODULO_RANGE(temp, 1, 13);
3870ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard        r->year = r->year + (unsigned int) FQUOTIENT_RANGE(temp, 1, 13);
38715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (r->year == 0) {
38725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (temp < 1)
38735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                r->year--;
38745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else
38755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                r->year++;
38765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	}
38775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
3878f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
38795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->day = tempdays;
38805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
38825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * adjust the date/time type to the date values
38835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
38845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret->type != XML_SCHEMAS_DATETIME) {
38855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if ((r->hour) || (r->min) || (r->sec))
38865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ret->type = XML_SCHEMAS_DATETIME;
38875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (ret->type != XML_SCHEMAS_DATE) {
38885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if ((r->mon != 1) && (r->day != 1))
38895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                ret->type = XML_SCHEMAS_DATE;
38905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1))
38915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                ret->type = XML_SCHEMAS_GYEARMONTH;
38925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
38935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
38945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3895669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaFreeValue(tmp);
38965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
38985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
38995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
39015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaDateNormalize:
3902669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt: an #xmlSchemaValPtr of a date/time type value.
3903669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @offset: number of seconds to adjust @dt by.
39045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3905669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Normalize @dt to GMT time. The @offset parameter is subtracted from
3906669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the return value is a time-zone offset is present on @dt.
39075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3908669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a normalized copy of @dt or NULL if error.
39095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
39105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr
39115a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset)
39125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
39135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValPtr dur, ret;
39145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dt == NULL)
39165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
39175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (((dt->type != XML_SCHEMAS_TIME) &&
3919c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik         (dt->type != XML_SCHEMAS_DATETIME) &&
3920c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	 (dt->type != XML_SCHEMAS_DATE)) || (dt->value.date.tzo == 0))
39215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return xmlSchemaDupVal(dt);
39225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION);
39245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dur == NULL)
39255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
39265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    dur->value.date.sec -= offset;
39285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ret = _xmlSchemaDateAdd(dt, dur);
39305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret == NULL)
39315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
39325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaFreeValue(dur);
39345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* ret->value.date.tzo = 0; */
39365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
39375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
39385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
39405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateCastYMToDays:
39415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr
39425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3943f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Convert mon and year of @dt to total number of days. Take the
39445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * number of years since (or before) 1 AD and add the number of leap
39455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years. This is a function  because negative
39465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years must be handled a little differently and there is no zero year.
39475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
39485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns number of days.
39495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
39505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic long
39515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt)
39525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
39535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long ret;
395449e8963c640865343327c67d4755a1af705717d3Daniel Veillard    int mon;
39555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
395649e8963c640865343327c67d4755a1af705717d3Daniel Veillard    mon = dt->value.date.mon;
395749e8963c640865343327c67d4755a1af705717d3Daniel Veillard    if (mon <= 0) mon = 1; /* normalization */
395849e8963c640865343327c67d4755a1af705717d3Daniel Veillard
395949e8963c640865343327c67d4755a1af705717d3Daniel Veillard    if (dt->value.date.year <= 0)
39605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ret = (dt->value.date.year * 365) +
39615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+
39625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard               ((dt->value.date.year+1)/400)) +
396349e8963c640865343327c67d4755a1af705717d3Daniel Veillard              DAY_IN_YEAR(0, mon, dt->value.date.year);
39645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else
39655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ret = ((dt->value.date.year-1) * 365) +
39665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+
39675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard               ((dt->value.date.year-1)/400)) +
396849e8963c640865343327c67d4755a1af705717d3Daniel Veillard              DAY_IN_YEAR(0, mon, dt->value.date.year);
39695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
39715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
39725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
39745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * TIME_TO_NUMBER:
39755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt:  an #xmlSchemaValPtr
39765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
39775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Calculates the number of seconds in the time portion of @dt.
39785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
39795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns seconds.
39805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
39815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define TIME_TO_NUMBER(dt)                              \
39825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ((double)((dt->value.date.hour * SECS_PER_HOUR) +   \
3983b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard              (dt->value.date.min * SECS_PER_MIN) +	\
3984b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard              (dt->value.date.tzo * SECS_PER_MIN)) +	\
3985b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard               dt->value.date.sec)
39865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
39885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaCompareDates:
39895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @x:  a first date/time value
39905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @y:  a second date/time value
39915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
39925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compare 2 date/times
39935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
39945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
39955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error
39965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
39975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic int
39985a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y)
39995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
40005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    unsigned char xmask, ymask, xor_mask, and_mask;
40015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValPtr p1, p2, q1, q2;
40025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long p1d, p2d, q1d, q2d;
40035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((x == NULL) || (y == NULL))
40055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return -2;
40065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (x->value.date.tz_flag) {
40085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (!y->value.date.tz_flag) {
40105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            p1 = xmlSchemaDateNormalize(x, 0);
40115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
40125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            /* normalize y + 14:00 */
40135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR));
40145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
4016fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            if (p1d < q1d) {
4017fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
4018fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
40195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return -1;
4020fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    } else if (p1d == q1d) {
40215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                double sec;
40225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
4024fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard                if (sec < 0.0) {
4025fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		    xmlSchemaFreeValue(p1);
4026fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		    xmlSchemaFreeValue(q1);
40275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    return -1;
4028fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		} else {
40294aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    int ret = 0;
40305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    /* normalize y - 14:00 */
40315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR));
40325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day;
40335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    if (p1d > q2d)
40344aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 1;
40355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    else if (p1d == q2d) {
40365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2);
40375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        if (sec > 0.0)
40384aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                            ret = 1;
40395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        else
40404aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                            ret = 2; /* indeterminate */
40415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    }
40424aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(p1);
40434aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(q1);
40444aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(q2);
40454aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    if (ret != 0)
40464aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		        return(ret);
40475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                }
4048fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            } else {
4049fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
4050fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
4051fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    }
40525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
40535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    } else if (y->value.date.tz_flag) {
40545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1 = xmlSchemaDateNormalize(y, 0);
40555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
40565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        /* normalize x - 14:00 */
40585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR));
40595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
40605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
4061fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard        if (p1d < q1d) {
4062fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(p1);
4063fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(q1);
40645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
4065fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else if (p1d == q1d) {
40665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            double sec;
40675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
4069fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            if (sec < 0.0) {
4070fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
4071fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
40725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return -1;
4073fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    } else {
40744aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	        int ret = 0;
40755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                /* normalize x + 14:00 */
40765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR));
40775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day;
40785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40796560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                if (p2d > q1d) {
40804aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                    ret = 1;
40816560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		} else if (p2d == q1d) {
40825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1);
40835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    if (sec > 0.0)
40844aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 1;
40855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    else
40864aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 2; /* indeterminate */
40875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                }
40886560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(p1);
40896560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(q1);
40906560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(p2);
40914aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		if (ret != 0)
40924aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    return(ret);
40935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            }
4094fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else {
4095fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(p1);
4096fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(q1);
40975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
40985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
40995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
41015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * if the same type then calculate the difference
41025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
41035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (x->type == y->type) {
41044aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard        int ret = 0;
41055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1 = xmlSchemaDateNormalize(y, 0);
41065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
41075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1 = xmlSchemaDateNormalize(x, 0);
41095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
41105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
4111fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard        if (p1d < q1d) {
41124aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard            ret = -1;
4113fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else if (p1d > q1d) {
41144aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard            ret = 1;
4115fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else {
41165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            double sec;
41175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
41195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (sec < 0.0)
41204aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                ret = -1;
41215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else if (sec > 0.0)
41224aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                ret = 1;
4123f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
41245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
41254aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	xmlSchemaFreeValue(p1);
41264aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	xmlSchemaFreeValue(q1);
41274aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard        return(ret);
41285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
41295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    switch (x->type) {
41315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
41325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0xf;
41335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
41355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x7;
41365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
41385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x1;
41395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
41415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x2;
41425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
41445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x3;
41455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
41475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x3;
41485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
41505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x6;
41515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
41535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x8;
41545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        default:
41565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0;
41575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
41595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    switch (y->type) {
41615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
41625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0xf;
41635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
41655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x7;
41665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
41685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x1;
41695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
41715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x2;
41725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
41745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x3;
41755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
41775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x3;
41785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
41805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x6;
41815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
41835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x8;
41845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        default:
41865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0;
41875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
41895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xor_mask = xmask ^ ymask;           /* mark type differences */
41915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    and_mask = xmask & ymask;           /* mark field specification */
41925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* year */
41945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 1)
41955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
41965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 1) {
41975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.year < y->value.date.year)
41985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
41995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.year > y->value.date.year)
42005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
42015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
42025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
42035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* month */
42045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 2)
42055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
42065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 2) {
42075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.mon < y->value.date.mon)
42085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
42095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.mon > y->value.date.mon)
42105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
42115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
42125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
42135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* day */
42145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 4)
42155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
42165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 4) {
42175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.day < y->value.date.day)
42185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
42195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.day > y->value.date.day)
42205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
42215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
42225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
42235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* time */
42245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 8)
42255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
42265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 8) {
42275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.hour < y->value.date.hour)
42285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
42295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.hour > y->value.date.hour)
42305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
42315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.min < y->value.date.min)
42325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
42335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.min > y->value.date.min)
42345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
42355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.sec < y->value.date.sec)
42365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
42375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.sec > y->value.date.sec)
42385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
42395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
42405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
4241070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
4242070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
4243070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
4244070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
42456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveReplaceStrings:
4246478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @x:  a first string value
4247478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @y:  a second string value
42486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @invert: inverts the result if x < y or x > y.
42496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
42506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
42516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is
42526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "replace". I.e. @x could
42536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString".
42546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
42556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
42566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
42576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
42586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
4259478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaComparePreserveReplaceStrings(const xmlChar *x,
4260478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				       const xmlChar *y,
42616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				       int invert)
42626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
42636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
4264f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
4265478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4266478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (IS_WSP_REPLACE_CH(*y)) {
4267478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (! IS_WSP_SPACE_CH(*x)) {
4268478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*x - 0x20) < 0) {
42696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
42706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
42716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
42726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
42736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
42746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
42756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
42766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
42776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
42786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
4279f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    }
42806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
4281478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x - *y;
42826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0) {
42836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
42846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
42856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
42866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
42876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
42886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0) {
42896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
42906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
42916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
42926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
42936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
42946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
4295478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	x++;
4296478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	y++;
42976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4298478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0) {
42996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (invert)
43006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(-1);
43016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	else
43026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(1);
43036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4304478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0) {
43056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (invert)
43066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(1);
43076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	else
43086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(-1);
43096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
43106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
43116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
43126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
43136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
43146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings:
43156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
43166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
43176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
43186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
43196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is
43206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could
43216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString".
43226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
43236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
43246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
43256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
43266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
4327478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaComparePreserveCollapseStrings(const xmlChar *x,
4328478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				        const xmlChar *y,
43296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik					int invert)
43306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
43316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
43326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
4333f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    /*
43346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    * Skip leading blank chars of the collapsed string.
43356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    */
4336478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while IS_WSP_BLANK_CH(*y)
4337478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	y++;
43386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
4339478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4340478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if IS_WSP_BLANK_CH(*y) {
4341478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (! IS_WSP_SPACE_CH(*x)) {
43426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		/*
4343478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* The yv character would have been replaced to 0x20.
43446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*/
4345478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*x - 0x20) < 0) {
43466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
43476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
43486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
43496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
43506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
43516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
43526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
43536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
43546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
43556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
43566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4357478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    x++;
4358478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    y++;
43596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    /*
43606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    * Skip contiguous blank chars of the collapsed string.
43616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    */
4362478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    while IS_WSP_BLANK_CH(*y)
4363478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		y++;
43646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
4365478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x++ - *y++;
43666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0) {
43676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
43686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
43696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
43706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
43716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
43726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0) {
43736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
43746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
43756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
43766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
43776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
43786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
43796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4380478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0) {
43816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 if (invert)
43826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(-1);
43836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 else
43846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(1);
43856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4386478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0) {
43876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	/*
43886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	* Skip trailing blank chars of the collapsed string.
43896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	*/
4390478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*y)
4391478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    y++;
4392478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (*y != 0) {
43936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (invert)
43946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(1);
43956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    else
43966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(-1);
43976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
43986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
43996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
44006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
44016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
44026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
44036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings:
44046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
44056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
44066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
44076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
44086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is
44096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could
44106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString".
44116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
44126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
44136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
44146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
44156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
4416478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareReplaceCollapseStrings(const xmlChar *x,
4417478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				       const xmlChar *y,
44186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				       int invert)
44196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
44206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
44216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
4422f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    /*
44236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    * Skip leading blank chars of the collapsed string.
44246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    */
4425478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while IS_WSP_BLANK_CH(*y)
4426478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	y++;
4427f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
4428478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4429478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if IS_WSP_BLANK_CH(*y) {
4430478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (! IS_WSP_BLANK_CH(*x)) {
44316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		/*
4432478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* The yv character would have been replaced to 0x20.
44336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*/
4434478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*x - 0x20) < 0) {
44356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
44366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
44376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
44386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
44396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
44406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
44416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
44426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
44436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
44446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
44456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4446478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    x++;
4447f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    y++;
4448f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    /*
44496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    * Skip contiguous blank chars of the collapsed string.
44506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    */
4451478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    while IS_WSP_BLANK_CH(*y)
4452478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		y++;
44536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
4454478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if IS_WSP_BLANK_CH(*x) {
44556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		/*
4456478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* The xv character would have been replaced to 0x20.
44576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*/
4458478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((0x20 - *y) < 0) {
44596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
44606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
44616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
44626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
44636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
44646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
44656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
44666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
44676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
44686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
44696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4470478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x++ - *y++;
44716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0)
44726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(-1);
44736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0)
44746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(1);
44756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
44766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4477478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0) {
44786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 if (invert)
44796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(-1);
44806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 else
44816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(1);
4482f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    }
4483478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0) {
44846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	/*
44856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	* Skip trailing blank chars of the collapsed string.
44866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	*/
4487478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*y)
4488478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    y++;
4489478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (*y != 0) {
44906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (invert)
44916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(1);
44926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    else
44936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(-1);
44946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
44956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
44966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
44976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
44986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
44996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
45006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
45016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareReplacedStrings:
45026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
45036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
45046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
45056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
45066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
45076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
45086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
45096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
45106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
4511478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareReplacedStrings(const xmlChar *x,
4512478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				const xmlChar *y)
45136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
45146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
4515f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
4516478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4517478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if IS_WSP_BLANK_CH(*y) {
4518478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (! IS_WSP_BLANK_CH(*x)) {
4519478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*x - 0x20) < 0)
4520f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		    return(-1);
45216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
45226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
4523f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    }
45246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
4525478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if IS_WSP_BLANK_CH(*x) {
4526478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((0x20 - *y) < 0)
4527f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		    return(-1);
45286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
45296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
45306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4531478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x - *y;
45326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0)
4533f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		return(-1);
45346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0)
4535f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		return(1);
45366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
4537478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	x++;
4538478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	y++;
45396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4540478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0)
45416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        return(1);
4542478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0)
45436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        return(-1);
45446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
45456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
45466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
45476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
4548c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaCompareNormStrings:
4549c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @x:  a first string value
4550c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @y:  a second string value
4551c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
4552c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Compare 2 string for their normalized values.
4553c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
4554c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
4555c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * case of error
4556c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */
4557c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int
4558478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareNormStrings(const xmlChar *x,
4559478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    const xmlChar *y) {
4560c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    int tmp;
4561f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
4562478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while (IS_BLANK_CH(*x)) x++;
4563478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while (IS_BLANK_CH(*y)) y++;
4564478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4565478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (IS_BLANK_CH(*x)) {
4566478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (!IS_BLANK_CH(*y)) {
4567478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		tmp = *x - *y;
4568c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(tmp);
4569c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    }
4570478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    while (IS_BLANK_CH(*x)) x++;
4571478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    while (IS_BLANK_CH(*y)) y++;
4572c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	} else {
4573478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x++ - *y++;
4574c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (tmp < 0)
4575c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(-1);
4576c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (tmp > 0)
4577c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(1);
4578c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	}
4579c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
4580478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0) {
4581478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	while (IS_BLANK_CH(*x)) x++;
4582478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (*x != 0)
4583c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    return(1);
4584c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
4585478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0) {
4586478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	while (IS_BLANK_CH(*y)) y++;
4587478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (*y != 0)
4588c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    return(-1);
4589c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
4590c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    return(0);
4591c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard}
4592c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
4593c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/**
4594b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCompareFloats:
4595b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @x:  a first float or double value
4596b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @y:  a second float or double value
4597b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
4598b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Compare 2 values
4599b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
4600b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
4601b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * case of error
4602b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
4603b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int
4604b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) {
4605b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    double d1, d2;
4606b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4607b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if ((x == NULL) || (y == NULL))
4608b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
4609b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4610b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
4611b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * Cast everything to doubles.
4612b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
4613b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (x->type == XML_SCHEMAS_DOUBLE)
4614b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d1 = x->value.d;
4615b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else if (x->type == XML_SCHEMAS_FLOAT)
4616b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d1 = x->value.f;
4617b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else
4618b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
4619b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4620b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (y->type == XML_SCHEMAS_DOUBLE)
4621b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d2 = y->value.d;
4622b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else if (y->type == XML_SCHEMAS_FLOAT)
4623b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d2 = y->value.f;
4624b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else
4625b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
4626b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4627b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
4628b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * Check for special cases.
4629b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
4630b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (xmlXPathIsNaN(d1)) {
4631b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (xmlXPathIsNaN(d2))
4632b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
4633b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(1);
4634b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
4635b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (xmlXPathIsNaN(d2))
4636b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-1);
4637b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == xmlXPathPINF) {
4638b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (d2 == xmlXPathPINF)
4639b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
4640b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(1);
4641b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
4642b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d2 == xmlXPathPINF)
4643b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(-1);
4644b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == xmlXPathNINF) {
4645b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (d2 == xmlXPathNINF)
4646b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
4647b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(-1);
4648b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
4649b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d2 == xmlXPathNINF)
4650b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(1);
4651b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4652b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
4653b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * basic tests, the last one we should have equality, but
4654b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * portability is more important than speed and handling
4655b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * NaN or Inf in a portable way is always a challenge, so ...
4656b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
4657b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 < d2)
4658b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-1);
4659b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 > d2)
4660b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(1);
4661b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == d2)
4662b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(0);
4663b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return(2);
4664b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
4665b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4666b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
46674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareValues:
46684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x:  a first value
46696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xvalue: the first value as a string (optional)
46706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xwtsp: the whitespace type
46714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y:  a second value
46726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xvalue: the second value as a string (optional)
46736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @ywtsp: the whitespace type
46744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
46754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 values
46764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
46774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, 3 if not
46784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * comparable and -2 in case of error
46794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
46806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
46816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaCompareValuesInternal(xmlSchemaValType xtype,
46826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValPtr x,
46836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *xvalue,
46846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType xws,
46856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValType ytype,
46866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			       xmlSchemaValPtr y,
46876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *yvalue,
4688478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType yws)
4689478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{
46906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    switch (xtype) {
469180b19092f24410a6b869abf519227686e8f207caDaniel Veillard	case XML_SCHEMAS_UNKNOWN:
46922f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	case XML_SCHEMAS_ANYTYPE:
469380b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    return(-2);
469480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_INTEGER:
469580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NPINTEGER:
469680b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NINTEGER:
469780b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NNINTEGER:
469880b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_PINTEGER:
469980b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_INT:
470080b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_UINT:
470180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_LONG:
470280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ULONG:
470380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_SHORT:
470480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_USHORT:
470580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_BYTE:
470680b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_UBYTE:
47074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMAS_DECIMAL:
47086c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
47096c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
47106c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ytype == xtype)
471180b19092f24410a6b869abf519227686e8f207caDaniel Veillard		return(xmlSchemaCompareDecimals(x, y));
47126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((ytype == XML_SCHEMAS_DECIMAL) ||
47136c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_INTEGER) ||
47146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_NPINTEGER) ||
47156c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_NINTEGER) ||
47166c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_NNINTEGER) ||
47176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_PINTEGER) ||
47186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_INT) ||
47196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_UINT) ||
47206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_LONG) ||
47216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_ULONG) ||
47226c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_SHORT) ||
47236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_USHORT) ||
47246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_BYTE) ||
47256c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_UBYTE))
47264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(xmlSchemaCompareDecimals(x, y));
47275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    return(-2);
4728070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        case XML_SCHEMAS_DURATION:
47296c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
47306c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
4731478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (ytype == XML_SCHEMAS_DURATION)
4732070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return(xmlSchemaCompareDurations(x, y));
47335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return(-2);
47345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
47355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
47365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
47375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
47385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
47395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
47405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
47415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
47426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
47436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
47446c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if ((ytype == XML_SCHEMAS_DATETIME)  ||
47456c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_TIME)      ||
47466c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GDAY)      ||
47476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GMONTH)    ||
47486c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GMONTHDAY) ||
47496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GYEAR)     ||
47506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_DATE)      ||
47516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GYEARMONTH))
47525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return (xmlSchemaCompareDates(x, y));
47535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return (-2);
4754f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	/*
47552ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	* Note that we will support comparison of string types against
47562ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	* anySimpleType as well.
47572ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	*/
47582ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	case XML_SCHEMAS_ANYSIMPLETYPE:
47596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_STRING:
4760f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard        case XML_SCHEMAS_NORMSTRING:
476180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_TOKEN:
476280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_LANGUAGE:
476380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NMTOKEN:
476480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NAME:
476580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NCNAME:
476680b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ID:
476780b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_IDREF:
476880b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ENTITY:
476980b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ANYURI:
47706c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	{
47716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    const xmlChar *xv, *yv;
47726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
47736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (x == NULL)
47746c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		xv = xvalue;
47756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    else
47766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		xv = x->value.str;
47776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (y == NULL)
47786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		yv = yvalue;
47796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    else
47806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		yv = y->value.str;
47816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    /*
47826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    * TODO: Compare those against QName.
47836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    */
4784f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    if (ytype == XML_SCHEMAS_QNAME) {
47856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		TODO
47866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		if (y == NULL)
4787f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		    return(-2);
47886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return (-2);
47896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
47906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if ((ytype == XML_SCHEMAS_ANYSIMPLETYPE) ||
47916c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_STRING) ||
47926c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_NORMSTRING) ||
47936c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_TOKEN) ||
47946c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_LANGUAGE) ||
47956c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_NMTOKEN) ||
47966c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_NAME) ||
47976c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_NCNAME) ||
47986c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_ID) ||
47996c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_IDREF) ||
48006c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_ENTITY) ||
48016c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_ANYURI)) {
48026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
48036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (xws == XML_SCHEMA_WHITESPACE_PRESERVE) {
48046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
48056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) {
48066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			/* TODO: What about x < y or x > y. */
48076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			if (xmlStrEqual(xv, yv))
48086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			    return (0);
4809f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard			else
48106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			    return (2);
48116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    } else if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
48126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaComparePreserveReplaceStrings(xv, yv, 0));
48136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
48146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaComparePreserveCollapseStrings(xv, yv, 0));
48156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
48166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else if (xws == XML_SCHEMA_WHITESPACE_REPLACE) {
48176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
48186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE)
48196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaComparePreserveReplaceStrings(yv, xv, 1));
48206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
48216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaCompareReplacedStrings(xv, yv));
48226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
48236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaCompareReplaceCollapseStrings(xv, yv, 0));
48246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
48256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else if (xws == XML_SCHEMA_WHITESPACE_COLLAPSE) {
48266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
48276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE)
48286c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaComparePreserveCollapseStrings(yv, xv, 1));
48296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
48306c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaCompareReplaceCollapseStrings(yv, xv, 1));
48316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
48326c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaCompareNormStrings(xv, yv));
48336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else
48346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return (-2);
4835f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
48366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4837c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard            return (-2);
48386c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	}
4839e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_QNAME:
4840c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_NOTATION:
48416c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
48426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
4843c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik            if ((ytype == XML_SCHEMAS_QNAME) ||
4844c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		(ytype == XML_SCHEMAS_NOTATION)) {
4845e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) &&
4846e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    (xmlStrEqual(x->value.qname.uri, y->value.qname.uri)))
4847e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    return(0);
4848e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		return(2);
4849e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    }
4850e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (-2);
4851c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_FLOAT:
4852c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_DOUBLE:
48536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
48546c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
48556c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if ((ytype == XML_SCHEMAS_FLOAT) ||
48566c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_DOUBLE))
4857b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard                return (xmlSchemaCompareFloats(x, y));
4858b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard            return (-2);
4859c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_BOOLEAN:
48606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
48616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
48626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if (ytype == XML_SCHEMAS_BOOLEAN) {
4863b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (x->value.b == y->value.b)
4864b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    return(0);
4865b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (x->value.b == 0)
4866b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    return(-1);
4867b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		return(1);
4868b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
4869b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return (-2);
4870560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard        case XML_SCHEMAS_HEXBINARY:
48716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
48726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
48736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if (ytype == XML_SCHEMAS_HEXBINARY) {
487470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	        if (x->value.hex.total == y->value.hex.total) {
487570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    int ret = xmlStrcmp(x->value.hex.str, y->value.hex.str);
487670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    if (ret > 0)
487770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard			return(1);
487870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    else if (ret == 0)
487970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard			return(0);
488070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		}
488170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		else if (x->value.hex.total > y->value.hex.total)
488270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    return(1);
488370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
488470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		return(-1);
488570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard            }
4886560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard            return (-2);
48871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BASE64BINARY:
48886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
48896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
48906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if (ytype == XML_SCHEMAS_BASE64BINARY) {
48911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (x->value.base64.total == y->value.base64.total) {
48921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int ret = xmlStrcmp(x->value.base64.str,
48931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		                        y->value.base64.str);
48941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (ret > 0)
48951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        return(1);
48961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (ret == 0)
48971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        return(0);
4898d369b1387e592791049a41eb4cc16046fe52e985Daniel Veillard		    else
4899d369b1387e592791049a41eb4cc16046fe52e985Daniel Veillard		        return(-1);
49001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
49011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else if (x->value.base64.total > y->value.base64.total)
49021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    return(1);
49031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else
49041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    return(-1);
49051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
4906f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard            return (-2);
4907c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_IDREFS:
4908c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ENTITIES:
4909c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NMTOKENS:
4910c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    TODO
4911c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    break;
49124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
49135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return -2;
49144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
49154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
49164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
49176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValues:
49186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first value
49196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second value
49206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
49216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values
49226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
49236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
49246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
49256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
49266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint
49276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) {
49286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    xmlSchemaWhitespaceValueType xws, yws;
49296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
49305e094143e423c01739ac9221f371846fd290be4eDaniel Veillard    if ((x == NULL) || (y == NULL))
49315e094143e423c01739ac9221f371846fd290be4eDaniel Veillard        return(-2);
49326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (x->type == XML_SCHEMAS_STRING)
49336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	xws = XML_SCHEMA_WHITESPACE_PRESERVE;
49346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else if (x->type == XML_SCHEMAS_NORMSTRING)
49356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        xws = XML_SCHEMA_WHITESPACE_REPLACE;
49366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else
49376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        xws = XML_SCHEMA_WHITESPACE_COLLAPSE;
49386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
49396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (y->type == XML_SCHEMAS_STRING)
49406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	yws = XML_SCHEMA_WHITESPACE_PRESERVE;
4941e79226ccdb377cb61fdee69aaf366bb9c5838de9Gaurav    else if (y->type == XML_SCHEMAS_NORMSTRING)
49426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        yws = XML_SCHEMA_WHITESPACE_REPLACE;
49436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else
49446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        yws = XML_SCHEMA_WHITESPACE_COLLAPSE;
49456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
49466c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type,
49476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	y, NULL, yws));
49486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
49496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
49506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
49516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValuesWhtsp:
49526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first value
49536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xws: the whitespace value of x
49546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second value
49556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @yws: the whitespace value of y
49566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
49576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values
49586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
49596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
49606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
49616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
49626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint
49636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValuesWhtsp(xmlSchemaValPtr x,
49646c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaWhitespaceValueType xws,
49656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaValPtr y,
49666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaWhitespaceValueType yws)
49676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{
49689dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik    if ((x == NULL) || (y == NULL))
49699dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik	return(-2);
49706c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type,
49716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	y, NULL, yws));
49726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik}
49736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
49746c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/**
49756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaCompareValuesWhtspExt:
49766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @x:  a first value
49776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xws: the whitespace value of x
49786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @y:  a second value
49796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @yws: the whitespace value of y
49806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
49816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Compare 2 values
49826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
49836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
49846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * case of error
49856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */
49866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikstatic int
49876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaCompareValuesWhtspExt(xmlSchemaValType xtype,
49886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValPtr x,
49896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *xvalue,
49906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType xws,
49916c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValType ytype,
49926c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValPtr y,
49936c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *yvalue,
49946c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType yws)
49956c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{
49966c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    return(xmlSchemaCompareValuesInternal(xtype, x, xvalue, xws, ytype, y,
49976c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	yvalue, yws));
49986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
49996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
50006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
5001c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaNormLen:
5002c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @value:  a string
5003c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
5004c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Computes the UTF8 length of the normalized value of the string
5005c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
5006c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns the length or -1 in case of error.
5007c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */
5008c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int
5009c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaNormLen(const xmlChar *value) {
5010c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    const xmlChar *utf;
5011c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    int ret = 0;
5012c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
5013c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    if (value == NULL)
5014c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	return(-1);
5015c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    utf = value;
501676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while (IS_BLANK_CH(*utf)) utf++;
5017c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    while (*utf != 0) {
5018c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	if (utf[0] & 0x80) {
5019c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if ((utf[1] & 0xc0) != 0x80)
5020c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(-1);
5021c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if ((utf[0] & 0xe0) == 0xe0) {
5022c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		if ((utf[2] & 0xc0) != 0x80)
5023c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    return(-1);
5024c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		if ((utf[0] & 0xf0) == 0xf0) {
5025c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80)
5026c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard			return(-1);
5027c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    utf += 4;
5028c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		} else {
5029c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    utf += 3;
5030c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		}
5031c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    } else {
5032c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		utf += 2;
5033c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    }
503476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	} else if (IS_BLANK_CH(*utf)) {
503576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*utf)) utf++;
5036c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (*utf == 0)
5037c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		break;
5038c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	} else {
5039c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    utf++;
5040c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	}
5041c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	ret++;
5042c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
5043c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    return(ret);
5044c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard}
5045c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
50466927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard/**
50476927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaGetFacetValueAsULong:
50486927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * @facet: an schemas type facet
50496927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard *
50506927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Extract the value of a facet
50516927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard *
50526927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Returns the value as a long
50536927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard */
5054c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardunsigned long
5055c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaGetFacetValueAsULong(xmlSchemaFacetPtr facet)
5056c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{
5057c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    /*
5058c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    * TODO: Check if this is a decimal.
5059c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    */
5060094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack    if (facet == NULL)
5061094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack        return 0;
5062c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    return ((unsigned long) facet->val->value.decimal.lo);
5063c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
5064c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
5065c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/**
506601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateListSimpleTypeFacet:
506701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facet:  the facet to check
506801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @value:  the lexical repr of the value to validate
506901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @actualLen:  the number of list items
507001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @expectedLen: the resulting expected number of list items
507101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
507201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Checks the value of a list simple type against a facet.
507301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
507401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 0 if the value is valid, a positive error code
507501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * number otherwise and -1 in case of an internal error.
507601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
507701fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint
507801fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaValidateListSimpleTypeFacet(xmlSchemaFacetPtr facet,
507901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     const xmlChar *value,
508001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     unsigned long actualLen,
508101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     unsigned long *expectedLen)
508201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
5083ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard    if (facet == NULL)
5084ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard        return(-1);
508501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    /*
508601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * TODO: Check if this will work with large numbers.
508701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * (compare value.decimal.mi and value.decimal.hi as well?).
508801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
508901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
509001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen != facet->val->value.decimal.lo) {
5091478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (expectedLen != NULL)
5092c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
509301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_LENGTH_VALID);
5094f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	}
509501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
509601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen < facet->val->value.decimal.lo) {
5097478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (expectedLen != NULL)
5098c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
509901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_MINLENGTH_VALID);
510001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
510101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MAXLENGTH) {
510201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen > facet->val->value.decimal.lo) {
5103478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (expectedLen != NULL)
5104c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
510501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_MAXLENGTH_VALID);
510601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
510701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else
5108f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	/*
5109f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	* NOTE: That we can pass NULL as xmlSchemaValPtr to
511001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	* xmlSchemaValidateFacet, since the remaining facet types
5111f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	* are: XML_SCHEMA_FACET_PATTERN, XML_SCHEMA_FACET_ENUMERATION.
511201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	*/
5113f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	return(xmlSchemaValidateFacet(NULL, facet, value, NULL));
511401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    return (0);
511501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
511601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
511701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
51186927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaValidateLengthFacet:
5119c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type:  the built-in type
5120c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @facet:  the facet to check
5121c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value:  the lexical repr. of the value to be validated
5122c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val:  the precomputed value
5123478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value
5124c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @length: the actual length of the value
5125c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
5126f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength"
5127c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * facet; sets @length to the computed length of @value.
5128c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
5129c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if the value is valid, a positive error code
5130c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * otherwise and -1 in case of an internal or API error.
5131c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */
5132478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikstatic int
5133478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacetInternal(xmlSchemaFacetPtr facet,
5134aae48e64dfbf2b46b157a4c1857e30645116388fNico Weber				     xmlSchemaValType valType,
5135478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				     const xmlChar *value,
5136aae48e64dfbf2b46b157a4c1857e30645116388fNico Weber				     xmlSchemaValPtr val,
5137478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				     unsigned long *length,
5138f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard				     xmlSchemaWhitespaceValueType ws)
5139c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{
5140c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    unsigned int len = 0;
5141c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
5142478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if ((length == NULL) || (facet == NULL))
5143ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard        return (-1);
5144c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    *length = 0;
5145c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((facet->type != XML_SCHEMA_FACET_LENGTH) &&
5146c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->type != XML_SCHEMA_FACET_MAXLENGTH) &&
5147c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->type != XML_SCHEMA_FACET_MINLENGTH))
5148c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	return (-1);
5149f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
5150478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    /*
5151478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    * TODO: length, maxLength and minLength must be of type
5152478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    * nonNegativeInteger only. Check if decimal is used somehow.
5153478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    */
5154c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((facet->val == NULL) ||
5155c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	((facet->val->type != XML_SCHEMAS_DECIMAL) &&
5156c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
5157c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->val->value.decimal.frac != 0)) {
5158c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	return(-1);
5159c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
5160c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY))
5161c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	len = val->value.hex.total;
5162c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY))
5163c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	len = val->value.base64.total;
5164c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    else {
5165478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	switch (valType) {
5166478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    case XML_SCHEMAS_STRING:
5167c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NORMSTRING:
5168478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) {
5169478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    /*
5170478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * This is to ensure API compatibility with the old
5171478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * xmlSchemaValidateLengthFacet(). Anyway, this was and
5172478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * is not the correct handling.
5173478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * TODO: Get rid of this case somehow.
5174478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    */
5175478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    if (valType == XML_SCHEMAS_STRING)
5176478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			len = xmlUTF8Strlen(value);
5177478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    else
5178478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			len = xmlSchemaNormLen(value);
5179478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		} else if (value != NULL) {
5180478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
5181478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			len = xmlSchemaNormLen(value);
5182478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    else
5183f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		    /*
5184478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * Should be OK for "preserve" as well.
5185478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    */
5186478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    len = xmlUTF8Strlen(value);
5187478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		}
5188478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		break;
5189478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    case XML_SCHEMAS_IDREF:
5190c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_TOKEN:
5191c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_LANGUAGE:
5192c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NMTOKEN:
5193c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NAME:
5194c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NCNAME:
5195f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    case XML_SCHEMAS_ID:
5196bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik		/*
5197bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik		* FIXME: What exactly to do with anyURI?
5198478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*/
5199c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_ANYURI:
5200c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		if (value != NULL)
5201478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    len = xmlSchemaNormLen(value);
5202c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		break;
5203bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik	    case XML_SCHEMAS_QNAME:
5204f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    case XML_SCHEMAS_NOTATION:
5205f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		/*
52064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		* For QName and NOTATION, those facets are
52074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		* deprecated and should be ignored.
5208f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		*/
5209bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik		return (0);
5210c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    default:
5211c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		TODO
5212c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	}
5213c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
5214c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    *length = (unsigned long) len;
5215478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    /*
5216478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    * TODO: Return the whole expected value, i.e. "lo", "mi" and "hi".
5217478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    */
5218c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
5219c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len != facet->val->value.decimal.lo)
5220c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_LENGTH_VALID);
5221c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
5222c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len < facet->val->value.decimal.lo)
5223c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_MINLENGTH_VALID);
5224c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    } else {
5225c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len > facet->val->value.decimal.lo)
5226c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXLENGTH_VALID);
5227c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
5228f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
5229c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    return (0);
5230c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
5231c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
5232c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/**
5233478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateLengthFacet:
5234478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @type:  the built-in type
5235478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @facet:  the facet to check
5236478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @value:  the lexical repr. of the value to be validated
5237478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @val:  the precomputed value
5238478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @length: the actual length of the value
5239478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *
5240f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength"
5241478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * facet; sets @length to the computed length of @value.
5242478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *
5243478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Returns 0 if the value is valid, a positive error code
5244478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * otherwise and -1 in case of an internal or API error.
5245478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */
5246478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikint
5247f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel VeillardxmlSchemaValidateLengthFacet(xmlSchemaTypePtr type,
5248478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			     xmlSchemaFacetPtr facet,
5249478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			     const xmlChar *value,
5250478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			     xmlSchemaValPtr val,
5251f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard			     unsigned long *length)
5252478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{
5253cc5e2330ef2432493afce6566d3651195366d822Daniel Veillard    if (type == NULL)
5254cc5e2330ef2432493afce6566d3651195366d822Daniel Veillard        return(-1);
5255478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    return (xmlSchemaValidateLengthFacetInternal(facet,
5256478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	type->builtInType, value, val, length,
5257478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	XML_SCHEMA_WHITESPACE_UNKNOWN));
5258478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik}
5259478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik
5260478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik/**
5261f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * xmlSchemaValidateLengthFacetWhtsp:
5262478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @facet:  the facet to check
5263478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @valType:  the built-in type
5264478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @value:  the lexical repr. of the value to be validated
5265478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @val:  the precomputed value
5266478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value
5267478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @length: the actual length of the value
5268478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *
5269f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength"
5270478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * facet; sets @length to the computed length of @value.
5271478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *
5272478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Returns 0 if the value is valid, a positive error code
5273478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * otherwise and -1 in case of an internal or API error.
5274478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */
5275478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikint
5276478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacetWhtsp(xmlSchemaFacetPtr facet,
5277478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  xmlSchemaValType valType,
5278478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  const xmlChar *value,
5279478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  xmlSchemaValPtr val,
5280478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  unsigned long *length,
5281478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  xmlSchemaWhitespaceValueType ws)
5282478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{
5283478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    return (xmlSchemaValidateLengthFacetInternal(facet, valType, value, val,
5284478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	length, ws));
5285478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik}
5286478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik
5287478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik/**
52886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetInternal:
52894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @facet:  the facet to check
5290478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @fws: the whitespace type of the facet's value
5291478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @valType: the built-in type of the value
52924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value:  the lexical repr of the value to validate
52934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val:  the precomputed value
5294478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value
52954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
52964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Check a value against a facet condition
52974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
52984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if the element is schemas valid, a positive error code
52994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *     number otherwise and -1 in case of internal or API error.
53004255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
53016c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikstatic int
53026c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaValidateFacetInternal(xmlSchemaFacetPtr facet,
53036c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType fws,
5304f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard			       xmlSchemaValType valType,
53056c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *value,
5306478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			       xmlSchemaValPtr val,
53076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType ws)
53084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{
53094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    int ret;
531090da33cebeba87ae3b49a270c8182142dd7cb48ePatrick Monnerat    int stringType;
53114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
53126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    if (facet == NULL)
53136c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	return(-1);
53146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
53154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    switch (facet->type) {
53164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMA_FACET_PATTERN:
5317f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    /*
53186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    * NOTE that for patterns, the @value needs to be the normalized
53196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    * value, *not* the lexical initial value or the canonical value.
53206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    */
53216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (value == NULL)
53226c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-1);
5323cad102b861f74d56e3f6e710c466cf1a38a5db56Audric Schiltknecht	    /*
5324cad102b861f74d56e3f6e710c466cf1a38a5db56Audric Schiltknecht	    * If string-derived type, regexp must be tested on the value space of
5325cad102b861f74d56e3f6e710c466cf1a38a5db56Audric Schiltknecht	    * the datatype.
5326cad102b861f74d56e3f6e710c466cf1a38a5db56Audric Schiltknecht	    * See https://www.w3.org/TR/xmlschema-2/#rf-pattern
5327cad102b861f74d56e3f6e710c466cf1a38a5db56Audric Schiltknecht	    */
532890da33cebeba87ae3b49a270c8182142dd7cb48ePatrick Monnerat	    stringType = val && ((val->type >= XML_SCHEMAS_STRING && val->type <= XML_SCHEMAS_NORMSTRING)
532990da33cebeba87ae3b49a270c8182142dd7cb48ePatrick Monnerat			      || (val->type >= XML_SCHEMAS_TOKEN && val->type <= XML_SCHEMAS_NCNAME));
5330cad102b861f74d56e3f6e710c466cf1a38a5db56Audric Schiltknecht	    ret = xmlRegexpExec(facet->regexp,
5331cad102b861f74d56e3f6e710c466cf1a38a5db56Audric Schiltknecht	                        (stringType && val->value.str) ? val->value.str : value);
53324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == 1)
53334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(0);
53346c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == 0)
533501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return(XML_SCHEMAV_CVC_PATTERN_VALID);
53364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    return(ret);
53374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMA_FACET_MAXEXCLUSIVE:
53384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
53396c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == -2)
53404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(-1);
53414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == -1)
53424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(0);
534301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID);
5344070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MAXINCLUSIVE:
5345070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
53466c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == -2)
5347070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
5348070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((ret == -1) || (ret == 0))
5349070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
535001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID);
5351070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MINEXCLUSIVE:
5352070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
53536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == -2)
5354070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
5355070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret == 1)
5356070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
535701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID);
5358070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MININCLUSIVE:
5359070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
53606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == -2)
5361070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
5362070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((ret == 1) || (ret == 0))
5363070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
536401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MININCLUSIVE_VALID);
53658651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard	case XML_SCHEMA_FACET_WHITESPACE:
53668bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    /* TODO whitespaces */
536701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    /*
536801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * NOTE: Whitespace should be handled to normalize
536901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * the value to be validated against a the facets;
537001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * not to normalize the value in-between.
537101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    */
53728651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard	    return(0);
53738bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case  XML_SCHEMA_FACET_ENUMERATION:
5374478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) {
5375478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		/*
5376478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* This is to ensure API compatibility with the old
5377478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* xmlSchemaValidateFacet().
5378478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* TODO: Get rid of this case.
5379478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*/
53806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		if ((facet->value != NULL) &&
53816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    (xmlStrEqual(facet->value, value)))
53826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    return(0);
53836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    } else {
53846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		ret = xmlSchemaCompareValuesWhtspExt(facet->val->type,
53856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    facet->val, facet->value, fws, valType, val,
53866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    value, ws);
53876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		if (ret == -2)
53886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    return(-1);
53896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		if (ret == 0)
53906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    return(0);
53916c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    }
539201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_ENUMERATION_VALID);
53938bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case XML_SCHEMA_FACET_LENGTH:
5394aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    /*
5395aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    * SPEC (1.3) "if {primitive type definition} is QName or NOTATION,
5396aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    * then any {value} is facet-valid."
5397aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    */
5398aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    if ((valType == XML_SCHEMAS_QNAME) ||
5399aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		(valType == XML_SCHEMAS_NOTATION))
5400aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		return (0);
5401aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    /* No break on purpose. */
5402e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard	case XML_SCHEMA_FACET_MAXLENGTH:
54038bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case XML_SCHEMA_FACET_MINLENGTH: {
54048bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    unsigned int len = 0;
5405e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard
54064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if ((valType == XML_SCHEMAS_QNAME) ||
54074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		(valType == XML_SCHEMAS_NOTATION))
54084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		return (0);
5409478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    /*
5410478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    * TODO: length, maxLength and minLength must be of type
5411478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    * nonNegativeInteger only. Check if decimal is used somehow.
5412478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    */
54138bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    if ((facet->val == NULL) ||
5414e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		((facet->val->type != XML_SCHEMAS_DECIMAL) &&
5415e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
54168bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		(facet->val->value.decimal.frac != 0)) {
54178bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		return(-1);
54188bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    }
5419560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY))
542070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		len = val->value.hex.total;
54211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	    else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY))
54221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		len = val->value.base64.total;
54231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	    else {
54246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		switch (valType) {
5425478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    case XML_SCHEMAS_STRING:
5426f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		    case XML_SCHEMAS_NORMSTRING:
5427478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) {
5428478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    /*
5429478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    * This is to ensure API compatibility with the old
5430478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    * xmlSchemaValidateFacet(). Anyway, this was and
5431478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    * is not the correct handling.
5432478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    * TODO: Get rid of this case somehow.
5433478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    */
5434478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    if (valType == XML_SCHEMAS_STRING)
5435478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				len = xmlUTF8Strlen(value);
5436478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    else
5437478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				len = xmlSchemaNormLen(value);
5438478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			} else if (value != NULL) {
5439478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
5440478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				len = xmlSchemaNormLen(value);
5441478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    else
5442f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard				/*
5443478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				* Should be OK for "preserve" as well.
5444478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				*/
5445478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				len = xmlUTF8Strlen(value);
5446478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			}
5447478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			break;
5448f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		    case XML_SCHEMAS_IDREF:
5449560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_TOKEN:
5450560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_LANGUAGE:
5451560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NMTOKEN:
5452560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NAME:
5453560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NCNAME:
5454560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_ID:
545501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    case XML_SCHEMAS_ANYURI:
5456478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			if (value != NULL)
5457f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard			    len = xmlSchemaNormLen(value);
5458f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard			break;
5459560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    default:
5460560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		        TODO
5461f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		}
54628bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    }
54638bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
5464e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len != facet->val->value.decimal.lo)
546501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_LENGTH_VALID);
54668bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
5467e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len < facet->val->value.decimal.lo)
546801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_MINLENGTH_VALID);
54698bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    } else {
5470e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len > facet->val->value.decimal.lo)
547101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_MAXLENGTH_VALID);
5472e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard	    }
54738bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    break;
54748bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	}
5475560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	case XML_SCHEMA_FACET_TOTALDIGITS:
5476560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	case XML_SCHEMA_FACET_FRACTIONDIGITS:
5477560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
5478560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((facet->val == NULL) ||
547969dea3a0c01e8a952b1d2f07ab0a3aa450f0cdfeKasimier T. Buchcik		((facet->val->type != XML_SCHEMAS_PINTEGER) &&
5480560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
5481560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		(facet->val->value.decimal.frac != 0)) {
5482560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		return(-1);
5483560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
5484560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((val == NULL) ||
5485560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		((val->type != XML_SCHEMAS_DECIMAL) &&
5486560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_INTEGER) &&
5487560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NPINTEGER) &&
5488560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NINTEGER) &&
5489560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NNINTEGER) &&
5490560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_PINTEGER) &&
5491560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_INT) &&
5492560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_UINT) &&
5493560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_LONG) &&
5494560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_ULONG) &&
5495560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_SHORT) &&
5496560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_USHORT) &&
5497560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_BYTE) &&
5498560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_UBYTE))) {
5499560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		return(-1);
5500560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
5501560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) {
5502560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	        if (val->value.decimal.total > facet->val->value.decimal.lo)
550301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	            return(XML_SCHEMAV_CVC_TOTALDIGITS_VALID);
5504560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
5505560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) {
5506560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	        if (val->value.decimal.frac > facet->val->value.decimal.lo)
550701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID);
5508560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
5509560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    break;
55104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	default:
55114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    TODO
55124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
55134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return(0);
5514b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
55154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
55164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
55176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
55186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacet:
55196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @base:  the base type
55206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @facet:  the facet to check
55216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @value:  the lexical repr of the value to validate
55226c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @val:  the precomputed value
55236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
55246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Check a value against a facet condition
55256c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
55266c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns 0 if the element is schemas valid, a positive error code
55276c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *     number otherwise and -1 in case of internal or API error.
55286c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */
55296c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikint
55309dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. BuchcikxmlSchemaValidateFacet(xmlSchemaTypePtr base,
55316c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	               xmlSchemaFacetPtr facet,
55326c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	               const xmlChar *value,
55336c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		       xmlSchemaValPtr val)
55346c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{
55356c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    /*
55366c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    * This tries to ensure API compatibility regarding the old
55376c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    * xmlSchemaValidateFacet() and the new xmlSchemaValidateFacetInternal() and
55386c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    * xmlSchemaValidateFacetWhtsp().
55396c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    */
55409dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik    if (val != NULL)
55416c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	return(xmlSchemaValidateFacetInternal(facet,
55429dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik	    XML_SCHEMA_WHITESPACE_UNKNOWN, val->type, value, val,
55436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    XML_SCHEMA_WHITESPACE_UNKNOWN));
55449dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik    else if (base != NULL)
55456c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	return(xmlSchemaValidateFacetInternal(facet,
55469dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik	    XML_SCHEMA_WHITESPACE_UNKNOWN, base->builtInType, value, val,
5547478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    XML_SCHEMA_WHITESPACE_UNKNOWN));
55489dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik    return(-1);
55496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik}
55506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
55516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/**
55526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetWhtsp:
55536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @facet:  the facet to check
55546c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @fws: the whitespace type of the facet's value
55556c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @valType: the built-in type of the value
55566c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @value:  the lexical (or normalized for pattern) repr of the value to validate
55576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @val:  the precomputed value
55586c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @ws: the whitespace type of the value
55596c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
55606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Check a value against a facet condition. This takes value normalization
55616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * according to the specified whitespace types into account.
55626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Note that @value needs to be the *normalized* value if the facet
55636c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * is of type "pattern".
55646c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
55656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns 0 if the element is schemas valid, a positive error code
55666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *     number otherwise and -1 in case of internal or API error.
55676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */
55686c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikint
55696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaValidateFacetWhtsp(xmlSchemaFacetPtr facet,
55706c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaWhitespaceValueType fws,
5571f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard			    xmlSchemaValType valType,
55726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    const xmlChar *value,
5573478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    xmlSchemaValPtr val,
55746c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaWhitespaceValueType ws)
55756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{
55766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik     return(xmlSchemaValidateFacetInternal(facet, fws, valType,
5577478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	 value, val, ws));
55786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik}
55796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
5580c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#if 0
5581c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifndef DBL_DIG
5582c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define DBL_DIG 16
5583c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif
5584c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifndef DBL_EPSILON
5585c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define DBL_EPSILON 1E-9
5586c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif
5587c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5588c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define INTEGER_DIGITS DBL_DIG
5589c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define FRACTION_DIGITS (DBL_DIG + 1)
5590c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define EXPONENT_DIGITS (3 + 2)
5591c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5592c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik/**
5593c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * xmlXPathFormatNumber:
5594c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @number:     number to format
5595c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @buffer:     output buffer
5596c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @buffersize: size of output buffer
5597c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
5598c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Convert the number into a string representation.
5599c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */
5600c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcikstatic void
5601c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. BuchcikxmlSchemaFormatFloat(double number, char buffer[], int buffersize)
5602c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik{
5603c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    switch (xmlXPathIsInf(number)) {
5604c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    case 1:
5605c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	if (buffersize > (int)sizeof("INF"))
5606c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    snprintf(buffer, buffersize, "INF");
5607c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	break;
5608c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    case -1:
5609c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	if (buffersize > (int)sizeof("-INF"))
5610c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    snprintf(buffer, buffersize, "-INF");
5611c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	break;
5612c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    default:
5613c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	if (xmlXPathIsNaN(number)) {
5614c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (buffersize > (int)sizeof("NaN"))
5615c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf(buffer, buffersize, "NaN");
5616c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	} else if (number == 0) {
5617c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    snprintf(buffer, buffersize, "0.0E0");
5618c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	} else {
5619c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /* 3 is sign, decimal point, and terminating zero */
5620c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    char work[DBL_DIG + EXPONENT_DIGITS + 3];
5621c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    int integer_place, fraction_place;
5622c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    char *ptr;
5623c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    char *after_fraction;
5624c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    double absolute_value;
5625c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    int size;
5626c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5627c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    absolute_value = fabs(number);
5628c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5629c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /*
5630c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	     * Result is in work, and after_fraction points
5631c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	     * just past the fractional part.
5632f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	     * Use scientific notation
5633c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    */
5634c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    integer_place = DBL_DIG + EXPONENT_DIGITS + 1;
5635c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    fraction_place = DBL_DIG - 1;
5636c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    snprintf(work, sizeof(work),"%*.*e",
5637c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		integer_place, fraction_place, number);
5638f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    after_fraction = strchr(work + DBL_DIG, 'e');
5639c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /* Remove fractional trailing zeroes */
5640c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    ptr = after_fraction;
5641c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    while (*(--ptr) == '0')
5642c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		;
5643c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (*ptr != '.')
5644c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	        ptr++;
5645c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    while ((*ptr++ = *after_fraction++) != 0);
5646c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5647c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /* Finally copy result back to caller */
5648c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    size = strlen(work) + 1;
5649c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (size > buffersize) {
5650c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		work[buffersize - 1] = 0;
5651c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		size = buffersize;
5652c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5653c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    memmove(buffer, work, size);
5654c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	}
5655c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	break;
5656c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    }
5657c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik}
5658c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif
5659c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
56606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/**
56616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaGetCanonValue:
56626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @val: the precomputed value
56636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @retValue: the returned value
56646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
56657a7cad6ed40dff815fd26416192bfbae1b44923fJan Pokorný * Get the canonical lexical representation of the value.
5666c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * The caller has to FREE the returned retValue.
5667c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
5668478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * WARNING: Some value types are not supported yet, resulting
5669478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * in a @retValue of "???".
5670f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard *
5671c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: XML Schema 1.0 does not define canonical representations
5672c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * for: duration, gYearMonth, gYear, gMonthDay, gMonth, gDay,
5673c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * anyURI, QName, NOTATION. This will be fixed in XML Schema 1.1.
5674c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
56756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
5676c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Returns 0 if the value could be built, 1 if the value type is
5677c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * not supported yet and -1 in case of API errors.
56786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
56796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint
5680b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel VeillardxmlSchemaGetCanonValue(xmlSchemaValPtr val, const xmlChar **retValue)
56816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
5682b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard    if ((retValue == NULL) || (val == NULL))
56836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return (-1);
56846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    *retValue = NULL;
56856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    switch (val->type) {
5686478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	case XML_SCHEMAS_STRING:
5687478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (val->value.str == NULL)
5688478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
5689478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    else
5690f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		*retValue =
5691478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    BAD_CAST xmlStrdup((const xmlChar *) val->value.str);
5692478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    break;
56936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NORMSTRING:
5694478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (val->value.str == NULL)
5695478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
5696478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    else {
5697478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = xmlSchemaWhiteSpaceReplace(
5698478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    (const xmlChar *) val->value.str);
5699478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*retValue) == NULL)
5700478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    *retValue = BAD_CAST xmlStrdup(
5701478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			(const xmlChar *) val->value.str);
5702478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    }
5703478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    break;
57046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_TOKEN:
57056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_LANGUAGE:
57066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NMTOKEN:
5707f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	case XML_SCHEMAS_NAME:
57086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NCNAME:
57096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_ID:
57106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_IDREF:
57116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_ENTITY:
5712c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_NOTATION: /* Unclear */
5713c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_ANYURI:   /* Unclear */
57146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (val->value.str == NULL)
5715478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		return (-1);
5716f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    *retValue =
5717aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		BAD_CAST xmlSchemaCollapseString(BAD_CAST val->value.str);
5718aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    if (*retValue == NULL)
5719f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		*retValue =
5720aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		    BAD_CAST xmlStrdup((const xmlChar *) val->value.str);
5721478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    break;
5722478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	case XML_SCHEMAS_QNAME:
5723c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /* TODO: Unclear in XML Schema 1.0. */
5724478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (val->value.qname.uri == NULL) {
5725478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.qname.name);
5726478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		return (0);
5727478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    } else {
5728478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "{");
5729478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue),
5730478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    BAD_CAST val->value.qname.uri);
5731478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue),
5732478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    BAD_CAST "}");
5733478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue),
5734478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    BAD_CAST val->value.qname.uri);
5735478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    }
5736478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    break;
5737c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_DECIMAL:
5738c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /*
5739c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * TODO: Lookout for a more simple implementation.
5740c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    */
5741f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    if ((val->value.decimal.total == 1) &&
5742c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		(val->value.decimal.lo == 0)) {
5743c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlStrdup(BAD_CAST "0.0");
5744c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    } else {
5745c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		xmlSchemaValDecimal dec = val->value.decimal;
5746c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		int bufsize;
5747c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char *buf = NULL, *offs;
5748c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5749c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* Add room for the decimal point as well. */
5750c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		bufsize = dec.total + 2;
5751c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.sign)
5752c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    bufsize++;
5753c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* Add room for leading/trailing zero. */
5754c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if ((dec.frac == 0) || (dec.frac == dec.total))
5755c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    bufsize++;
5756c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		buf = xmlMalloc(bufsize);
575726ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard		if (buf == NULL)
575826ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard		    return(-1);
5759c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		offs = buf;
5760c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.sign)
5761c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs++ = '-';
5762c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.frac == dec.total) {
5763c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs++ = '0';
5764c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs++ = '.';
5765c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5766c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.hi != 0)
5767c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(offs, bufsize - (offs - buf),
5768c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%lu%lu%lu", dec.hi, dec.mi, dec.lo);
5769c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else if (dec.mi != 0)
5770c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(offs, bufsize - (offs - buf),
5771c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%lu%lu", dec.mi, dec.lo);
5772c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else
5773c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(offs, bufsize - (offs - buf),
5774c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%lu", dec.lo);
5775f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard
5776c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.frac != 0) {
5777c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (dec.frac != dec.total) {
5778c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			int diff = dec.total - dec.frac;
5779c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			/*
5780c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			* Insert the decimal point.
5781c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			*/
5782c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			memmove(offs + diff + 1, offs + diff, dec.frac +1);
5783c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			offs[diff] = '.';
5784c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    } else {
5785c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			unsigned int i = 0;
5786c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			/*
5787c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			* Insert missing zeroes behind the decimal point.
5788f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard			*/
5789c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			while (*(offs + i) != 0)
5790c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    i++;
5791c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			if (i < dec.total) {
5792c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    memmove(offs + (dec.total - i), offs, i +1);
5793c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    memset(offs, '0', dec.total - i);
5794c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			}
5795c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    }
5796c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5797c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    /*
5798c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * Append decimal point and zero.
5799c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    */
5800c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    offs = buf + bufsize - 1;
5801c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs-- = 0;
5802c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs-- = '0';
5803c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs-- = '.';
5804c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5805c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST buf;
5806c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5807c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5808c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_INTEGER:
5809c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_PINTEGER:
5810c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_NPINTEGER:
5811c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_NINTEGER:
5812c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_NNINTEGER:
5813c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_LONG:
5814c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_BYTE:
5815c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_SHORT:
5816c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_INT:
5817c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_UINT:
5818c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_ULONG:
5819c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_USHORT:
5820c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_UBYTE:
5821c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if ((val->value.decimal.total == 1) &&
5822c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		(val->value.decimal.lo == 0))
5823c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlStrdup(BAD_CAST "0");
5824c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else {
5825c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		xmlSchemaValDecimal dec = val->value.decimal;
5826c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		int bufsize = dec.total + 1;
5827c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5828c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* Add room for the decimal point as well. */
5829c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.sign)
5830c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    bufsize++;
5831c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlMalloc(bufsize);
583226ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard		if (*retValue == NULL)
583326ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard		    return(-1);
5834c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.hi != 0) {
5835c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (dec.sign)
5836c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize,
5837c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    "-%lu%lu%lu", dec.hi, dec.mi, dec.lo);
5838c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    else
5839c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize,
5840c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    "%lu%lu%lu", dec.hi, dec.mi, dec.lo);
5841c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else if (dec.mi != 0) {
5842c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (dec.sign)
5843c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize,
5844c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    "-%lu%lu", dec.mi, dec.lo);
5845c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    else
5846c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize,
5847c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    "%lu%lu", dec.mi, dec.lo);
5848c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5849c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (dec.sign)
5850c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize, "-%lu", dec.lo);
5851c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    else
5852c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize, "%lu", dec.lo);
5853c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5854c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5855c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5856c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_BOOLEAN:
5857c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (val->value.b)
5858c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "true");
5859c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else
5860c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "false");
5861c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5862c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_DURATION: {
5863c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[100];
5864c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		unsigned long year;
5865c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		unsigned long mon, day, hour = 0, min = 0;
5866c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		double sec = 0, left;
5867c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5868c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5869c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/*
5870c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* TODO: This results in a normalized output of the value
5871c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* - which is NOT conformant to the spec -
5872c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* since the exact values of each property are not
5873c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* recoverable. Think about extending the structure to
5874c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* provide a field for every property.
5875c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*/
5876c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		year = (unsigned long) FQUOTIENT(labs(val->value.dur.mon), 12);
5877c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		mon = labs(val->value.dur.mon) - 12 * year;
5878c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5879c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		day = (unsigned long) FQUOTIENT(fabs(val->value.dur.sec), 86400);
5880c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		left = fabs(val->value.dur.sec) - day * 86400;
5881c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (left > 0) {
5882c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    hour = (unsigned long) FQUOTIENT(left, 3600);
5883c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    left = left - (hour * 3600);
5884c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (left > 0) {
5885c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			min = (unsigned long) FQUOTIENT(left, 60);
5886c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			sec = left - (min * 60);
5887c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    }
5888c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5889c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if ((val->value.dur.mon < 0) || (val->value.dur.sec < 0))
5890c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 100, "P%luY%luM%luDT%luH%luM%.14gS",
5891c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			year, mon, day, hour, min, sec);
5892c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else
5893c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 100, "-P%luY%luM%luDT%luH%luM%.14gS",
5894c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			year, mon, day, hour, min, sec);
5895c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5896c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5897c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5898c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_GYEAR: {
5899c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[30];
5900c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5901c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5902c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf(buf, 30, "%04ld", val->value.date.year);
5903c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5904c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5905c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5906c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_GMONTH: {
5907c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5908c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
590926ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard		*retValue = xmlMalloc(6);
591026ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard		if (*retValue == NULL)
591126ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard		    return(-1);
5912c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf((char *) *retValue, 6, "--%02u",
5913c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    val->value.date.mon);
5914c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5915c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5916c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_GDAY: {
5917c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5918c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5919c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlMalloc(6);
592026ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard		if (*retValue == NULL)
592126ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard		    return(-1);
5922c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf((char *) *retValue, 6, "---%02u",
5923c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    val->value.date.day);
5924c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5925f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    break;
5926c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_GMONTHDAY: {
5927c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5928c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5929c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlMalloc(8);
593026ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard		if (*retValue == NULL)
593126ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard		    return(-1);
5932c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf((char *) *retValue, 8, "--%02u-%02u",
5933c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    val->value.date.mon, val->value.date.day);
5934c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5935c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5936c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_GYEARMONTH: {
5937c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[35];
5938c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5939c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5940c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (val->value.date.year < 0)
5941c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 35, "-%04ld-%02u",
5942f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard			labs(val->value.date.year),
5943c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.mon);
5944c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else
5945c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 35, "%04ld-%02u",
5946c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.year, val->value.date.mon);
5947c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5948c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5949f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    break;
5950c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_TIME:
5951c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    {
5952c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[30];
5953c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5954c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (val->value.date.tz_flag) {
5955c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaValPtr norm;
5956c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5957c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    norm = xmlSchemaDateNormalize(val, 0);
5958c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (norm == NULL)
5959c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			return (-1);
5960f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		    /*
5961f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		    * TODO: Check if "%.14g" is portable.
5962c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    */
5963c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 30,
5964c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%02u:%02u:%02.14gZ",
5965c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.hour,
5966c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.min,
5967c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.sec);
5968c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaFreeValue(norm);
5969c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5970c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 30,
5971c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%02u:%02u:%02.14g",
5972c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.hour,
5973c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.min,
5974c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.sec);
5975c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5976c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5977f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    }
5978c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5979c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_DATE:
5980c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    {
5981c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[30];
5982c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5983c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (val->value.date.tz_flag) {
5984c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaValPtr norm;
5985c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5986c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    norm = xmlSchemaDateNormalize(val, 0);
5987c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (norm == NULL)
5988c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			return (-1);
5989c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    /*
5990c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * TODO: Append the canonical value of the
5991c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * recoverable timezone and not "Z".
5992c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    */
5993c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 30,
5994c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%04ld:%02u:%02uZ",
5995c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.year, norm->value.date.mon,
5996c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.day);
5997c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaFreeValue(norm);
5998c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5999c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 30,
6000c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%04ld:%02u:%02u",
6001c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.year, val->value.date.mon,
6002c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.day);
6003c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
6004c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
6005f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    }
6006c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
6007c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_DATETIME:
6008c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    {
6009c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[50];
6010c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
6011c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (val->value.date.tz_flag) {
6012c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaValPtr norm;
6013c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
6014c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    norm = xmlSchemaDateNormalize(val, 0);
6015c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (norm == NULL)
6016c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			return (-1);
6017c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    /*
6018c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * TODO: Check if "%.14g" is portable.
6019c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    */
6020c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 50,
6021c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%04ld:%02u:%02uT%02u:%02u:%02.14gZ",
6022c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.year, norm->value.date.mon,
6023c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.day, norm->value.date.hour,
6024c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.min, norm->value.date.sec);
6025c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaFreeValue(norm);
6026c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
6027c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 50,
6028c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%04ld:%02u:%02uT%02u:%02u:%02.14g",
6029c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.year, val->value.date.mon,
6030c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.day, val->value.date.hour,
6031c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.min, val->value.date.sec);
6032c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
6033c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
6034c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
6035c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
6036c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_HEXBINARY:
6037c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.hex.str);
6038c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
6039c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_BASE64BINARY:
6040c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /*
6041c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * TODO: Is the following spec piece implemented?:
6042c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * SPEC: "Note: For some values the canonical form defined
6043c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * above does not conform to [RFC 2045], which requires breaking
6044c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * with linefeeds at appropriate intervals."
6045c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    */
6046c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.base64.str);
6047c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
6048c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_FLOAT: {
6049f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		char buf[30];
6050f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard		/*
6051c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* |m| < 16777216, -149 <= e <= 104.
6052c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* TODO: Handle, NaN, INF, -INF. The format is not
6053c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* yet conformant. The c type float does not cover
6054c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* the whole range.
6055c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*/
6056c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf(buf, 30, "%01.14e", val->value.f);
6057c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
6058c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
6059c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
6060c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_DOUBLE: {
6061c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[40];
6062c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* |m| < 9007199254740992, -1075 <= e <= 970 */
6063c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/*
6064c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* TODO: Handle, NaN, INF, -INF. The format is not
6065c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* yet conformant. The c type float does not cover
6066c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* the whole range.
6067c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*/
6068c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf(buf, 40, "%01.14e", val->value.d);
6069c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
6070c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
6071f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard	    break;
60726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	default:
6073478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    *retValue = BAD_CAST xmlStrdup(BAD_CAST "???");
6074c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    return (1);
60756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
607626ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard    if (*retValue == NULL)
607726ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard	return(-1);
6078478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    return (0);
6079478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik}
6080478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik
6081bda59576670f1cabea3c49520628d82e401702caDaniel Veillard/**
6082c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * xmlSchemaGetCanonValueWhtsp:
6083c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @val: the precomputed value
6084c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @retValue: the returned value
6085c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @ws: the whitespace type of the value
6086c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
60877a7cad6ed40dff815fd26416192bfbae1b44923fJan Pokorný * Get the canonical representation of the value.
6088c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * The caller has to free the returned @retValue.
6089c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
6090c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Returns 0 if the value could be built, 1 if the value type is
6091c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * not supported yet and -1 in case of API errors.
6092c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */
6093c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcikint
6094c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. BuchcikxmlSchemaGetCanonValueWhtsp(xmlSchemaValPtr val,
6095c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    const xmlChar **retValue,
6096c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    xmlSchemaWhitespaceValueType ws)
6097c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik{
6098c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    if ((retValue == NULL) || (val == NULL))
6099c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	return (-1);
6100c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    if ((ws == XML_SCHEMA_WHITESPACE_UNKNOWN) ||
6101c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	(ws > XML_SCHEMA_WHITESPACE_COLLAPSE))
6102c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	return (-1);
6103c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
6104c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    *retValue = NULL;
6105c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    switch (val->type) {
6106c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_STRING:
6107c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (val->value.str == NULL)
6108c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
6109c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
6110c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlSchemaCollapseString(val->value.str);
6111c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else if (ws == XML_SCHEMA_WHITESPACE_REPLACE)
6112c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlSchemaWhiteSpaceReplace(val->value.str);
6113c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if ((*retValue) == NULL)
6114c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(val->value.str);
6115c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
6116c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_NORMSTRING:
6117c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (val->value.str == NULL)
6118c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
6119c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else {
6120c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
6121c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *retValue = xmlSchemaCollapseString(val->value.str);
6122c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else
6123c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *retValue = xmlSchemaWhiteSpaceReplace(val->value.str);
6124c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if ((*retValue) == NULL)
6125c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *retValue = BAD_CAST xmlStrdup(val->value.str);
6126c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
6127c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
6128c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	default:
6129c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    return (xmlSchemaGetCanonValue(val, retValue));
6130f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard    }
6131c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    return (0);
6132c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik}
6133c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
6134c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik/**
6135bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * xmlSchemaGetValType:
6136bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * @val: a schemas value
6137bda59576670f1cabea3c49520628d82e401702caDaniel Veillard *
6138bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * Accessor for the type of a value
6139bda59576670f1cabea3c49520628d82e401702caDaniel Veillard *
6140bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * Returns the xmlSchemaValType of the value
6141bda59576670f1cabea3c49520628d82e401702caDaniel Veillard */
6142478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValType
6143478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaGetValType(xmlSchemaValPtr val)
6144478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{
6145bda59576670f1cabea3c49520628d82e401702caDaniel Veillard    if (val == NULL)
6146bda59576670f1cabea3c49520628d82e401702caDaniel Veillard        return(XML_SCHEMAS_UNKNOWN);
6147478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    return (val->type);
61486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
61496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
61505d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#define bottom_xmlschemastypes
61515d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#include "elfgcchack.h"
61524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#endif /* LIBXML_SCHEMAS_ENABLED */
6153