xmlschemastypes.c revision 14b5643947845df089376106517c4f7ba061e4b0
14255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/*
24255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * schemastypes.c : implementation of the XML Schema Datatypes
34255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *             definition and validity checking
44255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
54255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * See Copyright for the status of this software.
64255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
74255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Daniel Veillard <veillard@redhat.com>
84255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
94255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define IN_LIBXML
114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include "libxml.h"
124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#ifdef LIBXML_SCHEMAS_ENABLED
144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <string.h>
164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/xmlmemory.h>
174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/parser.h>
184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/parserInternals.h>
194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/hash.h>
204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/valid.h>
2196a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard#include <libxml/xpath.h>
2296a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard#include <libxml/uri.h>
234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/xmlschemas.h>
254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/schemasInternals.h>
264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/xmlschemastypes.h>
274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
28070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#ifdef HAVE_MATH_H
29070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#include <math.h>
30070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#endif
31c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifdef HAVE_FLOAT_H
32c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#include <float.h>
33c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif
34070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define DEBUG
364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
37d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillard#ifndef LIBXML_XPATH_ENABLED
38d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillardextern double xmlXPathNAN;
39d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillardextern double xmlXPathPINF;
40d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillardextern double xmlXPathNINF;
41d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillard#endif
42d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillard
434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define TODO 								\
444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlGenericError(xmlGenericErrorContext,				\
454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    "Unimplemented block at %s:%d\n",				\
464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard            __FILE__, __LINE__);
474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define XML_SCHEMAS_NAMESPACE_NAME \
494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    (const xmlChar *)"http://www.w3.org/2001/XMLSchema"
504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik#define IS_WSP_REPLACE_CH(c)	((((c) == 0x9) || ((c) == 0xa)) || \
526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				 ((c) == 0xd))
536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik#define IS_WSP_SPACE_CH(c)	((c) == 0x20)
556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
56478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik#define IS_WSP_BLANK_CH(c) IS_BLANK_CH(c)
57478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik
58070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* Date value */
59070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef struct _xmlSchemaValDate xmlSchemaValDate;
60070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef xmlSchemaValDate *xmlSchemaValDatePtr;
61070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstruct _xmlSchemaValDate {
62070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long		year;
63070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	mon	:4;	/* 1 <=  mon    <= 12   */
64070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	day	:5;	/* 1 <=  day    <= 31   */
65070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	hour	:5;	/* 0 <=  hour   <= 23   */
66070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	min	:6;	/* 0 <=  min    <= 59	*/
67070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    double		sec;
68a77cf71f453249f224d609f2f20789a897c5bdebDaniel Veillard    unsigned int	tz_flag	:1;	/* is tzo explicitely set? */
69285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik    signed int		tzo	:12;	/* -1440 <= tzo <= 1440;
70285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik					   currently only -840 to +840 are needed */
71070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard};
72070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
73070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* Duration value */
74070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef struct _xmlSchemaValDuration xmlSchemaValDuration;
75070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef xmlSchemaValDuration *xmlSchemaValDurationPtr;
76070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstruct _xmlSchemaValDuration {
77070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long	        mon;		/* mon stores years also */
78070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long        	day;
79070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    double		sec;            /* sec stores min and hour also */
80070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard};
81070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardtypedef struct _xmlSchemaValDecimal xmlSchemaValDecimal;
834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardtypedef xmlSchemaValDecimal *xmlSchemaValDecimalPtr;
844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstruct _xmlSchemaValDecimal {
854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    /* would use long long but not portable */
86e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long lo;
87e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long mi;
88e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long hi;
894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    unsigned int extra;
905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    unsigned int sign:1;
91c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack    unsigned int frac:7;
92c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack    unsigned int total:8;
934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard};
944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
95e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardtypedef struct _xmlSchemaValQName xmlSchemaValQName;
96e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardtypedef xmlSchemaValQName *xmlSchemaValQNamePtr;
97e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstruct _xmlSchemaValQName {
98e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    xmlChar *name;
99e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    xmlChar *uri;
100e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard};
101e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
10270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardtypedef struct _xmlSchemaValHex xmlSchemaValHex;
10370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardtypedef xmlSchemaValHex *xmlSchemaValHexPtr;
10470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardstruct _xmlSchemaValHex {
10570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard    xmlChar     *str;
10670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard    unsigned int total;
10770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard};
10870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
1091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardtypedef struct _xmlSchemaValBase64 xmlSchemaValBase64;
1101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardtypedef xmlSchemaValBase64 *xmlSchemaValBase64Ptr;
1111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstruct _xmlSchemaValBase64 {
1121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    xmlChar     *str;
1131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    unsigned int total;
1141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard};
1151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
1164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstruct _xmlSchemaVal {
1174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValType type;
1184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    struct _xmlSchemaVal *next;
1194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    union {
1205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	xmlSchemaValDecimal     decimal;
121070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xmlSchemaValDate        date;
122070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xmlSchemaValDuration    dur;
123e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	xmlSchemaValQName	qname;
12470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	xmlSchemaValHex		hex;
1251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	xmlSchemaValBase64	base64;
12684d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard	float			f;
12784d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard	double			d;
128c5a70f264550ee39da267e81dccd95508ed367ddDaniel Veillard	int			b;
129c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	xmlChar                *str;
1304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    } value;
1314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard};
1324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
1334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int xmlSchemaTypesInitialized = 0;
1344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlHashTablePtr xmlSchemaTypesBank = NULL;
1354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
136c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard/*
137c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * Basic types
138c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */
1394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeStringDef = NULL;
1404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnyTypeDef = NULL;
1414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnySimpleTypeDef = NULL;
1424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDecimalDef = NULL;
143070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDatetimeDef = NULL;
1444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDateDef = NULL;
145070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeTimeDef = NULL;
146070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGYearDef = NULL;
147070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGYearMonthDef = NULL;
148070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGDayDef = NULL;
149070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGMonthDayDef = NULL;
150070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGMonthDef = NULL;
151070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDurationDef = NULL;
15284d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeFloatDef = NULL;
153c5a70f264550ee39da267e81dccd95508ed367ddDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeBooleanDef = NULL;
15484d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDoubleDef = NULL;
155560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeHexBinaryDef = NULL;
1561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeBase64BinaryDef = NULL;
157e5b110b3844d58ff4bea56bcb699144f6fbe0b83Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnyURIDef = NULL;
1584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
1594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/*
160c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * Derived types
161c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */
162c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypePositiveIntegerDef = NULL;
163c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNonPositiveIntegerDef = NULL;
164c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNegativeIntegerDef = NULL;
165c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNonNegativeIntegerDef = NULL;
166c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIntegerDef = NULL;
167c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeLongDef = NULL;
168c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIntDef = NULL;
169c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeShortDef = NULL;
170c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeByteDef = NULL;
171c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedLongDef = NULL;
172c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedIntDef = NULL;
173c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedShortDef = NULL;
174c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedByteDef = NULL;
1758bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNormStringDef = NULL;
1768bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeTokenDef = NULL;
1778bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeLanguageDef = NULL;
1788bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNameDef = NULL;
1798bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeQNameDef = NULL;
180e5b110b3844d58ff4bea56bcb699144f6fbe0b83Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNCNameDef = NULL;
1818bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdDef = NULL;
1828bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdrefDef = NULL;
1838bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdrefsDef = NULL;
184a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeEntityDef = NULL;
185a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeEntitiesDef = NULL;
186e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNotationDef = NULL;
1878bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNmtokenDef = NULL;
1888bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNmtokensDef = NULL;
189c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard
190d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/************************************************************************
191d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *									*
192d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * 			Datatype error handlers				*
193d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *									*
194d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard ************************************************************************/
195d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/**
196d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * xmlSchemaTypeErrMemory:
197d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * @extra:  extra informations
198d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *
199d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * Handle an out of memory condition
200d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard */
201d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillardstatic void
202d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel VeillardxmlSchemaTypeErrMemory(xmlNodePtr node, const char *extra)
203d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard{
204d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard    __xmlSimpleError(XML_FROM_DATATYPE, XML_ERR_NO_MEMORY, node, NULL, extra);
205d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard}
206d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard
207d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/************************************************************************
208d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *									*
209d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * 			Base types support				*
210d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *									*
211d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard ************************************************************************/
2124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
2134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik/**
2144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * xmlSchemaNewValue:
2154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * @type:  the value type
2164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *
2174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Allocate a new simple type value
2184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *
2194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error
2204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */
2214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikstatic xmlSchemaValPtr
2224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaNewValue(xmlSchemaValType type) {
2234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaValPtr value;
2244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
2254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    value = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal));
2264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (value == NULL) {
2274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return(NULL);
2284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    }
2294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    memset(value, 0, sizeof(xmlSchemaVal));
2304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    value->type = type;
2314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return(value);
2324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
2334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
2344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikstatic xmlSchemaFacetPtr
2354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaNewMinLengthFacet(int value)
2364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{
2374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaFacetPtr ret;
2384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
2394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret = xmlSchemaNewFacet();
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);
2454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->val->value.decimal.lo = value;
2464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (ret);
2474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
2484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
249c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard/*
2504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitBasicType:
2514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name:  the type name
2528bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard * @type:  the value type associated
2534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
25401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Initialize one primitive built-in type
2554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
2564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr
25701fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaInitBasicType(const char *name, xmlSchemaValType type,
25801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		       xmlSchemaTypePtr baseType) {
2594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypePtr ret;
2604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
2614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType));
2624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (ret == NULL) {
263d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard        xmlSchemaTypeErrMemory(NULL, "could not initialize basic types");
2644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(NULL);
2654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
2664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    memset(ret, 0, sizeof(xmlSchemaType));
267be9c6320d4ed8d5622322014310555bb88b02a85Daniel Veillard    ret->name = (const xmlChar *)name;
2684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->targetNamespace = XML_SCHEMAS_NAMESPACE_NAME;
2694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    ret->type = XML_SCHEMA_TYPE_BASIC;
2704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->baseType = baseType;
2714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->contentType = XML_SCHEMA_CONTENT_BASIC;
27201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    /*
2734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    * Primitive types.
27401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
2754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    switch (type) {
27601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_STRING:
27701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DECIMAL:
27801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATE:
27901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATETIME:
28001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TIME:
28101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEAR:
28201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEARMONTH:
28301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTH:
28401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTHDAY:
28501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GDAY:
28601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DURATION:
28701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_FLOAT:
28801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DOUBLE:
28901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BOOLEAN:
29001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYURI:
29101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_HEXBINARY:
29201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BASE64BINARY:
29301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_QNAME:
29401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NOTATION:
29501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    ret->flags |= XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE;
2964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
29796d2effc735fb45cfa363b6a876ff23a862f87a5William M. Brack	default:
2984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
2994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    }
3004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    /*
3014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    * Set variety.
3024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    */
3034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    switch (type) {
3044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_ANYTYPE:
3054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_ANYSIMPLETYPE:
3064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
3074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_IDREFS:
3084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_NMTOKENS:
3094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_ENTITIES:
3104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    ret->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST;
3114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    ret->facets = xmlSchemaNewMinLengthFacet(1);
3124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    ret->flags |= XML_SCHEMAS_TYPE_HAS_FACETS;
3134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
3144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	default:
3154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    ret->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC;
3164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
31701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
3184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlHashAddEntry2(xmlSchemaTypesBank, ret->name,
3194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	             XML_SCHEMAS_NAMESPACE_NAME, ret);
32001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    ret->builtInType = type;
3214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return(ret);
3224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
3234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
3244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/*
32511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* WARNING: Those type reside normally in xmlschemas.c but are
32611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* redefined here locally in oder of being able to use them for xs:anyType-
32711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* TODO: Remove those definition if we move the types to a header file.
32811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* TODO: Always keep those structs up-to-date with the originals.
32911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik*/
33011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik#define UNBOUNDED (1 << 30)
33111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik
33211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef struct _xmlSchemaTreeItem xmlSchemaTreeItem;
33311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef xmlSchemaTreeItem *xmlSchemaTreeItemPtr;
33411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstruct _xmlSchemaTreeItem {
33511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTypeType type;
33611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaAnnotPtr annot;
33711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTreeItemPtr next;
33811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTreeItemPtr children;
33911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik};
34011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik
34111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef struct _xmlSchemaParticle xmlSchemaParticle;
34211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef xmlSchemaParticle *xmlSchemaParticlePtr;
34311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstruct _xmlSchemaParticle {
34411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTypeType type;
34511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaAnnotPtr annot;
34611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTreeItemPtr next;
34711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTreeItemPtr children;
34811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    int minOccurs;
34911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    int maxOccurs;
35011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlNodePtr node;
35111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik};
35211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik
35311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef struct _xmlSchemaModelGroup xmlSchemaModelGroup;
35411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef xmlSchemaModelGroup *xmlSchemaModelGroupPtr;
35511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstruct _xmlSchemaModelGroup {
35611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTypeType type;
35711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaAnnotPtr annot;
35811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTreeItemPtr next;
35911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTreeItemPtr children;
36011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlNodePtr node;
36111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik};
36211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik
36311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstatic xmlSchemaParticlePtr
36411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. BuchcikxmlSchemaAddParticle(void)
36511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik{
36611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaParticlePtr ret = NULL;
36711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik
36811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    ret = (xmlSchemaParticlePtr)
36911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlMalloc(sizeof(xmlSchemaParticle));
37011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    if (ret == NULL) {
37111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlSchemaTypeErrMemory(NULL, "allocating particle component");
37211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	return (NULL);
37311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    }
37411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    memset(ret, 0, sizeof(xmlSchemaParticle));
37511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    ret->type = XML_SCHEMA_TYPE_PARTICLE;
37611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    ret->minOccurs = 1;
37711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    ret->maxOccurs = 1;
37811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    return (ret);
37911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik}
38011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik
38111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik/*
3824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitTypes:
3834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
3844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Initialize the default XML Schemas type library
3854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
3864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid
3876560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel VeillardxmlSchemaInitTypes(void)
3886560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard{
3894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized != 0)
3906560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        return;
3914255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypesBank = xmlHashCreate(40);
3926560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard
39301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
394c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard    /*
39501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * 3.4.7 Built-in Complex Type Definition
39601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
3978bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeAnyTypeDef = xmlSchemaInitBasicType("anyType",
3982f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack                                                     XML_SCHEMAS_ANYTYPE,
39901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     NULL);
40001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeAnyTypeDef->baseType = xmlSchemaTypeAnyTypeDef;
40101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED;
40211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    /*
40311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    * Init the content type.
40411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    */
40511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED;
40601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    {
40711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlSchemaParticlePtr particle;
40811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlSchemaModelGroupPtr sequence;
40901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaWildcardPtr wild;
41011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* First particle. */
41111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	particle = xmlSchemaAddParticle();
41211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	if (particle == NULL)
41311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    return;
41411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlSchemaTypeAnyTypeDef->subtypes = (xmlSchemaTypePtr) particle;
41511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* Sequence model group. */
41611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	sequence = (xmlSchemaModelGroupPtr)
41711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    xmlMalloc(sizeof(xmlSchemaModelGroup));
41811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	if (sequence == NULL) {
41911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    xmlSchemaTypeErrMemory(NULL, "allocating model group component");
42011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    return;
42111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	}
42211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	memset(sequence, 0, sizeof(xmlSchemaModelGroup));
42311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	sequence->type = XML_SCHEMA_TYPE_SEQUENCE;
42411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	particle->children = (xmlSchemaTreeItemPtr) sequence;
42511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* Second particle. */
42611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	particle = xmlSchemaAddParticle();
42711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	if (particle == NULL)
42811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    return;
42911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	particle->minOccurs = 0;
43011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	particle->maxOccurs = UNBOUNDED;
43111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	sequence->children = (xmlSchemaTreeItemPtr) particle;
43211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* The wildcard */
43311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard));
43411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	if (wild == NULL) {
43511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    xmlSchemaTypeErrMemory(NULL, "allocating wildcard component");
43611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    return;
43711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	}
43811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	memset(wild, 0, sizeof(xmlSchemaWildcard));
43911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	wild->type = XML_SCHEMA_TYPE_ANY;
44069dea3a0c01e8a952b1d2f07ab0a3aa450f0cdfeKasimier T. Buchcik	wild->any = 1;
44111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	wild->processContents = XML_SCHEMAS_ANY_LAX;
44211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	particle->children = (xmlSchemaTreeItemPtr) wild;
44311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/*
44411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	* Create the attribute wildcard.
44511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	*/
44601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard));
44701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (wild == NULL) {
44811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    xmlSchemaTypeErrMemory(NULL, "could not create an attribute "
44911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik		"wildcard on anyType");
45001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return;
45101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
45201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	memset(wild, 0, sizeof(xmlSchemaWildcard));
45301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	wild->any = 1;
45469dea3a0c01e8a952b1d2f07ab0a3aa450f0cdfeKasimier T. Buchcik	wild->processContents = XML_SCHEMAS_ANY_LAX;
45501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeAnyTypeDef->attributeWildcard = wild;
45601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
45701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeAnySimpleTypeDef = xmlSchemaInitBasicType("anySimpleType",
4582f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack                                                           XML_SCHEMAS_ANYSIMPLETYPE,
45901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard							   xmlSchemaTypeAnyTypeDef);
46001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    /*
46101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * primitive datatypes
46201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
46301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeStringDef = xmlSchemaInitBasicType("string",
46401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_STRING,
46501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
4668bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDecimalDef = xmlSchemaInitBasicType("decimal",
46701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_DECIMAL,
46801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeAnySimpleTypeDef);
4698bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDateDef = xmlSchemaInitBasicType("date",
47001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_DATE,
47101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeAnySimpleTypeDef);
4728bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDatetimeDef = xmlSchemaInitBasicType("dateTime",
47301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_DATETIME,
47401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						      xmlSchemaTypeAnySimpleTypeDef);
4758bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeTimeDef = xmlSchemaInitBasicType("time",
47601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_TIME,
47701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeAnySimpleTypeDef);
4788bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGYearDef = xmlSchemaInitBasicType("gYear",
47901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_GYEAR,
48001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeAnySimpleTypeDef);
4818bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGYearMonthDef = xmlSchemaInitBasicType("gYearMonth",
48201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                        XML_SCHEMAS_GYEARMONTH,
48301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard							xmlSchemaTypeAnySimpleTypeDef);
4848bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGMonthDef = xmlSchemaInitBasicType("gMonth",
48501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_GMONTH,
48601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
4878bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGMonthDayDef = xmlSchemaInitBasicType("gMonthDay",
48801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                       XML_SCHEMAS_GMONTHDAY,
48901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						       xmlSchemaTypeAnySimpleTypeDef);
4908bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGDayDef = xmlSchemaInitBasicType("gDay",
49101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_GDAY,
49201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeAnySimpleTypeDef);
4938bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDurationDef = xmlSchemaInitBasicType("duration",
49401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_DURATION,
49501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						      xmlSchemaTypeAnySimpleTypeDef);
4968bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float",
49701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_FLOAT,
49801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeAnySimpleTypeDef);
4998bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double",
50001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_DOUBLE,
50101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
5028bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeBooleanDef = xmlSchemaInitBasicType("boolean",
50301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_BOOLEAN,
50401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeAnySimpleTypeDef);
5058bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeAnyURIDef = xmlSchemaInitBasicType("anyURI",
50601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_ANYURI,
50701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
508560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard    xmlSchemaTypeHexBinaryDef = xmlSchemaInitBasicType("hexBinary",
50901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_HEXBINARY,
51001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeAnySimpleTypeDef);
5111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    xmlSchemaTypeBase64BinaryDef
51201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        = xmlSchemaInitBasicType("base64Binary", XML_SCHEMAS_BASE64BINARY,
51301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeAnySimpleTypeDef);
51401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNotationDef = xmlSchemaInitBasicType("NOTATION",
51501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_NOTATION,
51601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
51701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeQNameDef = xmlSchemaInitBasicType("QName",
51801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_QNAME,
51901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeAnySimpleTypeDef);
5204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
521c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard    /*
522c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard     * derived datatypes
523c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard     */
5248bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeIntegerDef = xmlSchemaInitBasicType("integer",
52501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_INTEGER,
52601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeDecimalDef);
5276560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeNonPositiveIntegerDef =
5286560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        xmlSchemaInitBasicType("nonPositiveInteger",
52901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                               XML_SCHEMAS_NPINTEGER,
53001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard			       xmlSchemaTypeIntegerDef);
5316560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeNegativeIntegerDef =
53201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("negativeInteger", XML_SCHEMAS_NINTEGER,
53301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeNonPositiveIntegerDef);
5346560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeLongDef =
53501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("long", XML_SCHEMAS_LONG,
53601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeIntegerDef);
53701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeIntDef = xmlSchemaInitBasicType("int", XML_SCHEMAS_INT,
53801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeLongDef);
5398bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeShortDef = xmlSchemaInitBasicType("short",
54001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_SHORT,
54101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeIntDef);
5428bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeByteDef = xmlSchemaInitBasicType("byte",
54301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_BYTE,
54401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeShortDef);
5456560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeNonNegativeIntegerDef =
5466560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        xmlSchemaInitBasicType("nonNegativeInteger",
54701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                               XML_SCHEMAS_NNINTEGER,
54801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard			       xmlSchemaTypeIntegerDef);
5496560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedLongDef =
55001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedLong", XML_SCHEMAS_ULONG,
55101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeNonNegativeIntegerDef);
5526560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedIntDef =
55301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedInt", XML_SCHEMAS_UINT,
55401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeUnsignedLongDef);
5556560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedShortDef =
55601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedShort", XML_SCHEMAS_USHORT,
55701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeUnsignedIntDef);
5586560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedByteDef =
55901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedByte", XML_SCHEMAS_UBYTE,
56001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeUnsignedShortDef);
5616560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypePositiveIntegerDef =
56201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("positiveInteger", XML_SCHEMAS_PINTEGER,
56301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeNonNegativeIntegerDef);
5648bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeNormStringDef = xmlSchemaInitBasicType("normalizedString",
56501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                        XML_SCHEMAS_NORMSTRING,
56601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard							xmlSchemaTypeStringDef);
5678bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeTokenDef = xmlSchemaInitBasicType("token",
56801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_TOKEN,
56901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeNormStringDef);
5708bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeLanguageDef = xmlSchemaInitBasicType("language",
57101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_LANGUAGE,
57201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						      xmlSchemaTypeTokenDef);
57301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNameDef = xmlSchemaInitBasicType("Name",
57401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_NAME,
57501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeTokenDef);
57601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNmtokenDef = xmlSchemaInitBasicType("NMTOKEN",
57701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_NMTOKEN,
5784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						     xmlSchemaTypeTokenDef);
57901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNCNameDef = xmlSchemaInitBasicType("NCName",
58001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_NCNAME,
58101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeNameDef);
58201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeIdDef = xmlSchemaInitBasicType("ID", XML_SCHEMAS_ID,
5834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						    xmlSchemaTypeNCNameDef);
5848bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeIdrefDef = xmlSchemaInitBasicType("IDREF",
58501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_IDREF,
5864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						   xmlSchemaTypeNCNameDef);
587a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    xmlSchemaTypeEntityDef = xmlSchemaInitBasicType("ENTITY",
58801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_ENTITY,
58901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeNCNameDef);
5904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    /*
5914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    * Derived list types.
5924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    */
5934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    /* ENTITIES */
594a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    xmlSchemaTypeEntitiesDef = xmlSchemaInitBasicType("ENTITIES",
59501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_ENTITIES,
5964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						      xmlSchemaTypeAnySimpleTypeDef);
5974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaTypeEntitiesDef->subtypes = xmlSchemaTypeEntityDef;
5984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    /* IDREFS */
5994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaTypeIdrefsDef = xmlSchemaInitBasicType("IDREFS",
6004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik                                                    XML_SCHEMAS_IDREFS,
6014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						    xmlSchemaTypeAnySimpleTypeDef);
6024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaTypeIdrefsDef->subtypes = xmlSchemaTypeIdrefDef;
6034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
6044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    /* NMTOKENS */
6054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaTypeNmtokensDef = xmlSchemaInitBasicType("NMTOKENS",
6064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik                                                      XML_SCHEMAS_NMTOKENS,
6074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						      xmlSchemaTypeAnySimpleTypeDef);
6084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaTypeNmtokensDef->subtypes = xmlSchemaTypeNmtokenDef;
6094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
6104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypesInitialized = 1;
6114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
6124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
6134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
6144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCleanupTypes:
6154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
6164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library
6174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
6184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid
6194255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCleanupTypes(void) {
6204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
6214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return;
62211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    /*
62311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    * Free xs:anyType.
62411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    */
62511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    {
62611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlSchemaParticlePtr particle;
62711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* Attribute wildcard. */
62811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlSchemaFreeWildcard(xmlSchemaTypeAnyTypeDef->attributeWildcard);
62911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* Content type. */
63011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	particle = (xmlSchemaParticlePtr) xmlSchemaTypeAnyTypeDef->subtypes;
63111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* Wildcard. */
63211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlSchemaFreeWildcard((xmlSchemaWildcardPtr)
63311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	    particle->children->children->children);
63411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlFree((xmlSchemaParticlePtr) particle->children->children);
63511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	/* Sequence model group. */
63611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlFree((xmlSchemaModelGroupPtr) particle->children);
63711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlFree((xmlSchemaParticlePtr) particle);
63811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik	xmlSchemaTypeAnyTypeDef->subtypes = NULL;
63911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik    }
6404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlHashFree(xmlSchemaTypesBank, (xmlHashDeallocator) xmlSchemaFreeType);
6414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypesInitialized = 0;
6424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
6434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
6444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
6456927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaIsBuiltInTypeFacet:
64601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in type
64701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facetType:  the facet type
64801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
64901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Evaluates if a specific facet can be
65001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * used in conjunction with a type.
65101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
65201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 1 if the facet can be used with the given built-in type,
65301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 0 otherwise and -1 in case the type is not a built-in type.
65401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
65501fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint
65601fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaIsBuiltInTypeFacet(xmlSchemaTypePtr type, int facetType)
65701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
658ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard    if (type == NULL)
659ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard	return (-1);
66001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if (type->type != XML_SCHEMA_TYPE_BASIC)
66101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	return (-1);
66201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type->builtInType) {
66301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BOOLEAN:
66401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_PATTERN) ||
66501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE))
66601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
66701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
66801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (0);
66901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_STRING:
67001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NOTATION:
67101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_QNAME:
67201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYURI:
67301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BASE64BINARY:
67401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_HEXBINARY:
67501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_LENGTH) ||
67601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MINLENGTH) ||
67701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXLENGTH) ||
67801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_PATTERN) ||
67901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_ENUMERATION) ||
68001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE))
68101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
68201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
68301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (0);
68401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DECIMAL:
68501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_TOTALDIGITS) ||
68601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) ||
68701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_PATTERN) ||
68801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE) ||
68901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_ENUMERATION) ||
69001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) ||
69101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) ||
69201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MININCLUSIVE) ||
69301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MINEXCLUSIVE))
69401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
69501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
69601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (0);
69701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TIME:
69801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GDAY:
69901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTH:
70001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTHDAY:
70101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEAR:
70201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEARMONTH:
70301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATE:
70401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATETIME:
70501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DURATION:
70601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_FLOAT:
70701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DOUBLE:
70801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_PATTERN) ||
70901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_ENUMERATION) ||
71001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE) ||
71101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) ||
71201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) ||
71301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MININCLUSIVE) ||
71401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MINEXCLUSIVE))
71501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
71601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
71701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (0);
71801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	default:
719c7e3cc49bade82dba0cda4ae7c07ffcd1e32fe25Daniel Veillard	    break;
72001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
72101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    return (0);
72201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
72301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
72401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
72501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInType:
72601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type:  the type of the built in type
72701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
72801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Gives you the type struct for a built-in
72901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * type by its type id.
73001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
73101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns the type if found, NULL otherwise.
73201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
73301fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr
73401fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInType(xmlSchemaValType type)
73501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
73601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
73701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaInitTypes();
73801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type) {
73901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
74001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYSIMPLETYPE:
74101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeAnySimpleTypeDef);
74201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_STRING:
74301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeStringDef);
74401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NORMSTRING:
74501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNormStringDef);
74601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DECIMAL:
74701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDecimalDef);
74801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TIME:
74901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeTimeDef);
75001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GDAY:
75101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGDayDef);
75201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTH:
75301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGMonthDef);
75401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTHDAY:
75501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    	    return (xmlSchemaTypeGMonthDayDef);
75601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEAR:
75701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGYearDef);
75801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEARMONTH:
75901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGYearMonthDef);
76001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATE:
76101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDateDef);
76201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATETIME:
76301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDatetimeDef);
76401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DURATION:
76501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDurationDef);
76601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_FLOAT:
76701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeFloatDef);
76801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DOUBLE:
76901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDoubleDef);
77001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BOOLEAN:
77101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeBooleanDef);
77201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TOKEN:
77301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeTokenDef);
77401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_LANGUAGE:
77501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeLanguageDef);
77601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NMTOKEN:
77701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNmtokenDef);
77801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NMTOKENS:
77901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNmtokensDef);
78001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NAME:
78101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNameDef);
78201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_QNAME:
78301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeQNameDef);
78401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NCNAME:
78501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNCNameDef);
78601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ID:
78701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdDef);
78801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_IDREF:
78901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdrefDef);
79001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_IDREFS:
79101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdrefsDef);
79201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ENTITY:
79301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeEntityDef);
79401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ENTITIES:
79501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeEntitiesDef);
79601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NOTATION:
79701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNotationDef);
79801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYURI:
79901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeAnyURIDef);
80001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_INTEGER:
80101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIntegerDef);
80201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NPINTEGER:
80301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNonPositiveIntegerDef);
80401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NINTEGER:
80501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNegativeIntegerDef);
80601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NNINTEGER:
80701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNonNegativeIntegerDef);
80801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_PINTEGER:
80901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypePositiveIntegerDef);
81001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_INT:
81101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIntDef);
81201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_UINT:
81301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedIntDef);
81401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_LONG:
81501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeLongDef);
81601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ULONG:
81701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedLongDef);
81801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_SHORT:
81901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeShortDef);
82001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_USHORT:
82101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedShortDef);
82201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BYTE:
82301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeByteDef);
82401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_UBYTE:
82501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedByteDef);
82601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_HEXBINARY:
82701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeHexBinaryDef);
82801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BASE64BINARY:
82901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeBase64BinaryDef);
83001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYTYPE:
83101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeAnyTypeDef);
83201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	default:
83301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (NULL);
83401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
83501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
83601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
8377f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/**
8387f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueAppend:
8397f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @prev: the value
8407f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @cur: the value to be appended
8417f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
8427f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Appends a next sibling to a list of computed values.
8437f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
8447f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns 0 if succeeded and -1 on API errors.
8457f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */
8464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikint
8474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueAppend(xmlSchemaValPtr prev, xmlSchemaValPtr cur) {
8484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
8494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if ((prev == NULL) || (cur == NULL))
8504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return (-1);
8514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    prev->next = cur;
8524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (0);
8534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
8544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
8557f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/**
8567f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetNext:
8577f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @cur: the value
8587f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
8597f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the next sibling of a list of computed values.
8607f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
8617f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns the next value or NULL if there was none, or on
8627f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *         API errors.
8637f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */
8644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValPtr
8654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetNext(xmlSchemaValPtr cur) {
8664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
8674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (cur == NULL)
8684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return (NULL);
8694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (cur->next);
8704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
8714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
8727f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/**
8737f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetAsString:
8747f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @val: the value
8757f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
8767f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the string value of a computed value.
8777f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
8787f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns the string value or NULL if there was none, or on
8797f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *         API errors.
8807f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */
8814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikconst xmlChar *
8824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetAsString(xmlSchemaValPtr val)
8834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{
8844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (val == NULL)
8854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return (NULL);
8864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    switch (val->type) {
8874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_STRING:
8884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_NORMSTRING:
8894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_ANYSIMPLETYPE:
8904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_TOKEN:
8914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_LANGUAGE:
8924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_NMTOKEN:
8934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_NAME:
8944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_NCNAME:
8954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_ID:
8964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_IDREF:
8974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_ENTITY:
8984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_ANYURI:
8994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    return (BAD_CAST val->value.str);
9004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	default:
9014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
9024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
9034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (NULL);
9044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
9054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
9067f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/**
9077f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetAsBoolean:
9087f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @val: the value
9097f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
9107f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the boolean value of a computed value.
9117f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
9127f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns 1 if true and 0 if false, or in case of an error. Hmm.
9137f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */
9144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikint
9154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetAsBoolean(xmlSchemaValPtr val)
9164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{
9174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if ((val == NULL) || (val->type != XML_SCHEMAS_BOOLEAN))
9184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return (0);
9194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (val->value.b);
9204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
9214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
9224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
9236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaNewStringValue:
9246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @type:  the value type
925b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @value:  the value
9266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
9276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Allocate a new simple type value. The type can be
9282ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * of XML_SCHEMAS_STRING.
9292ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * WARNING: This one is intended to be expanded for other
9302ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * string based types. We need this for anySimpleType as well.
9314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given value is consumed and freed with the struct.
9326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
9336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error
9346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
9356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaValPtr
9366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaNewStringValue(xmlSchemaValType type,
9376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			const xmlChar *value)
9386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
9396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    xmlSchemaValPtr val;
9406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
9416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (type != XML_SCHEMAS_STRING)
9426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return(NULL);
9436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    val = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal));
9446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (val == NULL) {
9456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return(NULL);
9466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
9476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    memset(val, 0, sizeof(xmlSchemaVal));
9486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    val->type = type;
9496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    val->value.str = (xmlChar *) value;
9506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(val);
9516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
9526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
953b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik/**
954b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * xmlSchemaNewNOTATIONValue:
955b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @name:  the notation name
956b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @ns: the notation namespace name or NULL
957b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik *
958b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * Allocate a new NOTATION value.
9594efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given values are consumed and freed with the struct.
960b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik *
961b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error
962b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik */
963b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. BuchcikxmlSchemaValPtr
964b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. BuchcikxmlSchemaNewNOTATIONValue(const xmlChar *name,
965b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik			  const xmlChar *ns)
966b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik{
967b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    xmlSchemaValPtr val;
968b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik
969b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    val = xmlSchemaNewValue(XML_SCHEMAS_NOTATION);
970b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    if (val == NULL)
971b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik	return (NULL);
972b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik
97312d37ab63441baf9e03db70168cc1d0d6f1c2373William M. Brack    val->value.qname.name = (xmlChar *)name;
974b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    if (ns != NULL)
97512d37ab63441baf9e03db70168cc1d0d6f1c2373William M. Brack	val->value.qname.uri = (xmlChar *)ns;
976b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    return(val);
977b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik}
9786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
9796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
9804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * xmlSchemaNewQNameValue:
9814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * @namespaceName: the namespace name
9824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * @localName: the local name
9834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *
9844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Allocate a new QName value.
9854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given values are consumed and freed with the struct.
9864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *
9874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of an error.
9884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */
9894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValPtr
9904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaNewQNameValue(const xmlChar *namespaceName,
9914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		       const xmlChar *localName)
9924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{
9934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaValPtr val;
9944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
9954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    val = xmlSchemaNewValue(XML_SCHEMAS_QNAME);
9964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (val == NULL)
9974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return (NULL);
9984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
9994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    val->value.qname.name = (xmlChar *) localName;
10004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    val->value.qname.uri = (xmlChar *) namespaceName;
10014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return(val);
10024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
10034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
10044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik/**
10054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaFreeValue:
10064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value:  the value to free
10074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
10084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library
10094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
10104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid
10114255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaFreeValue(xmlSchemaValPtr value) {
10124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaValPtr prev;
10134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
10144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    while (value != NULL) {
10154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	switch (value->type) {
10164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_STRING:
10174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NORMSTRING:
10184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_TOKEN:
10194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_LANGUAGE:
10204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NMTOKEN:
10214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NMTOKENS:
10224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NAME:
10234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NCNAME:
10244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ID:
10254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_IDREF:
10264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_IDREFS:
10274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ENTITY:
10284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ENTITIES:
10294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYURI:
10304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYSIMPLETYPE:
10314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (value->value.str != NULL)
10324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlFree(value->value.str);
10334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
10344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NOTATION:
10354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_QNAME:
10364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (value->value.qname.uri != NULL)
10374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlFree(value->value.qname.uri);
10384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (value->value.qname.name != NULL)
10394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlFree(value->value.qname.name);
10404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
10414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_HEXBINARY:
10424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (value->value.hex.str != NULL)
10434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlFree(value->value.hex.str);
10444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
10454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_BASE64BINARY:
10464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (value->value.base64.str != NULL)
10474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlFree(value->value.base64.str);
10484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
10494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    default:
10504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
10514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	}
10524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	prev = value;
10534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	value = value->next;
10544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	xmlFree(prev);
10554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    }
10564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
10574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
10584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
10594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaGetPredefinedType:
10604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name: the type name
10614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @ns:  the URI of the namespace usually "http://www.w3.org/2001/XMLSchema"
10624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
10634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Lookup a type in the default XML Schemas type library
10644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
10654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns the type if found, NULL otherwise
10664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
10674255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaTypePtr
10684255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaGetPredefinedType(const xmlChar *name, const xmlChar *ns) {
10694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
10704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	xmlSchemaInitTypes();
10714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (name == NULL)
10724255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(NULL);
10734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return((xmlSchemaTypePtr) xmlHashLookup2(xmlSchemaTypesBank, name, ns));
10744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
1075070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
107601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
107701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInListSimpleTypeItemType:
107801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in simple type.
107901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
10806927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Lookup function
10816927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard *
1082c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns the item type of @type as defined by the built-in datatype
1083c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * hierarchy of XML Schema Part 2: Datatypes, or NULL in case of an error.
108401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
108501fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr
108601fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInListSimpleTypeItemType(xmlSchemaTypePtr type)
108701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
10884259532303e96e089a185c6f55056cb7c4902d71Daniel Veillard    if ((type == NULL) || (type->type != XML_SCHEMA_TYPE_BASIC))
108901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	return (NULL);
109001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type->builtInType) {
109101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NMTOKENS:
109201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNmtokenDef );
109301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_IDREFS:
109401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdrefDef);
109501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ENTITIES:
109601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeEntityDef);
109701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	default:
109801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (NULL);
109901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
110001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
110101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
1102070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/****************************************************************
1103070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
1104070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *		Convenience macros and functions		*
1105070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
1106070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/
1107070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1108070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_TZO_CHAR(c)						\
1109070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	((c == 0) || (c == 'Z') || (c == '+') || (c == '-'))
1110070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1111070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_YEAR(yr)          (yr != 0)
1112070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MONTH(mon)        ((mon >= 1) && (mon <= 12))
1113070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* VALID_DAY should only be used when month is unknown */
1114070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DAY(day)          ((day >= 1) && (day <= 31))
1115070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_HOUR(hr)          ((hr >= 0) && (hr <= 23))
1116070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MIN(min)          ((min >= 0) && (min <= 59))
1117070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_SEC(sec)          ((sec >= 0) && (sec < 60))
1118690a68095f589248c9e962c6b5468aacb6d3aabaKasimier T. Buchcik#define VALID_TZO(tzo)          ((tzo > -840) && (tzo < 840))
1119070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_LEAP(y)						\
1120070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
1121070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1122ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonth[12] =
1123070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
1124ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonthLeap[12] =
1125070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
1126070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
11275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MAX_DAYINMONTH(yr,mon)                                  \
11285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1])
11295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
1130070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MDAY(dt)						\
1131070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(IS_LEAP(dt->year) ?				        \
1132070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (dt->day <= daysInMonthLeap[dt->mon - 1]) :	        \
1133070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (dt->day <= daysInMonth[dt->mon - 1]))
1134070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1135070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATE(dt)						\
1136070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_YEAR(dt->year) && VALID_MONTH(dt->mon) && VALID_MDAY(dt))
1137070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1138070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TIME(dt)						\
1139070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_HOUR(dt->hour) && VALID_MIN(dt->min) &&		\
1140070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 VALID_SEC(dt->sec) && VALID_TZO(dt->tzo))
1141070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1142070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATETIME(dt)					\
1143070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_DATE(dt) && VALID_TIME(dt))
1144070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1145070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_MIN            (60)
1146070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_HOUR           (60 * SECS_PER_MIN)
1147070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_DAY            (24 * SECS_PER_HOUR)
1148070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
11495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInYearByMonth[12] =
11505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
11515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInLeapYearByMonth[12] =
11525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };
11535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
11545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DAY_IN_YEAR(day, month, year)				\
11555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ((IS_LEAP(year) ?					\
11565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                dayInLeapYearByMonth[month - 1] :		\
11575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                dayInYearByMonth[month - 1]) + day)
11585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
11595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#ifdef DEBUG
11605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt)                                                  \
11615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlGenericError(xmlGenericErrorContext,                             \
11625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        "type=%o %04ld-%02u-%02uT%02u:%02u:%03f",                       \
11635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->type,dt->value.date.year,dt->value.date.mon,                \
11645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->value.date.day,dt->value.date.hour,dt->value.date.min,      \
11655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->value.date.sec);                                            \
11665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dt->value.date.tz_flag)                                         \
11675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (dt->value.date.tzo != 0)                                    \
11685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmlGenericError(xmlGenericErrorContext,                     \
11695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                "%+05d\n",dt->value.date.tzo);                          \
11705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else                                                            \
11715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmlGenericError(xmlGenericErrorContext, "Z\n");             \
11725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else                                                                \
11735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        xmlGenericError(xmlGenericErrorContext,"\n")
11745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#else
11755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt)
11765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#endif
11775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
1178070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1179070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGYear:
1180070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1181070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1182070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1183070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gYear without time zone and fills in the appropriate
1184070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1185070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gYear. It is supposed that @dt->year is big enough to contain
1186070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * the year.
1187070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1188070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1189070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1190070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1191070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) {
1192070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str, *firstChar;
1193070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int isneg = 0, digcnt = 0;
1194070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1195070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (((*cur < '0') || (*cur > '9')) &&
1196070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(*cur != '-') && (*cur != '+'))
1197070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1198070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1199070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur == '-') {
1200070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	isneg = 1;
1201070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1202070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1203070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1204070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    firstChar = cur;
1205070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1206070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    while ((*cur >= '0') && (*cur <= '9')) {
1207070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->year = dt->year * 10 + (*cur - '0');
1208070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1209070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	digcnt++;
1210070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1211070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1212070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* year must be at least 4 digits (CCYY); over 4
1213070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * digits cannot have a leading zero. */
1214070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0')))
1215070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1216070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1217070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (isneg)
1218070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->year = - dt->year;
1219070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1220070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (!VALID_YEAR(dt->year))
1221070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1222070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1223070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1224070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1225070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1226070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1227070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1228070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_2_DIGITS:
1229070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the integer to fill in
1230070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1231070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer
1232070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1233070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a 2-digits integer and updates @num with the value. @cur is
1234070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer.
1235070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and
1236070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1237070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1238070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_2_DIGITS(num, cur, invalid)			\
1239070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if ((cur[0] < '0') || (cur[0] > '9') ||			\
1240070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (cur[1] < '0') || (cur[1] > '9'))			\
1241070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    invalid = 1;					\
1242070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	else							\
1243070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    num = (cur[0] - '0') * 10 + (cur[1] - '0');		\
1244070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur += 2;
1245070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1246070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1247070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_FLOAT:
1248070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the double to fill in
1249070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1250070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer
1251070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1252070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float and updates @num with the value. @cur is
1253070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the float. The float must have a
1254070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2-digits integer part and may or may not have a decimal part.
1255070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and
1256070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1257070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1258070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_FLOAT(num, cur, invalid)				\
1259070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(num, cur, invalid);			\
1260070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!invalid && (*cur == '.')) {			\
1261070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    double mult = 1;				        \
1262070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    cur++;						\
1263070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((*cur < '0') || (*cur > '9'))			\
1264070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		invalid = 1;					\
1265070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
1266070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		mult /= 10;					\
1267070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num += (*cur - '0') * mult;			\
1268070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		cur++;						\
1269070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }							\
1270070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1271070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1272070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1273070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGMonth:
1274070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1275070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1276070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1277070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gMonth without time zone and fills in the appropriate
1278070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1279070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gMonth.
1280070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1281070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1282070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1283070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1284070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) {
1285070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
1286070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
128764dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    unsigned int value = 0;
1288070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
128964dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    PARSE_2_DIGITS(value, cur, ret);
1290070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1291070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1292070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
129364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if (!VALID_MONTH(value))
1294070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1295070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
129664dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    dt->mon = value;
129764dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik
1298070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1299070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1300070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1301070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1302070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1303070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGDay:
1304070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1305070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1306070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1307070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gDay without time zone and fills in the appropriate
1308070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1309070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay.
1310070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1311070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1312070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1313070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1314070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) {
1315070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
1316070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
131764dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    unsigned int value = 0;
1318070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
131964dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    PARSE_2_DIGITS(value, cur, ret);
1320070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1321070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1322070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
132364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if (!VALID_DAY(value))
1324070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1325070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
132664dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    dt->day = value;
1327070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1328070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1329070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1330070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1331070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1332070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTime:
1333070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1334070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1335070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1336070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:time without time zone and fills in the appropriate
1337070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * fields of the @dt structure. @str is updated to point just after the
1338070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:time.
1339070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, values of @dt fields are undefined.
1340070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1341070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1342070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1343070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1344070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) {
1345285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik    const xmlChar *cur = *str;
1346070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
1347285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik    int value = 0;
1348070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
134964dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    PARSE_2_DIGITS(value, cur, ret);
1350070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
135164dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik	return ret;
1352070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != ':')
1353070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
135464dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if (!VALID_HOUR(value))
135564dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik	return 2;
1356070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1357070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1358070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* the ':' insures this string is xs:time */
135964dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    dt->hour = value;
1360070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
136164dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    PARSE_2_DIGITS(value, cur, ret);
1362070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1363070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
136464dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if (!VALID_MIN(value))
136564dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik	return 2;
136664dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    dt->min = value;
1367070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1368070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != ':')
1369070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1370070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1371070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1372070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_FLOAT(dt->sec, cur, ret);
1373070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1374070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1375070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
137664dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if ((!VALID_SEC(dt->sec)) || (!VALID_TZO(dt->tzo)))
1377070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1378070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1379070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1380070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1381070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1382070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1383070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1384070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTimeZone:
1385070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1386070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1387070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1388070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a time zone without time zone and fills in the appropriate
1389070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1390070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * time zone.
1391070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1392070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1393070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1394070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1395070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) {
139614b5643947845df089376106517c4f7ba061e4b0Daniel Veillard    const xmlChar *cur;
1397070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
1398070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1399070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (str == NULL)
1400070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
140114b5643947845df089376106517c4f7ba061e4b0Daniel Veillard    cur = *str;
1402070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1403070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    switch (*cur) {
1404070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case 0:
1405070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tz_flag = 0;
1406070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = 0;
1407070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1408070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1409070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case 'Z':
1410070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tz_flag = 1;
1411070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = 0;
1412070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1413070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1414070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1415070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case '+':
1416070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case '-': {
1417070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	int isneg = 0, tmp = 0;
1418070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	isneg = (*cur == '-');
1419070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1420070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1421070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1422070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(tmp, cur, ret);
1423070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1424070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return ret;
1425070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_HOUR(tmp))
1426070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1427070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1428070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (*cur != ':')
1429070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 1;
1430070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1431070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1432070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = tmp * 60;
1433070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1434070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(tmp, cur, ret);
1435070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1436070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return ret;
1437070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_MIN(tmp))
1438070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1439070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1440070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo += tmp;
1441070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (isneg)
1442070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    dt->tzo = - dt->tzo;
1443070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1444070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_TZO(dt->tzo))
1445070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1446070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
14475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	dt->tz_flag = 1;
1448070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1449070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard      }
1450070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    default:
1451070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1452070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1453070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1454070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1455070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1456070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1457070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
14581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard/**
14591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * _xmlSchemaBase64Decode:
14601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * @ch: a character
14611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *
14621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Converts a base64 encoded character to its base 64 value.
14631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *
14641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Returns 0-63 (value), 64 (pad), or -1 (not recognized)
14651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */
14661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic int
14671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard_xmlSchemaBase64Decode (const xmlChar ch) {
14681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('A' <= ch) && (ch <= 'Z')) return ch - 'A';
14691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('a' <= ch) && (ch <= 'z')) return ch - 'a' + 26;
14701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('0' <= ch) && (ch <= '9')) return ch - '0' + 52;
14711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('+' == ch) return 62;
14721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('/' == ch) return 63;
14731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('=' == ch) return 64;
14741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return -1;
14751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard}
14761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
1477070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/****************************************************************
1478070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
1479070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *	XML Schema Dates/Times Datatypes Handling		*
1480070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
1481070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/
1482070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1483070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1484070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_DIGITS:
1485070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the integer to fill in
1486070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1487070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag
1488070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1489070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a digits integer and updates @num with the value. @cur is
1490070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer.
1491070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and
1492070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1493070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1494070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_DIGITS(num, cur, num_type)	                \
1495070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if ((*cur < '0') || (*cur > '9'))			\
1496070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    num_type = -1;					\
1497070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else                                                    \
1498070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
1499070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	        num = num * 10 + (*cur - '0');		        \
1500070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	        cur++;                                          \
1501070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            }
1502070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1503070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1504070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_NUM:
1505070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the double to fill in
1506070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1507070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag
1508070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1509070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float or integer and updates @num with the value. @cur is
1510070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the number. If the number is a float,
1511070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * then it must have an integer part and a decimal part; @num_type will
1512070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * be set to 1. If there is no decimal part, @num_type is set to zero.
1513070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and
1514070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1515070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1516070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_NUM(num, cur, num_type)				\
1517070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        num = 0;                                                \
1518070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_DIGITS(num, cur, num_type);	                \
1519070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!num_type && (*cur == '.')) {			\
1520070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    double mult = 1;				        \
1521070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    cur++;						\
1522070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((*cur < '0') || (*cur > '9'))			\
1523070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num_type = -1;					\
1524070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else                                                \
1525070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                num_type = 1;                                   \
1526070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
1527070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		mult /= 10;					\
1528070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num += (*cur - '0') * mult;			\
1529070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		cur++;						\
1530070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }							\
1531070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1532070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1533070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
15345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDates:
1535455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard * @type: the expected type or XML_SCHEMAS_UNKNOWN
1536070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dateTime:  string to analyze
1537070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val:  the return computed value
1538070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1539070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @dateTime conforms to the lexical space of one of the date types.
1540070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val.
1541070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1542070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
1543070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *         and -1 in case of internal or API error.
1544070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1545070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1546455cc07308c673b6714e2f5670c2091a1dab95dcDaniel VeillardxmlSchemaValidateDates (xmlSchemaValType type,
15474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	                const xmlChar *dateTime, xmlSchemaValPtr *val,
15484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			int collapse) {
1549070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmlSchemaValPtr dt;
1550070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret;
1551070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = dateTime;
1552070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1553070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define RETURN_TYPE_IF_VALID(t)					\
1554070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (IS_TZO_CHAR(*cur)) {					\
1555070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur);	\
1556070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret == 0) {						\
1557070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (*cur != 0)					\
1558070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		goto error;					\
1559070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    dt->type = t;					\
1560455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard	    goto done;						\
1561070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}							\
1562070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1563070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1564070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dateTime == NULL)
1565070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1566070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
15674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (collapse)
15684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*cur) cur++;
15694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
1570070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((*cur != '-') && (*cur < '0') && (*cur > '9'))
1571070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1572070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1573070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN);
1574070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dt == NULL)
1575070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1576070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1577070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((cur[0] == '-') && (cur[1] == '-')) {
1578070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/*
1579070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * It's an incomplete date (xs:gMonthDay, xs:gMonth or
1580070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * xs:gDay)
1581070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 */
1582070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur += 2;
1583070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1584070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/* is it an xs:gDay? */
1585070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (*cur == '-') {
1586455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard	    if (type == XML_SCHEMAS_GMONTH)
1587455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard		goto error;
1588070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	  ++cur;
1589070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1590070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret != 0)
1591070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		goto error;
1592070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1593070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY);
1594070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1595070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    goto error;
1596070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1597070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1598070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/*
1599070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * it should be an xs:gMonthDay or xs:gMonth
1600070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 */
1601070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur);
1602070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1603070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    goto error;
1604070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1605d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        /*
1606d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a '-' char could indicate this type is xs:gMonthDay or
1607d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a negative time zone offset. Check for xs:gMonthDay first.
1608d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * Also the first three char's of a negative tzo (-MM:SS) can
1609d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * appear to be a valid day; so even if the day portion
1610d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * of the xs:gMonthDay verifies, we must insure it was not
1611d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a tzo.
1612d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         */
1613d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if (*cur == '-') {
1614d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            const xmlChar *rewnd = cur;
1615d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            cur++;
1616d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1617d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard  	    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1618d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            if ((ret == 0) && ((*cur == 0) || (*cur != ':'))) {
1619d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1620d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                /*
1621d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * we can use the VALID_MDAY macro to validate the month
1622d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * and day because the leap year test will flag year zero
1623d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * as a leap year (even though zero is an invalid year).
16244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		 * FUTURE TODO: Zero will become valid in XML Schema 1.1
16254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		 * probably.
1626d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 */
1627d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                if (VALID_MDAY((&(dt->value.date)))) {
1628d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1629d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard	            RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY);
1630070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1631d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                    goto error;
1632d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                }
1633d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            }
1634d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1635d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            /*
1636d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             * not xs:gMonthDay so rewind and check if just xs:gMonth
1637d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             * with an optional time zone.
1638d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             */
1639d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            cur = rewnd;
1640d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        }
1641d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1642d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard	RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH);
1643070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1644070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1645070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1646070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1647070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /*
1648070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * It's a right-truncated date or an xs:time.
1649070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * Try to parse an xs:time then fallback on right-truncated dates.
1650070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     */
1651070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((*cur >= '0') && (*cur <= '9')) {
1652070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseTime(&(dt->value.date), &cur);
1653070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret == 0) {
1654070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    /* it's an xs:time */
1655070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_TIME);
1656070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1657070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1658070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1659070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* fallback on date parsing */
1660070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur = dateTime;
1661070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1662070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGYear(&(dt->value.date), &cur);
1663070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1664070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1665070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1666070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:gYear? */
1667070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEAR);
1668070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1669070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != '-')
1670070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1671070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1672070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1673070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur);
1674070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1675070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1676070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1677070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:gYearMonth? */
1678070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEARMONTH);
1679070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1680070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != '-')
1681070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1682070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1683070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1684070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1685070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((ret != 0) || !VALID_DATE((&(dt->value.date))))
1686070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1687070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1688070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:date? */
1689070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_DATE);
1690070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1691070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != 'T')
1692070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1693070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1694070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1695070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* it should be an xs:dateTime */
1696070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseTime(&(dt->value.date), &cur);
1697070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1698070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1699070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1700070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur);
17014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (collapse)
17024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*cur) cur++;
17036a0baa0cd89b402cdfbb63e9c40f291ebd191f1dDaniel Veillard    if ((ret != 0) || (*cur != 0) || (!(VALID_DATETIME((&(dt->value.date))))))
1704070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1705070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1706455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard
1707070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dt->type = XML_SCHEMAS_DATETIME;
1708070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1709455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillarddone:
1710d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#if 1
1711d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type))
1712d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        goto error;
1713d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#else
1714d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    /*
1715d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     * insure the parsed type is equal to or less significant (right
1716d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     * truncated) than the desired type.
1717d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     */
1718d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) {
1719d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1720d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        /* time only matches time */
1721d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_TIME) && (dt->type == XML_SCHEMAS_TIME))
1722d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1723d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1724d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_DATETIME) &&
1725d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            ((dt->type != XML_SCHEMAS_DATE) ||
1726d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEARMONTH) ||
1727d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEAR)))
1728d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1729d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1730d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_DATE) &&
1731d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            ((dt->type != XML_SCHEMAS_GYEAR) ||
1732d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEARMONTH)))
1733d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1734d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1735d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_GYEARMONTH) && (dt->type != XML_SCHEMAS_GYEAR))
1736d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1737d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1738d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_GMONTHDAY) && (dt->type != XML_SCHEMAS_GMONTH))
1739d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1740d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    }
1741455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard#endif
1742455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard
1743070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (val != NULL)
1744070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        *val = dt;
174580b19092f24410a6b869abf519227686e8f207caDaniel Veillard    else
174680b19092f24410a6b869abf519227686e8f207caDaniel Veillard	xmlSchemaFreeValue(dt);
1747070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1748070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1749070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1750070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror:
1751070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dt != NULL)
1752070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	xmlSchemaFreeValue(dt);
1753070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 1;
1754070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1755070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1756070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
17575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDuration:
1758070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @type: the predefined type
1759070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @duration:  string to analyze
1760070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val:  the return computed value
1761070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1762070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @duration conforms to the lexical space of the duration type.
1763070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val.
1764070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1765070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
1766070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *         and -1 in case of internal or API error.
1767070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1768070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1769dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
17704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	                   const xmlChar *duration, xmlSchemaValPtr *val,
17714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			   int collapse) {
1772070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar  *cur = duration;
1773070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmlSchemaValPtr dur;
1774070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int isneg = 0;
1775070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int seq = 0;
1776d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    double         num;
1777d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    int            num_type = 0;  /* -1 = invalid, 0 = int, 1 = floating */
1778d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    const xmlChar  desig[]  = {'Y', 'M', 'D', 'H', 'M', 'S'};
1779d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    const double   multi[]  = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0};
1780070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1781070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (duration == NULL)
1782070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1783070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
17844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (collapse)
17854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*cur) cur++;
17864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
1787070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur == '-') {
1788070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        isneg = 1;
1789070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        cur++;
1790070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1791070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1792070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* duration must start with 'P' (after sign) */
1793070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur++ != 'P')
1794070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1795070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
179680b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (*cur == 0)
179780b19092f24410a6b869abf519227686e8f207caDaniel Veillard	return 1;
179880b19092f24410a6b869abf519227686e8f207caDaniel Veillard
1799070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION);
1800070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dur == NULL)
1801070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1802070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1803070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    while (*cur != 0) {
1804070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1805070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* input string should be empty or invalid date/time item */
1806070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (seq >= sizeof(desig))
1807070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1808070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1809070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* T designator must be present for time items */
1810070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (*cur == 'T') {
1811070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (seq <= 3) {
1812070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                seq = 3;
1813070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                cur++;
1814070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            } else
1815070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 1;
1816070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        } else if (seq == 3)
1817070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1818070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1819070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* parse the number portion of the item */
1820070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        PARSE_NUM(num, cur, num_type);
1821070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1822070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if ((num_type == -1) || (*cur == 0))
1823070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1824070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1825070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* update duration based on item type */
1826070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        while (seq < sizeof(desig)) {
1827070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (*cur == desig[seq]) {
1828070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1829070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                /* verify numeric type; only seconds can be float */
1830070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                if ((num_type != 0) && (seq < (sizeof(desig)-1)))
1831070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    goto error;
1832070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1833070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                switch (seq) {
1834070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    case 0:
1835070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.mon = (long)num * 12;
1836070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1837070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    case 1:
1838070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.mon += (long)num;
1839070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1840070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    default:
1841070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        /* convert to seconds using multiplier */
1842070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.sec += num * multi[seq];
1843070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        seq++;
1844070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1845070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                }
1846070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1847070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                break;          /* exit loop */
1848070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            }
1849070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            /* no date designators found? */
1850c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik            if ((++seq == 3) || (seq == 6))
1851070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                goto error;
1852070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        }
18534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	cur++;
18544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	if (collapse)
18554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    while IS_WSP_BLANK_CH(*cur) cur++;
1856070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1857070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1858070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (isneg) {
1859070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.mon = -dur->value.dur.mon;
1860070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.day = -dur->value.dur.day;
1861070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.sec = -dur->value.dur.sec;
1862070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1863070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1864070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (val != NULL)
1865070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        *val = dur;
186680b19092f24410a6b869abf519227686e8f207caDaniel Veillard    else
186780b19092f24410a6b869abf519227686e8f207caDaniel Veillard	xmlSchemaFreeValue(dur);
1868070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1869070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1870070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1871070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror:
1872070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dur != NULL)
1873070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	xmlSchemaFreeValue(dur);
1874070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 1;
1875070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1876070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1877a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard/**
1878a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * xmlSchemaStrip:
1879a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * @value: a value
1880a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *
1881a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Removes the leading and ending spaces of a string
1882a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *
1883a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the new string or NULL if no change was required.
1884a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard */
1885a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlChar *
1886a1a9d0410000cc69874e53e438b250037d3e14cdDaniel VeillardxmlSchemaStrip(const xmlChar *value) {
1887a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    const xmlChar *start = value, *end, *f;
1888a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard
1889a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if (value == NULL) return(NULL);
189076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((*start != 0) && (IS_BLANK_CH(*start))) start++;
1891a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end = start;
1892a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    while (*end != 0) end++;
1893a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    f = end;
1894a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end--;
189576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((end > start) && (IS_BLANK_CH(*end))) end--;
1896a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end++;
1897a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if ((start == value) && (f == end)) return(NULL);
1898a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    return(xmlStrndup(start, end - start));
1899a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard}
190096a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard
190196a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard/**
190291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * xmlSchemaWhiteSpaceReplace:
190391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * @value: a value
190491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik *
190591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Replaces 0xd, 0x9 and 0xa with a space.
190691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik *
190791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Returns the new string or NULL if no change was required.
190891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik */
190991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlChar *
191091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlSchemaWhiteSpaceReplace(const xmlChar *value) {
191191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    const xmlChar *cur = value;
191291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    xmlChar *ret = NULL, *mcur;
191391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
191491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    if (value == NULL)
191591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	return(NULL);
191691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
191791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    while ((*cur != 0) &&
191891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	(((*cur) != 0xd) && ((*cur) != 0x9) && ((*cur) != 0xa))) {
191991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	cur++;
192091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    }
192191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    if (*cur == 0)
192291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	return (NULL);
192391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    ret = xmlStrdup(value);
192491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    /* TODO FIXME: I guess gcc will bark at this. */
192591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    mcur = (xmlChar *)  (ret + (cur - value));
192691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    do {
192791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	if ( ((*mcur) == 0xd) || ((*mcur) == 0x9) || ((*mcur) == 0xa) )
192891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	    *mcur = ' ';
192991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	mcur++;
193091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    } while (*mcur != 0);
193191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    return(ret);
193291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik}
193391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
193491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik/**
1935b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCollapseString:
1936b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: a value
1937b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
1938b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Removes and normalize white spaces in the string
1939b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
1940b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns the new string or NULL if no change was required.
1941b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
194201fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlChar *
1943b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCollapseString(const xmlChar *value) {
1944b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    const xmlChar *start = value, *end, *f;
1945b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    xmlChar *g;
1946b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    int col = 0;
1947b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1948b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (value == NULL) return(NULL);
194976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((*start != 0) && (IS_BLANK_CH(*start))) start++;
1950b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    end = start;
1951b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    while (*end != 0) {
195276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if ((*end == ' ') && (IS_BLANK_CH(end[1]))) {
1953b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    col = end - start;
1954b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    break;
1955b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	} else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) {
1956b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    col = end - start;
1957b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    break;
1958b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	}
1959b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end++;
1960b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1961b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (col == 0) {
1962b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	f = end;
1963b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end--;
196476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	while ((end > start) && (IS_BLANK_CH(*end))) end--;
1965b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end++;
1966b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if ((start == value) && (f == end)) return(NULL);
1967b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(xmlStrndup(start, end - start));
1968b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1969b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    start = xmlStrdup(start);
1970b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (start == NULL) return(NULL);
1971b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    g = (xmlChar *) (start + col);
1972b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    end = g;
1973b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    while (*end != 0) {
197476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if (IS_BLANK_CH(*end)) {
1975b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    end++;
197676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*end)) end++;
1977b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (*end != 0)
1978b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		*g++ = ' ';
1979b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	} else
1980b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    *g++ = *end++;
1981b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1982b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    *g = 0;
1983b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return((xmlChar *) start);
1984b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
1985b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1986b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
198728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * xmlSchemaValAtomicListNode:
198828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @type: the predefined atomic type for a token in the list
198928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @value: the list value to check
199028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @ret:  the return computed value
199128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @node:  the node containing the value
199228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *
199328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Check that a value conforms to the lexical space of the predefined
199428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * list type. if true a value is computed and returned in @ret.
199528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *
1996a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the number of items if this validates, a negative error code
1997a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *         number otherwise
199828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */
199928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillardstatic int
200028c52ab518d34a36fd8da6870a5850088f129a6aDaniel VeillardxmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value,
200128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	                   xmlSchemaValPtr *ret, xmlNodePtr node) {
200228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    xmlChar *val, *cur, *endval;
200328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    int nb_values = 0;
2004580ced8ee28ecd99374da9383897678e4ba6c358Daniel Veillard    int tmp = 0;
200528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard
200628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (value == NULL) {
200728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	return(-1);
200828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
200928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    val = xmlStrdup(value);
201028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (val == NULL) {
201128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	return(-1);
201228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
20136fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    if (ret != NULL) {
20146fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard        *ret = NULL;
20156fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    }
201628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    cur = val;
201728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    /*
201828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard     * Split the list
201928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard     */
202076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while (IS_BLANK_CH(*cur)) *cur++ = 0;
202128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while (*cur != 0) {
202276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if (IS_BLANK_CH(*cur)) {
202328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    *cur = 0;
202428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    cur++;
202576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*cur)) *cur++ = 0;
202628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	} else {
202728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    nb_values++;
202828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    cur++;
202976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++;
203028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	}
203128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
203228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (nb_values == 0) {
203328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	xmlFree(val);
2034a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard	return(nb_values);
203528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
203628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    endval = cur;
203728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    cur = val;
203828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while ((*cur == 0) && (cur != endval)) cur++;
203928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while (cur != endval) {
204028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node);
204128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	if (tmp != 0)
204228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    break;
204328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	while (*cur != 0) cur++;
204428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	while ((*cur == 0) && (cur != endval)) cur++;
204528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
20466fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    /* TODO what return value ? c.f. bug #158628
204728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (ret != NULL) {
204828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	TODO
20496fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    } */
20506fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    xmlFree(val);
2051a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if (tmp == 0)
2052a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard	return(nb_values);
2053a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    return(-1);
205428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard}
205528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard
205628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard/**
2057e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * xmlSchemaParseUInt:
2058e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @str: pointer to the string R/W
2059e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @llo: pointer to the low result
2060e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lmi: pointer to the mid result
2061e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lhi: pointer to the high result
2062e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *
2063e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Parse an unsigned long into 3 fields.
2064e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *
2065ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack * Returns the number of significant digits in the number or
2066ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack * -1 if overflow of the capacity
2067e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard */
2068e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic int
2069e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel VeillardxmlSchemaParseUInt(const xmlChar **str, unsigned long *llo,
2070478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik                   unsigned long *lmi, unsigned long *lhi) {
2071e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long lo = 0, mi = 0, hi = 0;
2072e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    const xmlChar *tmp, *cur = *str;
2073e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    int ret = 0, i = 0;
2074e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
2075478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while (*cur == '0') {        /* ignore leading zeroes */
2076478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        cur++;
2077e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2078e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    tmp = cur;
2079e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) {
2080478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        i++;tmp++;ret++;
2081e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2082e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (i > 24) {
2083478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        *str = tmp;
2084478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        return(-1);
2085e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2086e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 16) {
2087478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        hi = hi * 10 + (*cur++ - '0');
2088478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        i--;
2089e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2090e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 8) {
2091478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        mi = mi * 10 + (*cur++ - '0');
2092478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        i--;
2093e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2094e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 0) {
2095478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        lo = lo * 10 + (*cur++ - '0');
2096478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        i--;
2097e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
2098e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
2099e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *str = cur;
2100e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *llo = lo;
2101e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *lmi = mi;
2102e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *lhi = hi;
2103e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    return(ret);
2104e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard}
2105e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
2106e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard/**
2107b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValAtomicType:
21084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type: the predefined type
21094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to check
21104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val:  the return computed value
2111c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @node:  the node containing the value
2112b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * flags:  flags to control the vlidation
21134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
2114b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the atomic type.
21154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * if true a value is computed and returned in @val.
211601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * This checks the value space for list types as well (IDREFS, NMTOKENS).
21174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
21184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
21194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *         and -1 in case of internal or API error.
21204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
2121b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int
21221ac24d36b12487995b659a8fc23a02b9460edb36Daniel VeillardxmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value,
21234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik                       xmlSchemaValPtr * val, xmlNodePtr node, int flags,
21244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		       xmlSchemaWhitespaceValueType ws,
21254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		       int normOnTheFly, int applyNorm, int createStringValue)
21261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard{
21274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValPtr v;
2128b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    xmlChar *norm = NULL;
2129d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    int ret = 0;
21304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
21314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
213201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitTypes();
21334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (type == NULL)
21341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        return (-1);
21355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
2136eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard    /*
2137eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard     * validating a non existant text node is similar to validating
2138eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard     * an empty one.
2139eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard     */
2140eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard    if (value == NULL)
2141eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard        value = BAD_CAST "";
2142eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard
21434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (val != NULL)
21441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        *val = NULL;
2145b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if ((flags == 0) && (value != NULL)) {
214691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
214701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        if ((type->builtInType != XML_SCHEMAS_STRING) &&
214891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	  (type->builtInType != XML_SCHEMAS_ANYTYPE) &&
214991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	  (type->builtInType != XML_SCHEMAS_ANYSIMPLETYPE)) {
215091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	    if (type->builtInType == XML_SCHEMAS_NORMSTRING)
215191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik		norm = xmlSchemaWhiteSpaceReplace(value);
215291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik            else
215391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik		norm = xmlSchemaCollapseString(value);
21541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (norm != NULL)
21551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                value = norm;
21561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        }
2157b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
2158b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
215901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type->builtInType) {
21602f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack        case XML_SCHEMAS_UNKNOWN:
21611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto error;
21622f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	case XML_SCHEMAS_ANYTYPE:
21632f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	case XML_SCHEMAS_ANYSIMPLETYPE:
21644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if ((createStringValue) && (val != NULL)) {
21654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		v = xmlSchemaNewValue(XML_SCHEMAS_ANYSIMPLETYPE);
21664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (v != NULL) {
21674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    v->value.str = xmlStrdup(value);
21684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    *val = v;
21694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else {
21704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    goto error;
21714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
21724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    }
21732f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	    goto return0;
21744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_STRING:
21754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if (! normOnTheFly) {
21764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		const xmlChar *cur = value;
21774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
21784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (ws == XML_SCHEMA_WHITESPACE_REPLACE) {
21794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while (*cur != 0) {
21804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
21814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
21824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else {
21834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
21844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			}
21854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
21864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) {
21874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while (*cur != 0) {
21884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
21894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
21904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else if IS_WSP_SPACE_CH(*cur) {
21914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
21924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    if IS_WSP_SPACE_CH(*cur)
21934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik				goto return1;
21944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else {
21954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
21964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			}
21974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
21984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
21994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    }
22004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if (createStringValue && (val != NULL)) {
22014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (applyNorm) {
22024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
22034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			norm = xmlSchemaCollapseString(value);
22044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else if (ws == XML_SCHEMA_WHITESPACE_REPLACE)
22054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			norm = xmlSchemaWhiteSpaceReplace(value);
22064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (norm != NULL)
22074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			value = norm;
22084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
22094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		v = xmlSchemaNewValue(XML_SCHEMAS_STRING);
22104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (v != NULL) {
22114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    v->value.str = xmlStrdup(value);
22124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    *val = v;
22134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else {
22144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    goto error;
22154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
22164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    }
22171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return0;
22181516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard        case XML_SCHEMAS_NORMSTRING:{
22194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly) {
22204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (applyNorm) {
22214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
22224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    norm = xmlSchemaCollapseString(value);
22234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			else
22244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    norm = xmlSchemaWhiteSpaceReplace(value);
22254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if (norm != NULL)
22264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    value = norm;
22274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
22284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else {
22294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    const xmlChar *cur = value;
22304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while (*cur != 0) {
22314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
22324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
22334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else {
22344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
22354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			}
22364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
22374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
22381516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                if (val != NULL) {
22391516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NORMSTRING);
22401516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    if (v != NULL) {
22411516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        v->value.str = xmlStrdup(value);
22421516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        *val = v;
22431516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    } else {
22441516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        goto error;
22451516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    }
22461516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                }
22471516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                goto return0;
22481516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard            }
22491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_DECIMAL:{
2250273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack                const xmlChar *cur = value;
225172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik                unsigned int len, neg, integ, hasLeadingZeroes;
2252273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		xmlChar cval[25];
225372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		xmlChar *cptr = cval;
22541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
225572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik                if ((cur == NULL) || (*cur == 0))
22561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
22574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
225872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		/*
225972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		* xs:decimal has a whitespace-facet value of 'collapse'.
226072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		*/
22614efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
22624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
22634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
226472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		/*
226572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		* First we handle an optional sign.
226672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		*/
226772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		neg = 0;
226872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik                if (*cur == '-') {
226972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		    neg = 1;
22701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
227172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		} else if (*cur == '+')
22721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
227372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		/*
227472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		* Disallow: "", "-", "- "
227572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		*/
227672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		if (*cur == 0)
227772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		    goto return1;
2278273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		/*
2279273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 * Next we "pre-parse" the number, in preparation for calling
2280273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 * the common routine xmlSchemaParseUInt.  We get rid of any
2281273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 * leading zeroes (because we have reserved only 25 chars),
228272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		 * and note the position of a decimal point.
2283273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 */
2284273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		len = 0;
228572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		integ = ~0u;
228672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		hasLeadingZeroes = 0;
2287c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/*
2288c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* Skip leading zeroes.
2289c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*/
229072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		while (*cur == '0') {
2291273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		    cur++;
229272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		    hasLeadingZeroes = 1;
229372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		}
2294c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (*cur != 0) {
229572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		    do {
2296c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			if ((*cur >= '0') && (*cur <= '9')) {
2297c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    *cptr++ = *cur++;
2298c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    len++;
2299c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			} else if (*cur == '.') {
2300c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    cur++;
230172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    integ = len;
230272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    do {
230372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				if ((*cur >= '0') && (*cur <= '9')) {
230472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    *cptr++ = *cur++;
230572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    len++;
230672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				} else
230772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    break;
230872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    } while (len < 24);
230972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    /*
231072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    * Disallow "." but allow "00."
231172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    */
231272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    if ((len == 0) && (!hasLeadingZeroes))
2313c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik				goto return1;
2314c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    break;
2315c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			} else
2316c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    break;
231772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		    } while (len < 24);
2318273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		}
23194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
23204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
2321273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		if (*cur != 0)
232272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		    goto return1; /* error if any extraneous chars */
23231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
23241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL);
23251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
2326273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			/*
232772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		 	* Now evaluate the significant digits of the number
2328273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 	*/
232972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			if (len != 0) {
233072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik
233172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    if (integ != ~0u) {
233272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				/*
233372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				* Get rid of trailing zeroes in the
233472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				* fractional part.
233572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				*/
233672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				while ((len != integ) && (*(cptr-1) == '0')) {
233772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    cptr--;
233872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    len--;
233972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				}
234072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    }
234172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    /*
234272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    * Terminate the (preparsed) string.
234372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    */
234472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    if (len != 0) {
234572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				*cptr = 0;
234672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				cptr = cval;
234772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik
234872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				xmlSchemaParseUInt((const xmlChar **)&cptr,
234972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    &v->value.decimal.lo,
235072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    &v->value.decimal.mi,
235172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				    &v->value.decimal.hi);
2352273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			    }
2353273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			}
2354c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			/*
2355c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			* Set the total digits to 1 if a zero value.
2356c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			*/
23571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = neg;
235872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			if (len == 0) {
235972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    /* Speedup for zero values. */
236072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    v->value.decimal.total = 1;
2361273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			} else {
2362c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    v->value.decimal.total = len;
236372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    if (integ == ~0u)
236472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				v->value.decimal.frac = 0;
236572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik			    else
236672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik				v->value.decimal.frac = len - integ;
2367273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			}
23681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
23691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
23701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
23721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2373b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_TIME:
2374b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GDAY:
2375b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GMONTH:
2376b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GMONTHDAY:
2377b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GYEAR:
2378b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GYEARMONTH:
2379b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DATE:
2380b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DATETIME:
23814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik            ret = xmlSchemaValidateDates(type->builtInType, value, val,
23824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		normOnTheFly);
23831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            break;
2384b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DURATION:
23854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik            ret = xmlSchemaValidateDuration(type, value, val,
23864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		normOnTheFly);
23871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            break;
2388b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_FLOAT:
23891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_DOUBLE:{
23901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
23911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int neg = 0;
23921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
23944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
23954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
23961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) {
23971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur += 3;
23981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (*cur != 0)
23991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
24001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (val != NULL) {
24011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (type == xmlSchemaTypeFloatDef) {
24021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
24031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
24041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                v->value.f = (float) xmlXPathNAN;
24051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
24061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
24071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
24081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
24091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
24101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
24111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
24121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                v->value.d = xmlXPathNAN;
24131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
24141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
24151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
24161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
24171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
24181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
24191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
24201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return0;
24211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
24231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    neg = 1;
24241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) {
24271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur += 3;
24281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (*cur != 0)
24291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
24301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (val != NULL) {
24311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (type == xmlSchemaTypeFloatDef) {
24321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
24331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
24341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                if (neg)
24351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.f = (float) xmlXPathNINF;
24361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                else
24371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.f = (float) xmlXPathPINF;
24381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
24391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
24401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
24411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
24421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
24431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
24441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
24451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                if (neg)
24461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.d = xmlXPathNINF;
24471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                else
24481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.d = xmlXPathPINF;
24491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
24501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
24511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
24521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
24531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
24541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
24551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
24561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return0;
24571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((neg == 0) && (*cur == '+'))
24591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-'))
24611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
24621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                while ((*cur >= '0') && (*cur <= '9')) {
24631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '.') {
24661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while ((*cur >= '0') && (*cur <= '9'))
24681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
24691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((*cur == 'e') || (*cur == 'E')) {
24711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
24721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((*cur == '-') || (*cur == '+'))
24731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
24741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while ((*cur >= '0') && (*cur <= '9'))
24751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
24761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
24784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
24794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
24801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
24811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
24821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
24831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (type == xmlSchemaTypeFloatDef) {
24841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
24851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (v != NULL) {
24866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    /*
24876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * TODO: sscanf seems not to give the correct
24886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * value for extremely high/low values.
24896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * E.g. "1E-149" results in zero.
24906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    */
2491d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard                            if (sscanf((const char *) value, "%f",
24921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                 &(v->value.f)) == 1) {
24936c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                                *val = v;
24941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
24951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
24961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
24971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
24981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
24991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto error;
25001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
25011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
25021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
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			    */
2508d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard                            if (sscanf((const char *) value, "%lf",
25091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                 &(v->value.d)) == 1) {
25101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                *val = v;
25111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
25121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
25131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
25141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
25151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
25161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto error;
25171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
25181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
25191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
25201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
25211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
25221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BOOLEAN:{
25231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
25241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
25254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly) {
25264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
25274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (*cur == '0') {
25284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 0;
25294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			cur++;
25304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    } else if (*cur == '1') {
25314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 1;
25324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			cur++;
25334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    } else if (*cur == 't') {
25344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			cur++;
25354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur++ == 'r') && (*cur++ == 'u') &&
25364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    (*cur++ == 'e')) {
25374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    ret = 1;
25384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else
25394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
25404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    } else if (*cur == 'f') {
25414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			cur++;
25424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur++ == 'a') && (*cur++ == 'l') &&
25434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    (*cur++ == 's') && (*cur++ == 'e')) {
25444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    ret = 0;
25454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else
25464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
25471869be56906ed5488b7db6d7c16f1c473af1485dKasimier T. Buchcik		    } else
25481869be56906ed5488b7db6d7c16f1c473af1485dKasimier T. Buchcik			goto return1;
25494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (*cur != 0) {
25504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			while IS_WSP_BLANK_CH(*cur) cur++;
25514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if (*cur != 0)
25524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
25534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
25544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else {
25554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if ((cur[0] == '0') && (cur[1] == 0))
25564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 0;
25574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else if ((cur[0] == '1') && (cur[1] == 0))
25584efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 1;
25594efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else if ((cur[0] == 't') && (cur[1] == 'r')
25604efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			&& (cur[2] == 'u') && (cur[3] == 'e')
25614efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			&& (cur[4] == 0))
25624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 1;
25634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else if ((cur[0] == 'f') && (cur[1] == 'a')
25644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			&& (cur[2] == 'l') && (cur[3] == 's')
25654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			&& (cur[4] == 'e') && (cur[5] == 0))
25664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 0;
25674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else
25684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			goto return1;
25694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
25701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
25711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN);
25721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
25731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.b = ret;
25741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
25751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
25761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
25771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
25781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
25791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
25801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
25811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_TOKEN:{
25821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
25831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
25844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (! normOnTheFly) {
25854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while (*cur != 0) {
25864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
25874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
25884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else if (*cur == ' ') {
25894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
25904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    if (*cur == 0)
25914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik				goto return1;
25924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    if (*cur == ' ')
25934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik				goto return1;
25944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else {
25954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
25964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			}
25974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
25984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
25991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
26001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN);
26011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
26021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.str = xmlStrdup(value);
26031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
26041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
26051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
26061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
26071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
26091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2610b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_LANGUAGE:
26114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if (normOnTheFly) {
26124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		norm = xmlSchemaCollapseString(value);
26134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (norm != NULL)
26144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    value = norm;
26154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    }
26161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (xmlCheckLanguageID(value) == 1) {
26171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
26181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE);
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            }
26281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return1;
2629b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NMTOKEN:
26301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (xmlValidateNMToken(value, 1) == 0) {
26311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
26321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN);
26331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
26341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.str = xmlStrdup(value);
26351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
26361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
26371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
26381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
26391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
26411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
26421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return1;
2643b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NMTOKENS:
26441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef,
26451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
26461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret > 0)
26471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
26481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
26491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 1;
26501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2651b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NAME:
26521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateName(value, 1);
2653df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard            if ((ret == 0) && (val != NULL) && (value != NULL)) {
2654df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		v = xmlSchemaNewValue(XML_SCHEMAS_NAME);
2655df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		if (v != NULL) {
2656df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     const xmlChar *start = value, *end;
2657df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     while (IS_BLANK_CH(*start)) start++;
2658df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     end = start;
2659df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     while ((*end != 0) && (!IS_BLANK_CH(*end))) end++;
2660df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     v->value.str = xmlStrndup(start, end - start);
2661df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		    *val = v;
2662df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		} else {
2663df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		    goto error;
2664df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		}
26651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
26661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
26671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_QNAME:{
26681c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                const xmlChar *uri = NULL;
26691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *local = NULL;
26701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
26711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateQName(value, 1);
26721c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		if (ret != 0)
26731c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    goto done;
26741c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                if (node != NULL) {
26751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *prefix;
26761c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    xmlNsPtr ns;
26771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
26781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    local = xmlSplitQName2(value, &prefix);
26791c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    ns = xmlSearchNs(node->doc, node, prefix);
26801c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if ((ns == NULL) && (prefix != NULL)) {
26811c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			xmlFree(prefix);
26821c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			if (local != NULL)
26831c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			    xmlFree(local);
26841c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			goto return1;
26851c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    }
26861c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if (ns != NULL)
26871c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			uri = ns->href;
26881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL)
26891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(prefix);
26901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26911c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                if (val != NULL) {
26921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_QNAME);
26931c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                    if (v == NULL) {
26941c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			if (local != NULL)
26951c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			    xmlFree(local);
26961c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			goto error;
26971c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    }
26981c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if (local != NULL)
26991c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			v->value.qname.name = local;
27001c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    else
27011c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			v->value.qname.name = xmlStrdup(value);
27021c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if (uri != NULL)
27031c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			v->value.qname.uri = xmlStrdup(uri);
27041c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    *val = v;
27051c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                } else
27061c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if (local != NULL)
27071c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			xmlFree(local);
27081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
27091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2710b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NCNAME:
27111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
27121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
27131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME);
27141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (v != NULL) {
27151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.str = xmlStrdup(value);
27161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
27171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else {
27181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto error;
27191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2722b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_ID:
27231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
27241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
27251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                v = xmlSchemaNewValue(XML_SCHEMAS_ID);
27261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (v != NULL) {
27271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.str = xmlStrdup(value);
27281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
27291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else {
27301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto error;
27311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
27341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
27351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
27361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
27371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /*
27381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * NOTE: the IDness might have already be declared in the DTD
27391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 */
27401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (attr->atype != XML_ATTRIBUTE_ID) {
27411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlIDPtr res;
27421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *strip;
27431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
27441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    strip = xmlSchemaStrip(value);
27451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (strip != NULL) {
27461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        res = xmlAddID(NULL, node->doc, strip, attr);
27471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(strip);
27481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else
27491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        res = xmlAddID(NULL, node->doc, value, attr);
27501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (res == NULL) {
27511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 2;
27521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
27531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        attr->atype = XML_ATTRIBUTE_ID;
27541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
27551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2758b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_IDREF:
27591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
27601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
27616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		v = xmlSchemaNewValue(XML_SCHEMAS_IDREF);
27626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (v == NULL)
27636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    goto error;
27646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		v->value.str = xmlStrdup(value);
27656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*val = v;
27661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
27681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
27691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
27701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *strip;
27711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
27721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                strip = xmlSchemaStrip(value);
27731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (strip != NULL) {
27741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAddRef(NULL, node->doc, strip, attr);
27751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlFree(strip);
27761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else
27771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAddRef(NULL, node->doc, value, attr);
27781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_IDREF;
27791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2781b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_IDREFS:
27821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef,
27831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
27841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret < 0)
27851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 2;
27861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
27871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
27881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
27891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
27901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
2791249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard
27921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_IDREFS;
27931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
27951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_ENTITY:{
27961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *strip;
27971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
27981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateNCName(value, 1);
27991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((node == NULL) || (node->doc == NULL))
28001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 3;
28011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret == 0) {
28021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlEntityPtr ent;
28031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    strip = xmlSchemaStrip(value);
28051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (strip != NULL) {
28061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ent = xmlGetDocEntity(node->doc, strip);
28071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(strip);
28081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
28091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ent = xmlGetDocEntity(node->doc, value);
28101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
28111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((ent == NULL) ||
28121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        (ent->etype !=
28131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         XML_EXTERNAL_GENERAL_UNPARSED_ENTITY))
28141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 4;
28151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (val != NULL)) {
28171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    TODO;
28181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (node != NULL) &&
28201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    (node->type == XML_ATTRIBUTE_NODE)) {
28211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAttrPtr attr = (xmlAttrPtr) node;
2822a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard
28231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    attr->atype = XML_ATTRIBUTE_ENTITY;
28241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
28261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2827b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_ENTITIES:
28281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((node == NULL) || (node->doc == NULL))
28291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return3;
28301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef,
28311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
28321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret <= 0)
28331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 1;
28341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
28351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
28361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
28371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
28381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
28391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_ENTITIES;
28411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
28421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
28431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_NOTATION:{
28441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *uri = NULL;
28451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *local = NULL;
28461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateQName(value, 1);
28481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (node != NULL)) {
28491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *prefix;
28501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    local = xmlSplitQName2(value, &prefix);
28521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL) {
28531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlNsPtr ns;
28541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ns = xmlSearchNs(node->doc, node, prefix);
28561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (ns == NULL)
28571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            ret = 1;
28581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        else if (val != NULL)
28591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            uri = xmlStrdup(ns->href);
28601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
28611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((local != NULL) && ((val == NULL) || (ret != 0)))
28621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(local);
28631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL)
28641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(prefix);
28651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((node == NULL) || (node->doc == NULL))
28671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 3;
28681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret == 0) {
28691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = xmlValidateNotationUse(NULL, node->doc, value);
28701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (ret == 1)
28711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 0;
28721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else
28731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 1;
28741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (val != NULL)) {
28761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION);
28771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
28781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (local != NULL)
28791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.name = local;
28801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        else
28811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.name = xmlStrdup(value);
28821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (uri != NULL)
28831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.uri = uri;
28841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
28861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
28871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (local != NULL)
28881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            xmlFree(local);
28891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (uri != NULL)
28901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            xmlFree(uri);
28911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
28921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
28931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
2895560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard            }
28964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_ANYURI:{
289711c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                if (*value != 0) {
28984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlURIPtr uri;
28994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (normOnTheFly) {
29004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			norm = xmlSchemaCollapseString(value);
29014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if (norm != NULL)
29024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    value = norm;
29034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
29044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik                    uri = xmlParseURI((const char *) value);
290511c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    if (uri == NULL)
290611c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                        goto return1;
290711c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    xmlFreeURI(uri);
290811c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                }
2909560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
29101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
291111c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_ANYURI);
291211c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    if (v == NULL)
291311c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                        goto error;
291411c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    v->value.str = xmlStrdup(value);
291511c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    *val = v;
29161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
29171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
29181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
29191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_HEXBINARY:{
29208dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik                const xmlChar *cur = value, *start;
29211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *base;
29221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int total, i = 0;
2923560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
2924f34a20e69dc675cd23d3eb558cad135ea280f472Daniel Veillard                if (cur == NULL)
29251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
2926560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
29274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
29284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
29294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
29308dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik		start = cur;
29311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                while (((*cur >= '0') && (*cur <= '9')) ||
29321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                       ((*cur >= 'A') && (*cur <= 'F')) ||
29331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                       ((*cur >= 'a') && (*cur <= 'f'))) {
29341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    i++;
29351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
29361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
29374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
29384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
2939560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
29401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
29411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
29421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((i % 2) != 0)
294370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard                    goto return1;
2944560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
29451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
29461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
29471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY);
29481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v == NULL)
29491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
29504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    /*
29514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    * Copy only the normalized piece.
29524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    * CRITICAL TODO: Check this.
29534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    */
29548dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik                    cur = xmlStrndup(start, i);
29551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (cur == NULL) {
2956d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard		        xmlSchemaTypeErrMemory(node, "allocating hexbin data");
29571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(v);
29581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
29591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
29601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
29611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total = i / 2;      /* number of octets */
296270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
29631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    base = (xmlChar *) cur;
29641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while (i-- > 0) {
29651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (*base >= 'a')
29661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            *base = *base - ('a' - 'A');
29671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        base++;
29681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
296970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
29701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.hex.str = (xmlChar *) cur;
29711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.hex.total = total;
29721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
29731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
29741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
29751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
29761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BASE64BINARY:{
29771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /* ISSUE:
29781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 *
29791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Ignore all stray characters? (yes, currently)
29801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Worry about long lines? (no, currently)
29811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 *
29821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * rfc2045.txt:
29831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 *
29841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * "The encoded output stream must be represented in lines of
29851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * no more than 76 characters each.  All line breaks or other
29861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * characters not found in Table 1 must be ignored by decoding
29871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * software.  In base64 data, characters other than those in
29881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Table 1, line breaks, and other white space probably
29891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * indicate a transmission error, about which a warning
29901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * message or even a message rejection might be appropriate
29911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * under some circumstances." */
29921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
29931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *base;
29941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int total, i = 0, pad = 0;
29951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
29961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
29971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
29981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
29991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                for (; *cur; ++cur) {
30001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
30011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    decc = _xmlSchemaBase64Decode(*cur);
30031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc < 0) ;
30041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (decc < 64)
30051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        i++;
30061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else
30071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        break;
30081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
30091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                for (; *cur; ++cur) {
30101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
30111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    decc = _xmlSchemaBase64Decode(*cur);
30131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc < 0) ;
30141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (decc < 64)
30151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc == 64)
30171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        pad++;
30181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
30191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /* rfc2045.txt: "Special processing is performed if fewer than
30211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * 24 bits are available at the end of the data being encoded.
30221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * A full encoding quantum is always completed at the end of a
30231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * body.  When fewer than 24 input bits are available in an
30241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * input group, zero bits are added (on the right) to form an
30251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * integral number of 6-bit groups.  Padding at the end of the
30261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * data is performed using the "=" character.  Since all
30271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * base64 input is an integral number of octets, only the
30281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * following cases can arise: (1) the final quantum of
30291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * encoding input is an integral multiple of 24 bits; here,
30301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * the final unit of encoded output will be an integral
30311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * multiple ofindent: Standard input:701: Warning:old style
30321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		 * assignment ambiguity in "=*".  Assuming "= *" 4 characters
30331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		 * with no "=" padding, (2) the final
30341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * quantum of encoding input is exactly 8 bits; here, the
30351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * final unit of encoded output will be two characters
30361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * followed by two "=" padding characters, or (3) the final
30371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * quantum of encoding input is exactly 16 bits; here, the
30381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * final unit of encoded output will be three characters
30391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * followed by one "=" padding character." */
30401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                total = 3 * (i / 4);
30421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (pad == 0) {
30431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 0)
30441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (pad == 1) {
30461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
30471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 3)
30491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (decc = _xmlSchemaBase64Decode(*cur);
30511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         (decc < 0) || (decc > 63);
30521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         decc = _xmlSchemaBase64Decode(*cur))
30531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        --cur;
30541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 16bits in 24bits means 2 pad bits: nnnnnn nnmmmm mmmm00*/
30551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 00111100 -> 0x3c */
30561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc & ~0x3c)
30571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total += 2;
30591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (pad == 2) {
30601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
30611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 2)
30631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (decc = _xmlSchemaBase64Decode(*cur);
30651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         (decc < 0) || (decc > 63);
30661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         decc = _xmlSchemaBase64Decode(*cur))
30671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        --cur;
30681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 8bits in 12bits means 4 pad bits: nnnnnn nn0000 */
30691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 00110000 -> 0x30 */
30701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc & ~0x30)
30711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total += 1;
30731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else
30741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
30751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
30771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_BASE64BINARY);
30781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v == NULL)
30791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
30801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    base =
30811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        (xmlChar *) xmlMallocAtomic((i + pad + 1) *
30821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                                    sizeof(xmlChar));
30831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (base == NULL) {
3084d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard		        xmlSchemaTypeErrMemory(node, "allocating base64 data");
30851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(v);
30861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
30881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.base64.str = base;
30891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (cur = value; *cur; ++cur)
30901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (_xmlSchemaBase64Decode(*cur) >= 0) {
30911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            *base = *cur;
30921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            ++base;
30931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
30941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *base = 0;
30951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.base64.total = total;
30961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
30971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
30981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
309970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard            }
3100e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_INTEGER:
3101e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_PINTEGER:
3102e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_NPINTEGER:
3103e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_NINTEGER:
31041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_NNINTEGER:{
31051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
31061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
3107ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                int sign = 0;
31081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
31091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
31101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
31114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
31124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
31131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
31141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    sign = 1;
31151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
31161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (*cur == '+')
31171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
3118ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
3119ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (ret == -1)
3120ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
31214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
31224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
3123ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (*cur != 0)
3124ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
312501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_NPINTEGER) {
31261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) &&
31271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ((hi != 0) || (mi != 0) || (lo != 0)))
31281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
312901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_PINTEGER) {
31301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (sign == 1)
31311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((hi == 0) && (mi == 0) && (lo == 0))
31331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
313401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_NINTEGER) {
31351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (sign == 0)
31361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((hi == 0) && (mi == 0) && (lo == 0))
31381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
313901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_NNINTEGER) {
31401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) &&
31411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ((hi != 0) || (mi != 0) || (lo != 0)))
31421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
31446c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                if (val != NULL) {
314501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
31461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
3147c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			if (ret == 0)
3148c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    ret++;
31491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
31506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                        v->value.decimal.mi = mi;
31516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                        v->value.decimal.hi = hi;
31521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = sign;
31531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
3154ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                        v->value.decimal.total = ret;
31551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
31561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
31571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
31581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
31591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
3160e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_LONG:
3161e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_BYTE:
3162e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_SHORT:
31631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_INT:{
3164478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik                 const xmlChar *cur = value;
31651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
31661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int sign = 0;
31671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
31681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
31691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
31701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
31711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    sign = 1;
31721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
31731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (*cur == '+')
31741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
3175ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
3176ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (ret < 0)
3177ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
3178ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (*cur != 0)
3179ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
318001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_LONG) {
31811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi >= 922) {
31821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (hi > 922)
31831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
31841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi >= 33720368) {
31851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (mi > 33720368)
31861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
31871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if ((sign == 0) && (lo > 54775807))
31881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
31891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if ((sign == 1) && (lo > 54775808))
31901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
31911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
31921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
319301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_INT) {
31941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi != 0)
31951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (mi >= 21) {
31971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi > 21)
31981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
31991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if ((sign == 0) && (lo > 47483647))
32001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
32011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if ((sign == 1) && (lo > 47483648))
32021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
32031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
320401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_SHORT) {
32051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
32061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) && (lo > 32768))
32081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) && (lo > 32767))
32101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
321101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_BYTE) {
32121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
32131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) && (lo > 128))
32151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) && (lo > 127))
32171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
32191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
322001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
32211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
32221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
32236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                        v->value.decimal.mi = mi;
32246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                        v->value.decimal.hi = hi;
32251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = sign;
32261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
3227ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                        v->value.decimal.total = ret;
32281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
32291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
32301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
32311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
32321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
3233e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_UINT:
3234e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_ULONG:
3235e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_USHORT:
32361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_UBYTE:{
32371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
32381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
32391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
32401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
32411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
3242ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
3243ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (ret < 0)
3244ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
3245ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (*cur != 0)
3246ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
324701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_ULONG) {
32481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi >= 1844) {
32491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (hi > 1844)
32501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
32511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi >= 67440737) {
32521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (mi > 67440737)
32531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
32541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (lo > 9551615)
32551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
32561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
32571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
325801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_UINT) {
32591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi != 0)
32601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (mi >= 42) {
32621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi > 42)
32631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
32641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (lo > 94967295)
32651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
32661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
326701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_USHORT) {
32681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
32691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (lo > 65535)
32711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
327201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_UBYTE) {
32731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
32741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (lo > 255)
32761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
32771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
32781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
327901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
32801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
32811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
32821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.mi = mi;
32831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.hi = hi;
32841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = 0;
32851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
3286ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                        v->value.decimal.total = ret;
32871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
32881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
32891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
32901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
32911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
32924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
3293b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
32941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  done:
32951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
32961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
32971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (ret);
32981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return3:
32991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
33001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
33011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (3);
33021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return1:
33031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
33041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
33051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (1);
33061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return0:
33071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
33081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
33091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (0);
33101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  error:
33111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
33121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
33131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (-1);
3314b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
3315b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
3316b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
3317b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValPredefTypeNode:
3318b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @type: the predefined type
3319b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: the value to check
3320b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @val:  the return computed value
3321b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @node:  the node containing the value
3322b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
3323b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the predefined type.
3324b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * if true a value is computed and returned in @val.
3325b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
3326b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns 0 if this validates, a positive error code number otherwise
3327b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *         and -1 in case of internal or API error.
3328b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
3329b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardint
3330b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value,
3331b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	                   xmlSchemaValPtr *val, xmlNodePtr node) {
33324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return(xmlSchemaValAtomicType(type, value, val, node, 0,
33334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 1, 0));
33344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
33354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
33364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
3337c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaValPredefTypeNodeNoNorm:
3338c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the predefined type
3339c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the value to check
3340c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val:  the return computed value
3341c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @node:  the node containing the value
3342c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
3343c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Check that a value conforms to the lexical space of the predefined type.
3344c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * if true a value is computed and returned in @val.
3345c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * This one does apply any normalization to the value.
3346c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
3347c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
3348c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *         and -1 in case of internal or API error.
3349c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */
3350c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardint
3351c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, const xmlChar *value,
3352c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard				 xmlSchemaValPtr *val, xmlNodePtr node) {
33534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return(xmlSchemaValAtomicType(type, value, val, node, 1,
33544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 0, 1));
3355c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
3356c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
3357c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/**
3358c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * xmlSchemaValidatePredefinedType:
3359c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @type: the predefined type
3360c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @value: the value to check
3361c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @val:  the return computed value
3362c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *
3363c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Check that a value conforms to the lexical space of the predefined type.
3364c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * if true a value is computed and returned in @val.
3365c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *
3366c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
3367c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *         and -1 in case of internal or API error.
3368c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard */
3369c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillardint
3370c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel VeillardxmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value,
3371c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard	                        xmlSchemaValPtr *val) {
3372c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard    return(xmlSchemaValPredefTypeNode(type, value, val, NULL));
3373c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard}
3374c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard
3375c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard/**
33764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareDecimals:
33774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x:  a first decimal value
33784255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y:  a second decimal value
33794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
33804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 decimals
33814255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
33824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error
33834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
33844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int
33854255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y)
33864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{
33874255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValPtr swp;
3388273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    int order = 1, integx, integy, dlen;
3389273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    unsigned long hi, mi, lo;
33904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
3391273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    /*
3392273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * First test: If x is -ve and not zero
3393273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     */
3394e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if ((x->value.decimal.sign) &&
3395e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	((x->value.decimal.lo != 0) ||
3396e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	 (x->value.decimal.mi != 0) ||
3397e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	 (x->value.decimal.hi != 0))) {
3398273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	/*
3399273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	 * Then if y is -ve and not zero reverse the compare
3400273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	 */
3401e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	if ((y->value.decimal.sign) &&
3402e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    ((y->value.decimal.lo != 0) ||
3403e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	     (y->value.decimal.mi != 0) ||
3404e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	     (y->value.decimal.hi != 0)))
340580b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    order = -1;
3406273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	/*
3407273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	 * Otherwise (y >= 0) we have the answer
3408273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	 */
340980b19092f24410a6b869abf519227686e8f207caDaniel Veillard	else
341080b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    return (-1);
3411273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    /*
3412273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * If x is not -ve and y is -ve we have the answer
3413273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     */
3414e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    } else if ((y->value.decimal.sign) &&
3415e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	       ((y->value.decimal.lo != 0) ||
3416e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		(y->value.decimal.mi != 0) ||
3417e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		(y->value.decimal.hi != 0))) {
34184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (1);
341980b19092f24410a6b869abf519227686e8f207caDaniel Veillard    }
3420273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    /*
3421273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * If it's not simply determined by a difference in sign,
3422273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * then we need to compare the actual values of the two nums.
3423273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * To do this, we start by looking at the integral parts.
3424273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * If the number of integral digits differ, then we have our
3425273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * answer.
3426273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     */
3427273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    integx = x->value.decimal.total - x->value.decimal.frac;
3428273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    integy = y->value.decimal.total - y->value.decimal.frac;
342972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    /*
343072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    * NOTE: We changed the "total" for values like "0.1"
343172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    *   (or "-0.1" or ".1") to be 1, which was 2 previously.
343272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    *   Therefore the special case, when such values are
343372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    *   compared with 0, needs to be handled separately;
343472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    *   otherwise a zero would be recognized incorrectly as
343572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    *   greater than those values. This has the nice side effect
343672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    *   that we gain an overall optimized comparison with zeroes.
343772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    * Note that a "0" has a "total" of 1 already.
343872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    */
343972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    if (integx == 1) {
344072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	if (x->value.decimal.lo == 0) {
344172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	    if (integy != 1)
344272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		return -order;
344372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	    else if (y->value.decimal.lo != 0)
344472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		return -order;
344572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	    else
344672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		return(0);
344772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	}
344872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    }
344972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    if (integy == 1) {
345072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	if (y->value.decimal.lo == 0) {
345172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	    if (integx != 1)
345272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		return order;
345372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	    else if (x->value.decimal.lo != 0)
345472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		return order;
345572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	    else
345672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik		return(0);
345772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik	}
345872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik    }
345972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik
3460273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    if (integx > integy)
3461273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	return order;
3462273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    else if (integy > integx)
3463273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	return -order;
346472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik
3465273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    /*
3466273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * If the number of integral digits is the same for both numbers,
3467273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * then things get a little more complicated.  We need to "normalize"
3468273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * the numbers in order to properly compare them.  To do this, we
3469273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * look at the total length of each number (length => number of
3470273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * significant digits), and divide the "shorter" by 10 (decreasing
3471273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * the length) until they are of equal length.
3472273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     */
3473273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    dlen = x->value.decimal.total - y->value.decimal.total;
3474273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    if (dlen < 0) {	/* y has more digits than x */
3475273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	swp = x;
3476273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	hi = y->value.decimal.hi;
3477273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	mi = y->value.decimal.mi;
3478273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	lo = y->value.decimal.lo;
3479273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	dlen = -dlen;
3480273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	order = -order;
3481273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    } else {		/* x has more digits than y */
3482273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	swp = y;
3483273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	hi = x->value.decimal.hi;
3484273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	mi = x->value.decimal.mi;
3485273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	lo = x->value.decimal.lo;
3486273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    }
3487273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    while (dlen > 8) {	/* in effect, right shift by 10**8 */
3488273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	lo = mi;
3489273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	mi = hi;
3490273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	hi = 0;
3491273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	dlen -= 8;
34924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
3493273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    while (dlen > 0) {
3494273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	unsigned long rem1, rem2;
3495273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	rem1 = (hi % 10) * 100000000L;
3496273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	hi = hi / 10;
3497273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	rem2 = (mi % 10) * 100000000L;
3498273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	mi = (mi + rem1) / 10;
3499273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	lo = (lo + rem2) / 10;
3500273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	dlen--;
3501273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    }
3502273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    if (hi > swp->value.decimal.hi) {
3503273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	return order;
3504273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    } else if (hi == swp->value.decimal.hi) {
3505273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	if (mi > swp->value.decimal.mi) {
3506273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	    return order;
3507273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	} else if (mi == swp->value.decimal.mi) {
3508273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	    if (lo > swp->value.decimal.lo) {
3509273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		return order;
3510273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	    } else if (lo == swp->value.decimal.lo) {
3511273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		if (x->value.decimal.total == y->value.decimal.total) {
3512273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		    return 0;
3513273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		} else {
3514273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		    return order;
3515273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		}
3516273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	    }
3517273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	}
35184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
3519273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    return -order;
35204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
35214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
35224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
3523070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xmlSchemaCompareDurations:
3524070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @x:  a first duration value
3525070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @y:  a second duration value
3526070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
3527070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Compare 2 durations
3528070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
3529070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
3530070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * case of error
3531070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
3532070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
3533070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel VeillardxmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y)
3534070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard{
3535070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long carry, mon, day;
3536070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    double sec;
353780b19092f24410a6b869abf519227686e8f207caDaniel Veillard    int invert = 1;
353880b19092f24410a6b869abf519227686e8f207caDaniel Veillard    long xmon, xday, myear, minday, maxday;
3539070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    static const long dayRange [2][12] = {
3540070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        { 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, },
3541070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} };
3542070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3543070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((x == NULL) || (y == NULL))
35445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return -2;
3545070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3546070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* months */
3547070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    mon = x->value.dur.mon - y->value.dur.mon;
3548070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3549070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* seconds */
3550070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    sec = x->value.dur.sec - y->value.dur.sec;
3551070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    carry = (long)sec / SECS_PER_DAY;
3552070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    sec -= (double)(carry * SECS_PER_DAY);
3553070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3554070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* days */
3555070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    day = x->value.dur.day - y->value.dur.day + carry;
3556070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3557070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* easy test */
3558070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (mon == 0) {
3559070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (day == 0)
3560070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (sec == 0.0)
3561070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 0;
3562070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else if (sec < 0.0)
3563070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return -1;
3564070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else
3565070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 1;
3566070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else if (day < 0)
3567070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return -1;
3568070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else
3569070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return 1;
3570070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
3571070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3572070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (mon > 0) {
3573070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if ((day >= 0) && (sec >= 0.0))
3574070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return 1;
3575070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else {
3576070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            xmon = mon;
3577070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            xday = -day;
3578070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        }
3579070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    } else if ((day <= 0) && (sec <= 0.0)) {
3580070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        return -1;
3581070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    } else {
358280b19092f24410a6b869abf519227686e8f207caDaniel Veillard	invert = -1;
3583070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xmon = -mon;
3584070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xday = day;
3585070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
3586070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3587070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    myear = xmon / 12;
358880b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (myear == 0) {
358980b19092f24410a6b869abf519227686e8f207caDaniel Veillard	minday = 0;
359080b19092f24410a6b869abf519227686e8f207caDaniel Veillard	maxday = 0;
359180b19092f24410a6b869abf519227686e8f207caDaniel Veillard    } else {
359280b19092f24410a6b869abf519227686e8f207caDaniel Veillard	maxday = 366 * ((myear + 3) / 4) +
359380b19092f24410a6b869abf519227686e8f207caDaniel Veillard	         365 * ((myear - 1) % 4);
359480b19092f24410a6b869abf519227686e8f207caDaniel Veillard	minday = maxday - 1;
359580b19092f24410a6b869abf519227686e8f207caDaniel Veillard    }
359680b19092f24410a6b869abf519227686e8f207caDaniel Veillard
3597070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmon = xmon % 12;
3598070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    minday += dayRange[0][xmon];
3599070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    maxday += dayRange[1][xmon];
3600070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
360180b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if ((maxday == minday) && (maxday == xday))
360280b19092f24410a6b869abf519227686e8f207caDaniel Veillard	return(0); /* can this really happen ? */
3603070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (maxday < xday)
360480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        return(-invert);
360580b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (minday > xday)
360680b19092f24410a6b869abf519227686e8f207caDaniel Veillard        return(invert);
3607070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3608070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* indeterminate */
36095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return 2;
36105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
36115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
36125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/*
36135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * macros for adding date/times and durations
36145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
36155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT(a,b)                  (floor(((double)a/(double)b)))
36165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO(a,b)                     (a - FQUOTIENT(a,b) * b)
36175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT_RANGE(a,low,high)     (FQUOTIENT((a-low),(high-low)))
36185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO_RANGE(a,low,high)        ((MODULO((a-low),(high-low)))+low)
36195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
36205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
3621669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * xmlSchemaDupVal:
3622669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @v: the #xmlSchemaValPtr value to duplicate
3623669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard *
3624669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Makes a copy of @v. The calling program is responsible for freeing
3625669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the returned value.
3626669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard *
3627669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * returns a pointer to a duplicated #xmlSchemaValPtr or NULL if error.
3628669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard */
3629669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillardstatic xmlSchemaValPtr
3630669adfcd3af5dfda873b10119d44202a7450bb20Daniel VeillardxmlSchemaDupVal (xmlSchemaValPtr v)
3631669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard{
3632669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaValPtr ret = xmlSchemaNewValue(v->type);
3633669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    if (ret == NULL)
3634669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        return NULL;
3635669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard
3636669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    memcpy(ret, v, sizeof(xmlSchemaVal));
36374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->next = NULL;
3638669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    return ret;
3639669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard}
3640669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard
3641669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard/**
3642285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * xmlSchemaCopyValue:
3643285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * @val:  the precomputed value to be copied
3644285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik *
3645285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Copies the precomputed value. This duplicates any string within.
3646285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik *
3647285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Returns the copy or NULL if a copy for a data-type is not implemented.
3648285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik */
3649285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaValPtr
3650285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaCopyValue(xmlSchemaValPtr val)
3651285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik{
36524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaValPtr ret = NULL, prev = NULL, cur;
3653285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik
3654285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    /*
3655285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    * Copy the string values.
3656285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    */
36574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    while (val != NULL) {
36584efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	switch (val->type) {
36594efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYTYPE:
36604efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_IDREFS:
36614efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ENTITIES:
36624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NMTOKENS:
36634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		xmlSchemaFreeValue(ret);
36644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		return (NULL);
36654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYSIMPLETYPE:
36664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_STRING:
36674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NORMSTRING:
36684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_TOKEN:
36694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_LANGUAGE:
36704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NAME:
36714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NCNAME:
36724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ID:
36734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_IDREF:
36744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ENTITY:
36754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NMTOKEN:
36764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYURI:
36774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
36784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.str != NULL)
36794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.str = xmlStrdup(BAD_CAST val->value.str);
36804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
36814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_QNAME:
36824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NOTATION:
36834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
36844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.qname.name != NULL)
36854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.qname.name =
3686285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                    xmlStrdup(BAD_CAST val->value.qname.name);
36874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.qname.uri != NULL)
36884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.qname.uri =
3689285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                    xmlStrdup(BAD_CAST val->value.qname.uri);
36904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
36914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_HEXBINARY:
36924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
36934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.hex.str != NULL)
36944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.hex.str = xmlStrdup(BAD_CAST val->value.hex.str);
36954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
36964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_BASE64BINARY:
36974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
36984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.base64.str != NULL)
36994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.base64.str =
3700285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                    xmlStrdup(BAD_CAST val->value.base64.str);
37014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
37024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    default:
37034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
37044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
37054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	}
37064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	if (ret == NULL)
37074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    ret = cur;
37084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	else
37094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    prev->next = cur;
37104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	prev = cur;
37114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	val = val->next;
3712285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    }
37134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (ret);
3714285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik}
3715285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik
3716285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik/**
37175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateAdd:
37185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr
37195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dur: an #xmlSchemaValPtr of type #XS_DURATION
37205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
37215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compute a new date/time from @dt and @dur. This function assumes @dt
37225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH,
3723669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * or #XML_SCHEMAS_GYEAR. The returned #xmlSchemaVal is the same type as
3724669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt. The calling program is responsible for freeing the returned value.
37255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3726669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a pointer to a new #xmlSchemaVal or NULL if error.
37275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
37285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr
37295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur)
37305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
3731669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaValPtr ret, tmp;
37325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long carry, tempdays, temp;
37335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValDatePtr r, d;
37345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValDurationPtr u;
37355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((dt == NULL) || (dur == NULL))
37375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
37385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ret = xmlSchemaNewValue(dt->type);
37405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret == NULL)
37415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
37425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3743669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    /* make a copy so we don't alter the original value */
3744669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    tmp = xmlSchemaDupVal(dt);
3745669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    if (tmp == NULL) {
3746669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        xmlSchemaFreeValue(ret);
3747669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        return NULL;
3748669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    }
3749669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard
37505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r = &(ret->value.date);
3751669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    d = &(tmp->value.date);
37525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    u = &(dur->value.dur);
37535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalization */
37555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (d->mon == 0)
37565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        d->mon = 1;
37575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalize for time zone offset */
37595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    u->sec -= (d->tzo * 60);
37605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    d->tzo = 0;
37615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalization */
37635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (d->day == 0)
37645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        d->day = 1;
37655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* month */
37675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry  = d->mon + u->mon;
3768ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->mon = (unsigned int) MODULO_RANGE(carry, 1, 13);
3769ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT_RANGE(carry, 1, 13);
37705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* year (may be modified later) */
37725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->year = d->year + carry;
37735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (r->year == 0) {
37745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (d->year > 0)
37755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            r->year--;
37765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else
37775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            r->year++;
37785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
37795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* time zone */
37815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->tzo     = d->tzo;
37825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->tz_flag = d->tz_flag;
37835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* seconds */
37855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->sec = d->sec + u->sec;
3786ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT((long)r->sec, 60);
37875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (r->sec != 0.0) {
37885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        r->sec = MODULO(r->sec, 60.0);
37895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
37905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* minute */
37925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry += d->min;
3793ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->min = (unsigned int) MODULO(carry, 60);
3794ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT(carry, 60);
37955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* hours */
37975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry  += d->hour;
3798ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->hour = (unsigned int) MODULO(carry, 24);
3799ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry   = (long)FQUOTIENT(carry, 24);
38005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
38025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * days
38035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * Note we use tempdays because the temporary values may need more
38045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * than 5 bits
38055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
38065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) &&
38075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                  (d->day > MAX_DAYINMONTH(r->year, r->mon)))
38085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = MAX_DAYINMONTH(r->year, r->mon);
38095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (d->day < 1)
38105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = 1;
38115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else
38125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = d->day;
38135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    tempdays += u->day + carry;
38155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    while (1) {
38175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (tempdays < 1) {
38185e9576a492e4fb8c2d517ccd6056a139e801ec9fDaniel Veillard            long tmon = (long) MODULO_RANGE((int)r->mon-1, 1, 13);
38195e9576a492e4fb8c2d517ccd6056a139e801ec9fDaniel Veillard            long tyr  = r->year + (long)FQUOTIENT_RANGE((int)r->mon-1, 1, 13);
38205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (tyr == 0)
38215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                tyr--;
382214b5643947845df089376106517c4f7ba061e4b0Daniel Veillard	    /*
382314b5643947845df089376106517c4f7ba061e4b0Daniel Veillard	     * Coverity detected an overrun in daysInMonth
382414b5643947845df089376106517c4f7ba061e4b0Daniel Veillard	     * of size 12 at position 12 with index variable "((r)->mon - 1)"
382514b5643947845df089376106517c4f7ba061e4b0Daniel Veillard	     */
382614b5643947845df089376106517c4f7ba061e4b0Daniel Veillard	    if (tmon < 0)
382714b5643947845df089376106517c4f7ba061e4b0Daniel Veillard	        tmon = 0;
382814b5643947845df089376106517c4f7ba061e4b0Daniel Veillard	    if (tmon > 12)
382914b5643947845df089376106517c4f7ba061e4b0Daniel Veillard	        tmon = 12;
38305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            tempdays += MAX_DAYINMONTH(tyr, tmon);
38315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            carry = -1;
3832ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard        } else if (tempdays > (long) MAX_DAYINMONTH(r->year, r->mon)) {
38335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon);
38345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            carry = 1;
38355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        } else
38365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
38375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        temp = r->mon + carry;
3839ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard        r->mon = (unsigned int) MODULO_RANGE(temp, 1, 13);
3840ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard        r->year = r->year + (unsigned int) FQUOTIENT_RANGE(temp, 1, 13);
38415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (r->year == 0) {
38425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (temp < 1)
38435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                r->year--;
38445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else
38455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                r->year++;
38465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	}
38475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
38485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->day = tempdays;
38505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
38525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * adjust the date/time type to the date values
38535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
38545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret->type != XML_SCHEMAS_DATETIME) {
38555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if ((r->hour) || (r->min) || (r->sec))
38565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ret->type = XML_SCHEMAS_DATETIME;
38575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (ret->type != XML_SCHEMAS_DATE) {
38585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if ((r->mon != 1) && (r->day != 1))
38595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                ret->type = XML_SCHEMAS_DATE;
38605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1))
38615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                ret->type = XML_SCHEMAS_GYEARMONTH;
38625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
38635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
38645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3865669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaFreeValue(tmp);
38665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
38685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
38695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
38715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaDateNormalize:
3872669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt: an #xmlSchemaValPtr of a date/time type value.
3873669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @offset: number of seconds to adjust @dt by.
38745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3875669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Normalize @dt to GMT time. The @offset parameter is subtracted from
3876669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the return value is a time-zone offset is present on @dt.
38775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3878669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a normalized copy of @dt or NULL if error.
38795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
38805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr
38815a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset)
38825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
38835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValPtr dur, ret;
38845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dt == NULL)
38865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
38875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (((dt->type != XML_SCHEMAS_TIME) &&
3889c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik         (dt->type != XML_SCHEMAS_DATETIME) &&
3890c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	 (dt->type != XML_SCHEMAS_DATE)) || (dt->value.date.tzo == 0))
38915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return xmlSchemaDupVal(dt);
38925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION);
38945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dur == NULL)
38955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
38965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    dur->value.date.sec -= offset;
38985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ret = _xmlSchemaDateAdd(dt, dur);
39005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret == NULL)
39015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
39025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaFreeValue(dur);
39045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* ret->value.date.tzo = 0; */
39065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
39075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
39085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
39105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateCastYMToDays:
39115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr
39125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
39135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Convert mon and year of @dt to total number of days. Take the
39145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * number of years since (or before) 1 AD and add the number of leap
39155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years. This is a function  because negative
39165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years must be handled a little differently and there is no zero year.
39175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
39185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns number of days.
39195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
39205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic long
39215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt)
39225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
39235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long ret;
392449e8963c640865343327c67d4755a1af705717d3Daniel Veillard    int mon;
39255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
392649e8963c640865343327c67d4755a1af705717d3Daniel Veillard    mon = dt->value.date.mon;
392749e8963c640865343327c67d4755a1af705717d3Daniel Veillard    if (mon <= 0) mon = 1; /* normalization */
392849e8963c640865343327c67d4755a1af705717d3Daniel Veillard
392949e8963c640865343327c67d4755a1af705717d3Daniel Veillard    if (dt->value.date.year <= 0)
39305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ret = (dt->value.date.year * 365) +
39315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+
39325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard               ((dt->value.date.year+1)/400)) +
393349e8963c640865343327c67d4755a1af705717d3Daniel Veillard              DAY_IN_YEAR(0, mon, dt->value.date.year);
39345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else
39355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ret = ((dt->value.date.year-1) * 365) +
39365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+
39375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard               ((dt->value.date.year-1)/400)) +
393849e8963c640865343327c67d4755a1af705717d3Daniel Veillard              DAY_IN_YEAR(0, mon, dt->value.date.year);
39395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
39415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
39425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
39445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * TIME_TO_NUMBER:
39455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt:  an #xmlSchemaValPtr
39465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
39475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Calculates the number of seconds in the time portion of @dt.
39485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
39495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns seconds.
39505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
39515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define TIME_TO_NUMBER(dt)                              \
39525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ((double)((dt->value.date.hour * SECS_PER_HOUR) +   \
3953b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard              (dt->value.date.min * SECS_PER_MIN) +	\
3954b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard              (dt->value.date.tzo * SECS_PER_MIN)) +	\
3955b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard               dt->value.date.sec)
39565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
39585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaCompareDates:
39595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @x:  a first date/time value
39605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @y:  a second date/time value
39615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
39625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compare 2 date/times
39635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
39645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
39655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error
39665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
39675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic int
39685a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y)
39695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
39705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    unsigned char xmask, ymask, xor_mask, and_mask;
39715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValPtr p1, p2, q1, q2;
39725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long p1d, p2d, q1d, q2d;
39735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((x == NULL) || (y == NULL))
39755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return -2;
39765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (x->value.date.tz_flag) {
39785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (!y->value.date.tz_flag) {
39805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            p1 = xmlSchemaDateNormalize(x, 0);
39815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
39825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            /* normalize y + 14:00 */
39835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR));
39845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
3986fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            if (p1d < q1d) {
3987fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
3988fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
39895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return -1;
3990fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    } else if (p1d == q1d) {
39915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                double sec;
39925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
3994fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard                if (sec < 0.0) {
3995fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		    xmlSchemaFreeValue(p1);
3996fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		    xmlSchemaFreeValue(q1);
39975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    return -1;
3998fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		} else {
39994aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    int ret = 0;
40005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    /* normalize y - 14:00 */
40015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR));
40025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day;
40035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    if (p1d > q2d)
40044aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 1;
40055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    else if (p1d == q2d) {
40065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2);
40075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        if (sec > 0.0)
40084aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                            ret = 1;
40095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        else
40104aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                            ret = 2; /* indeterminate */
40115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    }
40124aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(p1);
40134aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(q1);
40144aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(q2);
40154aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    if (ret != 0)
40164aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		        return(ret);
40175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                }
4018fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            } else {
4019fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
4020fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
4021fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    }
40225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
40235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    } else if (y->value.date.tz_flag) {
40245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1 = xmlSchemaDateNormalize(y, 0);
40255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
40265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        /* normalize x - 14:00 */
40285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR));
40295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
40305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
4031fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard        if (p1d < q1d) {
4032fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(p1);
4033fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(q1);
40345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
4035fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else if (p1d == q1d) {
40365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            double sec;
40375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
4039fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            if (sec < 0.0) {
4040fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
4041fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
40425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return -1;
4043fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    } else {
40444aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	        int ret = 0;
40455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                /* normalize x + 14:00 */
40465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR));
40475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day;
40485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40496560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                if (p2d > q1d) {
40504aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                    ret = 1;
40516560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		} else if (p2d == q1d) {
40525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1);
40535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    if (sec > 0.0)
40544aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 1;
40555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    else
40564aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 2; /* indeterminate */
40575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                }
40586560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(p1);
40596560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(q1);
40606560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(p2);
40614aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		if (ret != 0)
40624aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    return(ret);
40635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            }
4064fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else {
4065fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(p1);
4066fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(q1);
40675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
40685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
40695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
40715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * if the same type then calculate the difference
40725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
40735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (x->type == y->type) {
40744aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard        int ret = 0;
40755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1 = xmlSchemaDateNormalize(y, 0);
40765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
40775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1 = xmlSchemaDateNormalize(x, 0);
40795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
40805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
4081fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard        if (p1d < q1d) {
40824aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard            ret = -1;
4083fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else if (p1d > q1d) {
40844aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard            ret = 1;
4085fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else {
40865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            double sec;
40875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
40895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (sec < 0.0)
40904aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                ret = -1;
40915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else if (sec > 0.0)
40924aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                ret = 1;
40935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
40954aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	xmlSchemaFreeValue(p1);
40964aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	xmlSchemaFreeValue(q1);
40974aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard        return(ret);
40985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
40995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    switch (x->type) {
41015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
41025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0xf;
41035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
41055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x7;
41065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
41085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x1;
41095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
41115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x2;
41125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
41145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x3;
41155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
41175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x3;
41185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
41205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x6;
41215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
41235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x8;
41245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        default:
41265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0;
41275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
41295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    switch (y->type) {
41315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
41325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0xf;
41335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
41355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x7;
41365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
41385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x1;
41395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
41415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x2;
41425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
41445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x3;
41455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
41475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x3;
41485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
41505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x6;
41515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
41535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x8;
41545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        default:
41565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0;
41575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
41585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
41595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xor_mask = xmask ^ ymask;           /* mark type differences */
41615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    and_mask = xmask & ymask;           /* mark field specification */
41625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* year */
41645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 1)
41655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
41665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 1) {
41675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.year < y->value.date.year)
41685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
41695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.year > y->value.date.year)
41705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
41715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
41725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* month */
41745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 2)
41755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
41765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 2) {
41775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.mon < y->value.date.mon)
41785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
41795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.mon > y->value.date.mon)
41805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
41815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
41825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* day */
41845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 4)
41855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
41865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 4) {
41875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.day < y->value.date.day)
41885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
41895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.day > y->value.date.day)
41905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
41915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
41925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
41935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* time */
41945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 8)
41955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
41965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 8) {
41975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.hour < y->value.date.hour)
41985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
41995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.hour > y->value.date.hour)
42005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
42015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.min < y->value.date.min)
42025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
42035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.min > y->value.date.min)
42045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
42055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.sec < y->value.date.sec)
42065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
42075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.sec > y->value.date.sec)
42085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
42095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
42105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
4211070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
4212070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
4213070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
4214070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
42156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveReplaceStrings:
4216478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @x:  a first string value
4217478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @y:  a second string value
42186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @invert: inverts the result if x < y or x > y.
42196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
42206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
42216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is
42226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "replace". I.e. @x could
42236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString".
42246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
42256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
42266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
42276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
42286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
4229478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaComparePreserveReplaceStrings(const xmlChar *x,
4230478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				       const xmlChar *y,
42316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				       int invert)
42326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
42336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
42346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
4235478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4236478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (IS_WSP_REPLACE_CH(*y)) {
4237478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (! IS_WSP_SPACE_CH(*x)) {
4238478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*x - 0x20) < 0) {
42396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
42406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
42416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
42426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
42436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
42446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
42456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
42466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
42476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
42486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
42496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
42506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
4251478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x - *y;
42526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0) {
42536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
42546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
42556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
42566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
42576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
42586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0) {
42596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
42606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
42616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
42626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
42636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
42646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
4265478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	x++;
4266478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	y++;
42676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4268478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0) {
42696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (invert)
42706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(-1);
42716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	else
42726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(1);
42736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4274478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0) {
42756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (invert)
42766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(1);
42776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	else
42786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(-1);
42796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
42806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
42816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
42826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
42836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
42846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings:
42856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
42866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
42876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
42886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
42896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is
42906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could
42916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString".
42926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
42936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
42946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
42956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
42966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
4297478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaComparePreserveCollapseStrings(const xmlChar *x,
4298478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				        const xmlChar *y,
42996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik					int invert)
43006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
43016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
43026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
43036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    /*
43046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    * Skip leading blank chars of the collapsed string.
43056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    */
4306478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while IS_WSP_BLANK_CH(*y)
4307478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	y++;
43086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
4309478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4310478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if IS_WSP_BLANK_CH(*y) {
4311478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (! IS_WSP_SPACE_CH(*x)) {
43126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		/*
4313478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* The yv character would have been replaced to 0x20.
43146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*/
4315478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*x - 0x20) < 0) {
43166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
43176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
43186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
43196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
43206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
43216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
43226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
43236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
43246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
43256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
43266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4327478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    x++;
4328478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    y++;
43296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    /*
43306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    * Skip contiguous blank chars of the collapsed string.
43316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    */
4332478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    while IS_WSP_BLANK_CH(*y)
4333478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		y++;
43346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
4335478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x++ - *y++;
43366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0) {
43376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
43386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
43396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
43406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
43416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
43426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0) {
43436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
43446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
43456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
43466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
43476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
43486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
43496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4350478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0) {
43516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 if (invert)
43526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(-1);
43536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 else
43546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(1);
43556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4356478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0) {
43576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	/*
43586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	* Skip trailing blank chars of the collapsed string.
43596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	*/
4360478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*y)
4361478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    y++;
4362478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (*y != 0) {
43636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (invert)
43646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(1);
43656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    else
43666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(-1);
43676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
43686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
43696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
43706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
43716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
43726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
43736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings:
43746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
43756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
43766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
43776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
43786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is
43796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could
43806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString".
43816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
43826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
43836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
43846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
43856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
4386478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareReplaceCollapseStrings(const xmlChar *x,
4387478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				       const xmlChar *y,
43886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				       int invert)
43896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
43906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
43916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
43926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    /*
43936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    * Skip leading blank chars of the collapsed string.
43946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    */
4395478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while IS_WSP_BLANK_CH(*y)
4396478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	y++;
43976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
4398478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4399478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if IS_WSP_BLANK_CH(*y) {
4400478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (! IS_WSP_BLANK_CH(*x)) {
44016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		/*
4402478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* The yv character would have been replaced to 0x20.
44036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*/
4404478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*x - 0x20) < 0) {
44056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
44066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
44076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
44086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
44096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
44106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
44116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
44126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
44136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
44146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
44156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4416478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    x++;
4417478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    y++;
44186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    /*
44196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    * Skip contiguous blank chars of the collapsed string.
44206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    */
4421478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    while IS_WSP_BLANK_CH(*y)
4422478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		y++;
44236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
4424478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if IS_WSP_BLANK_CH(*x) {
44256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		/*
4426478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* The xv character would have been replaced to 0x20.
44276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*/
4428478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((0x20 - *y) < 0) {
44296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
44306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
44316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
44326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
44336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
44346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
44356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
44366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
44376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
44386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
44396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4440478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x++ - *y++;
44416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0)
44426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(-1);
44436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0)
44446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(1);
44456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
44466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4447478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0) {
44486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 if (invert)
44496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(-1);
44506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 else
44516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(1);
44526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4453478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0) {
44546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	/*
44556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	* Skip trailing blank chars of the collapsed string.
44566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	*/
4457478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*y)
4458478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    y++;
4459478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (*y != 0) {
44606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (invert)
44616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(1);
44626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    else
44636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(-1);
44646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
44656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
44666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
44676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
44686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
44696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
44706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
44716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareReplacedStrings:
44726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
44736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
44746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
44756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
44766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
44776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
44786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
44796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
44806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
4481478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareReplacedStrings(const xmlChar *x,
4482478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				const xmlChar *y)
44836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
44846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
44856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
4486478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4487478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if IS_WSP_BLANK_CH(*y) {
4488478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (! IS_WSP_BLANK_CH(*x)) {
4489478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*x - 0x20) < 0)
44906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    		    return(-1);
44916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
44926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
44936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
44946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
4495478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if IS_WSP_BLANK_CH(*x) {
4496478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((0x20 - *y) < 0)
44976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    		    return(-1);
44986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
44996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
45006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4501478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x - *y;
45026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0)
45036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    		return(-1);
45046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0)
45056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    		return(1);
45066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
4507478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	x++;
4508478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	y++;
45096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4510478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0)
45116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        return(1);
4512478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0)
45136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        return(-1);
45146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
45156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
45166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
45176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
4518c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaCompareNormStrings:
4519c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @x:  a first string value
4520c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @y:  a second string value
4521c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
4522c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Compare 2 string for their normalized values.
4523c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
4524c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
4525c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * case of error
4526c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */
4527c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int
4528478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareNormStrings(const xmlChar *x,
4529478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    const xmlChar *y) {
4530c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    int tmp;
4531c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
4532478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while (IS_BLANK_CH(*x)) x++;
4533478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while (IS_BLANK_CH(*y)) y++;
4534478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4535478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (IS_BLANK_CH(*x)) {
4536478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (!IS_BLANK_CH(*y)) {
4537478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		tmp = *x - *y;
4538c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(tmp);
4539c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    }
4540478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    while (IS_BLANK_CH(*x)) x++;
4541478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    while (IS_BLANK_CH(*y)) y++;
4542c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	} else {
4543478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x++ - *y++;
4544c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (tmp < 0)
4545c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(-1);
4546c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (tmp > 0)
4547c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(1);
4548c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	}
4549c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
4550478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0) {
4551478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	while (IS_BLANK_CH(*x)) x++;
4552478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (*x != 0)
4553c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    return(1);
4554c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
4555478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0) {
4556478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	while (IS_BLANK_CH(*y)) y++;
4557478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (*y != 0)
4558c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    return(-1);
4559c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
4560c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    return(0);
4561c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard}
4562c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
4563c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/**
4564b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCompareFloats:
4565b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @x:  a first float or double value
4566b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @y:  a second float or double value
4567b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
4568b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Compare 2 values
4569b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
4570b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
4571b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * case of error
4572b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
4573b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int
4574b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) {
4575b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    double d1, d2;
4576b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4577b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if ((x == NULL) || (y == NULL))
4578b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
4579b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4580b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
4581b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * Cast everything to doubles.
4582b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
4583b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (x->type == XML_SCHEMAS_DOUBLE)
4584b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d1 = x->value.d;
4585b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else if (x->type == XML_SCHEMAS_FLOAT)
4586b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d1 = x->value.f;
4587b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else
4588b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
4589b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4590b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (y->type == XML_SCHEMAS_DOUBLE)
4591b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d2 = y->value.d;
4592b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else if (y->type == XML_SCHEMAS_FLOAT)
4593b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d2 = y->value.f;
4594b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else
4595b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
4596b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4597b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
4598b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * Check for special cases.
4599b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
4600b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (xmlXPathIsNaN(d1)) {
4601b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (xmlXPathIsNaN(d2))
4602b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
4603b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(1);
4604b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
4605b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (xmlXPathIsNaN(d2))
4606b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-1);
4607b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == xmlXPathPINF) {
4608b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (d2 == xmlXPathPINF)
4609b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
4610b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(1);
4611b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
4612b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d2 == xmlXPathPINF)
4613b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(-1);
4614b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == xmlXPathNINF) {
4615b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (d2 == xmlXPathNINF)
4616b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
4617b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(-1);
4618b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
4619b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d2 == xmlXPathNINF)
4620b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(1);
4621b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4622b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
4623b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * basic tests, the last one we should have equality, but
4624b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * portability is more important than speed and handling
4625b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * NaN or Inf in a portable way is always a challenge, so ...
4626b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
4627b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 < d2)
4628b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-1);
4629b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 > d2)
4630b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(1);
4631b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == d2)
4632b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(0);
4633b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return(2);
4634b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
4635b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4636b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
46374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareValues:
46384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x:  a first value
46396c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xvalue: the first value as a string (optional)
46406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xwtsp: the whitespace type
46414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y:  a second value
46426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xvalue: the second value as a string (optional)
46436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @ywtsp: the whitespace type
46444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
46454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 values
46464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
46474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, 3 if not
46484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * comparable and -2 in case of error
46494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
46506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
46516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaCompareValuesInternal(xmlSchemaValType xtype,
46526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValPtr x,
46536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *xvalue,
46546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType xws,
46556c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValType ytype,
46566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			       xmlSchemaValPtr y,
46576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *yvalue,
4658478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType yws)
4659478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{
46606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    switch (xtype) {
466180b19092f24410a6b869abf519227686e8f207caDaniel Veillard	case XML_SCHEMAS_UNKNOWN:
46622f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	case XML_SCHEMAS_ANYTYPE:
466380b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    return(-2);
466480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_INTEGER:
466580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NPINTEGER:
466680b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NINTEGER:
466780b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NNINTEGER:
466880b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_PINTEGER:
466980b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_INT:
467080b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_UINT:
467180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_LONG:
467280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ULONG:
467380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_SHORT:
467480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_USHORT:
467580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_BYTE:
467680b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_UBYTE:
46774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMAS_DECIMAL:
46786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
46796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
46806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ytype == xtype)
468180b19092f24410a6b869abf519227686e8f207caDaniel Veillard		return(xmlSchemaCompareDecimals(x, y));
46826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((ytype == XML_SCHEMAS_DECIMAL) ||
46836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_INTEGER) ||
46846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_NPINTEGER) ||
46856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_NINTEGER) ||
46866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_NNINTEGER) ||
46876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_PINTEGER) ||
46886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_INT) ||
46896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_UINT) ||
46906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_LONG) ||
46916c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_ULONG) ||
46926c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_SHORT) ||
46936c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_USHORT) ||
46946c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_BYTE) ||
46956c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_UBYTE))
46964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(xmlSchemaCompareDecimals(x, y));
46975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    return(-2);
4698070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        case XML_SCHEMAS_DURATION:
46996c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
47006c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
4701478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (ytype == XML_SCHEMAS_DURATION)
4702070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return(xmlSchemaCompareDurations(x, y));
47035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return(-2);
47045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
47055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
47065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
47075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
47085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
47095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
47105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
47115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
47126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
47136c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
47146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if ((ytype == XML_SCHEMAS_DATETIME)  ||
47156c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_TIME)      ||
47166c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GDAY)      ||
47176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GMONTH)    ||
47186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GMONTHDAY) ||
47196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GYEAR)     ||
47206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_DATE)      ||
47216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GYEARMONTH))
47225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return (xmlSchemaCompareDates(x, y));
47235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return (-2);
47242ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	/*
47252ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	* Note that we will support comparison of string types against
47262ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	* anySimpleType as well.
47272ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	*/
47282ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	case XML_SCHEMAS_ANYSIMPLETYPE:
47296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_STRING:
47306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        case XML_SCHEMAS_NORMSTRING:
473180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_TOKEN:
473280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_LANGUAGE:
473380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NMTOKEN:
473480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NAME:
473580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NCNAME:
473680b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ID:
473780b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_IDREF:
473880b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ENTITY:
473980b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ANYURI:
47406c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	{
47416c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    const xmlChar *xv, *yv;
47426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
47436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (x == NULL)
47446c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		xv = xvalue;
47456c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    else
47466c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		xv = x->value.str;
47476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (y == NULL)
47486c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		yv = yvalue;
47496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    else
47506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		yv = y->value.str;
47516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    /*
47526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    * TODO: Compare those against QName.
47536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    */
47546c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ytype == XML_SCHEMAS_QNAME) {
47556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		TODO
47566c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		if (y == NULL)
47576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    return(-2);
47586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return (-2);
47596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
47606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if ((ytype == XML_SCHEMAS_ANYSIMPLETYPE) ||
47616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_STRING) ||
47626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_NORMSTRING) ||
47636c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_TOKEN) ||
47646c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_LANGUAGE) ||
47656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_NMTOKEN) ||
47666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_NAME) ||
47676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_NCNAME) ||
47686c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_ID) ||
47696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_IDREF) ||
47706c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_ENTITY) ||
47716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_ANYURI)) {
47726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
47736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (xws == XML_SCHEMA_WHITESPACE_PRESERVE) {
47746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
47756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) {
47766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			/* TODO: What about x < y or x > y. */
47776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			if (xmlStrEqual(xv, yv))
47786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			    return (0);
47796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			else
47806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			    return (2);
47816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    } else if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
47826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaComparePreserveReplaceStrings(xv, yv, 0));
47836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
47846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaComparePreserveCollapseStrings(xv, yv, 0));
47856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
47866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else if (xws == XML_SCHEMA_WHITESPACE_REPLACE) {
47876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
47886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE)
47896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaComparePreserveReplaceStrings(yv, xv, 1));
47906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
47916c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaCompareReplacedStrings(xv, yv));
47926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
47936c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaCompareReplaceCollapseStrings(xv, yv, 0));
47946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
47956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else if (xws == XML_SCHEMA_WHITESPACE_COLLAPSE) {
47966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
47976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE)
47986c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaComparePreserveCollapseStrings(yv, xv, 1));
47996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
48006c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaCompareReplaceCollapseStrings(yv, xv, 1));
48016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
48026c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaCompareNormStrings(xv, yv));
48036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else
48046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return (-2);
48056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
48066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4807c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard            return (-2);
48086c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	}
4809e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_QNAME:
4810c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_NOTATION:
48116c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
48126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
4813c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik            if ((ytype == XML_SCHEMAS_QNAME) ||
4814c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		(ytype == XML_SCHEMAS_NOTATION)) {
4815e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) &&
4816e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    (xmlStrEqual(x->value.qname.uri, y->value.qname.uri)))
4817e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    return(0);
4818e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		return(2);
4819e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    }
4820e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (-2);
4821c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_FLOAT:
4822c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_DOUBLE:
48236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
48246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
48256c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if ((ytype == XML_SCHEMAS_FLOAT) ||
48266c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_DOUBLE))
4827b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard                return (xmlSchemaCompareFloats(x, y));
4828b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard            return (-2);
4829c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_BOOLEAN:
48306c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
48316c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
48326c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if (ytype == XML_SCHEMAS_BOOLEAN) {
4833b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (x->value.b == y->value.b)
4834b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    return(0);
4835b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (x->value.b == 0)
4836b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    return(-1);
4837b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		return(1);
4838b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
4839b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return (-2);
4840560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard        case XML_SCHEMAS_HEXBINARY:
48416c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
48426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
48436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if (ytype == XML_SCHEMAS_HEXBINARY) {
484470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	        if (x->value.hex.total == y->value.hex.total) {
484570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    int ret = xmlStrcmp(x->value.hex.str, y->value.hex.str);
484670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    if (ret > 0)
484770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard			return(1);
484870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    else if (ret == 0)
484970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard			return(0);
485070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		}
485170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		else if (x->value.hex.total > y->value.hex.total)
485270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    return(1);
485370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
485470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		return(-1);
485570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard            }
4856560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard            return (-2);
48571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BASE64BINARY:
48586c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
48596c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
48606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if (ytype == XML_SCHEMAS_BASE64BINARY) {
48611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (x->value.base64.total == y->value.base64.total) {
48621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int ret = xmlStrcmp(x->value.base64.str,
48631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		                        y->value.base64.str);
48641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (ret > 0)
48651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        return(1);
48661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (ret == 0)
48671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        return(0);
4868d369b1387e592791049a41eb4cc16046fe52e985Daniel Veillard		    else
4869d369b1387e592791049a41eb4cc16046fe52e985Daniel Veillard		        return(-1);
48701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
48711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else if (x->value.base64.total > y->value.base64.total)
48721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    return(1);
48731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else
48741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    return(-1);
48751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
48766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik            return (-2);
4877c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_IDREFS:
4878c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ENTITIES:
4879c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NMTOKENS:
4880c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    TODO
4881c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    break;
48824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
48835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return -2;
48844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
48854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
48864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
48876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValues:
48886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first value
48896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second value
48906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
48916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values
48926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
48936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
48946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
48956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
48966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint
48976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) {
48986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    xmlSchemaWhitespaceValueType xws, yws;
48996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
49005e094143e423c01739ac9221f371846fd290be4eDaniel Veillard    if ((x == NULL) || (y == NULL))
49015e094143e423c01739ac9221f371846fd290be4eDaniel Veillard        return(-2);
49026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (x->type == XML_SCHEMAS_STRING)
49036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	xws = XML_SCHEMA_WHITESPACE_PRESERVE;
49046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else if (x->type == XML_SCHEMAS_NORMSTRING)
49056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        xws = XML_SCHEMA_WHITESPACE_REPLACE;
49066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else
49076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        xws = XML_SCHEMA_WHITESPACE_COLLAPSE;
49086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
49096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (y->type == XML_SCHEMAS_STRING)
49106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	yws = XML_SCHEMA_WHITESPACE_PRESERVE;
49116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else if (x->type == XML_SCHEMAS_NORMSTRING)
49126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        yws = XML_SCHEMA_WHITESPACE_REPLACE;
49136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else
49146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        yws = XML_SCHEMA_WHITESPACE_COLLAPSE;
49156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
49166c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type,
49176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	y, NULL, yws));
49186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
49196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
49206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
49216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValuesWhtsp:
49226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first value
49236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xws: the whitespace value of x
49246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second value
49256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @yws: the whitespace value of y
49266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
49276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values
49286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
49296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
49306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
49316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
49326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint
49336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValuesWhtsp(xmlSchemaValPtr x,
49346c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaWhitespaceValueType xws,
49356c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaValPtr y,
49366c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaWhitespaceValueType yws)
49376c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{
49389dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik    if ((x == NULL) || (y == NULL))
49399dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik	return(-2);
49406c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type,
49416c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	y, NULL, yws));
49426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik}
49436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
49446c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/**
49456c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaCompareValuesWhtspExt:
49466c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @x:  a first value
49476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xws: the whitespace value of x
49486c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @y:  a second value
49496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @yws: the whitespace value of y
49506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
49516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Compare 2 values
49526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
49536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
49546c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * case of error
49556c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */
49566c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikstatic int
49576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaCompareValuesWhtspExt(xmlSchemaValType xtype,
49586c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValPtr x,
49596c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *xvalue,
49606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType xws,
49616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValType ytype,
49626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValPtr y,
49636c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *yvalue,
49646c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType yws)
49656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{
49666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    return(xmlSchemaCompareValuesInternal(xtype, x, xvalue, xws, ytype, y,
49676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	yvalue, yws));
49686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
49696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
49706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
4971c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaNormLen:
4972c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @value:  a string
4973c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
4974c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Computes the UTF8 length of the normalized value of the string
4975c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
4976c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns the length or -1 in case of error.
4977c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */
4978c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int
4979c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaNormLen(const xmlChar *value) {
4980c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    const xmlChar *utf;
4981c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    int ret = 0;
4982c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
4983c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    if (value == NULL)
4984c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	return(-1);
4985c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    utf = value;
498676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while (IS_BLANK_CH(*utf)) utf++;
4987c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    while (*utf != 0) {
4988c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	if (utf[0] & 0x80) {
4989c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if ((utf[1] & 0xc0) != 0x80)
4990c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(-1);
4991c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if ((utf[0] & 0xe0) == 0xe0) {
4992c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		if ((utf[2] & 0xc0) != 0x80)
4993c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    return(-1);
4994c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		if ((utf[0] & 0xf0) == 0xf0) {
4995c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80)
4996c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard			return(-1);
4997c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    utf += 4;
4998c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		} else {
4999c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    utf += 3;
5000c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		}
5001c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    } else {
5002c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		utf += 2;
5003c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    }
500476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	} else if (IS_BLANK_CH(*utf)) {
500576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*utf)) utf++;
5006c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (*utf == 0)
5007c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		break;
5008c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	} else {
5009c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    utf++;
5010c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	}
5011c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	ret++;
5012c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
5013c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    return(ret);
5014c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard}
5015c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
50166927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard/**
50176927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaGetFacetValueAsULong:
50186927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * @facet: an schemas type facet
50196927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard *
50206927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Extract the value of a facet
50216927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard *
50226927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Returns the value as a long
50236927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard */
5024c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardunsigned long
5025c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaGetFacetValueAsULong(xmlSchemaFacetPtr facet)
5026c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{
5027c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    /*
5028c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    * TODO: Check if this is a decimal.
5029c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    */
5030094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack    if (facet == NULL)
5031094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack        return 0;
5032c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    return ((unsigned long) facet->val->value.decimal.lo);
5033c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
5034c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
5035c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/**
503601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateListSimpleTypeFacet:
503701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facet:  the facet to check
503801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @value:  the lexical repr of the value to validate
503901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @actualLen:  the number of list items
504001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @expectedLen: the resulting expected number of list items
504101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
504201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Checks the value of a list simple type against a facet.
504301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
504401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 0 if the value is valid, a positive error code
504501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * number otherwise and -1 in case of an internal error.
504601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
504701fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint
504801fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaValidateListSimpleTypeFacet(xmlSchemaFacetPtr facet,
504901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     const xmlChar *value,
505001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     unsigned long actualLen,
505101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     unsigned long *expectedLen)
505201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
5053ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard    if (facet == NULL)
5054ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard        return(-1);
505501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    /*
505601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * TODO: Check if this will work with large numbers.
505701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * (compare value.decimal.mi and value.decimal.hi as well?).
505801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
505901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
506001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen != facet->val->value.decimal.lo) {
5061478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (expectedLen != NULL)
5062c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
506301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_LENGTH_VALID);
506401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
506501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
506601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen < facet->val->value.decimal.lo) {
5067478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (expectedLen != NULL)
5068c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
506901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_MINLENGTH_VALID);
507001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
507101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MAXLENGTH) {
507201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen > facet->val->value.decimal.lo) {
5073478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (expectedLen != NULL)
5074c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
507501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_MAXLENGTH_VALID);
507601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
507701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else
507801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	/*
507901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	* NOTE: That we can pass NULL as xmlSchemaValPtr to
508001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	* xmlSchemaValidateFacet, since the remaining facet types
508101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	* are: XML_SCHEMA_FACET_PATTERN, XML_SCHEMA_FACET_ENUMERATION.
508201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	*/
508301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	return(xmlSchemaValidateFacet(NULL, facet, value, NULL));
508401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    return (0);
508501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
508601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
508701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
50886927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaValidateLengthFacet:
5089c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type:  the built-in type
5090c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @facet:  the facet to check
5091c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value:  the lexical repr. of the value to be validated
5092c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val:  the precomputed value
5093478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value
5094c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @length: the actual length of the value
5095c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
5096c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength"
5097c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * facet; sets @length to the computed length of @value.
5098c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
5099c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if the value is valid, a positive error code
5100c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * otherwise and -1 in case of an internal or API error.
5101c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */
5102478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikstatic int
5103478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacetInternal(xmlSchemaFacetPtr facet,
5104478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				     xmlSchemaTypeType valType,
5105478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				     const xmlChar *value,
5106478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				     xmlSchemaValPtr val,
5107478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				     unsigned long *length,
5108478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				     xmlSchemaWhitespaceValueType ws)
5109c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{
5110c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    unsigned int len = 0;
5111c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
5112478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if ((length == NULL) || (facet == NULL))
5113ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard        return (-1);
5114c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    *length = 0;
5115c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((facet->type != XML_SCHEMA_FACET_LENGTH) &&
5116c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->type != XML_SCHEMA_FACET_MAXLENGTH) &&
5117c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->type != XML_SCHEMA_FACET_MINLENGTH))
5118c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	return (-1);
5119c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
5120478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    /*
5121478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    * TODO: length, maxLength and minLength must be of type
5122478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    * nonNegativeInteger only. Check if decimal is used somehow.
5123478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    */
5124c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((facet->val == NULL) ||
5125c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	((facet->val->type != XML_SCHEMAS_DECIMAL) &&
5126c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
5127c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->val->value.decimal.frac != 0)) {
5128c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	return(-1);
5129c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
5130c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY))
5131c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	len = val->value.hex.total;
5132c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY))
5133c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	len = val->value.base64.total;
5134c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    else {
5135478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	switch (valType) {
5136478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    case XML_SCHEMAS_STRING:
5137c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NORMSTRING:
5138478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) {
5139478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    /*
5140478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * This is to ensure API compatibility with the old
5141478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * xmlSchemaValidateLengthFacet(). Anyway, this was and
5142478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * is not the correct handling.
5143478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * TODO: Get rid of this case somehow.
5144478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    */
5145478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    if (valType == XML_SCHEMAS_STRING)
5146478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			len = xmlUTF8Strlen(value);
5147478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    else
5148478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			len = xmlSchemaNormLen(value);
5149478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		} else if (value != NULL) {
5150478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
5151478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			len = xmlSchemaNormLen(value);
5152478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    else
5153478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    /*
5154478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * Should be OK for "preserve" as well.
5155478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    */
5156478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    len = xmlUTF8Strlen(value);
5157478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		}
5158478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		break;
5159478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    case XML_SCHEMAS_IDREF:
5160c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_TOKEN:
5161c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_LANGUAGE:
5162c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NMTOKEN:
5163c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NAME:
5164c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NCNAME:
5165bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik	    case XML_SCHEMAS_ID:
5166bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik		/*
5167bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik		* FIXME: What exactly to do with anyURI?
5168478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*/
5169c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_ANYURI:
5170c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		if (value != NULL)
5171478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    len = xmlSchemaNormLen(value);
5172c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		break;
5173bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik	    case XML_SCHEMAS_QNAME:
5174bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik 	    case XML_SCHEMAS_NOTATION:
5175bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik 		/*
51764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		* For QName and NOTATION, those facets are
51774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		* deprecated and should be ignored.
5178bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik 		*/
5179bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik		return (0);
5180c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    default:
5181c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		TODO
5182c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	}
5183c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
5184c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    *length = (unsigned long) len;
5185478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    /*
5186478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    * TODO: Return the whole expected value, i.e. "lo", "mi" and "hi".
5187478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    */
5188c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
5189c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len != facet->val->value.decimal.lo)
5190c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_LENGTH_VALID);
5191c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
5192c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len < facet->val->value.decimal.lo)
5193c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_MINLENGTH_VALID);
5194c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    } else {
5195c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len > facet->val->value.decimal.lo)
5196c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXLENGTH_VALID);
5197c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
5198c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
5199c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    return (0);
5200c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
5201c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
5202c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/**
5203478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateLengthFacet:
5204478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @type:  the built-in type
5205478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @facet:  the facet to check
5206478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @value:  the lexical repr. of the value to be validated
5207478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @val:  the precomputed value
5208478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @length: the actual length of the value
5209478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *
5210478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Checka a value against a "length", "minLength" and "maxLength"
5211478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * facet; sets @length to the computed length of @value.
5212478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *
5213478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Returns 0 if the value is valid, a positive error code
5214478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * otherwise and -1 in case of an internal or API error.
5215478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */
5216478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikint
5217478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacet(xmlSchemaTypePtr type,
5218478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			     xmlSchemaFacetPtr facet,
5219478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			     const xmlChar *value,
5220478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			     xmlSchemaValPtr val,
5221478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			     unsigned long *length)
5222478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{
5223cc5e2330ef2432493afce6566d3651195366d822Daniel Veillard    if (type == NULL)
5224cc5e2330ef2432493afce6566d3651195366d822Daniel Veillard        return(-1);
5225478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    return (xmlSchemaValidateLengthFacetInternal(facet,
5226478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	type->builtInType, value, val, length,
5227478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	XML_SCHEMA_WHITESPACE_UNKNOWN));
5228478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik}
5229478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik
5230478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik/**
5231478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateLengthFacetWhtsp:
5232478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @facet:  the facet to check
5233478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @valType:  the built-in type
5234478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @value:  the lexical repr. of the value to be validated
5235478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @val:  the precomputed value
5236478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value
5237478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @length: the actual length of the value
5238478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *
5239478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Checka a value against a "length", "minLength" and "maxLength"
5240478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * facet; sets @length to the computed length of @value.
5241478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *
5242478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Returns 0 if the value is valid, a positive error code
5243478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * otherwise and -1 in case of an internal or API error.
5244478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */
5245478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikint
5246478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacetWhtsp(xmlSchemaFacetPtr facet,
5247478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  xmlSchemaValType valType,
5248478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  const xmlChar *value,
5249478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  xmlSchemaValPtr val,
5250478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  unsigned long *length,
5251478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  xmlSchemaWhitespaceValueType ws)
5252478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{
5253478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    return (xmlSchemaValidateLengthFacetInternal(facet, valType, value, val,
5254478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	length, ws));
5255478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik}
5256478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik
5257478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik/**
52586c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetInternal:
52594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @facet:  the facet to check
5260478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @fws: the whitespace type of the facet's value
5261478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @valType: the built-in type of the value
52624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value:  the lexical repr of the value to validate
52634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val:  the precomputed value
5264478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value
52654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
52664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Check a value against a facet condition
52674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
52684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if the element is schemas valid, a positive error code
52694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *     number otherwise and -1 in case of internal or API error.
52704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
52716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikstatic int
52726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaValidateFacetInternal(xmlSchemaFacetPtr facet,
52736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType fws,
5274478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			       xmlSchemaValType valType,
52756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *value,
5276478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			       xmlSchemaValPtr val,
52776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType ws)
52784255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{
52794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    int ret;
52804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
52816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    if (facet == NULL)
52826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	return(-1);
52836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
52844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    switch (facet->type) {
52854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMA_FACET_PATTERN:
52866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    /*
52876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    * NOTE that for patterns, the @value needs to be the normalized
52886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    * value, *not* the lexical initial value or the canonical value.
52896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    */
52906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (value == NULL)
52916c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-1);
52924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    ret = xmlRegexpExec(facet->regexp, value);
52934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == 1)
52944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(0);
52956c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == 0)
529601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return(XML_SCHEMAV_CVC_PATTERN_VALID);
52974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    return(ret);
52984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMA_FACET_MAXEXCLUSIVE:
52994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
53006c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == -2)
53014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(-1);
53024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == -1)
53034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(0);
530401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID);
5305070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MAXINCLUSIVE:
5306070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
53076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == -2)
5308070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
5309070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((ret == -1) || (ret == 0))
5310070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
531101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID);
5312070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MINEXCLUSIVE:
5313070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
53146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == -2)
5315070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
5316070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret == 1)
5317070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
531801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID);
5319070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MININCLUSIVE:
5320070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
53216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == -2)
5322070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
5323070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((ret == 1) || (ret == 0))
5324070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
532501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MININCLUSIVE_VALID);
53268651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard	case XML_SCHEMA_FACET_WHITESPACE:
53278bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    /* TODO whitespaces */
532801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    /*
532901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * NOTE: Whitespace should be handled to normalize
533001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * the value to be validated against a the facets;
533101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * not to normalize the value in-between.
533201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    */
53338651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard	    return(0);
53348bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case  XML_SCHEMA_FACET_ENUMERATION:
5335478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) {
5336478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		/*
5337478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* This is to ensure API compatibility with the old
5338478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* xmlSchemaValidateFacet().
5339478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* TODO: Get rid of this case.
5340478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*/
53416c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		if ((facet->value != NULL) &&
53426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    (xmlStrEqual(facet->value, value)))
53436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    return(0);
53446c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    } else {
53456c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		ret = xmlSchemaCompareValuesWhtspExt(facet->val->type,
53466c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    facet->val, facet->value, fws, valType, val,
53476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    value, ws);
53486c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		if (ret == -2)
53496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    return(-1);
53506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		if (ret == 0)
53516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    return(0);
53526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    }
535301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_ENUMERATION_VALID);
53548bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case XML_SCHEMA_FACET_LENGTH:
5355aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    /*
5356aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    * SPEC (1.3) "if {primitive type definition} is QName or NOTATION,
5357aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    * then any {value} is facet-valid."
5358aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    */
5359aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    if ((valType == XML_SCHEMAS_QNAME) ||
5360aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		(valType == XML_SCHEMAS_NOTATION))
5361aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		return (0);
5362aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    /* No break on purpose. */
5363e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard	case XML_SCHEMA_FACET_MAXLENGTH:
53648bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case XML_SCHEMA_FACET_MINLENGTH: {
53658bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    unsigned int len = 0;
5366e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard
53674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if ((valType == XML_SCHEMAS_QNAME) ||
53684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		(valType == XML_SCHEMAS_NOTATION))
53694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		return (0);
5370478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    /*
5371478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    * TODO: length, maxLength and minLength must be of type
5372478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    * nonNegativeInteger only. Check if decimal is used somehow.
5373478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    */
53748bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    if ((facet->val == NULL) ||
5375e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		((facet->val->type != XML_SCHEMAS_DECIMAL) &&
5376e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
53778bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		(facet->val->value.decimal.frac != 0)) {
53788bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		return(-1);
53798bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    }
5380560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY))
538170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		len = val->value.hex.total;
53821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	    else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY))
53831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		len = val->value.base64.total;
53841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	    else {
53856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		switch (valType) {
5386478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    case XML_SCHEMAS_STRING:
5387478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    case XML_SCHEMAS_NORMSTRING:
5388478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) {
5389478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    /*
5390478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    * This is to ensure API compatibility with the old
5391478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    * xmlSchemaValidateFacet(). Anyway, this was and
5392478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    * is not the correct handling.
5393478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    * TODO: Get rid of this case somehow.
5394478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    */
5395478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    if (valType == XML_SCHEMAS_STRING)
5396478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				len = xmlUTF8Strlen(value);
5397478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    else
5398478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				len = xmlSchemaNormLen(value);
5399478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			} else if (value != NULL) {
5400478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
5401478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				len = xmlSchemaNormLen(value);
5402478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    else
5403478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				/*
5404478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				* Should be OK for "preserve" as well.
5405478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				*/
5406478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				len = xmlUTF8Strlen(value);
5407478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			}
5408478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			break;
5409478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    	    case XML_SCHEMAS_IDREF:
5410560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_TOKEN:
5411560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_LANGUAGE:
5412560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NMTOKEN:
5413560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NAME:
5414560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NCNAME:
5415560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_ID:
541601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    case XML_SCHEMAS_ANYURI:
5417478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			if (value != NULL)
5418478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    	    len = xmlSchemaNormLen(value);
5419478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    	break;
5420560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    default:
5421560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		        TODO
542270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	    	}
54238bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    }
54248bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
5425e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len != facet->val->value.decimal.lo)
542601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_LENGTH_VALID);
54278bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
5428e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len < facet->val->value.decimal.lo)
542901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_MINLENGTH_VALID);
54308bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    } else {
5431e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len > facet->val->value.decimal.lo)
543201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_MAXLENGTH_VALID);
5433e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard	    }
54348bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    break;
54358bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	}
5436560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	case XML_SCHEMA_FACET_TOTALDIGITS:
5437560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	case XML_SCHEMA_FACET_FRACTIONDIGITS:
5438560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
5439560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((facet->val == NULL) ||
544069dea3a0c01e8a952b1d2f07ab0a3aa450f0cdfeKasimier T. Buchcik		((facet->val->type != XML_SCHEMAS_PINTEGER) &&
5441560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
5442560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		(facet->val->value.decimal.frac != 0)) {
5443560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		return(-1);
5444560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
5445560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((val == NULL) ||
5446560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		((val->type != XML_SCHEMAS_DECIMAL) &&
5447560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_INTEGER) &&
5448560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NPINTEGER) &&
5449560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NINTEGER) &&
5450560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NNINTEGER) &&
5451560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_PINTEGER) &&
5452560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_INT) &&
5453560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_UINT) &&
5454560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_LONG) &&
5455560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_ULONG) &&
5456560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_SHORT) &&
5457560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_USHORT) &&
5458560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_BYTE) &&
5459560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_UBYTE))) {
5460560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		return(-1);
5461560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
5462560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) {
5463560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	        if (val->value.decimal.total > facet->val->value.decimal.lo)
546401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	            return(XML_SCHEMAV_CVC_TOTALDIGITS_VALID);
5465560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
5466560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) {
5467560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	        if (val->value.decimal.frac > facet->val->value.decimal.lo)
546801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID);
5469560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
5470560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    break;
54714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	default:
54724255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    TODO
54734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
54744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return(0);
5475b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
54764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
54774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
54786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
54796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacet:
54806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @base:  the base type
54816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @facet:  the facet to check
54826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @value:  the lexical repr of the value to validate
54836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @val:  the precomputed value
54846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
54856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Check a value against a facet condition
54866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
54876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns 0 if the element is schemas valid, a positive error code
54886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *     number otherwise and -1 in case of internal or API error.
54896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */
54906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikint
54919dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. BuchcikxmlSchemaValidateFacet(xmlSchemaTypePtr base,
54926c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	               xmlSchemaFacetPtr facet,
54936c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	               const xmlChar *value,
54946c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		       xmlSchemaValPtr val)
54956c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{
54966c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    /*
54976c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    * This tries to ensure API compatibility regarding the old
54986c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    * xmlSchemaValidateFacet() and the new xmlSchemaValidateFacetInternal() and
54996c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    * xmlSchemaValidateFacetWhtsp().
55006c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    */
55019dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik    if (val != NULL)
55026c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	return(xmlSchemaValidateFacetInternal(facet,
55039dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik	    XML_SCHEMA_WHITESPACE_UNKNOWN, val->type, value, val,
55046c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    XML_SCHEMA_WHITESPACE_UNKNOWN));
55059dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik    else if (base != NULL)
55066c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	return(xmlSchemaValidateFacetInternal(facet,
55079dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik	    XML_SCHEMA_WHITESPACE_UNKNOWN, base->builtInType, value, val,
5508478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    XML_SCHEMA_WHITESPACE_UNKNOWN));
55099dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik    return(-1);
55106c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik}
55116c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
55126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/**
55136c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetWhtsp:
55146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @facet:  the facet to check
55156c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @fws: the whitespace type of the facet's value
55166c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @valType: the built-in type of the value
55176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @value:  the lexical (or normalized for pattern) repr of the value to validate
55186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @val:  the precomputed value
55196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @ws: the whitespace type of the value
55206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
55216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Check a value against a facet condition. This takes value normalization
55226c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * according to the specified whitespace types into account.
55236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Note that @value needs to be the *normalized* value if the facet
55246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * is of type "pattern".
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
55306c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaValidateFacetWhtsp(xmlSchemaFacetPtr facet,
55316c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaWhitespaceValueType fws,
5532478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    xmlSchemaValType valType,
55336c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    const xmlChar *value,
5534478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    xmlSchemaValPtr val,
55356c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaWhitespaceValueType ws)
55366c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{
55376c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik     return(xmlSchemaValidateFacetInternal(facet, fws, valType,
5538478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	 value, val, ws));
55396c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik}
55406c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
5541c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#if 0
5542c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifndef DBL_DIG
5543c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define DBL_DIG 16
5544c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif
5545c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifndef DBL_EPSILON
5546c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define DBL_EPSILON 1E-9
5547c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif
5548c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5549c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define INTEGER_DIGITS DBL_DIG
5550c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define FRACTION_DIGITS (DBL_DIG + 1)
5551c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define EXPONENT_DIGITS (3 + 2)
5552c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5553c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik/**
5554c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * xmlXPathFormatNumber:
5555c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @number:     number to format
5556c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @buffer:     output buffer
5557c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @buffersize: size of output buffer
5558c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
5559c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Convert the number into a string representation.
5560c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */
5561c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcikstatic void
5562c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. BuchcikxmlSchemaFormatFloat(double number, char buffer[], int buffersize)
5563c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik{
5564c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    switch (xmlXPathIsInf(number)) {
5565c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    case 1:
5566c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	if (buffersize > (int)sizeof("INF"))
5567c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    snprintf(buffer, buffersize, "INF");
5568c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	break;
5569c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    case -1:
5570c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	if (buffersize > (int)sizeof("-INF"))
5571c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    snprintf(buffer, buffersize, "-INF");
5572c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	break;
5573c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    default:
5574c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	if (xmlXPathIsNaN(number)) {
5575c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (buffersize > (int)sizeof("NaN"))
5576c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf(buffer, buffersize, "NaN");
5577c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	} else if (number == 0) {
5578c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    snprintf(buffer, buffersize, "0.0E0");
5579c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	} else {
5580c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /* 3 is sign, decimal point, and terminating zero */
5581c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    char work[DBL_DIG + EXPONENT_DIGITS + 3];
5582c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    int integer_place, fraction_place;
5583c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    char *ptr;
5584c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    char *after_fraction;
5585c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    double absolute_value;
5586c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    int size;
5587c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5588c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    absolute_value = fabs(number);
5589c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5590c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /*
5591c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	     * Result is in work, and after_fraction points
5592c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	     * just past the fractional part.
5593c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	     * Use scientific notation
5594c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    */
5595c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    integer_place = DBL_DIG + EXPONENT_DIGITS + 1;
5596c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    fraction_place = DBL_DIG - 1;
5597c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    snprintf(work, sizeof(work),"%*.*e",
5598c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		integer_place, fraction_place, number);
5599c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    after_fraction = strchr(work + DBL_DIG, 'e');
5600c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /* Remove fractional trailing zeroes */
5601c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    ptr = after_fraction;
5602c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    while (*(--ptr) == '0')
5603c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		;
5604c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (*ptr != '.')
5605c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	        ptr++;
5606c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    while ((*ptr++ = *after_fraction++) != 0);
5607c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5608c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /* Finally copy result back to caller */
5609c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    size = strlen(work) + 1;
5610c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (size > buffersize) {
5611c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		work[buffersize - 1] = 0;
5612c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		size = buffersize;
5613c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5614c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    memmove(buffer, work, size);
5615c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	}
5616c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	break;
5617c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    }
5618c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik}
5619c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif
5620c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
56216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/**
56226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaGetCanonValue:
56236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @val: the precomputed value
56246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @retValue: the returned value
56256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
5626478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Get a the cononical lexical representation of the value.
5627c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * The caller has to FREE the returned retValue.
5628c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
5629478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * WARNING: Some value types are not supported yet, resulting
5630478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * in a @retValue of "???".
5631c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
5632c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: XML Schema 1.0 does not define canonical representations
5633c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * for: duration, gYearMonth, gYear, gMonthDay, gMonth, gDay,
5634c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * anyURI, QName, NOTATION. This will be fixed in XML Schema 1.1.
5635c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
56366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
5637c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Returns 0 if the value could be built, 1 if the value type is
5638c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * not supported yet and -1 in case of API errors.
56396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
56406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint
5641b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel VeillardxmlSchemaGetCanonValue(xmlSchemaValPtr val, const xmlChar **retValue)
56426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
5643b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard    if ((retValue == NULL) || (val == NULL))
56446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return (-1);
56456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    *retValue = NULL;
56466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    switch (val->type) {
5647478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	case XML_SCHEMAS_STRING:
5648478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (val->value.str == NULL)
5649478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
5650478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    else
5651478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue =
5652478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    BAD_CAST xmlStrdup((const xmlChar *) val->value.str);
5653478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    break;
56546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NORMSTRING:
5655478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (val->value.str == NULL)
5656478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
5657478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    else {
5658478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = xmlSchemaWhiteSpaceReplace(
5659478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    (const xmlChar *) val->value.str);
5660478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*retValue) == NULL)
5661478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    *retValue = BAD_CAST xmlStrdup(
5662478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			(const xmlChar *) val->value.str);
5663478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    }
5664478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    break;
56656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_TOKEN:
56666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_LANGUAGE:
56676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NMTOKEN:
5668478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	case XML_SCHEMAS_NAME:
56696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NCNAME:
56706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_ID:
56716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_IDREF:
56726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_ENTITY:
5673c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_NOTATION: /* Unclear */
5674c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_ANYURI:   /* Unclear */
56756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (val->value.str == NULL)
5676478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		return (-1);
5677aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    *retValue =
5678aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		BAD_CAST xmlSchemaCollapseString(BAD_CAST val->value.str);
5679aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    if (*retValue == NULL)
5680aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		*retValue =
5681aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		    BAD_CAST xmlStrdup((const xmlChar *) val->value.str);
5682478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    break;
5683478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	case XML_SCHEMAS_QNAME:
5684c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /* TODO: Unclear in XML Schema 1.0. */
5685478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (val->value.qname.uri == NULL) {
5686478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.qname.name);
5687478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		return (0);
5688478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    } else {
5689478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "{");
5690478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue),
5691478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    BAD_CAST val->value.qname.uri);
5692478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue),
5693478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    BAD_CAST "}");
5694478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue),
5695478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    BAD_CAST val->value.qname.uri);
5696478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    }
5697478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    break;
5698c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_DECIMAL:
5699c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /*
5700c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * TODO: Lookout for a more simple implementation.
5701c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    */
5702c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if ((val->value.decimal.total == 1) &&
5703c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		(val->value.decimal.lo == 0)) {
5704c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlStrdup(BAD_CAST "0.0");
5705c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    } else {
5706c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		xmlSchemaValDecimal dec = val->value.decimal;
5707c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		int bufsize;
5708c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char *buf = NULL, *offs;
5709c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5710c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* Add room for the decimal point as well. */
5711c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		bufsize = dec.total + 2;
5712c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.sign)
5713c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    bufsize++;
5714c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* Add room for leading/trailing zero. */
5715c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if ((dec.frac == 0) || (dec.frac == dec.total))
5716c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    bufsize++;
5717c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		buf = xmlMalloc(bufsize);
5718c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		offs = buf;
5719c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.sign)
5720c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs++ = '-';
5721c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.frac == dec.total) {
5722c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs++ = '0';
5723c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs++ = '.';
5724c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5725c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.hi != 0)
5726c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(offs, bufsize - (offs - buf),
5727c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%lu%lu%lu", dec.hi, dec.mi, dec.lo);
5728c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else if (dec.mi != 0)
5729c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(offs, bufsize - (offs - buf),
5730c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%lu%lu", dec.mi, dec.lo);
5731c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else
5732c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(offs, bufsize - (offs - buf),
5733c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%lu", dec.lo);
5734c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5735c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.frac != 0) {
5736c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (dec.frac != dec.total) {
5737c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			int diff = dec.total - dec.frac;
5738c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			/*
5739c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			* Insert the decimal point.
5740c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			*/
5741c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			memmove(offs + diff + 1, offs + diff, dec.frac +1);
5742c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			offs[diff] = '.';
5743c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    } else {
5744c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			unsigned int i = 0;
5745c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			/*
5746c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			* Insert missing zeroes behind the decimal point.
5747c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			*/
5748c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			while (*(offs + i) != 0)
5749c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    i++;
5750c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			if (i < dec.total) {
5751c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    memmove(offs + (dec.total - i), offs, i +1);
5752c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    memset(offs, '0', dec.total - i);
5753c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			}
5754c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    }
5755c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5756c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    /*
5757c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * Append decimal point and zero.
5758c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    */
5759c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    offs = buf + bufsize - 1;
5760c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs-- = 0;
5761c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs-- = '0';
5762c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs-- = '.';
5763c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5764c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST buf;
5765c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5766c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5767c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_INTEGER:
5768c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_PINTEGER:
5769c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_NPINTEGER:
5770c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_NINTEGER:
5771c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_NNINTEGER:
5772c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_LONG:
5773c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_BYTE:
5774c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_SHORT:
5775c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_INT:
5776c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_UINT:
5777c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_ULONG:
5778c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_USHORT:
5779c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_UBYTE:
5780c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if ((val->value.decimal.total == 1) &&
5781c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		(val->value.decimal.lo == 0))
5782c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlStrdup(BAD_CAST "0");
5783c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else {
5784c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		xmlSchemaValDecimal dec = val->value.decimal;
5785c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		int bufsize = dec.total + 1;
5786c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5787c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* Add room for the decimal point as well. */
5788c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.sign)
5789c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    bufsize++;
5790c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlMalloc(bufsize);
5791c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.hi != 0) {
5792c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (dec.sign)
5793c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize,
5794c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    "-%lu%lu%lu", dec.hi, dec.mi, dec.lo);
5795c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    else
5796c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize,
5797c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    "%lu%lu%lu", dec.hi, dec.mi, dec.lo);
5798c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else if (dec.mi != 0) {
5799c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (dec.sign)
5800c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize,
5801c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    "-%lu%lu", dec.mi, dec.lo);
5802c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    else
5803c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize,
5804c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    "%lu%lu", dec.mi, dec.lo);
5805c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5806c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (dec.sign)
5807c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize, "-%lu", dec.lo);
5808c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    else
5809c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize, "%lu", dec.lo);
5810c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5811c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5812c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5813c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_BOOLEAN:
5814c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (val->value.b)
5815c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "true");
5816c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else
5817c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "false");
5818c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5819c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_DURATION: {
5820c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[100];
5821c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		unsigned long year;
5822c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		unsigned long mon, day, hour = 0, min = 0;
5823c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		double sec = 0, left;
5824c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5825c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5826c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/*
5827c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* TODO: This results in a normalized output of the value
5828c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* - which is NOT conformant to the spec -
5829c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* since the exact values of each property are not
5830c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* recoverable. Think about extending the structure to
5831c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* provide a field for every property.
5832c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*/
5833c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		year = (unsigned long) FQUOTIENT(labs(val->value.dur.mon), 12);
5834c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		mon = labs(val->value.dur.mon) - 12 * year;
5835c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5836c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		day = (unsigned long) FQUOTIENT(fabs(val->value.dur.sec), 86400);
5837c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		left = fabs(val->value.dur.sec) - day * 86400;
5838c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (left > 0) {
5839c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    hour = (unsigned long) FQUOTIENT(left, 3600);
5840c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    left = left - (hour * 3600);
5841c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (left > 0) {
5842c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			min = (unsigned long) FQUOTIENT(left, 60);
5843c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			sec = left - (min * 60);
5844c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    }
5845c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5846c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if ((val->value.dur.mon < 0) || (val->value.dur.sec < 0))
5847c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 100, "P%luY%luM%luDT%luH%luM%.14gS",
5848c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			year, mon, day, hour, min, sec);
5849c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else
5850c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 100, "-P%luY%luM%luDT%luH%luM%.14gS",
5851c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			year, mon, day, hour, min, sec);
5852c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5853c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5854c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5855c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_GYEAR: {
5856c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[30];
5857c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5858c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5859c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf(buf, 30, "%04ld", val->value.date.year);
5860c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5861c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5862c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5863c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_GMONTH: {
5864c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5865c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5866c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlMalloc(5);
5867c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf((char *) *retValue, 6, "--%02u",
5868c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    val->value.date.mon);
5869c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5870c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5871c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_GDAY: {
5872c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5873c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5874c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlMalloc(6);
5875c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf((char *) *retValue, 6, "---%02u",
5876c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    val->value.date.day);
5877c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5878c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5879c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_GMONTHDAY: {
5880c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5881c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5882c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlMalloc(8);
5883c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf((char *) *retValue, 8, "--%02u-%02u",
5884c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    val->value.date.mon, val->value.date.day);
5885c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5886c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5887c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_GYEARMONTH: {
5888c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[35];
5889c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5890c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5891c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (val->value.date.year < 0)
5892c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 35, "-%04ld-%02u",
5893c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			labs(val->value.date.year),
5894c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.mon);
5895c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else
5896c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 35, "%04ld-%02u",
5897c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.year, val->value.date.mon);
5898c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5899c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5900c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5901c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_TIME:
5902c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    {
5903c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[30];
5904c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5905c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (val->value.date.tz_flag) {
5906c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaValPtr norm;
5907c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5908c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    norm = xmlSchemaDateNormalize(val, 0);
5909c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (norm == NULL)
5910c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			return (-1);
5911c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    /*
5912c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * TODO: Check if "%.14g" is portable.
5913c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    */
5914c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 30,
5915c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%02u:%02u:%02.14gZ",
5916c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.hour,
5917c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.min,
5918c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.sec);
5919c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaFreeValue(norm);
5920c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5921c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 30,
5922c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%02u:%02u:%02.14g",
5923c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.hour,
5924c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.min,
5925c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.sec);
5926c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5927c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5928c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5929c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5930c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_DATE:
5931c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    {
5932c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[30];
5933c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5934c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (val->value.date.tz_flag) {
5935c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaValPtr norm;
5936c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5937c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    norm = xmlSchemaDateNormalize(val, 0);
5938c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (norm == NULL)
5939c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			return (-1);
5940c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    /*
5941c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * TODO: Append the canonical value of the
5942c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * recoverable timezone and not "Z".
5943c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    */
5944c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 30,
5945c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%04ld:%02u:%02uZ",
5946c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.year, norm->value.date.mon,
5947c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.day);
5948c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaFreeValue(norm);
5949c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5950c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 30,
5951c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%04ld:%02u:%02u",
5952c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.year, val->value.date.mon,
5953c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.day);
5954c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5955c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5956c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5957c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5958c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_DATETIME:
5959c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    {
5960c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[50];
5961c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5962c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (val->value.date.tz_flag) {
5963c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaValPtr norm;
5964c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5965c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    norm = xmlSchemaDateNormalize(val, 0);
5966c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (norm == NULL)
5967c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			return (-1);
5968c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    /*
5969c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * TODO: Check if "%.14g" is portable.
5970c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    */
5971c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 50,
5972c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%04ld:%02u:%02uT%02u:%02u:%02.14gZ",
5973c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.year, norm->value.date.mon,
5974c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.day, norm->value.date.hour,
5975c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.min, norm->value.date.sec);
5976c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaFreeValue(norm);
5977c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5978c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 50,
5979c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%04ld:%02u:%02uT%02u:%02u:%02.14g",
5980c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.year, val->value.date.mon,
5981c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.day, val->value.date.hour,
5982c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.min, val->value.date.sec);
5983c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5984c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5985c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5986c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5987c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_HEXBINARY:
5988c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.hex.str);
5989c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5990c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_BASE64BINARY:
5991c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /*
5992c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * TODO: Is the following spec piece implemented?:
5993c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * SPEC: "Note: For some values the canonical form defined
5994c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * above does not conform to [RFC 2045], which requires breaking
5995c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * with linefeeds at appropriate intervals."
5996c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    */
5997c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.base64.str);
5998c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5999c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_FLOAT: {
6000c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[30];
6001c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/*
6002c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* |m| < 16777216, -149 <= e <= 104.
6003c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* TODO: Handle, NaN, INF, -INF. The format is not
6004c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* yet conformant. The c type float does not cover
6005c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* the whole range.
6006c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*/
6007c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf(buf, 30, "%01.14e", val->value.f);
6008c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
6009c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
6010c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
6011c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_DOUBLE: {
6012c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[40];
6013c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* |m| < 9007199254740992, -1075 <= e <= 970 */
6014c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/*
6015c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* TODO: Handle, NaN, INF, -INF. The format is not
6016c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* yet conformant. The c type float does not cover
6017c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* the whole range.
6018c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*/
6019c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf(buf, 40, "%01.14e", val->value.d);
6020c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
6021c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
6022c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
60236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	default:
6024478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    *retValue = BAD_CAST xmlStrdup(BAD_CAST "???");
6025c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    return (1);
60266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
6027478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    return (0);
6028478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik}
6029478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik
6030bda59576670f1cabea3c49520628d82e401702caDaniel Veillard/**
6031c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * xmlSchemaGetCanonValueWhtsp:
6032c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @val: the precomputed value
6033c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @retValue: the returned value
6034c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @ws: the whitespace type of the value
6035c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
6036c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Get a the cononical representation of the value.
6037c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * The caller has to free the returned @retValue.
6038c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
6039c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Returns 0 if the value could be built, 1 if the value type is
6040c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * not supported yet and -1 in case of API errors.
6041c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */
6042c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcikint
6043c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. BuchcikxmlSchemaGetCanonValueWhtsp(xmlSchemaValPtr val,
6044c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    const xmlChar **retValue,
6045c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    xmlSchemaWhitespaceValueType ws)
6046c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik{
6047c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    if ((retValue == NULL) || (val == NULL))
6048c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	return (-1);
6049c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    if ((ws == XML_SCHEMA_WHITESPACE_UNKNOWN) ||
6050c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	(ws > XML_SCHEMA_WHITESPACE_COLLAPSE))
6051c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	return (-1);
6052c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
6053c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    *retValue = NULL;
6054c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    switch (val->type) {
6055c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_STRING:
6056c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (val->value.str == NULL)
6057c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
6058c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
6059c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlSchemaCollapseString(val->value.str);
6060c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else if (ws == XML_SCHEMA_WHITESPACE_REPLACE)
6061c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlSchemaWhiteSpaceReplace(val->value.str);
6062c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if ((*retValue) == NULL)
6063c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(val->value.str);
6064c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
6065c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_NORMSTRING:
6066c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (val->value.str == NULL)
6067c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
6068c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else {
6069c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
6070c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *retValue = xmlSchemaCollapseString(val->value.str);
6071c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else
6072c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *retValue = xmlSchemaWhiteSpaceReplace(val->value.str);
6073c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if ((*retValue) == NULL)
6074c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *retValue = BAD_CAST xmlStrdup(val->value.str);
6075c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
6076c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
6077c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	default:
6078c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    return (xmlSchemaGetCanonValue(val, retValue));
6079c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    }
6080c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    return (0);
6081c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik}
6082c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
6083c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik/**
6084bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * xmlSchemaGetValType:
6085bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * @val: a schemas value
6086bda59576670f1cabea3c49520628d82e401702caDaniel Veillard *
6087bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * Accessor for the type of a value
6088bda59576670f1cabea3c49520628d82e401702caDaniel Veillard *
6089bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * Returns the xmlSchemaValType of the value
6090bda59576670f1cabea3c49520628d82e401702caDaniel Veillard */
6091478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValType
6092478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaGetValType(xmlSchemaValPtr val)
6093478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{
6094bda59576670f1cabea3c49520628d82e401702caDaniel Veillard    if (val == NULL)
6095bda59576670f1cabea3c49520628d82e401702caDaniel Veillard        return(XML_SCHEMAS_UNKNOWN);
6096478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    return (val->type);
60976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
60986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
60995d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#define bottom_xmlschemastypes
61005d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#include "elfgcchack.h"
61014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#endif /* LIBXML_SCHEMAS_ENABLED */
6102