xmlschemastypes.c revision 7f6e02432dbe40f0d6ab3efa82e488420db68b4c
14255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/*
24255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * schemastypes.c : implementation of the XML Schema Datatypes
34255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *             definition and validity checking
44255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
54255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * See Copyright for the status of this software.
64255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
74255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Daniel Veillard <veillard@redhat.com>
84255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
94255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define IN_LIBXML
114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include "libxml.h"
124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#ifdef LIBXML_SCHEMAS_ENABLED
144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <string.h>
164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/xmlmemory.h>
174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/parser.h>
184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/parserInternals.h>
194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/hash.h>
204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/valid.h>
2196a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard#include <libxml/xpath.h>
2296a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard#include <libxml/uri.h>
234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/xmlschemas.h>
254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/schemasInternals.h>
264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/xmlschemastypes.h>
274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
28070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#ifdef HAVE_MATH_H
29070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#include <math.h>
30070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#endif
31c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifdef HAVE_FLOAT_H
32c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#include <float.h>
33c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif
34070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define DEBUG
364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
37d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillard#ifndef LIBXML_XPATH_ENABLED
38d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillardextern double xmlXPathNAN;
39d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillardextern double xmlXPathPINF;
40d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillardextern double xmlXPathNINF;
41d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillard#endif
42d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillard
434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define TODO 								\
444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlGenericError(xmlGenericErrorContext,				\
454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    "Unimplemented block at %s:%d\n",				\
464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard            __FILE__, __LINE__);
474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define XML_SCHEMAS_NAMESPACE_NAME \
494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    (const xmlChar *)"http://www.w3.org/2001/XMLSchema"
504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik#define IS_WSP_REPLACE_CH(c)	((((c) == 0x9) || ((c) == 0xa)) || \
526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				 ((c) == 0xd))
536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik#define IS_WSP_SPACE_CH(c)	((c) == 0x20)
556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
56478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik#define IS_WSP_BLANK_CH(c) IS_BLANK_CH(c)
57478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik
58070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* Date value */
59070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef struct _xmlSchemaValDate xmlSchemaValDate;
60070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef xmlSchemaValDate *xmlSchemaValDatePtr;
61070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstruct _xmlSchemaValDate {
62070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long		year;
63070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	mon	:4;	/* 1 <=  mon    <= 12   */
64070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	day	:5;	/* 1 <=  day    <= 31   */
65070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	hour	:5;	/* 0 <=  hour   <= 23   */
66070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int	min	:6;	/* 0 <=  min    <= 59	*/
67070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    double		sec;
68a77cf71f453249f224d609f2f20789a897c5bdebDaniel Veillard    unsigned int	tz_flag	:1;	/* is tzo explicitely set? */
69285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik    signed int		tzo	:12;	/* -1440 <= tzo <= 1440;
70285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik					   currently only -840 to +840 are needed */
71070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard};
72070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
73070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* Duration value */
74070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef struct _xmlSchemaValDuration xmlSchemaValDuration;
75070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef xmlSchemaValDuration *xmlSchemaValDurationPtr;
76070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstruct _xmlSchemaValDuration {
77070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long	        mon;		/* mon stores years also */
78070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long        	day;
79070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    double		sec;            /* sec stores min and hour also */
80070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard};
81070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardtypedef struct _xmlSchemaValDecimal xmlSchemaValDecimal;
834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardtypedef xmlSchemaValDecimal *xmlSchemaValDecimalPtr;
844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstruct _xmlSchemaValDecimal {
854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    /* would use long long but not portable */
86e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long lo;
87e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long mi;
88e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long hi;
894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    unsigned int extra;
905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    unsigned int sign:1;
91c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack    unsigned int frac:7;
92c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack    unsigned int total:8;
934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard};
944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
95e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardtypedef struct _xmlSchemaValQName xmlSchemaValQName;
96e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardtypedef xmlSchemaValQName *xmlSchemaValQNamePtr;
97e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstruct _xmlSchemaValQName {
98e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    xmlChar *name;
99e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    xmlChar *uri;
100e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard};
101e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
10270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardtypedef struct _xmlSchemaValHex xmlSchemaValHex;
10370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardtypedef xmlSchemaValHex *xmlSchemaValHexPtr;
10470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardstruct _xmlSchemaValHex {
10570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard    xmlChar     *str;
10670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard    unsigned int total;
10770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard};
10870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
1091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardtypedef struct _xmlSchemaValBase64 xmlSchemaValBase64;
1101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardtypedef xmlSchemaValBase64 *xmlSchemaValBase64Ptr;
1111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstruct _xmlSchemaValBase64 {
1121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    xmlChar     *str;
1131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    unsigned int total;
1141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard};
1151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
1164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstruct _xmlSchemaVal {
1174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValType type;
1184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    struct _xmlSchemaVal *next;
1194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    union {
1205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	xmlSchemaValDecimal     decimal;
121070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xmlSchemaValDate        date;
122070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xmlSchemaValDuration    dur;
123e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	xmlSchemaValQName	qname;
12470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	xmlSchemaValHex		hex;
1251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	xmlSchemaValBase64	base64;
12684d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard	float			f;
12784d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard	double			d;
128c5a70f264550ee39da267e81dccd95508ed367ddDaniel Veillard	int			b;
129c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	xmlChar                *str;
1304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    } value;
1314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard};
1324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
1334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int xmlSchemaTypesInitialized = 0;
1344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlHashTablePtr xmlSchemaTypesBank = NULL;
1354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
136c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard/*
137c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * Basic types
138c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */
1394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeStringDef = NULL;
1404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnyTypeDef = NULL;
1414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnySimpleTypeDef = NULL;
1424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDecimalDef = NULL;
143070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDatetimeDef = NULL;
1444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDateDef = NULL;
145070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeTimeDef = NULL;
146070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGYearDef = NULL;
147070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGYearMonthDef = NULL;
148070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGDayDef = NULL;
149070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGMonthDayDef = NULL;
150070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGMonthDef = NULL;
151070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDurationDef = NULL;
15284d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeFloatDef = NULL;
153c5a70f264550ee39da267e81dccd95508ed367ddDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeBooleanDef = NULL;
15484d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDoubleDef = NULL;
155560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeHexBinaryDef = NULL;
1561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeBase64BinaryDef = NULL;
157e5b110b3844d58ff4bea56bcb699144f6fbe0b83Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnyURIDef = NULL;
1584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
1594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/*
160c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * Derived types
161c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */
162c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypePositiveIntegerDef = NULL;
163c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNonPositiveIntegerDef = NULL;
164c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNegativeIntegerDef = NULL;
165c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNonNegativeIntegerDef = NULL;
166c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIntegerDef = NULL;
167c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeLongDef = NULL;
168c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIntDef = NULL;
169c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeShortDef = NULL;
170c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeByteDef = NULL;
171c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedLongDef = NULL;
172c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedIntDef = NULL;
173c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedShortDef = NULL;
174c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedByteDef = NULL;
1758bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNormStringDef = NULL;
1768bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeTokenDef = NULL;
1778bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeLanguageDef = NULL;
1788bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNameDef = NULL;
1798bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeQNameDef = NULL;
180e5b110b3844d58ff4bea56bcb699144f6fbe0b83Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNCNameDef = NULL;
1818bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdDef = NULL;
1828bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdrefDef = NULL;
1838bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdrefsDef = NULL;
184a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeEntityDef = NULL;
185a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeEntitiesDef = NULL;
186e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNotationDef = NULL;
1878bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNmtokenDef = NULL;
1888bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNmtokensDef = NULL;
189c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard
190d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/************************************************************************
191d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *									*
192d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * 			Datatype error handlers				*
193d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *									*
194d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard ************************************************************************/
195d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/**
196d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * xmlSchemaTypeErrMemory:
197d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * @extra:  extra informations
198d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *
199d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * Handle an out of memory condition
200d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard */
201d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillardstatic void
202d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel VeillardxmlSchemaTypeErrMemory(xmlNodePtr node, const char *extra)
203d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard{
204d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard    __xmlSimpleError(XML_FROM_DATATYPE, XML_ERR_NO_MEMORY, node, NULL, extra);
205d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard}
206d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard
207d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/************************************************************************
208d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *									*
209d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * 			Base types support				*
210d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard *									*
211d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard ************************************************************************/
2124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
2134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik/**
2144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * xmlSchemaNewValue:
2154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * @type:  the value type
2164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *
2174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Allocate a new simple type value
2184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *
2194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error
2204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */
2214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikstatic xmlSchemaValPtr
2224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaNewValue(xmlSchemaValType type) {
2234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaValPtr value;
2244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
2254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    value = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal));
2264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (value == NULL) {
2274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return(NULL);
2284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    }
2294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    memset(value, 0, sizeof(xmlSchemaVal));
2304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    value->type = type;
2314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return(value);
2324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
2334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
2344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikstatic xmlSchemaFacetPtr
2354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaNewMinLengthFacet(int value)
2364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{
2374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaFacetPtr ret;
2384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
2394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret = xmlSchemaNewFacet();
2404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->type = XML_SCHEMA_FACET_MINLENGTH;
2414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->val = xmlSchemaNewValue(XML_SCHEMAS_NNINTEGER);
2424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->val->value.decimal.lo = value;
2434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (ret);
2444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
2454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
246c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard/*
2474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitBasicType:
2484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name:  the type name
2498bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard * @type:  the value type associated
2504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
25101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Initialize one primitive built-in type
2524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
2534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr
25401fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaInitBasicType(const char *name, xmlSchemaValType type,
25501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		       xmlSchemaTypePtr baseType) {
2564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypePtr ret;
2574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
2584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType));
2594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (ret == NULL) {
260d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard        xmlSchemaTypeErrMemory(NULL, "could not initialize basic types");
2614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(NULL);
2624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
2634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    memset(ret, 0, sizeof(xmlSchemaType));
264be9c6320d4ed8d5622322014310555bb88b02a85Daniel Veillard    ret->name = (const xmlChar *)name;
2654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->targetNamespace = XML_SCHEMAS_NAMESPACE_NAME;
2664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    ret->type = XML_SCHEMA_TYPE_BASIC;
2674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->baseType = baseType;
2684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->contentType = XML_SCHEMA_CONTENT_BASIC;
26901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    /*
2704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    * Primitive types.
27101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
2724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    switch (type) {
27301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_STRING:
27401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DECIMAL:
27501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATE:
27601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATETIME:
27701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TIME:
27801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEAR:
27901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEARMONTH:
28001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTH:
28101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTHDAY:
28201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GDAY:
28301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DURATION:
28401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_FLOAT:
28501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DOUBLE:
28601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BOOLEAN:
28701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYURI:
28801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_HEXBINARY:
28901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BASE64BINARY:
29001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_QNAME:
29101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NOTATION:
29201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    ret->flags |= XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE;
2934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
29496d2effc735fb45cfa363b6a876ff23a862f87a5William M. Brack	default:
2954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
2964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    }
2974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    /*
2984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    * Set variety.
2994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    */
3004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    switch (type) {
3014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_ANYTYPE:
3024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_ANYSIMPLETYPE:
3034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
3044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_IDREFS:
3054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_NMTOKENS:
3064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_ENTITIES:
3074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    ret->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST;
3084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    ret->facets = xmlSchemaNewMinLengthFacet(1);
3094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    ret->flags |= XML_SCHEMAS_TYPE_HAS_FACETS;
3104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
3114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	default:
3124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    ret->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC;
3134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
31401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
3154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlHashAddEntry2(xmlSchemaTypesBank, ret->name,
3164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	             XML_SCHEMAS_NAMESPACE_NAME, ret);
31701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    ret->builtInType = type;
3184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return(ret);
3194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
3204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
3214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/*
3224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitTypes:
3234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
3244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Initialize the default XML Schemas type library
3254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
3264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid
3276560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel VeillardxmlSchemaInitTypes(void)
3286560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard{
3294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized != 0)
3306560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        return;
3314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypesBank = xmlHashCreate(40);
3326560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard
33301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
334c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard    /*
33501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * 3.4.7 Built-in Complex Type Definition
33601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
3378bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeAnyTypeDef = xmlSchemaInitBasicType("anyType",
3382f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack                                                     XML_SCHEMAS_ANYTYPE,
33901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     NULL);
34001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeAnyTypeDef->baseType = xmlSchemaTypeAnyTypeDef;
34101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED;
34201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    {
34301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaWildcardPtr wild;
34401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
34501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard));
34601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (wild == NULL) {
3472f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	    xmlSchemaTypeErrMemory(NULL, "could not create an attribute wildcard on anyType");
34801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return;
34901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
35001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	memset(wild, 0, sizeof(xmlSchemaWildcard));
35101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	wild->any = 1;
35201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	wild->processContents = XML_SCHEMAS_ANY_LAX;
35301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	wild->minOccurs = 1;
35401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	wild->maxOccurs = 1;
35501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeAnyTypeDef->attributeWildcard = wild;
35601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
35701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeAnySimpleTypeDef = xmlSchemaInitBasicType("anySimpleType",
3582f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack                                                           XML_SCHEMAS_ANYSIMPLETYPE,
35901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard							   xmlSchemaTypeAnyTypeDef);
36001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    /*
36101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * primitive datatypes
36201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
36301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeStringDef = xmlSchemaInitBasicType("string",
36401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_STRING,
36501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
3668bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDecimalDef = xmlSchemaInitBasicType("decimal",
36701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_DECIMAL,
36801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeAnySimpleTypeDef);
3698bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDateDef = xmlSchemaInitBasicType("date",
37001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_DATE,
37101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeAnySimpleTypeDef);
3728bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDatetimeDef = xmlSchemaInitBasicType("dateTime",
37301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_DATETIME,
37401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						      xmlSchemaTypeAnySimpleTypeDef);
3758bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeTimeDef = xmlSchemaInitBasicType("time",
37601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_TIME,
37701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeAnySimpleTypeDef);
3788bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGYearDef = xmlSchemaInitBasicType("gYear",
37901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_GYEAR,
38001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeAnySimpleTypeDef);
3818bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGYearMonthDef = xmlSchemaInitBasicType("gYearMonth",
38201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                        XML_SCHEMAS_GYEARMONTH,
38301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard							xmlSchemaTypeAnySimpleTypeDef);
3848bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGMonthDef = xmlSchemaInitBasicType("gMonth",
38501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_GMONTH,
38601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
3878bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGMonthDayDef = xmlSchemaInitBasicType("gMonthDay",
38801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                       XML_SCHEMAS_GMONTHDAY,
38901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						       xmlSchemaTypeAnySimpleTypeDef);
3908bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeGDayDef = xmlSchemaInitBasicType("gDay",
39101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_GDAY,
39201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeAnySimpleTypeDef);
3938bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDurationDef = xmlSchemaInitBasicType("duration",
39401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_DURATION,
39501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						      xmlSchemaTypeAnySimpleTypeDef);
3968bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float",
39701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_FLOAT,
39801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeAnySimpleTypeDef);
3998bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double",
40001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_DOUBLE,
40101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
4028bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeBooleanDef = xmlSchemaInitBasicType("boolean",
40301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_BOOLEAN,
40401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeAnySimpleTypeDef);
4058bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeAnyURIDef = xmlSchemaInitBasicType("anyURI",
40601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_ANYURI,
40701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
408560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard    xmlSchemaTypeHexBinaryDef = xmlSchemaInitBasicType("hexBinary",
40901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_HEXBINARY,
41001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeAnySimpleTypeDef);
4111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    xmlSchemaTypeBase64BinaryDef
41201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        = xmlSchemaInitBasicType("base64Binary", XML_SCHEMAS_BASE64BINARY,
41301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeAnySimpleTypeDef);
41401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNotationDef = xmlSchemaInitBasicType("NOTATION",
41501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_NOTATION,
41601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeAnySimpleTypeDef);
41701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeQNameDef = xmlSchemaInitBasicType("QName",
41801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_QNAME,
41901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeAnySimpleTypeDef);
4204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
421c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard    /*
422c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard     * derived datatypes
423c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard     */
4248bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeIntegerDef = xmlSchemaInitBasicType("integer",
42501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_INTEGER,
42601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						     xmlSchemaTypeDecimalDef);
4276560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeNonPositiveIntegerDef =
4286560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        xmlSchemaInitBasicType("nonPositiveInteger",
42901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                               XML_SCHEMAS_NPINTEGER,
43001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard			       xmlSchemaTypeIntegerDef);
4316560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeNegativeIntegerDef =
43201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("negativeInteger", XML_SCHEMAS_NINTEGER,
43301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeNonPositiveIntegerDef);
4346560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeLongDef =
43501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("long", XML_SCHEMAS_LONG,
43601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeIntegerDef);
43701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeIntDef = xmlSchemaInitBasicType("int", XML_SCHEMAS_INT,
43801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeLongDef);
4398bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeShortDef = xmlSchemaInitBasicType("short",
44001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_SHORT,
44101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeIntDef);
4428bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeByteDef = xmlSchemaInitBasicType("byte",
44301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_BYTE,
44401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeShortDef);
4456560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeNonNegativeIntegerDef =
4466560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard        xmlSchemaInitBasicType("nonNegativeInteger",
44701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                               XML_SCHEMAS_NNINTEGER,
44801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard			       xmlSchemaTypeIntegerDef);
4496560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedLongDef =
45001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedLong", XML_SCHEMAS_ULONG,
45101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeNonNegativeIntegerDef);
4526560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedIntDef =
45301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedInt", XML_SCHEMAS_UINT,
45401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeUnsignedLongDef);
4556560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedShortDef =
45601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedShort", XML_SCHEMAS_USHORT,
45701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeUnsignedIntDef);
4586560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypeUnsignedByteDef =
45901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("unsignedByte", XML_SCHEMAS_UBYTE,
46001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeUnsignedShortDef);
4616560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard    xmlSchemaTypePositiveIntegerDef =
46201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitBasicType("positiveInteger", XML_SCHEMAS_PINTEGER,
46301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaTypeNonNegativeIntegerDef);
4648bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeNormStringDef = xmlSchemaInitBasicType("normalizedString",
46501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                        XML_SCHEMAS_NORMSTRING,
46601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard							xmlSchemaTypeStringDef);
4678bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeTokenDef = xmlSchemaInitBasicType("token",
46801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_TOKEN,
46901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						   xmlSchemaTypeNormStringDef);
4708bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeLanguageDef = xmlSchemaInitBasicType("language",
47101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_LANGUAGE,
47201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						      xmlSchemaTypeTokenDef);
47301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNameDef = xmlSchemaInitBasicType("Name",
47401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                  XML_SCHEMAS_NAME,
47501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						  xmlSchemaTypeTokenDef);
47601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNmtokenDef = xmlSchemaInitBasicType("NMTOKEN",
47701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                     XML_SCHEMAS_NMTOKEN,
4784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						     xmlSchemaTypeTokenDef);
47901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeNCNameDef = xmlSchemaInitBasicType("NCName",
48001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_NCNAME,
48101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeNameDef);
48201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaTypeIdDef = xmlSchemaInitBasicType("ID", XML_SCHEMAS_ID,
4834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						    xmlSchemaTypeNCNameDef);
4848bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard    xmlSchemaTypeIdrefDef = xmlSchemaInitBasicType("IDREF",
48501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                   XML_SCHEMAS_IDREF,
4864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						   xmlSchemaTypeNCNameDef);
487a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    xmlSchemaTypeEntityDef = xmlSchemaInitBasicType("ENTITY",
48801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                    XML_SCHEMAS_ENTITY,
48901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard						    xmlSchemaTypeNCNameDef);
4904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    /*
4914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    * Derived list types.
4924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    */
4934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    /* ENTITIES */
494a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    xmlSchemaTypeEntitiesDef = xmlSchemaInitBasicType("ENTITIES",
49501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                                                      XML_SCHEMAS_ENTITIES,
4964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						      xmlSchemaTypeAnySimpleTypeDef);
4974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaTypeEntitiesDef->subtypes = xmlSchemaTypeEntityDef;
4984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    /* IDREFS */
4994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaTypeIdrefsDef = xmlSchemaInitBasicType("IDREFS",
5004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik                                                    XML_SCHEMAS_IDREFS,
5014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						    xmlSchemaTypeAnySimpleTypeDef);
5024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaTypeIdrefsDef->subtypes = xmlSchemaTypeIdrefDef;
5034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
5044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    /* NMTOKENS */
5054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaTypeNmtokensDef = xmlSchemaInitBasicType("NMTOKENS",
5064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik                                                      XML_SCHEMAS_NMTOKENS,
5074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik						      xmlSchemaTypeAnySimpleTypeDef);
5084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaTypeNmtokensDef->subtypes = xmlSchemaTypeNmtokenDef;
5094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
5104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypesInitialized = 1;
5114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
5124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
5134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
5144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCleanupTypes:
5154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
5164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library
5174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
5184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid
5194255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCleanupTypes(void) {
5204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
5214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return;
52201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    xmlSchemaFreeWildcard(xmlSchemaTypeAnyTypeDef->attributeWildcard);
5234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlHashFree(xmlSchemaTypesBank, (xmlHashDeallocator) xmlSchemaFreeType);
5244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaTypesInitialized = 0;
5254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
5264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
5274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
5286927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaIsBuiltInTypeFacet:
52901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in type
53001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facetType:  the facet type
53101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
53201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Evaluates if a specific facet can be
53301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * used in conjunction with a type.
53401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
53501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 1 if the facet can be used with the given built-in type,
53601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 0 otherwise and -1 in case the type is not a built-in type.
53701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
53801fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint
53901fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaIsBuiltInTypeFacet(xmlSchemaTypePtr type, int facetType)
54001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
541ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard    if (type == NULL)
542ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard	return (-1);
54301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if (type->type != XML_SCHEMA_TYPE_BASIC)
54401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	return (-1);
54501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type->builtInType) {
54601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BOOLEAN:
54701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_PATTERN) ||
54801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE))
54901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
55001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
55101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (0);
55201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_STRING:
55301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NOTATION:
55401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_QNAME:
55501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYURI:
55601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BASE64BINARY:
55701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_HEXBINARY:
55801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_LENGTH) ||
55901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MINLENGTH) ||
56001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXLENGTH) ||
56101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_PATTERN) ||
56201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_ENUMERATION) ||
56301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE))
56401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
56501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
56601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (0);
56701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DECIMAL:
56801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_TOTALDIGITS) ||
56901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) ||
57001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_PATTERN) ||
57101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE) ||
57201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_ENUMERATION) ||
57301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) ||
57401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) ||
57501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MININCLUSIVE) ||
57601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MINEXCLUSIVE))
57701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
57801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
57901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (0);
58001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TIME:
58101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GDAY:
58201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTH:
58301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTHDAY:
58401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEAR:
58501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEARMONTH:
58601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATE:
58701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATETIME:
58801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DURATION:
58901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_FLOAT:
59001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DOUBLE:
59101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    if ((facetType == XML_SCHEMA_FACET_PATTERN) ||
59201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_ENUMERATION) ||
59301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_WHITESPACE) ||
59401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) ||
59501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) ||
59601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MININCLUSIVE) ||
59701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		(facetType == XML_SCHEMA_FACET_MINEXCLUSIVE))
59801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (1);
59901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    else
60001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return (0);
60101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	default:
602c7e3cc49bade82dba0cda4ae7c07ffcd1e32fe25Daniel Veillard	    break;
60301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
60401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    return (0);
60501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
60601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
60701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
60801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInType:
60901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type:  the type of the built in type
61001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
61101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Gives you the type struct for a built-in
61201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * type by its type id.
61301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
61401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns the type if found, NULL otherwise.
61501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
61601fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr
61701fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInType(xmlSchemaValType type)
61801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
61901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
62001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	xmlSchemaInitTypes();
62101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type) {
62201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
62301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYSIMPLETYPE:
62401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeAnySimpleTypeDef);
62501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_STRING:
62601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeStringDef);
62701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NORMSTRING:
62801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNormStringDef);
62901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DECIMAL:
63001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDecimalDef);
63101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TIME:
63201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeTimeDef);
63301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GDAY:
63401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGDayDef);
63501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTH:
63601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGMonthDef);
63701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GMONTHDAY:
63801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    	    return (xmlSchemaTypeGMonthDayDef);
63901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEAR:
64001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGYearDef);
64101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_GYEARMONTH:
64201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeGYearMonthDef);
64301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATE:
64401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDateDef);
64501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DATETIME:
64601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDatetimeDef);
64701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DURATION:
64801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDurationDef);
64901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_FLOAT:
65001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeFloatDef);
65101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_DOUBLE:
65201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeDoubleDef);
65301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BOOLEAN:
65401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeBooleanDef);
65501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_TOKEN:
65601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeTokenDef);
65701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_LANGUAGE:
65801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeLanguageDef);
65901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NMTOKEN:
66001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNmtokenDef);
66101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NMTOKENS:
66201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNmtokensDef);
66301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NAME:
66401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNameDef);
66501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_QNAME:
66601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeQNameDef);
66701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NCNAME:
66801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNCNameDef);
66901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ID:
67001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdDef);
67101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_IDREF:
67201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdrefDef);
67301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_IDREFS:
67401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdrefsDef);
67501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ENTITY:
67601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeEntityDef);
67701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ENTITIES:
67801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeEntitiesDef);
67901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NOTATION:
68001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNotationDef);
68101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYURI:
68201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeAnyURIDef);
68301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_INTEGER:
68401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIntegerDef);
68501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NPINTEGER:
68601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNonPositiveIntegerDef);
68701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NINTEGER:
68801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNegativeIntegerDef);
68901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NNINTEGER:
69001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNonNegativeIntegerDef);
69101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_PINTEGER:
69201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypePositiveIntegerDef);
69301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_INT:
69401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIntDef);
69501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_UINT:
69601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedIntDef);
69701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_LONG:
69801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeLongDef);
69901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ULONG:
70001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedLongDef);
70101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_SHORT:
70201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeShortDef);
70301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_USHORT:
70401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedShortDef);
70501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BYTE:
70601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeByteDef);
70701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_UBYTE:
70801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeUnsignedByteDef);
70901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_HEXBINARY:
71001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeHexBinaryDef);
71101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_BASE64BINARY:
71201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeBase64BinaryDef);
71301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ANYTYPE:
71401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeAnyTypeDef);
71501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	default:
71601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (NULL);
71701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
71801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
71901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
7207f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/**
7217f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueAppend:
7227f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @prev: the value
7237f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @cur: the value to be appended
7247f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
7257f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Appends a next sibling to a list of computed values.
7267f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
7277f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns 0 if succeeded and -1 on API errors.
7287f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */
7294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikint
7304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueAppend(xmlSchemaValPtr prev, xmlSchemaValPtr cur) {
7314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
7324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if ((prev == NULL) || (cur == NULL))
7334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return (-1);
7344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    prev->next = cur;
7354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (0);
7364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
7374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
7387f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/**
7397f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetNext:
7407f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @cur: the value
7417f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
7427f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the next sibling of a list of computed values.
7437f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
7447f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns the next value or NULL if there was none, or on
7457f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *         API errors.
7467f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */
7474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValPtr
7484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetNext(xmlSchemaValPtr cur) {
7494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
7504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (cur == NULL)
7514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return (NULL);
7524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (cur->next);
7534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
7544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
7557f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/**
7567f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetAsString:
7577f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @val: the value
7587f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
7597f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the string value of a computed value.
7607f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
7617f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns the string value or NULL if there was none, or on
7627f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *         API errors.
7637f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */
7644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikconst xmlChar *
7654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetAsString(xmlSchemaValPtr val)
7664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{
7674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (val == NULL)
7684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return (NULL);
7694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    switch (val->type) {
7704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_STRING:
7714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_NORMSTRING:
7724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_ANYSIMPLETYPE:
7734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	case XML_SCHEMAS_TOKEN:
7744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_LANGUAGE:
7754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_NMTOKEN:
7764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_NAME:
7774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_NCNAME:
7784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_ID:
7794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_IDREF:
7804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_ENTITY:
7814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_ANYURI:
7824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    return (BAD_CAST val->value.str);
7834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	default:
7844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    break;
7854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
7864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (NULL);
7874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
7884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
7897f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/**
7907f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetAsBoolean:
7917f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @val: the value
7927f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
7937f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the boolean value of a computed value.
7947f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik *
7957f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns 1 if true and 0 if false, or in case of an error. Hmm.
7967f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */
7974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikint
7984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetAsBoolean(xmlSchemaValPtr val)
7994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{
8004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if ((val == NULL) || (val->type != XML_SCHEMAS_BOOLEAN))
8014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return (0);
8024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (val->value.b);
8034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
8044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
8054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
8066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaNewStringValue:
8076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @type:  the value type
808b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @value:  the value
8096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
8106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Allocate a new simple type value. The type can be
8112ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * of XML_SCHEMAS_STRING.
8122ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * WARNING: This one is intended to be expanded for other
8132ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * string based types. We need this for anySimpleType as well.
8144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given value is consumed and freed with the struct.
8156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
8166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error
8176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
8186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaValPtr
8196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaNewStringValue(xmlSchemaValType type,
8206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			const xmlChar *value)
8216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
8226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    xmlSchemaValPtr val;
8236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
8246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (type != XML_SCHEMAS_STRING)
8256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return(NULL);
8266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    val = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal));
8276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (val == NULL) {
8286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return(NULL);
8296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
8306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    memset(val, 0, sizeof(xmlSchemaVal));
8316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    val->type = type;
8326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    val->value.str = (xmlChar *) value;
8336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(val);
8346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
8356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
836b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik/**
837b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * xmlSchemaNewNOTATIONValue:
838b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @name:  the notation name
839b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @ns: the notation namespace name or NULL
840b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik *
841b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * Allocate a new NOTATION value.
8424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given values are consumed and freed with the struct.
843b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik *
844b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error
845b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik */
846b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. BuchcikxmlSchemaValPtr
847b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. BuchcikxmlSchemaNewNOTATIONValue(const xmlChar *name,
848b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik			  const xmlChar *ns)
849b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik{
850b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    xmlSchemaValPtr val;
851b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik
852b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    val = xmlSchemaNewValue(XML_SCHEMAS_NOTATION);
853b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    if (val == NULL)
854b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik	return (NULL);
855b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik
85612d37ab63441baf9e03db70168cc1d0d6f1c2373William M. Brack    val->value.qname.name = (xmlChar *)name;
857b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    if (ns != NULL)
85812d37ab63441baf9e03db70168cc1d0d6f1c2373William M. Brack	val->value.qname.uri = (xmlChar *)ns;
859b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik    return(val);
860b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik}
8616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
8626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
8634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * xmlSchemaNewQNameValue:
8644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * @namespaceName: the namespace name
8654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * @localName: the local name
8664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *
8674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Allocate a new QName value.
8684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given values are consumed and freed with the struct.
8694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *
8704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of an error.
8714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */
8724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValPtr
8734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaNewQNameValue(const xmlChar *namespaceName,
8744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		       const xmlChar *localName)
8754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{
8764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaValPtr val;
8774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
8784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    val = xmlSchemaNewValue(XML_SCHEMAS_QNAME);
8794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (val == NULL)
8804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	return (NULL);
8814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
8824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    val->value.qname.name = (xmlChar *) localName;
8834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    val->value.qname.uri = (xmlChar *) namespaceName;
8844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return(val);
8854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik}
8864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
8874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik/**
8884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaFreeValue:
8894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value:  the value to free
8904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
8914255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library
8924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
8934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid
8944255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaFreeValue(xmlSchemaValPtr value) {
8954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaValPtr prev;
8964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
8974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    while (value != NULL) {
8984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	switch (value->type) {
8994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_STRING:
9004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NORMSTRING:
9014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_TOKEN:
9024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_LANGUAGE:
9034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NMTOKEN:
9044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NMTOKENS:
9054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NAME:
9064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NCNAME:
9074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ID:
9084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_IDREF:
9094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_IDREFS:
9104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ENTITY:
9114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ENTITIES:
9124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYURI:
9134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYSIMPLETYPE:
9144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (value->value.str != NULL)
9154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlFree(value->value.str);
9164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
9174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NOTATION:
9184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_QNAME:
9194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (value->value.qname.uri != NULL)
9204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlFree(value->value.qname.uri);
9214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (value->value.qname.name != NULL)
9224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlFree(value->value.qname.name);
9234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
9244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_HEXBINARY:
9254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (value->value.hex.str != NULL)
9264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlFree(value->value.hex.str);
9274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
9284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_BASE64BINARY:
9294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (value->value.base64.str != NULL)
9304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlFree(value->value.base64.str);
9314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
9324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    default:
9334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
9344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	}
9354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	prev = value;
9364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	value = value->next;
9374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	xmlFree(prev);
9384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    }
9394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
9404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
9414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
9424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaGetPredefinedType:
9434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name: the type name
9444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @ns:  the URI of the namespace usually "http://www.w3.org/2001/XMLSchema"
9454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
9464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Lookup a type in the default XML Schemas type library
9474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
9484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns the type if found, NULL otherwise
9494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
9504255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaTypePtr
9514255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaGetPredefinedType(const xmlChar *name, const xmlChar *ns) {
9524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
9534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	xmlSchemaInitTypes();
9544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (name == NULL)
9554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	return(NULL);
9564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return((xmlSchemaTypePtr) xmlHashLookup2(xmlSchemaTypesBank, name, ns));
9574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
958070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
95901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
96001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInListSimpleTypeItemType:
96101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in simple type.
96201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
9636927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Lookup function
9646927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard *
965c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns the item type of @type as defined by the built-in datatype
966c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * hierarchy of XML Schema Part 2: Datatypes, or NULL in case of an error.
96701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
96801fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr
96901fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInListSimpleTypeItemType(xmlSchemaTypePtr type)
97001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
9714259532303e96e089a185c6f55056cb7c4902d71Daniel Veillard    if ((type == NULL) || (type->type != XML_SCHEMA_TYPE_BASIC))
97201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	return (NULL);
97301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type->builtInType) {
97401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_NMTOKENS:
97501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeNmtokenDef );
97601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_IDREFS:
97701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeIdrefDef);
97801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	case XML_SCHEMAS_ENTITIES:
97901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (xmlSchemaTypeEntityDef);
98001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	default:
98101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (NULL);
98201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    }
98301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
98401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
985070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/****************************************************************
986070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
987070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *		Convenience macros and functions		*
988070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
989070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/
990070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
991070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_TZO_CHAR(c)						\
992070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	((c == 0) || (c == 'Z') || (c == '+') || (c == '-'))
993070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
994070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_YEAR(yr)          (yr != 0)
995070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MONTH(mon)        ((mon >= 1) && (mon <= 12))
996070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* VALID_DAY should only be used when month is unknown */
997070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DAY(day)          ((day >= 1) && (day <= 31))
998070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_HOUR(hr)          ((hr >= 0) && (hr <= 23))
999070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MIN(min)          ((min >= 0) && (min <= 59))
1000070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_SEC(sec)          ((sec >= 0) && (sec < 60))
1001690a68095f589248c9e962c6b5468aacb6d3aabaKasimier T. Buchcik#define VALID_TZO(tzo)          ((tzo > -840) && (tzo < 840))
1002070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_LEAP(y)						\
1003070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
1004070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1005ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonth[12] =
1006070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
1007ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonthLeap[12] =
1008070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
1009070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
10105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MAX_DAYINMONTH(yr,mon)                                  \
10115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1])
10125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
1013070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MDAY(dt)						\
1014070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(IS_LEAP(dt->year) ?				        \
1015070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (dt->day <= daysInMonthLeap[dt->mon - 1]) :	        \
1016070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (dt->day <= daysInMonth[dt->mon - 1]))
1017070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1018070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATE(dt)						\
1019070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_YEAR(dt->year) && VALID_MONTH(dt->mon) && VALID_MDAY(dt))
1020070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1021070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TIME(dt)						\
1022070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_HOUR(dt->hour) && VALID_MIN(dt->min) &&		\
1023070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 VALID_SEC(dt->sec) && VALID_TZO(dt->tzo))
1024070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1025070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATETIME(dt)					\
1026070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(VALID_DATE(dt) && VALID_TIME(dt))
1027070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1028070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_MIN            (60)
1029070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_HOUR           (60 * SECS_PER_MIN)
1030070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_DAY            (24 * SECS_PER_HOUR)
1031070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
10325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInYearByMonth[12] =
10335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
10345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInLeapYearByMonth[12] =
10355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };
10365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
10375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DAY_IN_YEAR(day, month, year)				\
10385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ((IS_LEAP(year) ?					\
10395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                dayInLeapYearByMonth[month - 1] :		\
10405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                dayInYearByMonth[month - 1]) + day)
10415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
10425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#ifdef DEBUG
10435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt)                                                  \
10445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlGenericError(xmlGenericErrorContext,                             \
10455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        "type=%o %04ld-%02u-%02uT%02u:%02u:%03f",                       \
10465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->type,dt->value.date.year,dt->value.date.mon,                \
10475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->value.date.day,dt->value.date.hour,dt->value.date.min,      \
10485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        dt->value.date.sec);                                            \
10495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dt->value.date.tz_flag)                                         \
10505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (dt->value.date.tzo != 0)                                    \
10515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmlGenericError(xmlGenericErrorContext,                     \
10525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                "%+05d\n",dt->value.date.tzo);                          \
10535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else                                                            \
10545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmlGenericError(xmlGenericErrorContext, "Z\n");             \
10555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else                                                                \
10565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        xmlGenericError(xmlGenericErrorContext,"\n")
10575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#else
10585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt)
10595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#endif
10605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
1061070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1062070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGYear:
1063070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1064070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1065070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1066070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gYear without time zone and fills in the appropriate
1067070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1068070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gYear. It is supposed that @dt->year is big enough to contain
1069070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * the year.
1070070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1071070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1072070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1073070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1074070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) {
1075070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str, *firstChar;
1076070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int isneg = 0, digcnt = 0;
1077070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1078070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (((*cur < '0') || (*cur > '9')) &&
1079070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	(*cur != '-') && (*cur != '+'))
1080070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1081070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1082070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur == '-') {
1083070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	isneg = 1;
1084070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1085070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1086070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1087070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    firstChar = cur;
1088070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1089070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    while ((*cur >= '0') && (*cur <= '9')) {
1090070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->year = dt->year * 10 + (*cur - '0');
1091070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1092070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	digcnt++;
1093070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1094070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1095070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* year must be at least 4 digits (CCYY); over 4
1096070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * digits cannot have a leading zero. */
1097070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0')))
1098070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1099070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1100070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (isneg)
1101070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->year = - dt->year;
1102070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1103070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (!VALID_YEAR(dt->year))
1104070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1105070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1106070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1107070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1108070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1109070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1110070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1111070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_2_DIGITS:
1112070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the integer to fill in
1113070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1114070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer
1115070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1116070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a 2-digits integer and updates @num with the value. @cur is
1117070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer.
1118070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and
1119070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1120070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1121070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_2_DIGITS(num, cur, invalid)			\
1122070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if ((cur[0] < '0') || (cur[0] > '9') ||			\
1123070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    (cur[1] < '0') || (cur[1] > '9'))			\
1124070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    invalid = 1;					\
1125070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	else							\
1126070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    num = (cur[0] - '0') * 10 + (cur[1] - '0');		\
1127070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur += 2;
1128070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1129070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1130070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_FLOAT:
1131070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the double to fill in
1132070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1133070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer
1134070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1135070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float and updates @num with the value. @cur is
1136070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the float. The float must have a
1137070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2-digits integer part and may or may not have a decimal part.
1138070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and
1139070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1140070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1141070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_FLOAT(num, cur, invalid)				\
1142070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(num, cur, invalid);			\
1143070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!invalid && (*cur == '.')) {			\
1144070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    double mult = 1;				        \
1145070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    cur++;						\
1146070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((*cur < '0') || (*cur > '9'))			\
1147070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		invalid = 1;					\
1148070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
1149070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		mult /= 10;					\
1150070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num += (*cur - '0') * mult;			\
1151070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		cur++;						\
1152070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }							\
1153070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1154070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1155070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1156070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGMonth:
1157070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1158070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1159070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1160070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gMonth without time zone and fills in the appropriate
1161070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1162070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gMonth.
1163070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1164070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1165070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1166070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1167070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) {
1168070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
1169070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
117064dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    unsigned int value = 0;
1171070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
117264dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    PARSE_2_DIGITS(value, cur, ret);
1173070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1174070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1175070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
117664dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if (!VALID_MONTH(value))
1177070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1178070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
117964dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    dt->mon = value;
118064dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik
1181070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1182070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1183070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1184070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1185070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1186070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGDay:
1187070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1188070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1189070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1190070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gDay without time zone and fills in the appropriate
1191070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1192070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay.
1193070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1194070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1195070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1196070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1197070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) {
1198070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
1199070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
120064dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    unsigned int value = 0;
1201070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
120264dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    PARSE_2_DIGITS(value, cur, ret);
1203070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1204070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1205070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
120664dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if (!VALID_DAY(value))
1207070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1208070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
120964dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    dt->day = value;
1210070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1211070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1212070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1213070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1214070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1215070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTime:
1216070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1217070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1218070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1219070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:time without time zone and fills in the appropriate
1220070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * fields of the @dt structure. @str is updated to point just after the
1221070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:time.
1222070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, values of @dt fields are undefined.
1223070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1224070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1225070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1226070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1227070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) {
1228285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik    const xmlChar *cur = *str;
1229070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
1230285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik    int value = 0;
1231070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
123264dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    PARSE_2_DIGITS(value, cur, ret);
1233070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
123464dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik	return ret;
1235070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != ':')
1236070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
123764dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if (!VALID_HOUR(value))
123864dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik	return 2;
1239070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1240070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1241070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* the ':' insures this string is xs:time */
124264dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    dt->hour = value;
1243070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
124464dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    PARSE_2_DIGITS(value, cur, ret);
1245070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1246070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
124764dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if (!VALID_MIN(value))
124864dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik	return 2;
124964dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    dt->min = value;
1250070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1251070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != ':')
1252070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1253070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1254070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1255070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    PARSE_FLOAT(dt->sec, cur, ret);
1256070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1257070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return ret;
1258070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
125964dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik    if ((!VALID_SEC(dt->sec)) || (!VALID_TZO(dt->tzo)))
1260070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 2;
1261070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1262070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1263070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1264070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1265070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1266070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1267070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTimeZone:
1268070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt:  pointer to a date structure
1269070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze
1270070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1271070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a time zone without time zone and fills in the appropriate
1272070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the
1273070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * time zone.
1274070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1275070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code
1276070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1277070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1278070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) {
1279070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = *str;
1280070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret = 0;
1281070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1282070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (str == NULL)
1283070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1284070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1285070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    switch (*cur) {
1286070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case 0:
1287070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tz_flag = 0;
1288070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = 0;
1289070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1290070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1291070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case 'Z':
1292070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tz_flag = 1;
1293070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = 0;
1294070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1295070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1296070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1297070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case '+':
1298070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    case '-': {
1299070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	int isneg = 0, tmp = 0;
1300070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	isneg = (*cur == '-');
1301070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1302070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1303070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1304070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(tmp, cur, ret);
1305070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1306070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return ret;
1307070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_HOUR(tmp))
1308070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1309070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1310070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (*cur != ':')
1311070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 1;
1312070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur++;
1313070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1314070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo = tmp * 60;
1315070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1316070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_2_DIGITS(tmp, cur, ret);
1317070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1318070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return ret;
1319070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_MIN(tmp))
1320070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1321070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1322070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	dt->tzo += tmp;
1323070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (isneg)
1324070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    dt->tzo = - dt->tzo;
1325070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1326070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!VALID_TZO(dt->tzo))
1327070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    return 2;
1328070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
13295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	dt->tz_flag = 1;
1330070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	break;
1331070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard      }
1332070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    default:
1333070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1334070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1335070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1336070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    *str = cur;
1337070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1338070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1339070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
13401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard/**
13411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * _xmlSchemaBase64Decode:
13421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * @ch: a character
13431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *
13441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Converts a base64 encoded character to its base 64 value.
13451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *
13461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Returns 0-63 (value), 64 (pad), or -1 (not recognized)
13471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */
13481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic int
13491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard_xmlSchemaBase64Decode (const xmlChar ch) {
13501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('A' <= ch) && (ch <= 'Z')) return ch - 'A';
13511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('a' <= ch) && (ch <= 'z')) return ch - 'a' + 26;
13521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (('0' <= ch) && (ch <= '9')) return ch - '0' + 52;
13531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('+' == ch) return 62;
13541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('/' == ch) return 63;
13551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if ('=' == ch) return 64;
13561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return -1;
13571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard}
13581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
1359070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/****************************************************************
1360070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
1361070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *	XML Schema Dates/Times Datatypes Handling		*
1362070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *								*
1363070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/
1364070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1365070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1366070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_DIGITS:
1367070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the integer to fill in
1368070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1369070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag
1370070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1371070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a digits integer and updates @num with the value. @cur is
1372070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer.
1373070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and
1374070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1375070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1376070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_DIGITS(num, cur, num_type)	                \
1377070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if ((*cur < '0') || (*cur > '9'))			\
1378070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    num_type = -1;					\
1379070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else                                                    \
1380070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
1381070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	        num = num * 10 + (*cur - '0');		        \
1382070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	        cur++;                                          \
1383070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            }
1384070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1385070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
1386070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_NUM:
1387070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num:  the double to fill in
1388070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur:  an #xmlChar *
1389070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag
1390070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1391070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float or integer and updates @num with the value. @cur is
1392070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the number. If the number is a float,
1393070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * then it must have an integer part and a decimal part; @num_type will
1394070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * be set to 1. If there is no decimal part, @num_type is set to zero.
1395070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and
1396070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined.
1397070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1398070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_NUM(num, cur, num_type)				\
1399070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        num = 0;                                                \
1400070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	PARSE_DIGITS(num, cur, num_type);	                \
1401070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (!num_type && (*cur == '.')) {			\
1402070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    double mult = 1;				        \
1403070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    cur++;						\
1404070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((*cur < '0') || (*cur > '9'))			\
1405070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num_type = -1;					\
1406070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else                                                \
1407070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                num_type = 1;                                   \
1408070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    while ((*cur >= '0') && (*cur <= '9')) {		\
1409070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		mult /= 10;					\
1410070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		num += (*cur - '0') * mult;			\
1411070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		cur++;						\
1412070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    }							\
1413070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1414070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1415070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
14165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDates:
1417455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard * @type: the expected type or XML_SCHEMAS_UNKNOWN
1418070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dateTime:  string to analyze
1419070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val:  the return computed value
1420070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1421070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @dateTime conforms to the lexical space of one of the date types.
1422070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val.
1423070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1424070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
1425070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *         and -1 in case of internal or API error.
1426070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1427070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1428455cc07308c673b6714e2f5670c2091a1dab95dcDaniel VeillardxmlSchemaValidateDates (xmlSchemaValType type,
14294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	                const xmlChar *dateTime, xmlSchemaValPtr *val,
14304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			int collapse) {
1431070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmlSchemaValPtr dt;
1432070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int ret;
1433070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar *cur = dateTime;
1434070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1435070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define RETURN_TYPE_IF_VALID(t)					\
1436070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (IS_TZO_CHAR(*cur)) {					\
1437070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur);	\
1438070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret == 0) {						\
1439070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (*cur != 0)					\
1440070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		goto error;					\
1441070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    dt->type = t;					\
1442455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard	    goto done;						\
1443070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}							\
1444070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1445070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1446070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dateTime == NULL)
1447070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1448070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
14494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (collapse)
14504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*cur) cur++;
14514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
1452070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((*cur != '-') && (*cur < '0') && (*cur > '9'))
1453070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1454070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1455070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN);
1456070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dt == NULL)
1457070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1458070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1459070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((cur[0] == '-') && (cur[1] == '-')) {
1460070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/*
1461070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * It's an incomplete date (xs:gMonthDay, xs:gMonth or
1462070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * xs:gDay)
1463070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 */
1464070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	cur += 2;
1465070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1466070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/* is it an xs:gDay? */
1467070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (*cur == '-') {
1468455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard	    if (type == XML_SCHEMAS_GMONTH)
1469455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard		goto error;
1470070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	  ++cur;
1471070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1472070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret != 0)
1473070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		goto error;
1474070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1475070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY);
1476070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1477070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    goto error;
1478070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1479070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1480070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	/*
1481070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 * it should be an xs:gMonthDay or xs:gMonth
1482070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	 */
1483070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur);
1484070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret != 0)
1485070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    goto error;
1486070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1487d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        /*
1488d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a '-' char could indicate this type is xs:gMonthDay or
1489d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a negative time zone offset. Check for xs:gMonthDay first.
1490d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * Also the first three char's of a negative tzo (-MM:SS) can
1491d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * appear to be a valid day; so even if the day portion
1492d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * of the xs:gMonthDay verifies, we must insure it was not
1493d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         * a tzo.
1494d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard         */
1495d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if (*cur == '-') {
1496d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            const xmlChar *rewnd = cur;
1497d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            cur++;
1498d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1499d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard  	    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1500d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            if ((ret == 0) && ((*cur == 0) || (*cur != ':'))) {
1501d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1502d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                /*
1503d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * we can use the VALID_MDAY macro to validate the month
1504d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * and day because the leap year test will flag year zero
1505d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 * as a leap year (even though zero is an invalid year).
15064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		 * FUTURE TODO: Zero will become valid in XML Schema 1.1
15074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		 * probably.
1508d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                 */
1509d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                if (VALID_MDAY((&(dt->value.date)))) {
1510d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1511d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard	            RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY);
1512070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1513d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                    goto error;
1514d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard                }
1515d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            }
1516d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1517d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            /*
1518d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             * not xs:gMonthDay so rewind and check if just xs:gMonth
1519d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             * with an optional time zone.
1520d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             */
1521d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            cur = rewnd;
1522d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        }
1523d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1524d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard	RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH);
1525070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1526070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1527070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1528070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1529070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /*
1530070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * It's a right-truncated date or an xs:time.
1531070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     * Try to parse an xs:time then fallback on right-truncated dates.
1532070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard     */
1533070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((*cur >= '0') && (*cur <= '9')) {
1534070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	ret = _xmlSchemaParseTime(&(dt->value.date), &cur);
1535070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	if (ret == 0) {
1536070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    /* it's an xs:time */
1537070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    RETURN_TYPE_IF_VALID(XML_SCHEMAS_TIME);
1538070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	}
1539070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1540070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1541070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* fallback on date parsing */
1542070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur = dateTime;
1543070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1544070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGYear(&(dt->value.date), &cur);
1545070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1546070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1547070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1548070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:gYear? */
1549070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEAR);
1550070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1551070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != '-')
1552070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1553070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1554070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1555070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur);
1556070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1557070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1558070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1559070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:gYearMonth? */
1560070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEARMONTH);
1561070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1562070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != '-')
1563070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1564070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1565070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1566070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseGDay(&(dt->value.date), &cur);
1567070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((ret != 0) || !VALID_DATE((&(dt->value.date))))
1568070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1569070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1570070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* is it an xs:date? */
1571070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    RETURN_TYPE_IF_VALID(XML_SCHEMAS_DATE);
1572070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1573070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur != 'T')
1574070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1575070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    cur++;
1576070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1577070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* it should be an xs:dateTime */
1578070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseTime(&(dt->value.date), &cur);
1579070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (ret != 0)
1580070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1581070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1582070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur);
15834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (collapse)
15844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*cur) cur++;
1585070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((ret != 0) || (*cur != 0) || !VALID_DATETIME((&(dt->value.date))))
1586070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	goto error;
1587070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1588455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard
1589070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dt->type = XML_SCHEMAS_DATETIME;
1590070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1591455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillarddone:
1592d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#if 1
1593d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type))
1594d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        goto error;
1595d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#else
1596d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    /*
1597d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     * insure the parsed type is equal to or less significant (right
1598d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     * truncated) than the desired type.
1599d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard     */
1600d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) {
1601d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1602d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        /* time only matches time */
1603d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_TIME) && (dt->type == XML_SCHEMAS_TIME))
1604d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1605d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1606d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_DATETIME) &&
1607d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            ((dt->type != XML_SCHEMAS_DATE) ||
1608d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEARMONTH) ||
1609d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEAR)))
1610d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1611d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1612d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_DATE) &&
1613d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            ((dt->type != XML_SCHEMAS_GYEAR) ||
1614d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard             (dt->type != XML_SCHEMAS_GYEARMONTH)))
1615d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1616d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1617d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_GYEARMONTH) && (dt->type != XML_SCHEMAS_GYEAR))
1618d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1619d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard
1620d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard        if ((type == XML_SCHEMAS_GMONTHDAY) && (dt->type != XML_SCHEMAS_GMONTH))
1621d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard            goto error;
1622d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    }
1623455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard#endif
1624455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard
1625070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (val != NULL)
1626070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        *val = dt;
162780b19092f24410a6b869abf519227686e8f207caDaniel Veillard    else
162880b19092f24410a6b869abf519227686e8f207caDaniel Veillard	xmlSchemaFreeValue(dt);
1629070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1630070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1631070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1632070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror:
1633070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dt != NULL)
1634070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	xmlSchemaFreeValue(dt);
1635070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 1;
1636070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1637070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1638070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
16395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDuration:
1640070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @type: the predefined type
1641070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @duration:  string to analyze
1642070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val:  the return computed value
1643070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1644070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @duration conforms to the lexical space of the duration type.
1645070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val.
1646070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
1647070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
1648070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *         and -1 in case of internal or API error.
1649070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
1650070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
1651dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED,
16524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	                   const xmlChar *duration, xmlSchemaValPtr *val,
16534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			   int collapse) {
1654070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    const xmlChar  *cur = duration;
1655070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmlSchemaValPtr dur;
1656070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    int isneg = 0;
1657070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    unsigned int seq = 0;
1658d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    double         num;
1659d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    int            num_type = 0;  /* -1 = invalid, 0 = int, 1 = floating */
1660d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    const xmlChar  desig[]  = {'Y', 'M', 'D', 'H', 'M', 'S'};
1661d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    const double   multi[]  = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0};
1662070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1663070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (duration == NULL)
1664070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1665070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
16664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    if (collapse)
16674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*cur) cur++;
16684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
1669070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur == '-') {
1670070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        isneg = 1;
1671070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        cur++;
1672070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1673070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1674070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* duration must start with 'P' (after sign) */
1675070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (*cur++ != 'P')
1676070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return 1;
1677070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
167880b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (*cur == 0)
167980b19092f24410a6b869abf519227686e8f207caDaniel Veillard	return 1;
168080b19092f24410a6b869abf519227686e8f207caDaniel Veillard
1681070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION);
1682070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dur == NULL)
1683070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	return -1;
1684070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1685070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    while (*cur != 0) {
1686070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1687070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* input string should be empty or invalid date/time item */
1688070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (seq >= sizeof(desig))
1689070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1690070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1691070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* T designator must be present for time items */
1692070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (*cur == 'T') {
1693070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (seq <= 3) {
1694070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                seq = 3;
1695070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                cur++;
1696070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            } else
1697070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 1;
1698070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        } else if (seq == 3)
1699070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1700070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1701070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* parse the number portion of the item */
1702070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        PARSE_NUM(num, cur, num_type);
1703070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1704070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if ((num_type == -1) || (*cur == 0))
1705070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            goto error;
1706070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1707070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        /* update duration based on item type */
1708070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        while (seq < sizeof(desig)) {
1709070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (*cur == desig[seq]) {
1710070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1711070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                /* verify numeric type; only seconds can be float */
1712070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                if ((num_type != 0) && (seq < (sizeof(desig)-1)))
1713070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    goto error;
1714070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1715070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                switch (seq) {
1716070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    case 0:
1717070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.mon = (long)num * 12;
1718070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1719070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    case 1:
1720070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.mon += (long)num;
1721070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1722070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                    default:
1723070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        /* convert to seconds using multiplier */
1724070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        dur->value.dur.sec += num * multi[seq];
1725070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        seq++;
1726070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                        break;
1727070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                }
1728070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1729070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                break;          /* exit loop */
1730070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            }
1731070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            /* no date designators found? */
1732c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik            if ((++seq == 3) || (seq == 6))
1733070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                goto error;
1734070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        }
17354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	cur++;
17364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	if (collapse)
17374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    while IS_WSP_BLANK_CH(*cur) cur++;
1738070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1739070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1740070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (isneg) {
1741070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.mon = -dur->value.dur.mon;
1742070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.day = -dur->value.dur.day;
1743070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        dur->value.dur.sec = -dur->value.dur.sec;
1744070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
1745070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1746070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (val != NULL)
1747070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        *val = dur;
174880b19092f24410a6b869abf519227686e8f207caDaniel Veillard    else
174980b19092f24410a6b869abf519227686e8f207caDaniel Veillard	xmlSchemaFreeValue(dur);
1750070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1751070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
1752070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1753070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror:
1754070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (dur != NULL)
1755070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	xmlSchemaFreeValue(dur);
1756070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 1;
1757070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
1758070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
1759a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard/**
1760a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * xmlSchemaStrip:
1761a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * @value: a value
1762a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *
1763a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Removes the leading and ending spaces of a string
1764a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *
1765a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the new string or NULL if no change was required.
1766a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard */
1767a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlChar *
1768a1a9d0410000cc69874e53e438b250037d3e14cdDaniel VeillardxmlSchemaStrip(const xmlChar *value) {
1769a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    const xmlChar *start = value, *end, *f;
1770a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard
1771a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if (value == NULL) return(NULL);
177276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((*start != 0) && (IS_BLANK_CH(*start))) start++;
1773a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end = start;
1774a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    while (*end != 0) end++;
1775a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    f = end;
1776a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end--;
177776e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((end > start) && (IS_BLANK_CH(*end))) end--;
1778a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    end++;
1779a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if ((start == value) && (f == end)) return(NULL);
1780a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    return(xmlStrndup(start, end - start));
1781a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard}
178296a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard
178396a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard/**
178491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * xmlSchemaWhiteSpaceReplace:
178591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * @value: a value
178691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik *
178791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Replaces 0xd, 0x9 and 0xa with a space.
178891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik *
178991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Returns the new string or NULL if no change was required.
179091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik */
179191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlChar *
179291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlSchemaWhiteSpaceReplace(const xmlChar *value) {
179391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    const xmlChar *cur = value;
179491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    xmlChar *ret = NULL, *mcur;
179591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
179691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    if (value == NULL)
179791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	return(NULL);
179891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
179991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    while ((*cur != 0) &&
180091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	(((*cur) != 0xd) && ((*cur) != 0x9) && ((*cur) != 0xa))) {
180191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	cur++;
180291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    }
180391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    if (*cur == 0)
180491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	return (NULL);
180591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    ret = xmlStrdup(value);
180691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    /* TODO FIXME: I guess gcc will bark at this. */
180791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    mcur = (xmlChar *)  (ret + (cur - value));
180891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    do {
180991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	if ( ((*mcur) == 0xd) || ((*mcur) == 0x9) || ((*mcur) == 0xa) )
181091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	    *mcur = ' ';
181191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	mcur++;
181291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    } while (*mcur != 0);
181391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik    return(ret);
181491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik}
181591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
181691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik/**
1817b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCollapseString:
1818b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: a value
1819b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
1820b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Removes and normalize white spaces in the string
1821b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
1822b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns the new string or NULL if no change was required.
1823b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
182401fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlChar *
1825b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCollapseString(const xmlChar *value) {
1826b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    const xmlChar *start = value, *end, *f;
1827b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    xmlChar *g;
1828b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    int col = 0;
1829b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1830b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (value == NULL) return(NULL);
183176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while ((*start != 0) && (IS_BLANK_CH(*start))) start++;
1832b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    end = start;
1833b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    while (*end != 0) {
183476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if ((*end == ' ') && (IS_BLANK_CH(end[1]))) {
1835b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    col = end - start;
1836b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    break;
1837b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	} else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) {
1838b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    col = end - start;
1839b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    break;
1840b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	}
1841b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end++;
1842b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1843b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (col == 0) {
1844b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	f = end;
1845b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end--;
184676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	while ((end > start) && (IS_BLANK_CH(*end))) end--;
1847b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	end++;
1848b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if ((start == value) && (f == end)) return(NULL);
1849b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(xmlStrndup(start, end - start));
1850b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1851b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    start = xmlStrdup(start);
1852b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (start == NULL) return(NULL);
1853b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    g = (xmlChar *) (start + col);
1854b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    end = g;
1855b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    while (*end != 0) {
185676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if (IS_BLANK_CH(*end)) {
1857b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    end++;
185876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*end)) end++;
1859b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    if (*end != 0)
1860b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		*g++ = ' ';
1861b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	} else
1862b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    *g++ = *end++;
1863b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
1864b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    *g = 0;
1865b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return((xmlChar *) start);
1866b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
1867b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
1868b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
186928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * xmlSchemaValAtomicListNode:
187028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @type: the predefined atomic type for a token in the list
187128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @value: the list value to check
187228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @ret:  the return computed value
187328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @node:  the node containing the value
187428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *
187528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Check that a value conforms to the lexical space of the predefined
187628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * list type. if true a value is computed and returned in @ret.
187728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *
1878a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the number of items if this validates, a negative error code
1879a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard *         number otherwise
188028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */
188128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillardstatic int
188228c52ab518d34a36fd8da6870a5850088f129a6aDaniel VeillardxmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value,
188328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	                   xmlSchemaValPtr *ret, xmlNodePtr node) {
188428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    xmlChar *val, *cur, *endval;
188528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    int nb_values = 0;
1886580ced8ee28ecd99374da9383897678e4ba6c358Daniel Veillard    int tmp = 0;
188728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard
188828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (value == NULL) {
188928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	return(-1);
189028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
189128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    val = xmlStrdup(value);
189228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (val == NULL) {
189328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	return(-1);
189428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
18956fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    if (ret != NULL) {
18966fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard        *ret = NULL;
18976fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    }
189828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    cur = val;
189928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    /*
190028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard     * Split the list
190128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard     */
190276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while (IS_BLANK_CH(*cur)) *cur++ = 0;
190328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while (*cur != 0) {
190476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	if (IS_BLANK_CH(*cur)) {
190528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    *cur = 0;
190628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    cur++;
190776e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*cur)) *cur++ = 0;
190828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	} else {
190928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    nb_values++;
191028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    cur++;
191176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++;
191228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	}
191328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
191428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (nb_values == 0) {
191528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	xmlFree(val);
1916a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard	return(nb_values);
191728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
191828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    endval = cur;
191928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    cur = val;
192028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while ((*cur == 0) && (cur != endval)) cur++;
192128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    while (cur != endval) {
192228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node);
192328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	if (tmp != 0)
192428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	    break;
192528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	while (*cur != 0) cur++;
192628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	while ((*cur == 0) && (cur != endval)) cur++;
192728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    }
19286fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    /* TODO what return value ? c.f. bug #158628
192928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard    if (ret != NULL) {
193028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard	TODO
19316fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    } */
19326fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard    xmlFree(val);
1933a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    if (tmp == 0)
1934a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard	return(nb_values);
1935a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard    return(-1);
193628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard}
193728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard
193828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard/**
1939e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * xmlSchemaParseUInt:
1940e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @str: pointer to the string R/W
1941e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @llo: pointer to the low result
1942e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lmi: pointer to the mid result
1943e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lhi: pointer to the high result
1944e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *
1945e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Parse an unsigned long into 3 fields.
1946e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *
1947ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack * Returns the number of significant digits in the number or
1948ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack * -1 if overflow of the capacity
1949e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard */
1950e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic int
1951e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel VeillardxmlSchemaParseUInt(const xmlChar **str, unsigned long *llo,
1952478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik                   unsigned long *lmi, unsigned long *lhi) {
1953e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    unsigned long lo = 0, mi = 0, hi = 0;
1954e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    const xmlChar *tmp, *cur = *str;
1955e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    int ret = 0, i = 0;
1956e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
1957478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while (*cur == '0') {        /* ignore leading zeroes */
1958478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        cur++;
1959e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1960e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    tmp = cur;
1961e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) {
1962478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        i++;tmp++;ret++;
1963e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1964e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if (i > 24) {
1965478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        *str = tmp;
1966478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        return(-1);
1967e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1968e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 16) {
1969478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        hi = hi * 10 + (*cur++ - '0');
1970478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        i--;
1971e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1972e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 8) {
1973478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        mi = mi * 10 + (*cur++ - '0');
1974478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        i--;
1975e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1976e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    while (i > 0) {
1977478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        lo = lo * 10 + (*cur++ - '0');
1978478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik        i--;
1979e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    }
1980e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
1981e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *str = cur;
1982e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *llo = lo;
1983e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *lmi = mi;
1984e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    *lhi = hi;
1985e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    return(ret);
1986e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard}
1987e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard
1988e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard/**
1989b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValAtomicType:
19904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type: the predefined type
19914255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to check
19924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val:  the return computed value
1993c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @node:  the node containing the value
1994b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * flags:  flags to control the vlidation
19954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
1996b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the atomic type.
19974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * if true a value is computed and returned in @val.
199801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * This checks the value space for list types as well (IDREFS, NMTOKENS).
19994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
20004255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
20014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *         and -1 in case of internal or API error.
20024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
2003b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int
20041ac24d36b12487995b659a8fc23a02b9460edb36Daniel VeillardxmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value,
20054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik                       xmlSchemaValPtr * val, xmlNodePtr node, int flags,
20064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		       xmlSchemaWhitespaceValueType ws,
20074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		       int normOnTheFly, int applyNorm, int createStringValue)
20081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard{
20094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValPtr v;
2010b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    xmlChar *norm = NULL;
2011d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard    int ret = 0;
20124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
20134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (xmlSchemaTypesInitialized == 0)
201401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        xmlSchemaInitTypes();
20154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (type == NULL)
20161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        return (-1);
20175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
2018eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard    /*
2019eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard     * validating a non existant text node is similar to validating
2020eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard     * an empty one.
2021eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard     */
2022eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard    if (value == NULL)
2023eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard        value = BAD_CAST "";
2024eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard
20254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    if (val != NULL)
20261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        *val = NULL;
2027b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if ((flags == 0) && (value != NULL)) {
202891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik
202901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard        if ((type->builtInType != XML_SCHEMAS_STRING) &&
203091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	  (type->builtInType != XML_SCHEMAS_ANYTYPE) &&
203191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	  (type->builtInType != XML_SCHEMAS_ANYSIMPLETYPE)) {
203291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik	    if (type->builtInType == XML_SCHEMAS_NORMSTRING)
203391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik		norm = xmlSchemaWhiteSpaceReplace(value);
203491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik            else
203591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik		norm = xmlSchemaCollapseString(value);
20361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (norm != NULL)
20371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                value = norm;
20381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        }
2039b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
2040b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
204101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    switch (type->builtInType) {
20422f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack        case XML_SCHEMAS_UNKNOWN:
20431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto error;
20442f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	case XML_SCHEMAS_ANYTYPE:
20452f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	case XML_SCHEMAS_ANYSIMPLETYPE:
20464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if ((createStringValue) && (val != NULL)) {
20474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		v = xmlSchemaNewValue(XML_SCHEMAS_ANYSIMPLETYPE);
20484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (v != NULL) {
20494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    v->value.str = xmlStrdup(value);
20504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    *val = v;
20514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else {
20524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    goto error;
20534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
20544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    }
20552f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	    goto return0;
20564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_STRING:
20574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if (! normOnTheFly) {
20584efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		const xmlChar *cur = value;
20594efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
20604efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (ws == XML_SCHEMA_WHITESPACE_REPLACE) {
20614efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while (*cur != 0) {
20624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
20634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
20644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else {
20654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
20664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			}
20674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
20684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) {
20694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while (*cur != 0) {
20704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
20714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
20724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else if IS_WSP_SPACE_CH(*cur) {
20734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
20744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    if IS_WSP_SPACE_CH(*cur)
20754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik				goto return1;
20764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else {
20774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
20784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			}
20794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
20804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
20814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    }
20824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if (createStringValue && (val != NULL)) {
20834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (applyNorm) {
20844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
20854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			norm = xmlSchemaCollapseString(value);
20864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else if (ws == XML_SCHEMA_WHITESPACE_REPLACE)
20874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			norm = xmlSchemaWhiteSpaceReplace(value);
20884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (norm != NULL)
20894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			value = norm;
20904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
20914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		v = xmlSchemaNewValue(XML_SCHEMAS_STRING);
20924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (v != NULL) {
20934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    v->value.str = xmlStrdup(value);
20944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    *val = v;
20954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else {
20964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    goto error;
20974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
20984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    }
20991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return0;
21001516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard        case XML_SCHEMAS_NORMSTRING:{
21014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly) {
21024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (applyNorm) {
21034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
21044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    norm = xmlSchemaCollapseString(value);
21054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			else
21064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    norm = xmlSchemaWhiteSpaceReplace(value);
21074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if (norm != NULL)
21084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    value = norm;
21094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
21104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else {
21114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    const xmlChar *cur = value;
21124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while (*cur != 0) {
21134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
21144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
21154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else {
21164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
21174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			}
21184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
21194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
21201516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                if (val != NULL) {
21211516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NORMSTRING);
21221516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    if (v != NULL) {
21231516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        v->value.str = xmlStrdup(value);
21241516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        *val = v;
21251516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    } else {
21261516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                        goto error;
21271516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                    }
21281516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                }
21291516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard                goto return0;
21301516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard            }
21311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_DECIMAL:{
2132273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack                const xmlChar *cur = value;
2133273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack                unsigned int len, neg = 0;
2134273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		xmlChar cval[25];
2135273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		xmlChar *cptr = cval;
2136273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		int dec = -1;
21371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
21381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
21391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
21404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
21414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
21424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
21434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
2144273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		/* First we handle an optional sign */
21451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '+')
21461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
21471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else if (*cur == '-') {
21481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    neg = 1;
21491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
21501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
2151273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		/*
2152273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 * Next we "pre-parse" the number, in preparation for calling
2153273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 * the common routine xmlSchemaParseUInt.  We get rid of any
2154273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 * leading zeroes (because we have reserved only 25 chars),
2155273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 * and note the position of any decimal point.
2156273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 */
2157273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		len = 0;
2158c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/*
2159c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* Skip leading zeroes.
2160c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*/
2161c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		while (*cur == '0')
2162273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		    cur++;
2163c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (*cur != 0) {
2164c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    while (len < 24) {
2165c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			if ((*cur >= '0') && (*cur <= '9')) {
2166c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    *cptr++ = *cur++;
2167c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    len++;
2168c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			} else if (*cur == '.') {
2169c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    if (dec != -1)
2170c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik				goto return1;	/* multiple decimal points */
2171c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    cur++;
2172c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    if ((*cur == 0) && (cur -1 == value))
2173c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik				goto return1;
2174c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
2175c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    dec = len;
2176c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    while ((len < 24) && (*cur >= '0') &&
2177c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik				(*cur <= '9')) {
2178c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik				*cptr++ = *cur++;
2179c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik				len++;
2180c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    }
2181c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    break;
2182c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			} else
2183c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    break;
2184c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    }
2185273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		}
21864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
21874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
2188273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		if (*cur != 0)
2189273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		    goto return1;	/* error if any extraneous chars */
21901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
21911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL);
21921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
2193273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			/*
2194273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 	* If a mixed decimal, get rid of trailing zeroes
2195273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 	*/
21966c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			if (dec != -1) {
2197273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			    while ((cptr > cval) && (*(cptr-1) == '0')) {
2198273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack				cptr--;
2199273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack				len--;
2200273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			    }
2201273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			}
2202273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			*cptr = 0;	/* Terminate our (preparsed) string */
2203273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			cptr = cval;
2204273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			/*
2205273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 	* Now evaluate the significant digits of the number
2206273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		 	*/
2207c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			if (*cptr != 0)
2208c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    xmlSchemaParseUInt((const xmlChar **)&cptr,
2209273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack					    &v->value.decimal.lo,
2210273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack					    &v->value.decimal.mi,
2211273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack					    &v->value.decimal.hi);
2212c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			/*
2213c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			* Set the total digits to 1 if a zero value.
2214c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			*/
2215c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			if (len == 0)
2216c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    len++;
22171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = neg;
2218273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			if (dec == -1) {
2219273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			    v->value.decimal.frac = 0;
2220273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			    v->value.decimal.total = len;
2221273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			} else {
2222c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    v->value.decimal.frac = len - dec;
2223c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    v->value.decimal.total = len;
2224273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack			}
22251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
22261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
22271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
22281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
22291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2230b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_TIME:
2231b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GDAY:
2232b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GMONTH:
2233b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GMONTHDAY:
2234b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GYEAR:
2235b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_GYEARMONTH:
2236b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DATE:
2237b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DATETIME:
22384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik            ret = xmlSchemaValidateDates(type->builtInType, value, val,
22394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		normOnTheFly);
22401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            break;
2241b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_DURATION:
22424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik            ret = xmlSchemaValidateDuration(type, value, val,
22434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		normOnTheFly);
22441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            break;
2245b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_FLOAT:
22461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_DOUBLE:{
22471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
22481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int neg = 0;
22491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
22501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
22511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
22524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
22534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
22544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
22554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
22561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) {
22571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur += 3;
22581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (*cur != 0)
22591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
22601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (val != NULL) {
22611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (type == xmlSchemaTypeFloatDef) {
22621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
22631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
22641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                v->value.f = (float) xmlXPathNAN;
22651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
22661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
22671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
22681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
22691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
22701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
22711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
22721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                v->value.d = xmlXPathNAN;
22731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
22741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
22751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
22761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
22771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
22781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
22791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
22801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return0;
22811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
22821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
22831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    neg = 1;
22841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
22851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
22861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) {
22871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur += 3;
22881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (*cur != 0)
22891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
22901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (val != NULL) {
22911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (type == xmlSchemaTypeFloatDef) {
22921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
22931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
22941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                if (neg)
22951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.f = (float) xmlXPathNINF;
22961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                else
22971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.f = (float) xmlXPathPINF;
22981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
22991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
23001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
23011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
23021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
23031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
23041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (v != NULL) {
23051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                if (neg)
23061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.d = xmlXPathNINF;
23071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                else
23081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                    v->value.d = xmlXPathPINF;
23091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
23101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
23111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto error;
23121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
23131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
23141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
23151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
23161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return0;
23171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((neg == 0) && (*cur == '+'))
23191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
23201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-'))
23211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
23221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                while ((*cur >= '0') && (*cur <= '9')) {
23231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
23241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '.') {
23261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
23271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while ((*cur >= '0') && (*cur <= '9'))
23281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
23291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((*cur == 'e') || (*cur == 'E')) {
23311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
23321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((*cur == '-') || (*cur == '+'))
23331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
23341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while ((*cur >= '0') && (*cur <= '9'))
23351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        cur++;
23361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
23384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
23394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
23401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
23411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
23421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
23431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (type == xmlSchemaTypeFloatDef) {
23441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT);
23451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (v != NULL) {
23466c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    /*
23476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * TODO: sscanf seems not to give the correct
23486c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * value for extremely high/low values.
23496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * E.g. "1E-149" results in zero.
23506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    */
2351d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard                            if (sscanf((const char *) value, "%f",
23521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                 &(v->value.f)) == 1) {
23536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                                *val = v;
23541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
23551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
23561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
23571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
23581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
23591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto error;
23601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
23611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
23621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE);
23631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (v != NULL) {
23646c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    /*
23656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * TODO: sscanf seems not to give the correct
23666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    * value for extremely high/low values.
23676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    */
2368d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard                            if (sscanf((const char *) value, "%lf",
23691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                 &(v->value.d)) == 1) {
23701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                *val = v;
23711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            } else {
23721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                xmlSchemaFreeValue(v);
23731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
23741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            }
23751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        } else {
23761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto error;
23771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
23781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
23791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
23801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
23811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
23821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BOOLEAN:{
23831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
23841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
23854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly) {
23864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
23874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (*cur == '0') {
23884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 0;
23894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			cur++;
23904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    } else if (*cur == '1') {
23914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 1;
23924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			cur++;
23934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    } else if (*cur == 't') {
23944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			cur++;
23954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur++ == 'r') && (*cur++ == 'u') &&
23964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    (*cur++ == 'e')) {
23974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    ret = 1;
23984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else
23994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
24004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    } else if (*cur == 'f') {
24014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			cur++;
24024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur++ == 'a') && (*cur++ == 'l') &&
24034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    (*cur++ == 's') && (*cur++ == 'e')) {
24044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    ret = 0;
24054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else
24064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
24074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
24084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (*cur != 0) {
24094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			while IS_WSP_BLANK_CH(*cur) cur++;
24104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if (*cur != 0)
24114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
24124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
24134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		} else {
24144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if ((cur[0] == '0') && (cur[1] == 0))
24154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 0;
24164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else if ((cur[0] == '1') && (cur[1] == 0))
24174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 1;
24184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else if ((cur[0] == 't') && (cur[1] == 'r')
24194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			&& (cur[2] == 'u') && (cur[3] == 'e')
24204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			&& (cur[4] == 0))
24214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 1;
24224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else if ((cur[0] == 'f') && (cur[1] == 'a')
24234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			&& (cur[2] == 'l') && (cur[3] == 's')
24244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			&& (cur[4] == 'e') && (cur[5] == 0))
24254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			ret = 0;
24264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    else
24274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			goto return1;
24284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
24291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
24301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN);
24311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
24321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.b = ret;
24331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
24341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
24351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
24361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
24371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
24391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
24401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_TOKEN:{
24411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
24421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
24434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (! normOnTheFly) {
24444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while (*cur != 0) {
24454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) {
24464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    goto return1;
24474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else if (*cur == ' ') {
24484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
24494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    if (*cur == 0)
24504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik				goto return1;
24514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    if (*cur == ' ')
24524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik				goto return1;
24534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			} else {
24544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    cur++;
24554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			}
24564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
24574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		}
24581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
24591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN);
24601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
24611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.str = xmlStrdup(value);
24621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
24631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
24641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
24651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
24661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
24681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2469b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_LANGUAGE:
24704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if (normOnTheFly) {
24714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		norm = xmlSchemaCollapseString(value);
24724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (norm != NULL)
24734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    value = norm;
24744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    }
24751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (xmlCheckLanguageID(value) == 1) {
24761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
24771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE);
24781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
24791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.str = xmlStrdup(value);
24801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
24811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
24821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
24831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
24841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
24861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
24871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return1;
2488b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NMTOKEN:
24891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (xmlValidateNMToken(value, 1) == 0) {
24901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
24911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN);
24921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
24931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.str = xmlStrdup(value);
24941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
24951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
24961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
24971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
24981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
24991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
25001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
25011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto return1;
2502b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NMTOKENS:
25031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef,
25041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
25051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret > 0)
25061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
25071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
25081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 1;
25091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2510b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NAME:
25111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateName(value, 1);
2512df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard            if ((ret == 0) && (val != NULL) && (value != NULL)) {
2513df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		v = xmlSchemaNewValue(XML_SCHEMAS_NAME);
2514df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		if (v != NULL) {
2515df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     const xmlChar *start = value, *end;
2516df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     while (IS_BLANK_CH(*start)) start++;
2517df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     end = start;
2518df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     while ((*end != 0) && (!IS_BLANK_CH(*end))) end++;
2519df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		     v->value.str = xmlStrndup(start, end - start);
2520df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		    *val = v;
2521df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		} else {
2522df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		    goto error;
2523df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard		}
25241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
25251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
25261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_QNAME:{
25271c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                const xmlChar *uri = NULL;
25281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *local = NULL;
25291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
25301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateQName(value, 1);
25311c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		if (ret != 0)
25321c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    goto done;
25331c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                if (node != NULL) {
25341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *prefix;
25351c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    xmlNsPtr ns;
25361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
25371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    local = xmlSplitQName2(value, &prefix);
25381c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    ns = xmlSearchNs(node->doc, node, prefix);
25391c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if ((ns == NULL) && (prefix != NULL)) {
25401c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			xmlFree(prefix);
25411c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			if (local != NULL)
25421c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			    xmlFree(local);
25431c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			goto return1;
25441c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    }
25451c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if (ns != NULL)
25461c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			uri = ns->href;
25471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL)
25481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(prefix);
25491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
25501c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                if (val != NULL) {
25511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_QNAME);
25521c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                    if (v == NULL) {
25531c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			if (local != NULL)
25541c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			    xmlFree(local);
25551c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			goto error;
25561c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    }
25571c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if (local != NULL)
25581c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			v->value.qname.name = local;
25591c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    else
25601c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			v->value.qname.name = xmlStrdup(value);
25611c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if (uri != NULL)
25621c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			v->value.qname.uri = xmlStrdup(uri);
25631c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    *val = v;
25641c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik                } else
25651c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik		    if (local != NULL)
25661c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik			xmlFree(local);
25671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
25681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2569b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_NCNAME:
25701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
25711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
25721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME);
25731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (v != NULL) {
25741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.str = xmlStrdup(value);
25751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
25761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else {
25771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto error;
25781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
25791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
25801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2581b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_ID:
25821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
25831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
25841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                v = xmlSchemaNewValue(XML_SCHEMAS_ID);
25851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (v != NULL) {
25861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.str = xmlStrdup(value);
25871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
25881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else {
25891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto error;
25901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
25911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
25921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
25931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
25941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
25951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
25961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /*
25971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * NOTE: the IDness might have already be declared in the DTD
25981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 */
25991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (attr->atype != XML_ATTRIBUTE_ID) {
26001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlIDPtr res;
26011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *strip;
26021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
26031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    strip = xmlSchemaStrip(value);
26041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (strip != NULL) {
26051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        res = xmlAddID(NULL, node->doc, strip, attr);
26061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(strip);
26071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else
26081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        res = xmlAddID(NULL, node->doc, value, attr);
26091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (res == NULL) {
26101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 2;
26111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
26121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        attr->atype = XML_ATTRIBUTE_ID;
26131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
26141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
26161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2617b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_IDREF:
26181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlValidateNCName(value, 1);
26191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (val != NULL)) {
26206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		v = xmlSchemaNewValue(XML_SCHEMAS_IDREF);
26216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (v == NULL)
26226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    goto error;
26236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		v->value.str = xmlStrdup(value);
26246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*val = v;
26251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
26261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
26271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
26281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
26291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *strip;
26301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
26311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                strip = xmlSchemaStrip(value);
26321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (strip != NULL) {
26331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAddRef(NULL, node->doc, strip, attr);
26341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlFree(strip);
26351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else
26361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAddRef(NULL, node->doc, value, attr);
26371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_IDREF;
26381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
26391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
2640b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_IDREFS:
26411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef,
26421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
26431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret < 0)
26441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 2;
26451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
26461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
26471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
26481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
26491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
2650249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard
26511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_IDREFS;
26521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
26531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
26541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_ENTITY:{
26551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *strip;
26561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
26571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateNCName(value, 1);
26581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((node == NULL) || (node->doc == NULL))
26591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 3;
26601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret == 0) {
26611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlEntityPtr ent;
26621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
26631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    strip = xmlSchemaStrip(value);
26641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (strip != NULL) {
26651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ent = xmlGetDocEntity(node->doc, strip);
26661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(strip);
26671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
26681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ent = xmlGetDocEntity(node->doc, value);
26691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
26701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((ent == NULL) ||
26711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        (ent->etype !=
26721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         XML_EXTERNAL_GENERAL_UNPARSED_ENTITY))
26731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 4;
26741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (val != NULL)) {
26761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    TODO;
26771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (node != NULL) &&
26791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    (node->type == XML_ATTRIBUTE_NODE)) {
26801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlAttrPtr attr = (xmlAttrPtr) node;
2681a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard
26821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    attr->atype = XML_ATTRIBUTE_ENTITY;
26831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
26841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
26851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
2686b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        case XML_SCHEMAS_ENTITIES:
26871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((node == NULL) || (node->doc == NULL))
26881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return3;
26891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef,
26901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                             value, val, node);
26911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if (ret <= 0)
26921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 1;
26931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            else
26941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = 0;
26951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            if ((ret == 0) && (node != NULL) &&
26961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                (node->type == XML_ATTRIBUTE_NODE)) {
26971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) node;
26981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
26991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                attr->atype = XML_ATTRIBUTE_ENTITIES;
27001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            goto done;
27021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_NOTATION:{
27031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *uri = NULL;
27041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *local = NULL;
27051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
27061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                ret = xmlValidateQName(value, 1);
27071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (node != NULL)) {
27081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    xmlChar *prefix;
27091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
27101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    local = xmlSplitQName2(value, &prefix);
27111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL) {
27121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlNsPtr ns;
27131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
27141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ns = xmlSearchNs(node->doc, node, prefix);
27151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (ns == NULL)
27161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            ret = 1;
27171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        else if (val != NULL)
27181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            uri = xmlStrdup(ns->href);
27191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
27201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((local != NULL) && ((val == NULL) || (ret != 0)))
27211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(local);
27221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (prefix != NULL)
27231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(prefix);
27241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((node == NULL) || (node->doc == NULL))
27261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = 3;
27271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (ret == 0) {
27281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    ret = xmlValidateNotationUse(NULL, node->doc, value);
27291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (ret == 1)
27301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 0;
27311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else
27321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ret = 1;
27331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((ret == 0) && (val != NULL)) {
27351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION);
27361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
27371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (local != NULL)
27381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.name = local;
27391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        else
27401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.name = xmlStrdup(value);
27411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (uri != NULL)
27421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            v->value.qname.uri = uri;
27431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
27441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
27451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    } else {
27461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (local != NULL)
27471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            xmlFree(local);
27481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (uri != NULL)
27491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            xmlFree(uri);
27501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
27511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
27521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto done;
2754560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard            }
27554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik        case XML_SCHEMAS_ANYURI:{
275611c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                if (*value != 0) {
27574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    xmlURIPtr uri;
27584efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    if (normOnTheFly) {
27594efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			norm = xmlSchemaCollapseString(value);
27604efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			if (norm != NULL)
27614efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik			    value = norm;
27624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    }
27634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik                    uri = xmlParseURI((const char *) value);
276411c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    if (uri == NULL)
276511c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                        goto return1;
276611c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    xmlFreeURI(uri);
276711c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                }
2768560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
27691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
277011c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_ANYURI);
277111c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    if (v == NULL)
277211c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                        goto error;
277311c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    v->value.str = xmlStrdup(value);
277411c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard                    *val = v;
27751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
27771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
27781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_HEXBINARY:{
27798dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik                const xmlChar *cur = value, *start;
27801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *base;
27811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int total, i = 0;
2782560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
2783f34a20e69dc675cd23d3eb558cad135ea280f472Daniel Veillard                if (cur == NULL)
27841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
2785560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
27864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
27874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
27884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik
27898dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik		start = cur;
27901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                while (((*cur >= '0') && (*cur <= '9')) ||
27911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                       ((*cur >= 'A') && (*cur <= 'F')) ||
27921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                       ((*cur >= 'a') && (*cur <= 'f'))) {
27931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    i++;
27941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
27951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
27964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
27974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
2798560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
27991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur != 0)
28001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
28011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if ((i % 2) != 0)
280270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard                    goto return1;
2803560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
28041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
28051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY);
28071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v == NULL)
28081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
28094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    /*
28104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    * Copy only the normalized piece.
28114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    * CRITICAL TODO: Check this.
28124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    */
28138dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik                    cur = xmlStrndup(start, i);
28141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (cur == NULL) {
2815d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard		        xmlSchemaTypeErrMemory(node, "allocating hexbin data");
28161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(v);
28171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
28181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
28191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total = i / 2;      /* number of octets */
282170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
28221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    base = (xmlChar *) cur;
28231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    while (i-- > 0) {
28241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (*base >= 'a')
28251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            *base = *base - ('a' - 'A');
28261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        base++;
28271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
282870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
28291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.hex.str = (xmlChar *) cur;
28301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.hex.total = total;
28311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
28321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
28341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
28351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BASE64BINARY:{
28361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /* ISSUE:
28371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 *
28381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Ignore all stray characters? (yes, currently)
28391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Worry about long lines? (no, currently)
28401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 *
28411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * rfc2045.txt:
28421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 *
28431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * "The encoded output stream must be represented in lines of
28441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * no more than 76 characters each.  All line breaks or other
28451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * characters not found in Table 1 must be ignored by decoding
28461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * software.  In base64 data, characters other than those in
28471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * Table 1, line breaks, and other white space probably
28481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * indicate a transmission error, about which a warning
28491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * message or even a message rejection might be appropriate
28501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * under some circumstances." */
28511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
28521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                xmlChar *base;
28531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int total, i = 0, pad = 0;
28541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
28561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
28571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                for (; *cur; ++cur) {
28591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
28601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    decc = _xmlSchemaBase64Decode(*cur);
28621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc < 0) ;
28631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (decc < 64)
28641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        i++;
28651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else
28661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        break;
28671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                for (; *cur; ++cur) {
28691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
28701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    decc = _xmlSchemaBase64Decode(*cur);
28721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc < 0) ;
28731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (decc < 64)
28741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
28751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc == 64)
28761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        pad++;
28771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
28781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
28791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                /* rfc2045.txt: "Special processing is performed if fewer than
28801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * 24 bits are available at the end of the data being encoded.
28811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * A full encoding quantum is always completed at the end of a
28821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * body.  When fewer than 24 input bits are available in an
28831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * input group, zero bits are added (on the right) to form an
28841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * integral number of 6-bit groups.  Padding at the end of the
28851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * data is performed using the "=" character.  Since all
28861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * base64 input is an integral number of octets, only the
28871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * following cases can arise: (1) the final quantum of
28881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * encoding input is an integral multiple of 24 bits; here,
28891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * the final unit of encoded output will be an integral
28901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * multiple ofindent: Standard input:701: Warning:old style
28911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		 * assignment ambiguity in "=*".  Assuming "= *" 4 characters
28921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		 * with no "=" padding, (2) the final
28931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * quantum of encoding input is exactly 8 bits; here, the
28941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * final unit of encoded output will be two characters
28951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * followed by two "=" padding characters, or (3) the final
28961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * quantum of encoding input is exactly 16 bits; here, the
28971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * final unit of encoded output will be three characters
28981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                 * followed by one "=" padding character." */
28991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
29001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                total = 3 * (i / 4);
29011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (pad == 0) {
29021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 0)
29031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
29041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (pad == 1) {
29051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
29061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
29071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 3)
29081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
29091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (decc = _xmlSchemaBase64Decode(*cur);
29101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         (decc < 0) || (decc > 63);
29111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         decc = _xmlSchemaBase64Decode(*cur))
29121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        --cur;
29131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 16bits in 24bits means 2 pad bits: nnnnnn nnmmmm mmmm00*/
29141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 00111100 -> 0x3c */
29151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc & ~0x3c)
29161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
29171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total += 2;
29181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (pad == 2) {
29191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int decc;
29201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
29211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (i % 4 != 2)
29221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
29231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (decc = _xmlSchemaBase64Decode(*cur);
29241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         (decc < 0) || (decc > 63);
29251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                         decc = _xmlSchemaBase64Decode(*cur))
29261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        --cur;
29271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 8bits in 12bits means 4 pad bits: nnnnnn nn0000 */
29281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    /* 00110000 -> 0x30 */
29291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (decc & ~0x30)
29301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
29311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    total += 1;
29321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else
29331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
29341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
29351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
29361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v = xmlSchemaNewValue(XML_SCHEMAS_BASE64BINARY);
29371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v == NULL)
29381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto error;
29391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    base =
29401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        (xmlChar *) xmlMallocAtomic((i + pad + 1) *
29411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                                    sizeof(xmlChar));
29421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (base == NULL) {
2943d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard		        xmlSchemaTypeErrMemory(node, "allocating base64 data");
29441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        xmlFree(v);
29451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
29461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
29471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.base64.str = base;
29481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    for (cur = value; *cur; ++cur)
29491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (_xmlSchemaBase64Decode(*cur) >= 0) {
29501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            *base = *cur;
29511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            ++base;
29521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
29531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *base = 0;
29541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    v->value.base64.total = total;
29551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    *val = v;
29561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
29571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
295870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard            }
2959e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_INTEGER:
2960e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_PINTEGER:
2961e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_NPINTEGER:
2962e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_NINTEGER:
29631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_NNINTEGER:{
29641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
29651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
2966ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                int sign = 0;
29671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
29681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
29691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
29704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
29714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
29721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
29731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    sign = 1;
29741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
29751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (*cur == '+')
29761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
2977ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
2978ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (ret == -1)
2979ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
29804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (normOnTheFly)
29814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    while IS_WSP_BLANK_CH(*cur) cur++;
2982ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (*cur != 0)
2983ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
298401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_NPINTEGER) {
29851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) &&
29861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ((hi != 0) || (mi != 0) || (lo != 0)))
29871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
298801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_PINTEGER) {
29891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (sign == 1)
29901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
29911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((hi == 0) && (mi == 0) && (lo == 0))
29921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
299301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_NINTEGER) {
29941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (sign == 0)
29951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
29961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((hi == 0) && (mi == 0) && (lo == 0))
29971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
299801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_NNINTEGER) {
29991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) &&
30001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        ((hi != 0) || (mi != 0) || (lo != 0)))
30011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
30036c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                if (val != NULL) {
300401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
30051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
3006c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			if (ret == 0)
3007c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    ret++;
30081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
30096c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                        v->value.decimal.mi = mi;
30106c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                        v->value.decimal.hi = hi;
30111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = sign;
30121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
3013ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                        v->value.decimal.total = ret;
30141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
30151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
30161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
30171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
30181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
3019e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_LONG:
3020e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_BYTE:
3021e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_SHORT:
30221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_INT:{
3023478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik                 const xmlChar *cur = value;
30241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
30251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                int sign = 0;
30261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
30281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
30291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (*cur == '-') {
30301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    sign = 1;
30311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
30321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                } else if (*cur == '+')
30331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    cur++;
3034ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
3035ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (ret < 0)
3036ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
3037ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (*cur != 0)
3038ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
303901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_LONG) {
30401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi >= 922) {
30411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (hi > 922)
30421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
30431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi >= 33720368) {
30441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (mi > 33720368)
30451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
30461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if ((sign == 0) && (lo > 54775807))
30471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
30481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if ((sign == 1) && (lo > 54775808))
30491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
30501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
30511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
305201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_INT) {
30531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi != 0)
30541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (mi >= 21) {
30561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi > 21)
30571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
30581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if ((sign == 0) && (lo > 47483647))
30591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
30601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if ((sign == 1) && (lo > 47483648))
30611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
30621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
306301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_SHORT) {
30641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
30651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) && (lo > 32768))
30671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) && (lo > 32767))
30691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
307001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_BYTE) {
30711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
30721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 1) && (lo > 128))
30741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((sign == 0) && (lo > 127))
30761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
30771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
30781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
307901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
30801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
30811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
30826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                        v->value.decimal.mi = mi;
30836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                        v->value.decimal.hi = hi;
30841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = sign;
30851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
3086ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                        v->value.decimal.total = ret;
30871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
30881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
30891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
30901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
30911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
3092e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_UINT:
3093e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_ULONG:
3094e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_USHORT:
30951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_UBYTE:{
30961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                const xmlChar *cur = value;
30971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                unsigned long lo, mi, hi;
30981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard
30991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (cur == NULL)
31001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    goto return1;
3101ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi);
3102ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (ret < 0)
3103ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
3104ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                if (*cur != 0)
3105ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                    goto return1;
310601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                if (type->builtInType == XML_SCHEMAS_ULONG) {
31071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi >= 1844) {
31081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (hi > 1844)
31091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
31101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi >= 67440737) {
31111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (mi > 67440737)
31121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
31131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            if (lo > 9551615)
31141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                                goto return1;
31151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        }
31161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
311701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_UINT) {
31181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (hi != 0)
31191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (mi >= 42) {
31211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (mi > 42)
31221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
31231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        if (lo > 94967295)
31241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                            goto return1;
31251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
312601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_USHORT) {
31271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
31281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (lo > 65535)
31301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
313101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                } else if (type->builtInType == XML_SCHEMAS_UBYTE) {
31321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if ((mi != 0) || (hi != 0))
31331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (lo > 255)
31351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        goto return1;
31361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
31371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (val != NULL) {
313801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard                    v = xmlSchemaNewValue(type->builtInType);
31391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (v != NULL) {
31401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.lo = lo;
31411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.mi = mi;
31421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.hi = hi;
31431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.sign = 0;
31441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        v->value.decimal.frac = 0;
3145ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack                        v->value.decimal.total = ret;
31461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        *val = v;
31471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    }
31481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
31491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                goto return0;
31501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
31514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
3152b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
31531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  done:
31541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
31551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
31561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (ret);
31571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return3:
31581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
31591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
31601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (3);
31611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return1:
31621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
31631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
31641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (1);
31651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  return0:
31661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
31671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
31681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (0);
31691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard  error:
31701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    if (norm != NULL)
31711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        xmlFree(norm);
31721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard    return (-1);
3173b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
3174b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
3175b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
3176b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValPredefTypeNode:
3177b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @type: the predefined type
3178b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: the value to check
3179b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @val:  the return computed value
3180b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @node:  the node containing the value
3181b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
3182b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the predefined type.
3183b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * if true a value is computed and returned in @val.
3184b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
3185b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns 0 if this validates, a positive error code number otherwise
3186b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *         and -1 in case of internal or API error.
3187b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
3188b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardint
3189b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value,
3190b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	                   xmlSchemaValPtr *val, xmlNodePtr node) {
31914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return(xmlSchemaValAtomicType(type, value, val, node, 0,
31924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 1, 0));
31934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
31944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
31954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
3196c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaValPredefTypeNodeNoNorm:
3197c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the predefined type
3198c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the value to check
3199c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val:  the return computed value
3200c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @node:  the node containing the value
3201c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
3202c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Check that a value conforms to the lexical space of the predefined type.
3203c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * if true a value is computed and returned in @val.
3204c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * This one does apply any normalization to the value.
3205c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
3206c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
3207c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *         and -1 in case of internal or API error.
3208c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */
3209c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardint
3210c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, const xmlChar *value,
3211c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard				 xmlSchemaValPtr *val, xmlNodePtr node) {
32124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return(xmlSchemaValAtomicType(type, value, val, node, 1,
32134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 0, 1));
3214c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
3215c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
3216c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/**
3217c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * xmlSchemaValidatePredefinedType:
3218c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @type: the predefined type
3219c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @value: the value to check
3220c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @val:  the return computed value
3221c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *
3222c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Check that a value conforms to the lexical space of the predefined type.
3223c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * if true a value is computed and returned in @val.
3224c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *
3225c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise
3226c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard *         and -1 in case of internal or API error.
3227c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard */
3228c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillardint
3229c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel VeillardxmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value,
3230c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard	                        xmlSchemaValPtr *val) {
3231c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard    return(xmlSchemaValPredefTypeNode(type, value, val, NULL));
3232c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard}
3233c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard
3234c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard/**
32354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareDecimals:
32364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x:  a first decimal value
32374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y:  a second decimal value
32384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
32394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 decimals
32404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
32414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error
32424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
32434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int
32444255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y)
32454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{
32464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    xmlSchemaValPtr swp;
3247273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    int order = 1, integx, integy, dlen;
3248273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    unsigned long hi, mi, lo;
32494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
3250273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    /*
3251273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * First test: If x is -ve and not zero
3252273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     */
3253e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    if ((x->value.decimal.sign) &&
3254e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	((x->value.decimal.lo != 0) ||
3255e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	 (x->value.decimal.mi != 0) ||
3256e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	 (x->value.decimal.hi != 0))) {
3257273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	/*
3258273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	 * Then if y is -ve and not zero reverse the compare
3259273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	 */
3260e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	if ((y->value.decimal.sign) &&
3261e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    ((y->value.decimal.lo != 0) ||
3262e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	     (y->value.decimal.mi != 0) ||
3263e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	     (y->value.decimal.hi != 0)))
326480b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    order = -1;
3265273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	/*
3266273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	 * Otherwise (y >= 0) we have the answer
3267273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	 */
326880b19092f24410a6b869abf519227686e8f207caDaniel Veillard	else
326980b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    return (-1);
3270273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    /*
3271273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * If x is not -ve and y is -ve we have the answer
3272273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     */
3273e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard    } else if ((y->value.decimal.sign) &&
3274e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	       ((y->value.decimal.lo != 0) ||
3275e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		(y->value.decimal.mi != 0) ||
3276e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		(y->value.decimal.hi != 0))) {
32774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard        return (1);
327880b19092f24410a6b869abf519227686e8f207caDaniel Veillard    }
3279273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    /*
3280273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * If it's not simply determined by a difference in sign,
3281273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * then we need to compare the actual values of the two nums.
3282273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * To do this, we start by looking at the integral parts.
3283273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * If the number of integral digits differ, then we have our
3284273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * answer.
3285273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     */
3286273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    integx = x->value.decimal.total - x->value.decimal.frac;
3287273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    integy = y->value.decimal.total - y->value.decimal.frac;
3288273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    if (integx > integy)
3289273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	return order;
3290273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    else if (integy > integx)
3291273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	return -order;
3292273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    /*
3293273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * If the number of integral digits is the same for both numbers,
3294273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * then things get a little more complicated.  We need to "normalize"
3295273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * the numbers in order to properly compare them.  To do this, we
3296273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * look at the total length of each number (length => number of
3297273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * significant digits), and divide the "shorter" by 10 (decreasing
3298273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     * the length) until they are of equal length.
3299273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack     */
3300273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    dlen = x->value.decimal.total - y->value.decimal.total;
3301273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    if (dlen < 0) {	/* y has more digits than x */
3302273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	swp = x;
3303273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	hi = y->value.decimal.hi;
3304273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	mi = y->value.decimal.mi;
3305273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	lo = y->value.decimal.lo;
3306273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	dlen = -dlen;
3307273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	order = -order;
3308273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    } else {		/* x has more digits than y */
3309273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	swp = y;
3310273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	hi = x->value.decimal.hi;
3311273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	mi = x->value.decimal.mi;
3312273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	lo = x->value.decimal.lo;
3313273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    }
3314273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    while (dlen > 8) {	/* in effect, right shift by 10**8 */
3315273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	lo = mi;
3316273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	mi = hi;
3317273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	hi = 0;
3318273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	dlen -= 8;
33194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
3320273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    while (dlen > 0) {
3321273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	unsigned long rem1, rem2;
3322273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	rem1 = (hi % 10) * 100000000L;
3323273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	hi = hi / 10;
3324273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	rem2 = (mi % 10) * 100000000L;
3325273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	mi = (mi + rem1) / 10;
3326273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	lo = (lo + rem2) / 10;
3327273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	dlen--;
3328273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    }
3329273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    if (hi > swp->value.decimal.hi) {
3330273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	return order;
3331273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    } else if (hi == swp->value.decimal.hi) {
3332273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	if (mi > swp->value.decimal.mi) {
3333273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	    return order;
3334273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	} else if (mi == swp->value.decimal.mi) {
3335273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	    if (lo > swp->value.decimal.lo) {
3336273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		return order;
3337273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	    } else if (lo == swp->value.decimal.lo) {
3338273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		if (x->value.decimal.total == y->value.decimal.total) {
3339273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		    return 0;
3340273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		} else {
3341273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		    return order;
3342273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack		}
3343273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	    }
3344273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack	}
33454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
3346273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack    return -order;
33474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
33484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
33494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
3350070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xmlSchemaCompareDurations:
3351070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @x:  a first duration value
3352070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @y:  a second duration value
3353070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
3354070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Compare 2 durations
3355070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *
3356070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
3357070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * case of error
3358070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */
3359070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int
3360070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel VeillardxmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y)
3361070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard{
3362070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    long carry, mon, day;
3363070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    double sec;
336480b19092f24410a6b869abf519227686e8f207caDaniel Veillard    int invert = 1;
336580b19092f24410a6b869abf519227686e8f207caDaniel Veillard    long xmon, xday, myear, minday, maxday;
3366070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    static const long dayRange [2][12] = {
3367070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        { 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, },
3368070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} };
3369070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3370070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if ((x == NULL) || (y == NULL))
33715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return -2;
3372070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3373070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* months */
3374070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    mon = x->value.dur.mon - y->value.dur.mon;
3375070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3376070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* seconds */
3377070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    sec = x->value.dur.sec - y->value.dur.sec;
3378070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    carry = (long)sec / SECS_PER_DAY;
3379070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    sec -= (double)(carry * SECS_PER_DAY);
3380070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3381070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* days */
3382070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    day = x->value.dur.day - y->value.dur.day + carry;
3383070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3384070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* easy test */
3385070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (mon == 0) {
3386070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if (day == 0)
3387070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            if (sec == 0.0)
3388070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 0;
3389070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else if (sec < 0.0)
3390070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return -1;
3391070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            else
3392070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return 1;
3393070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else if (day < 0)
3394070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return -1;
3395070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else
3396070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return 1;
3397070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
3398070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3399070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (mon > 0) {
3400070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        if ((day >= 0) && (sec >= 0.0))
3401070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            return 1;
3402070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        else {
3403070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            xmon = mon;
3404070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard            xday = -day;
3405070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        }
3406070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    } else if ((day <= 0) && (sec <= 0.0)) {
3407070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        return -1;
3408070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    } else {
340980b19092f24410a6b869abf519227686e8f207caDaniel Veillard	invert = -1;
3410070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xmon = -mon;
3411070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        xday = day;
3412070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    }
3413070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3414070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    myear = xmon / 12;
341580b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (myear == 0) {
341680b19092f24410a6b869abf519227686e8f207caDaniel Veillard	minday = 0;
341780b19092f24410a6b869abf519227686e8f207caDaniel Veillard	maxday = 0;
341880b19092f24410a6b869abf519227686e8f207caDaniel Veillard    } else {
341980b19092f24410a6b869abf519227686e8f207caDaniel Veillard	maxday = 366 * ((myear + 3) / 4) +
342080b19092f24410a6b869abf519227686e8f207caDaniel Veillard	         365 * ((myear - 1) % 4);
342180b19092f24410a6b869abf519227686e8f207caDaniel Veillard	minday = maxday - 1;
342280b19092f24410a6b869abf519227686e8f207caDaniel Veillard    }
342380b19092f24410a6b869abf519227686e8f207caDaniel Veillard
3424070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    xmon = xmon % 12;
3425070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    minday += dayRange[0][xmon];
3426070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    maxday += dayRange[1][xmon];
3427070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
342880b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if ((maxday == minday) && (maxday == xday))
342980b19092f24410a6b869abf519227686e8f207caDaniel Veillard	return(0); /* can this really happen ? */
3430070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    if (maxday < xday)
343180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        return(-invert);
343280b19092f24410a6b869abf519227686e8f207caDaniel Veillard    if (minday > xday)
343380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        return(invert);
3434070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
3435070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    /* indeterminate */
34365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return 2;
34375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
34385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
34395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/*
34405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * macros for adding date/times and durations
34415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
34425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT(a,b)                  (floor(((double)a/(double)b)))
34435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO(a,b)                     (a - FQUOTIENT(a,b) * b)
34445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT_RANGE(a,low,high)     (FQUOTIENT((a-low),(high-low)))
34455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO_RANGE(a,low,high)        ((MODULO((a-low),(high-low)))+low)
34465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
34475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
3448669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * xmlSchemaDupVal:
3449669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @v: the #xmlSchemaValPtr value to duplicate
3450669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard *
3451669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Makes a copy of @v. The calling program is responsible for freeing
3452669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the returned value.
3453669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard *
3454669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * returns a pointer to a duplicated #xmlSchemaValPtr or NULL if error.
3455669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard */
3456669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillardstatic xmlSchemaValPtr
3457669adfcd3af5dfda873b10119d44202a7450bb20Daniel VeillardxmlSchemaDupVal (xmlSchemaValPtr v)
3458669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard{
3459669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaValPtr ret = xmlSchemaNewValue(v->type);
3460669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    if (ret == NULL)
3461669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        return NULL;
3462669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard
3463669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    memcpy(ret, v, sizeof(xmlSchemaVal));
34644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    ret->next = NULL;
3465669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    return ret;
3466669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard}
3467669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard
3468669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard/**
3469285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * xmlSchemaCopyValue:
3470285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * @val:  the precomputed value to be copied
3471285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik *
3472285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Copies the precomputed value. This duplicates any string within.
3473285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik *
3474285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Returns the copy or NULL if a copy for a data-type is not implemented.
3475285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik */
3476285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaValPtr
3477285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaCopyValue(xmlSchemaValPtr val)
3478285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik{
34794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    xmlSchemaValPtr ret = NULL, prev = NULL, cur;
3480285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik
3481285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    /*
3482285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    * Copy the string values.
3483285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    */
34844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    while (val != NULL) {
34854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	switch (val->type) {
34864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYTYPE:
34874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_IDREFS:
34884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ENTITIES:
34894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NMTOKENS:
34904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		xmlSchemaFreeValue(ret);
34914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		return (NULL);
34924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYSIMPLETYPE:
34934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_STRING:
34944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NORMSTRING:
34954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_TOKEN:
34964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_LANGUAGE:
34974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NAME:
34984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NCNAME:
34994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ID:
35004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_IDREF:
35014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ENTITY:
35024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NMTOKEN:
35034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_ANYURI:
35044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
35054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.str != NULL)
35064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.str = xmlStrdup(BAD_CAST val->value.str);
35074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
35084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_QNAME:
35094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_NOTATION:
35104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
35114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.qname.name != NULL)
35124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.qname.name =
3513285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                    xmlStrdup(BAD_CAST val->value.qname.name);
35144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.qname.uri != NULL)
35154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.qname.uri =
3516285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                    xmlStrdup(BAD_CAST val->value.qname.uri);
35174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
35184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_HEXBINARY:
35194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
35204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.hex.str != NULL)
35214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.hex.str = xmlStrdup(BAD_CAST val->value.hex.str);
35224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
35234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    case XML_SCHEMAS_BASE64BINARY:
35244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
35254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		if (val->value.base64.str != NULL)
35264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		    cur->value.base64.str =
3527285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik                    xmlStrdup(BAD_CAST val->value.base64.str);
35284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
35294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    default:
35304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		cur = xmlSchemaDupVal(val);
35314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		break;
35324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	}
35334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	if (ret == NULL)
35344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    ret = cur;
35354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	else
35364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    prev->next = cur;
35374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	prev = cur;
35384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	val = val->next;
3539285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik    }
35404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik    return (ret);
3541285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik}
3542285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik
3543285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik/**
35445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateAdd:
35455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr
35465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dur: an #xmlSchemaValPtr of type #XS_DURATION
35475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
35485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compute a new date/time from @dt and @dur. This function assumes @dt
35495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH,
3550669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * or #XML_SCHEMAS_GYEAR. The returned #xmlSchemaVal is the same type as
3551669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt. The calling program is responsible for freeing the returned value.
35525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3553669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a pointer to a new #xmlSchemaVal or NULL if error.
35545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
35555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr
35565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur)
35575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
3558669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaValPtr ret, tmp;
35595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long carry, tempdays, temp;
35605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValDatePtr r, d;
35615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValDurationPtr u;
35625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
35635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((dt == NULL) || (dur == NULL))
35645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
35655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
35665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ret = xmlSchemaNewValue(dt->type);
35675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret == NULL)
35685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
35695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3570669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    /* make a copy so we don't alter the original value */
3571669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    tmp = xmlSchemaDupVal(dt);
3572669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    if (tmp == NULL) {
3573669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        xmlSchemaFreeValue(ret);
3574669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard        return NULL;
3575669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    }
3576669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard
35775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r = &(ret->value.date);
3578669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    d = &(tmp->value.date);
35795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    u = &(dur->value.dur);
35805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
35815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalization */
35825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (d->mon == 0)
35835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        d->mon = 1;
35845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
35855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalize for time zone offset */
35865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    u->sec -= (d->tzo * 60);
35875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    d->tzo = 0;
35885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
35895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* normalization */
35905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (d->day == 0)
35915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        d->day = 1;
35925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
35935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* month */
35945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry  = d->mon + u->mon;
3595ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->mon = (unsigned int) MODULO_RANGE(carry, 1, 13);
3596ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT_RANGE(carry, 1, 13);
35975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
35985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* year (may be modified later) */
35995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->year = d->year + carry;
36005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (r->year == 0) {
36015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (d->year > 0)
36025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            r->year--;
36035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else
36045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            r->year++;
36055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
36065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
36075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* time zone */
36085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->tzo     = d->tzo;
36095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->tz_flag = d->tz_flag;
36105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
36115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* seconds */
36125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->sec = d->sec + u->sec;
3613ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT((long)r->sec, 60);
36145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (r->sec != 0.0) {
36155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        r->sec = MODULO(r->sec, 60.0);
36165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
36175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
36185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* minute */
36195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry += d->min;
3620ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->min = (unsigned int) MODULO(carry, 60);
3621ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry  = (long) FQUOTIENT(carry, 60);
36225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
36235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* hours */
36245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    carry  += d->hour;
3625ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    r->hour = (unsigned int) MODULO(carry, 24);
3626ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard    carry   = (long)FQUOTIENT(carry, 24);
36275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
36285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
36295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * days
36305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * Note we use tempdays because the temporary values may need more
36315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * than 5 bits
36325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
36335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) &&
36345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                  (d->day > MAX_DAYINMONTH(r->year, r->mon)))
36355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = MAX_DAYINMONTH(r->year, r->mon);
36365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (d->day < 1)
36375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = 1;
36385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else
36395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        tempdays = d->day;
36405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
36415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    tempdays += u->day + carry;
36425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
36435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    while (1) {
36445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (tempdays < 1) {
3645ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard            long tmon = (long) MODULO_RANGE(r->mon-1, 1, 13);
3646ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard            long tyr  = r->year + (long)FQUOTIENT_RANGE(r->mon-1, 1, 13);
36475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (tyr == 0)
36485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                tyr--;
36495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            tempdays += MAX_DAYINMONTH(tyr, tmon);
36505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            carry = -1;
3651ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard        } else if (tempdays > (long) MAX_DAYINMONTH(r->year, r->mon)) {
36525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon);
36535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            carry = 1;
36545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        } else
36555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
36565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
36575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        temp = r->mon + carry;
3658ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard        r->mon = (unsigned int) MODULO_RANGE(temp, 1, 13);
3659ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard        r->year = r->year + (unsigned int) FQUOTIENT_RANGE(temp, 1, 13);
36605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (r->year == 0) {
36615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (temp < 1)
36625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                r->year--;
36635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else
36645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                r->year++;
36655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	}
36665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
36675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
36685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    r->day = tempdays;
36695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
36705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
36715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * adjust the date/time type to the date values
36725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
36735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret->type != XML_SCHEMAS_DATETIME) {
36745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if ((r->hour) || (r->min) || (r->sec))
36755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ret->type = XML_SCHEMAS_DATETIME;
36765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (ret->type != XML_SCHEMAS_DATE) {
36775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if ((r->mon != 1) && (r->day != 1))
36785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                ret->type = XML_SCHEMAS_DATE;
36795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1))
36805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                ret->type = XML_SCHEMAS_GYEARMONTH;
36815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
36825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
36835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3684669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard    xmlSchemaFreeValue(tmp);
36855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
36865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
36875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
36885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
36895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
36905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaDateNormalize:
3691669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt: an #xmlSchemaValPtr of a date/time type value.
3692669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @offset: number of seconds to adjust @dt by.
36935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3694669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Normalize @dt to GMT time. The @offset parameter is subtracted from
3695669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the return value is a time-zone offset is present on @dt.
36965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
3697669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a normalized copy of @dt or NULL if error.
36985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
36995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr
37005a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset)
37015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
37025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValPtr dur, ret;
37035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dt == NULL)
37055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
37065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (((dt->type != XML_SCHEMAS_TIME) &&
3708c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik         (dt->type != XML_SCHEMAS_DATETIME) &&
3709c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	 (dt->type != XML_SCHEMAS_DATE)) || (dt->value.date.tzo == 0))
37105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return xmlSchemaDupVal(dt);
37115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION);
37135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (dur == NULL)
37145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
37155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    dur->value.date.sec -= offset;
37175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ret = _xmlSchemaDateAdd(dt, dur);
37195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (ret == NULL)
37205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return NULL;
37215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaFreeValue(dur);
37235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* ret->value.date.tzo = 0; */
37255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
37265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
37275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
37295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateCastYMToDays:
37305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr
37315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
37325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Convert mon and year of @dt to total number of days. Take the
37335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * number of years since (or before) 1 AD and add the number of leap
37345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years. This is a function  because negative
37355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years must be handled a little differently and there is no zero year.
37365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
37375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns number of days.
37385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
37395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic long
37405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt)
37415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
37425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long ret;
374349e8963c640865343327c67d4755a1af705717d3Daniel Veillard    int mon;
37445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
374549e8963c640865343327c67d4755a1af705717d3Daniel Veillard    mon = dt->value.date.mon;
374649e8963c640865343327c67d4755a1af705717d3Daniel Veillard    if (mon <= 0) mon = 1; /* normalization */
374749e8963c640865343327c67d4755a1af705717d3Daniel Veillard
374849e8963c640865343327c67d4755a1af705717d3Daniel Veillard    if (dt->value.date.year <= 0)
37495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ret = (dt->value.date.year * 365) +
37505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+
37515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard               ((dt->value.date.year+1)/400)) +
375249e8963c640865343327c67d4755a1af705717d3Daniel Veillard              DAY_IN_YEAR(0, mon, dt->value.date.year);
37535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else
37545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        ret = ((dt->value.date.year-1) * 365) +
37555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard              (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+
37565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard               ((dt->value.date.year-1)/400)) +
375749e8963c640865343327c67d4755a1af705717d3Daniel Veillard              DAY_IN_YEAR(0, mon, dt->value.date.year);
37585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return ret;
37605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard}
37615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
37635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * TIME_TO_NUMBER:
37645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt:  an #xmlSchemaValPtr
37655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
37665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Calculates the number of seconds in the time portion of @dt.
37675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
37685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns seconds.
37695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
37705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define TIME_TO_NUMBER(dt)                              \
37715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    ((double)((dt->value.date.hour * SECS_PER_HOUR) +   \
3772b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard              (dt->value.date.min * SECS_PER_MIN) +	\
3773b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard              (dt->value.date.tzo * SECS_PER_MIN)) +	\
3774b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard               dt->value.date.sec)
37755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/**
37775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaCompareDates:
37785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @x:  a first date/time value
37795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @y:  a second date/time value
37805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
37815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compare 2 date/times
37825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard *
37835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
37845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error
37855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */
37865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic int
37875a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y)
37885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{
37895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    unsigned char xmask, ymask, xor_mask, and_mask;
37905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xmlSchemaValPtr p1, p2, q1, q2;
37915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    long p1d, p2d, q1d, q2d;
37925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if ((x == NULL) || (y == NULL))
37945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return -2;
37955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (x->value.date.tz_flag) {
37975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
37985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (!y->value.date.tz_flag) {
37995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            p1 = xmlSchemaDateNormalize(x, 0);
38005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
38015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            /* normalize y + 14:00 */
38025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR));
38035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
3805fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            if (p1d < q1d) {
3806fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
3807fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
38085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return -1;
3809fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    } else if (p1d == q1d) {
38105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                double sec;
38115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
3813fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard                if (sec < 0.0) {
3814fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		    xmlSchemaFreeValue(p1);
3815fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		    xmlSchemaFreeValue(q1);
38165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    return -1;
3817fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		} else {
38184aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    int ret = 0;
38195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    /* normalize y - 14:00 */
38205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR));
38215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day;
38225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    if (p1d > q2d)
38234aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 1;
38245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    else if (p1d == q2d) {
38255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2);
38265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        if (sec > 0.0)
38274aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                            ret = 1;
38285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                        else
38294aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                            ret = 2; /* indeterminate */
38305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    }
38314aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(p1);
38324aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(q1);
38334aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    xmlSchemaFreeValue(q2);
38344aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    if (ret != 0)
38354aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		        return(ret);
38365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                }
3837fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            } else {
3838fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
3839fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
3840fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    }
38415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
38425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    } else if (y->value.date.tz_flag) {
38435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1 = xmlSchemaDateNormalize(y, 0);
38445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
38455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        /* normalize x - 14:00 */
38475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR));
38485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
38495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3850fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard        if (p1d < q1d) {
3851fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(p1);
3852fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(q1);
38535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
3854fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else if (p1d == q1d) {
38555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            double sec;
38565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
3858fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard            if (sec < 0.0) {
3859fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(p1);
3860fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard		xmlSchemaFreeValue(q1);
38615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return -1;
3862fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    } else {
38634aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	        int ret = 0;
38645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                /* normalize x + 14:00 */
38655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR));
38665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day;
38675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38686560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard                if (p2d > q1d) {
38694aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                    ret = 1;
38706560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		} else if (p2d == q1d) {
38715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1);
38725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    if (sec > 0.0)
38734aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 1;
38745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                    else
38754aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                        ret = 2; /* indeterminate */
38765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                }
38776560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(p1);
38786560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(q1);
38796560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard		xmlSchemaFreeValue(p2);
38804aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		if (ret != 0)
38814aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard		    return(ret);
38825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            }
3883fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else {
3884fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(p1);
3885fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	    xmlSchemaFreeValue(q1);
38865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
38875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
38885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /*
38905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     * if the same type then calculate the difference
38915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard     */
38925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (x->type == y->type) {
38934aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard        int ret = 0;
38945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1 = xmlSchemaDateNormalize(y, 0);
38955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
38965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
38975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1 = xmlSchemaDateNormalize(x, 0);
38985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
38995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
3900fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard        if (p1d < q1d) {
39014aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard            ret = -1;
3902fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else if (p1d > q1d) {
39034aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard            ret = 1;
3904fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard	} else {
39055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            double sec;
39065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
39085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            if (sec < 0.0)
39094aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                ret = -1;
39105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            else if (sec > 0.0)
39114aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard                ret = 1;
39125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        }
39144aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	xmlSchemaFreeValue(p1);
39154aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard	xmlSchemaFreeValue(q1);
39164aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard        return(ret);
39175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
39185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    switch (x->type) {
39205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
39215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0xf;
39225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
39235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
39245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x7;
39255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
39265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
39275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x1;
39285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
39295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
39305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x2;
39315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
39325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
39335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x3;
39345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
39355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
39365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x3;
39375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
39385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
39395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x6;
39405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
39415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
39425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0x8;
39435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
39445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        default:
39455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            xmask = 0;
39465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
39475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
39485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    switch (y->type) {
39505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
39515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0xf;
39525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
39535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
39545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x7;
39555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
39565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
39575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x1;
39585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
39595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
39605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x2;
39615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
39625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
39635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x3;
39645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
39655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
39665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x3;
39675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
39685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
39695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x6;
39705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
39715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
39725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0x8;
39735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
39745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        default:
39755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            ymask = 0;
39765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            break;
39775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
39785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    xor_mask = xmask ^ ymask;           /* mark type differences */
39805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    and_mask = xmask & ymask;           /* mark field specification */
39815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* year */
39835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 1)
39845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
39855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 1) {
39865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.year < y->value.date.year)
39875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
39885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.year > y->value.date.year)
39895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
39905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
39915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
39925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* month */
39935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 2)
39945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
39955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 2) {
39965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.mon < y->value.date.mon)
39975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
39985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.mon > y->value.date.mon)
39995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
40005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
40015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* day */
40035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 4)
40045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
40055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 4) {
40065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.day < y->value.date.day)
40075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
40085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.day > y->value.date.day)
40095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
40105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
40115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
40125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    /* time */
40135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    if (xor_mask & 8)
40145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        return 2; /* indeterminate */
40155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    else if (and_mask & 8) {
40165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        if (x->value.date.hour < y->value.date.hour)
40175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
40185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.hour > y->value.date.hour)
40195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
40205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.min < y->value.date.min)
40215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
40225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.min > y->value.date.min)
40235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
40245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.sec < y->value.date.sec)
40255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return -1;
40265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        else if (x->value.date.sec > y->value.date.sec)
40275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return 1;
40285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    }
40295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard
4030070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard    return 0;
4031070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}
4032070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard
4033070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**
40346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveReplaceStrings:
4035478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @x:  a first string value
4036478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @y:  a second string value
40376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @invert: inverts the result if x < y or x > y.
40386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
40396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
40406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is
40416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "replace". I.e. @x could
40426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString".
40436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
40446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
40456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
40466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
40476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
4048478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaComparePreserveReplaceStrings(const xmlChar *x,
4049478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				       const xmlChar *y,
40506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				       int invert)
40516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
40526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
40536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
4054478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4055478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (IS_WSP_REPLACE_CH(*y)) {
4056478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (! IS_WSP_SPACE_CH(*x)) {
4057478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*x - 0x20) < 0) {
40586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
40596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
40606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
40616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
40626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
40636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
40646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
40656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
40666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
40676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
40686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
40696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
4070478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x - *y;
40716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0) {
40726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
40736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
40746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
40756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
40766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
40776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0) {
40786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
40796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
40806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
40816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
40826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
40836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
4084478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	x++;
4085478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	y++;
40866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4087478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0) {
40886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (invert)
40896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(-1);
40906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	else
40916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(1);
40926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4093478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0) {
40946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	if (invert)
40956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(1);
40966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	else
40976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    return(-1);
40986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
40996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
41006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
41016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
41026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
41036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings:
41046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
41056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
41066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
41076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
41086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is
41096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could
41106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString".
41116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
41126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
41136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
41146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
41156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
4116478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaComparePreserveCollapseStrings(const xmlChar *x,
4117478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				        const xmlChar *y,
41186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik					int invert)
41196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
41206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
41216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
41226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    /*
41236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    * Skip leading blank chars of the collapsed string.
41246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    */
4125478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while IS_WSP_BLANK_CH(*y)
4126478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	y++;
41276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
4128478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4129478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if IS_WSP_BLANK_CH(*y) {
4130478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (! IS_WSP_SPACE_CH(*x)) {
41316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		/*
4132478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* The yv character would have been replaced to 0x20.
41336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*/
4134478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*x - 0x20) < 0) {
41356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
41366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
41376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
41386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
41396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
41406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
41416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
41426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
41436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
41446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
41456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4146478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    x++;
4147478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    y++;
41486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    /*
41496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    * Skip contiguous blank chars of the collapsed string.
41506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    */
4151478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    while IS_WSP_BLANK_CH(*y)
4152478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		y++;
41536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
4154478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x++ - *y++;
41556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0) {
41566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
41576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
41586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
41596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
41606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
41616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0) {
41626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (invert)
41636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(-1);
41646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
41656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
41666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
41676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
41686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4169478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0) {
41706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 if (invert)
41716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(-1);
41726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 else
41736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(1);
41746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4175478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0) {
41766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	/*
41776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	* Skip trailing blank chars of the collapsed string.
41786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	*/
4179478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*y)
4180478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    y++;
4181478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (*y != 0) {
41826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (invert)
41836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(1);
41846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    else
41856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(-1);
41866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
41876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
41886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
41896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
41906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
41916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
41926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings:
41936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
41946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
41956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
41966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
41976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is
41986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could
41996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString".
42006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
42016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
42026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
42036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
42046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
4205478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareReplaceCollapseStrings(const xmlChar *x,
4206478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				       const xmlChar *y,
42076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik				       int invert)
42086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
42096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
42106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
42116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    /*
42126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    * Skip leading blank chars of the collapsed string.
42136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    */
4214478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while IS_WSP_BLANK_CH(*y)
4215478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	y++;
42166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
4217478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4218478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if IS_WSP_BLANK_CH(*y) {
4219478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (! IS_WSP_BLANK_CH(*x)) {
42206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		/*
4221478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* The yv character would have been replaced to 0x20.
42226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*/
4223478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*x - 0x20) < 0) {
42246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
42256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
42266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
42276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
42286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
42296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
42306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
42316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
42326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
42336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		}
42346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4235478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    x++;
4236478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    y++;
42376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    /*
42386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    * Skip contiguous blank chars of the collapsed string.
42396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    */
4240478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    while IS_WSP_BLANK_CH(*y)
4241478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		y++;
42426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
4243478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if IS_WSP_BLANK_CH(*x) {
42446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		/*
4245478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* The xv character would have been replaced to 0x20.
42466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		*/
4247478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((0x20 - *y) < 0) {
42486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (invert)
42496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(1);
42506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else
42516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			return(-1);
42526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else {
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	    }
4259478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x++ - *y++;
42606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0)
42616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(-1);
42626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0)
42636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(1);
42646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
42656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4266478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0) {
42676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 if (invert)
42686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(-1);
42696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	 else
42706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	     return(1);
42716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4272478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0) {
42736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	/*
42746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	* Skip trailing blank chars of the collapsed string.
42756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	*/
4276478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	while IS_WSP_BLANK_CH(*y)
4277478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    y++;
4278478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (*y != 0) {
42796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (invert)
42806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(1);
42816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    else
42826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return(-1);
42836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
42846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
42856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
42866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
42876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
42886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
42896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
42906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareReplacedStrings:
42916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first string value
42926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second string value
42936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
42946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values.
42956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
42966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
42976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
42986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
42996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
4300478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareReplacedStrings(const xmlChar *x,
4301478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				const xmlChar *y)
43026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
43036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    int tmp;
43046c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
4305478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4306478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if IS_WSP_BLANK_CH(*y) {
4307478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (! IS_WSP_BLANK_CH(*x)) {
4308478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*x - 0x20) < 0)
43096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    		    return(-1);
43106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
43116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
43126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
43136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	} else {
4314478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if IS_WSP_BLANK_CH(*x) {
4315478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((0x20 - *y) < 0)
43166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    		    return(-1);
43176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		else
43186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return(1);
43196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4320478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x - *y;
43216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp < 0)
43226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    		return(-1);
43236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (tmp > 0)
43246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    		return(1);
43256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	}
4326478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	x++;
4327478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	y++;
43286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
4329478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0)
43306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        return(1);
4331478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0)
43326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        return(-1);
43336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    return(0);
43346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
43356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
43366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
4337c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaCompareNormStrings:
4338c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @x:  a first string value
4339c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @y:  a second string value
4340c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
4341c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Compare 2 string for their normalized values.
4342c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
4343c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in
4344c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * case of error
4345c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */
4346c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int
4347478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareNormStrings(const xmlChar *x,
4348478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    const xmlChar *y) {
4349c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    int tmp;
4350c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
4351478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while (IS_BLANK_CH(*x)) x++;
4352478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while (IS_BLANK_CH(*y)) y++;
4353478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    while ((*x != 0) && (*y != 0)) {
4354478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (IS_BLANK_CH(*x)) {
4355478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (!IS_BLANK_CH(*y)) {
4356478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		tmp = *x - *y;
4357c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(tmp);
4358c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    }
4359478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    while (IS_BLANK_CH(*x)) x++;
4360478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    while (IS_BLANK_CH(*y)) y++;
4361c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	} else {
4362478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    tmp = *x++ - *y++;
4363c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (tmp < 0)
4364c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(-1);
4365c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (tmp > 0)
4366c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(1);
4367c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	}
4368c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
4369478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*x != 0) {
4370478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	while (IS_BLANK_CH(*x)) x++;
4371478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (*x != 0)
4372c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    return(1);
4373c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
4374478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if (*y != 0) {
4375478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	while (IS_BLANK_CH(*y)) y++;
4376478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	if (*y != 0)
4377c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    return(-1);
4378c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
4379c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    return(0);
4380c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard}
4381c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
4382c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/**
4383b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCompareFloats:
4384b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @x:  a first float or double value
4385b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @y:  a second float or double value
4386b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
4387b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Compare 2 values
4388b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *
4389b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
4390b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * case of error
4391b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */
4392b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int
4393b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) {
4394b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    double d1, d2;
4395b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4396b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if ((x == NULL) || (y == NULL))
4397b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
4398b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4399b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
4400b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * Cast everything to doubles.
4401b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
4402b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (x->type == XML_SCHEMAS_DOUBLE)
4403b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d1 = x->value.d;
4404b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else if (x->type == XML_SCHEMAS_FLOAT)
4405b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d1 = x->value.f;
4406b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else
4407b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
4408b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4409b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (y->type == XML_SCHEMAS_DOUBLE)
4410b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d2 = y->value.d;
4411b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else if (y->type == XML_SCHEMAS_FLOAT)
4412b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	d2 = y->value.f;
4413b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    else
4414b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-2);
4415b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4416b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
4417b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * Check for special cases.
4418b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
4419b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (xmlXPathIsNaN(d1)) {
4420b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (xmlXPathIsNaN(d2))
4421b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
4422b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(1);
4423b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
4424b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (xmlXPathIsNaN(d2))
4425b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-1);
4426b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == xmlXPathPINF) {
4427b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (d2 == xmlXPathPINF)
4428b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
4429b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(1);
4430b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
4431b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d2 == xmlXPathPINF)
4432b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(-1);
4433b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == xmlXPathNINF) {
4434b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	if (d2 == xmlXPathNINF)
4435b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return(0);
4436b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(-1);
4437b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    }
4438b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d2 == xmlXPathNINF)
4439b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard        return(1);
4440b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4441b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    /*
4442b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * basic tests, the last one we should have equality, but
4443b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * portability is more important than speed and handling
4444b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     * NaN or Inf in a portable way is always a challenge, so ...
4445b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard     */
4446b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 < d2)
4447b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(-1);
4448b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 > d2)
4449b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(1);
4450b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    if (d1 == d2)
4451b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	return(0);
4452b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard    return(2);
4453b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard}
4454b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
4455b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/**
44564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareValues:
44574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x:  a first value
44586c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xvalue: the first value as a string (optional)
44596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xwtsp: the whitespace type
44604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y:  a second value
44616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xvalue: the second value as a string (optional)
44626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @ywtsp: the whitespace type
44634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
44644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 values
44654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
44664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, 3 if not
44674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * comparable and -2 in case of error
44684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
44696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int
44706c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaCompareValuesInternal(xmlSchemaValType xtype,
44716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValPtr x,
44726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *xvalue,
44736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType xws,
44746c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValType ytype,
44756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			       xmlSchemaValPtr y,
44766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *yvalue,
4477478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType yws)
4478478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{
44796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    switch (xtype) {
448080b19092f24410a6b869abf519227686e8f207caDaniel Veillard	case XML_SCHEMAS_UNKNOWN:
44812f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack	case XML_SCHEMAS_ANYTYPE:
448280b19092f24410a6b869abf519227686e8f207caDaniel Veillard	    return(-2);
448380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_INTEGER:
448480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NPINTEGER:
448580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NINTEGER:
448680b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NNINTEGER:
448780b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_PINTEGER:
448880b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_INT:
448980b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_UINT:
449080b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_LONG:
449180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ULONG:
449280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_SHORT:
449380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_USHORT:
449480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_BYTE:
449580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_UBYTE:
44964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMAS_DECIMAL:
44976c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
44986c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
44996c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ytype == xtype)
450080b19092f24410a6b869abf519227686e8f207caDaniel Veillard		return(xmlSchemaCompareDecimals(x, y));
45016c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((ytype == XML_SCHEMAS_DECIMAL) ||
45026c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_INTEGER) ||
45036c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_NPINTEGER) ||
45046c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_NINTEGER) ||
45056c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_NNINTEGER) ||
45066c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_PINTEGER) ||
45076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_INT) ||
45086c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_UINT) ||
45096c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_LONG) ||
45106c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_ULONG) ||
45116c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_SHORT) ||
45126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_USHORT) ||
45136c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_BYTE) ||
45146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_UBYTE))
45154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(xmlSchemaCompareDecimals(x, y));
45165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard	    return(-2);
4517070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard        case XML_SCHEMAS_DURATION:
45186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
45196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
4520478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (ytype == XML_SCHEMAS_DURATION)
4521070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard                return(xmlSchemaCompareDurations(x, y));
45225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return(-2);
45235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_TIME:
45245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GDAY:
45255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTH:
45265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GMONTHDAY:
45275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEAR:
45285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_GYEARMONTH:
45295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATE:
45305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard        case XML_SCHEMAS_DATETIME:
45316c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
45326c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
45336c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if ((ytype == XML_SCHEMAS_DATETIME)  ||
45346c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_TIME)      ||
45356c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GDAY)      ||
45366c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GMONTH)    ||
45376c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GMONTHDAY) ||
45386c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GYEAR)     ||
45396c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_DATE)      ||
45406c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_GYEARMONTH))
45415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard                return (xmlSchemaCompareDates(x, y));
45425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard            return (-2);
45432ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	/*
45442ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	* Note that we will support comparison of string types against
45452ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	* anySimpleType as well.
45462ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	*/
45472ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik	case XML_SCHEMAS_ANYSIMPLETYPE:
45486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_STRING:
45496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        case XML_SCHEMAS_NORMSTRING:
455080b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_TOKEN:
455180b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_LANGUAGE:
455280b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NMTOKEN:
455380b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NAME:
455480b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_NCNAME:
455580b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ID:
455680b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_IDREF:
455780b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ENTITY:
455880b19092f24410a6b869abf519227686e8f207caDaniel Veillard        case XML_SCHEMAS_ANYURI:
45596c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	{
45606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    const xmlChar *xv, *yv;
45616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
45626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (x == NULL)
45636c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		xv = xvalue;
45646c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    else
45656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		xv = x->value.str;
45666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (y == NULL)
45676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		yv = yvalue;
45686c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    else
45696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		yv = y->value.str;
45706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    /*
45716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    * TODO: Compare those against QName.
45726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    */
45736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ytype == XML_SCHEMAS_QNAME) {
45746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		TODO
45756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		if (y == NULL)
45766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    return(-2);
45776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		return (-2);
45786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
45796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if ((ytype == XML_SCHEMAS_ANYSIMPLETYPE) ||
45806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_STRING) ||
45816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		(ytype == XML_SCHEMAS_NORMSTRING) ||
45826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_TOKEN) ||
45836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_LANGUAGE) ||
45846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_NMTOKEN) ||
45856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_NAME) ||
45866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_NCNAME) ||
45876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_ID) ||
45886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_IDREF) ||
45896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_ENTITY) ||
45906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_ANYURI)) {
45916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
45926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		if (xws == XML_SCHEMA_WHITESPACE_PRESERVE) {
45936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
45946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) {
45956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			/* TODO: What about x < y or x > y. */
45966c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			if (xmlStrEqual(xv, yv))
45976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			    return (0);
45986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			else
45996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik			    return (2);
46006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    } else if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
46016c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaComparePreserveReplaceStrings(xv, yv, 0));
46026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    else if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
46036c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaComparePreserveCollapseStrings(xv, yv, 0));
46046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
46056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else if (xws == XML_SCHEMA_WHITESPACE_REPLACE) {
46066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
46076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE)
46086c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaComparePreserveReplaceStrings(yv, xv, 1));
46096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
46106c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaCompareReplacedStrings(xv, yv));
46116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
46126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaCompareReplaceCollapseStrings(xv, yv, 0));
46136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
46146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else if (xws == XML_SCHEMA_WHITESPACE_COLLAPSE) {
46156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
46166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_PRESERVE)
46176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaComparePreserveCollapseStrings(yv, xv, 1));
46186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_REPLACE)
46196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaCompareReplaceCollapseStrings(yv, xv, 1));
46206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE)
46216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			return (xmlSchemaCompareNormStrings(xv, yv));
46226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		} else
46236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik		    return (-2);
46246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
46256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    }
4626c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard            return (-2);
46276c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	}
4628e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard        case XML_SCHEMAS_QNAME:
4629c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_NOTATION:
46306c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
46316c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
4632c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik            if ((ytype == XML_SCHEMAS_QNAME) ||
4633c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		(ytype == XML_SCHEMAS_NOTATION)) {
4634e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) &&
4635e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    (xmlStrEqual(x->value.qname.uri, y->value.qname.uri)))
4636e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		    return(0);
4637e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		return(2);
4638e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    }
4639e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard	    return (-2);
4640c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_FLOAT:
4641c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_DOUBLE:
46426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
46436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
46446c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if ((ytype == XML_SCHEMAS_FLOAT) ||
46456c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik                (ytype == XML_SCHEMAS_DOUBLE))
4646b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard                return (xmlSchemaCompareFloats(x, y));
4647b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard            return (-2);
4648c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_BOOLEAN:
46496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
46506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
46516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if (ytype == XML_SCHEMAS_BOOLEAN) {
4652b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (x->value.b == y->value.b)
4653b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    return(0);
4654b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		if (x->value.b == 0)
4655b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		    return(-1);
4656b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard		return(1);
4657b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    }
4658b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard	    return (-2);
4659560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard        case XML_SCHEMAS_HEXBINARY:
46606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
46616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
46626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if (ytype == XML_SCHEMAS_HEXBINARY) {
466370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	        if (x->value.hex.total == y->value.hex.total) {
466470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    int ret = xmlStrcmp(x->value.hex.str, y->value.hex.str);
466570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    if (ret > 0)
466670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard			return(1);
466770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    else if (ret == 0)
466870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard			return(0);
466970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		}
467070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		else if (x->value.hex.total > y->value.hex.total)
467170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		    return(1);
467270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard
467370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		return(-1);
467470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard            }
4675560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard            return (-2);
46761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard        case XML_SCHEMAS_BASE64BINARY:
46776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if ((x == NULL) || (y == NULL))
46786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-2);
46796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik            if (ytype == XML_SCHEMAS_BASE64BINARY) {
46801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                if (x->value.base64.total == y->value.base64.total) {
46811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    int ret = xmlStrcmp(x->value.base64.str,
46821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		                        y->value.base64.str);
46831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    if (ret > 0)
46841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        return(1);
46851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    else if (ret == 0)
46861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                        return(0);
46871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                }
46881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else if (x->value.base64.total > y->value.base64.total)
46891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    return(1);
46901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                else
46911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard                    return(-1);
46921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard            }
46936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik            return (-2);
4694c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_IDREFS:
4695c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_ENTITIES:
4696c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard        case XML_SCHEMAS_NMTOKENS:
4697c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    TODO
4698c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    break;
46994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
47005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard    return -2;
47014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
47024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
47034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/**
47046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValues:
47056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first value
47066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second value
47076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
47086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values
47096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
47106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
47116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
47126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
47136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint
47146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) {
47156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    xmlSchemaWhitespaceValueType xws, yws;
47166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
47175e094143e423c01739ac9221f371846fd290be4eDaniel Veillard    if ((x == NULL) || (y == NULL))
47185e094143e423c01739ac9221f371846fd290be4eDaniel Veillard        return(-2);
47196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (x->type == XML_SCHEMAS_STRING)
47206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	xws = XML_SCHEMA_WHITESPACE_PRESERVE;
47216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else if (x->type == XML_SCHEMAS_NORMSTRING)
47226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        xws = XML_SCHEMA_WHITESPACE_REPLACE;
47236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else
47246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        xws = XML_SCHEMA_WHITESPACE_COLLAPSE;
47256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
47266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    if (y->type == XML_SCHEMAS_STRING)
47276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	yws = XML_SCHEMA_WHITESPACE_PRESERVE;
47286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else if (x->type == XML_SCHEMAS_NORMSTRING)
47296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        yws = XML_SCHEMA_WHITESPACE_REPLACE;
47306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    else
47316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik        yws = XML_SCHEMA_WHITESPACE_COLLAPSE;
47326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
47336c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type,
47346c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	y, NULL, yws));
47356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
47366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
47376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
47386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValuesWhtsp:
47396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x:  a first value
47406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xws: the whitespace value of x
47416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y:  a second value
47426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @yws: the whitespace value of y
47436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
47446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values
47456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
47466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
47476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error
47486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
47496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint
47506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValuesWhtsp(xmlSchemaValPtr x,
47516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaWhitespaceValueType xws,
47526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaValPtr y,
47536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaWhitespaceValueType yws)
47546c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{
47559dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik    if ((x == NULL) || (y == NULL))
47569dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik	return(-2);
47576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type,
47586c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	y, NULL, yws));
47596c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik}
47606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
47616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/**
47626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaCompareValuesWhtspExt:
47636c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @x:  a first value
47646c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xws: the whitespace value of x
47656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @y:  a second value
47666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @yws: the whitespace value of y
47676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
47686c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Compare 2 values
47696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
47706c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
47716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * case of error
47726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */
47736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikstatic int
47746c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaCompareValuesWhtspExt(xmlSchemaValType xtype,
47756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValPtr x,
47766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *xvalue,
47776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType xws,
47786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValType ytype,
47796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaValPtr y,
47806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *yvalue,
47816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType yws)
47826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{
47836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    return(xmlSchemaCompareValuesInternal(xtype, x, xvalue, xws, ytype, y,
47846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	yvalue, yws));
47856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
47866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
47876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
4788c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaNormLen:
4789c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @value:  a string
4790c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
4791c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Computes the UTF8 length of the normalized value of the string
4792c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard *
4793c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns the length or -1 in case of error.
4794c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */
4795c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int
4796c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaNormLen(const xmlChar *value) {
4797c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    const xmlChar *utf;
4798c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    int ret = 0;
4799c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
4800c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    if (value == NULL)
4801c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	return(-1);
4802c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    utf = value;
480376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack    while (IS_BLANK_CH(*utf)) utf++;
4804c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    while (*utf != 0) {
4805c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	if (utf[0] & 0x80) {
4806c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if ((utf[1] & 0xc0) != 0x80)
4807c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		return(-1);
4808c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if ((utf[0] & 0xe0) == 0xe0) {
4809c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		if ((utf[2] & 0xc0) != 0x80)
4810c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    return(-1);
4811c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		if ((utf[0] & 0xf0) == 0xf0) {
4812c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80)
4813c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard			return(-1);
4814c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    utf += 4;
4815c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		} else {
4816c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		    utf += 3;
4817c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		}
4818c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    } else {
4819c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		utf += 2;
4820c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    }
482176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	} else if (IS_BLANK_CH(*utf)) {
482276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack	    while (IS_BLANK_CH(*utf)) utf++;
4823c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    if (*utf == 0)
4824c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard		break;
4825c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	} else {
4826c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	    utf++;
4827c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	}
4828c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard	ret++;
4829c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    }
4830c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard    return(ret);
4831c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard}
4832c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard
48336927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard/**
48346927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaGetFacetValueAsULong:
48356927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * @facet: an schemas type facet
48366927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard *
48376927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Extract the value of a facet
48386927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard *
48396927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Returns the value as a long
48406927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard */
4841c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardunsigned long
4842c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaGetFacetValueAsULong(xmlSchemaFacetPtr facet)
4843c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{
4844c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    /*
4845c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    * TODO: Check if this is a decimal.
4846c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    */
4847094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack    if (facet == NULL)
4848094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack        return 0;
4849c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    return ((unsigned long) facet->val->value.decimal.lo);
4850c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
4851c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
4852c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/**
485301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateListSimpleTypeFacet:
485401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facet:  the facet to check
485501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @value:  the lexical repr of the value to validate
485601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @actualLen:  the number of list items
485701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @expectedLen: the resulting expected number of list items
485801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
485901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Checks the value of a list simple type against a facet.
486001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *
486101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 0 if the value is valid, a positive error code
486201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * number otherwise and -1 in case of an internal error.
486301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */
486401fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint
486501fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaValidateListSimpleTypeFacet(xmlSchemaFacetPtr facet,
486601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     const xmlChar *value,
486701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     unsigned long actualLen,
486801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard				     unsigned long *expectedLen)
486901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{
4870ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard    if (facet == NULL)
4871ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard        return(-1);
487201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    /*
487301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * TODO: Check if this will work with large numbers.
487401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    * (compare value.decimal.mi and value.decimal.hi as well?).
487501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    */
487601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
487701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen != facet->val->value.decimal.lo) {
4878478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (expectedLen != NULL)
4879c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
488001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_LENGTH_VALID);
488101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
488201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
488301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen < facet->val->value.decimal.lo) {
4884478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (expectedLen != NULL)
4885c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
488601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_MINLENGTH_VALID);
488701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
488801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MAXLENGTH) {
488901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	if (actualLen > facet->val->value.decimal.lo) {
4890478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (expectedLen != NULL)
4891c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		*expectedLen = facet->val->value.decimal.lo;
489201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return (XML_SCHEMAV_CVC_MAXLENGTH_VALID);
489301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	}
489401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    } else
489501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	/*
489601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	* NOTE: That we can pass NULL as xmlSchemaValPtr to
489701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	* xmlSchemaValidateFacet, since the remaining facet types
489801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	* are: XML_SCHEMA_FACET_PATTERN, XML_SCHEMA_FACET_ENUMERATION.
489901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	*/
490001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	return(xmlSchemaValidateFacet(NULL, facet, value, NULL));
490101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard    return (0);
490201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard}
490301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard
490401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/**
49056927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaValidateLengthFacet:
4906c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type:  the built-in type
4907c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @facet:  the facet to check
4908c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value:  the lexical repr. of the value to be validated
4909c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val:  the precomputed value
4910478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value
4911c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @length: the actual length of the value
4912c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
4913c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength"
4914c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * facet; sets @length to the computed length of @value.
4915c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *
4916c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if the value is valid, a positive error code
4917c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * otherwise and -1 in case of an internal or API error.
4918c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */
4919478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikstatic int
4920478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacetInternal(xmlSchemaFacetPtr facet,
4921478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				     xmlSchemaTypeType valType,
4922478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				     const xmlChar *value,
4923478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				     xmlSchemaValPtr val,
4924478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				     unsigned long *length,
4925478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				     xmlSchemaWhitespaceValueType ws)
4926c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{
4927c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    unsigned int len = 0;
4928c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
4929478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    if ((length == NULL) || (facet == NULL))
4930ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard        return (-1);
4931c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    *length = 0;
4932c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((facet->type != XML_SCHEMA_FACET_LENGTH) &&
4933c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->type != XML_SCHEMA_FACET_MAXLENGTH) &&
4934c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->type != XML_SCHEMA_FACET_MINLENGTH))
4935c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	return (-1);
4936c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
4937478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    /*
4938478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    * TODO: length, maxLength and minLength must be of type
4939478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    * nonNegativeInteger only. Check if decimal is used somehow.
4940478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    */
4941c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((facet->val == NULL) ||
4942c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	((facet->val->type != XML_SCHEMAS_DECIMAL) &&
4943c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
4944c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	(facet->val->value.decimal.frac != 0)) {
4945c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	return(-1);
4946c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
4947c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY))
4948c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	len = val->value.hex.total;
4949c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY))
4950c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	len = val->value.base64.total;
4951c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    else {
4952478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	switch (valType) {
4953478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    case XML_SCHEMAS_STRING:
4954c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NORMSTRING:
4955478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) {
4956478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    /*
4957478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * This is to ensure API compatibility with the old
4958478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * xmlSchemaValidateLengthFacet(). Anyway, this was and
4959478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * is not the correct handling.
4960478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * TODO: Get rid of this case somehow.
4961478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    */
4962478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    if (valType == XML_SCHEMAS_STRING)
4963478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			len = xmlUTF8Strlen(value);
4964478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    else
4965478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			len = xmlSchemaNormLen(value);
4966478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		} else if (value != NULL) {
4967478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
4968478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			len = xmlSchemaNormLen(value);
4969478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    else
4970478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    /*
4971478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    * Should be OK for "preserve" as well.
4972478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    */
4973478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    len = xmlUTF8Strlen(value);
4974478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		}
4975478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		break;
4976478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    case XML_SCHEMAS_IDREF:
4977c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_TOKEN:
4978c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_LANGUAGE:
4979c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NMTOKEN:
4980c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NAME:
4981c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_NCNAME:
4982bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik	    case XML_SCHEMAS_ID:
4983bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik		/*
4984bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik		* FIXME: What exactly to do with anyURI?
4985478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*/
4986c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    case XML_SCHEMAS_ANYURI:
4987c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		if (value != NULL)
4988478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    len = xmlSchemaNormLen(value);
4989c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		break;
4990bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik	    case XML_SCHEMAS_QNAME:
4991bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik 	    case XML_SCHEMAS_NOTATION:
4992bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik 		/*
49934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		* For QName and NOTATION, those facets are
49944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		* deprecated and should be ignored.
4995bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik 		*/
4996bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik		return (0);
4997c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    default:
4998c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard		TODO
4999c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	}
5000c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
5001c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    *length = (unsigned long) len;
5002478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    /*
5003478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    * TODO: Return the whole expected value, i.e. "lo", "mi" and "hi".
5004478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    */
5005c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
5006c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len != facet->val->value.decimal.lo)
5007c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_LENGTH_VALID);
5008c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
5009c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len < facet->val->value.decimal.lo)
5010c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_MINLENGTH_VALID);
5011c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    } else {
5012c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	if (len > facet->val->value.decimal.lo)
5013c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXLENGTH_VALID);
5014c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    }
5015c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
5016c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard    return (0);
5017c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard}
5018c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard
5019c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/**
5020478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateLengthFacet:
5021478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @type:  the built-in type
5022478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @facet:  the facet to check
5023478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @value:  the lexical repr. of the value to be validated
5024478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @val:  the precomputed value
5025478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @length: the actual length of the value
5026478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *
5027478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Checka a value against a "length", "minLength" and "maxLength"
5028478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * facet; sets @length to the computed length of @value.
5029478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *
5030478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Returns 0 if the value is valid, a positive error code
5031478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * otherwise and -1 in case of an internal or API error.
5032478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */
5033478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikint
5034478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacet(xmlSchemaTypePtr type,
5035478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			     xmlSchemaFacetPtr facet,
5036478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			     const xmlChar *value,
5037478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			     xmlSchemaValPtr val,
5038478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			     unsigned long *length)
5039478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{
5040cc5e2330ef2432493afce6566d3651195366d822Daniel Veillard    if (type == NULL)
5041cc5e2330ef2432493afce6566d3651195366d822Daniel Veillard        return(-1);
5042478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    return (xmlSchemaValidateLengthFacetInternal(facet,
5043478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	type->builtInType, value, val, length,
5044478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	XML_SCHEMA_WHITESPACE_UNKNOWN));
5045478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik}
5046478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik
5047478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik/**
5048478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateLengthFacetWhtsp:
5049478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @facet:  the facet to check
5050478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @valType:  the built-in type
5051478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @value:  the lexical repr. of the value to be validated
5052478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @val:  the precomputed value
5053478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value
5054478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @length: the actual length of the value
5055478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *
5056478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Checka a value against a "length", "minLength" and "maxLength"
5057478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * facet; sets @length to the computed length of @value.
5058478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *
5059478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Returns 0 if the value is valid, a positive error code
5060478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * otherwise and -1 in case of an internal or API error.
5061478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */
5062478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikint
5063478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacetWhtsp(xmlSchemaFacetPtr facet,
5064478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  xmlSchemaValType valType,
5065478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  const xmlChar *value,
5066478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  xmlSchemaValPtr val,
5067478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  unsigned long *length,
5068478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				  xmlSchemaWhitespaceValueType ws)
5069478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{
5070478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    return (xmlSchemaValidateLengthFacetInternal(facet, valType, value, val,
5071478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	length, ws));
5072478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik}
5073478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik
5074478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik/**
50756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetInternal:
50764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @facet:  the facet to check
5077478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @fws: the whitespace type of the facet's value
5078478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @valType: the built-in type of the value
50794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value:  the lexical repr of the value to validate
50804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val:  the precomputed value
5081478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value
50824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
50834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Check a value against a facet condition
50844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *
50854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if the element is schemas valid, a positive error code
50864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard *     number otherwise and -1 in case of internal or API error.
50874255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */
50886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikstatic int
50896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaValidateFacetInternal(xmlSchemaFacetPtr facet,
50906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType fws,
5091478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			       xmlSchemaValType valType,
50926c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       const xmlChar *value,
5093478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			       xmlSchemaValPtr val,
50946c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			       xmlSchemaWhitespaceValueType ws)
50954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{
50964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    int ret;
50974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
50986c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    if (facet == NULL)
50996c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	return(-1);
51006c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
51014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    switch (facet->type) {
51024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMA_FACET_PATTERN:
51036c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    /*
51046c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    * NOTE that for patterns, the @value needs to be the normalized
51056c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    * value, *not* the lexical initial value or the canonical value.
51066c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    */
51076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (value == NULL)
51086c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		return(-1);
51094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    ret = xmlRegexpExec(facet->regexp, value);
51104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == 1)
51114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(0);
51126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == 0)
511301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		return(XML_SCHEMAV_CVC_PATTERN_VALID);
51144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    return(ret);
51154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	case XML_SCHEMA_FACET_MAXEXCLUSIVE:
51164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
51176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == -2)
51184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(-1);
51194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    if (ret == -1)
51204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard		return(0);
512101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID);
5122070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MAXINCLUSIVE:
5123070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
51246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == -2)
5125070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
5126070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((ret == -1) || (ret == 0))
5127070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
512801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID);
5129070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MINEXCLUSIVE:
5130070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
51316c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == -2)
5132070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
5133070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if (ret == 1)
5134070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
513501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID);
5136070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	case XML_SCHEMA_FACET_MININCLUSIVE:
5137070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    ret = xmlSchemaCompareValues(val, facet->val);
51386c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    if (ret == -2)
5139070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(-1);
5140070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard	    if ((ret == 1) || (ret == 0))
5141070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard		return(0);
514201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_MININCLUSIVE_VALID);
51438651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard	case XML_SCHEMA_FACET_WHITESPACE:
51448bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    /* TODO whitespaces */
514501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    /*
514601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * NOTE: Whitespace should be handled to normalize
514701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * the value to be validated against a the facets;
514801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    * not to normalize the value in-between.
514901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    */
51508651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard	    return(0);
51518bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case  XML_SCHEMA_FACET_ENUMERATION:
5152478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) {
5153478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		/*
5154478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* This is to ensure API compatibility with the old
5155478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* xmlSchemaValidateFacet().
5156478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		* TODO: Get rid of this case.
5157478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*/
51586c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		if ((facet->value != NULL) &&
51596c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    (xmlStrEqual(facet->value, value)))
51606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    return(0);
51616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    } else {
51626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		ret = xmlSchemaCompareValuesWhtspExt(facet->val->type,
51636c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    facet->val, facet->value, fws, valType, val,
51646c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    value, ws);
51656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		if (ret == -2)
51666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    return(-1);
51676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		if (ret == 0)
51686c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		    return(0);
51696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    }
517001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	    return(XML_SCHEMAV_CVC_ENUMERATION_VALID);
51718bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case XML_SCHEMA_FACET_LENGTH:
5172aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    /*
5173aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    * SPEC (1.3) "if {primitive type definition} is QName or NOTATION,
5174aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    * then any {value} is facet-valid."
5175aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    */
5176aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    if ((valType == XML_SCHEMAS_QNAME) ||
5177aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		(valType == XML_SCHEMAS_NOTATION))
5178aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		return (0);
5179aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    /* No break on purpose. */
5180e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard	case XML_SCHEMA_FACET_MAXLENGTH:
51818bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	case XML_SCHEMA_FACET_MINLENGTH: {
51828bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    unsigned int len = 0;
5183e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard
51844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik	    if ((valType == XML_SCHEMAS_QNAME) ||
51854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		(valType == XML_SCHEMAS_NOTATION))
51864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik		return (0);
5187478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    /*
5188478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    * TODO: length, maxLength and minLength must be of type
5189478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    * nonNegativeInteger only. Check if decimal is used somehow.
5190478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    */
51918bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    if ((facet->val == NULL) ||
5192e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		((facet->val->type != XML_SCHEMAS_DECIMAL) &&
5193e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
51948bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		(facet->val->value.decimal.frac != 0)) {
51958bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard		return(-1);
51968bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    }
5197560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY))
519870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard		len = val->value.hex.total;
51991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	    else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY))
52001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard		len = val->value.base64.total;
52011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard	    else {
52026c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		switch (valType) {
5203478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    case XML_SCHEMAS_STRING:
5204478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    case XML_SCHEMAS_NORMSTRING:
5205478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) {
5206478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    /*
5207478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    * This is to ensure API compatibility with the old
5208478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    * xmlSchemaValidateFacet(). Anyway, this was and
5209478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    * is not the correct handling.
5210478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    * TODO: Get rid of this case somehow.
5211478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    */
5212478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    if (valType == XML_SCHEMAS_STRING)
5213478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				len = xmlUTF8Strlen(value);
5214478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    else
5215478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				len = xmlSchemaNormLen(value);
5216478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			} else if (value != NULL) {
5217478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
5218478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				len = xmlSchemaNormLen(value);
5219478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    else
5220478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				/*
5221478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				* Should be OK for "preserve" as well.
5222478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				*/
5223478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik				len = xmlUTF8Strlen(value);
5224478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			}
5225478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			break;
5226478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    	    case XML_SCHEMAS_IDREF:
5227560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_TOKEN:
5228560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_LANGUAGE:
5229560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NMTOKEN:
5230560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NAME:
5231560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_NCNAME:
5232560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    case XML_SCHEMAS_ID:
523301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    case XML_SCHEMAS_ANYURI:
5234478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			if (value != NULL)
5235478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    	    len = xmlSchemaNormLen(value);
5236478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    	break;
5237560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		    default:
5238560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		        TODO
523970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard	    	}
52408bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    }
52418bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    if (facet->type == XML_SCHEMA_FACET_LENGTH) {
5242e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len != facet->val->value.decimal.lo)
524301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_LENGTH_VALID);
52448bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) {
5245e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len < facet->val->value.decimal.lo)
524601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_MINLENGTH_VALID);
52478bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    } else {
5248e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard		if (len > facet->val->value.decimal.lo)
524901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_MAXLENGTH_VALID);
5250e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard	    }
52518bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	    break;
52528bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard	}
5253560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	case XML_SCHEMA_FACET_TOTALDIGITS:
5254560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	case XML_SCHEMA_FACET_FRACTIONDIGITS:
5255560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
5256560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((facet->val == NULL) ||
5257560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		((facet->val->type != XML_SCHEMAS_DECIMAL) &&
5258560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (facet->val->type != XML_SCHEMAS_NNINTEGER)) ||
5259560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		(facet->val->value.decimal.frac != 0)) {
5260560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		return(-1);
5261560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
5262560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if ((val == NULL) ||
5263560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		((val->type != XML_SCHEMAS_DECIMAL) &&
5264560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_INTEGER) &&
5265560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NPINTEGER) &&
5266560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NINTEGER) &&
5267560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_NNINTEGER) &&
5268560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_PINTEGER) &&
5269560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_INT) &&
5270560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_UINT) &&
5271560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_LONG) &&
5272560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_ULONG) &&
5273560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_SHORT) &&
5274560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_USHORT) &&
5275560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_BYTE) &&
5276560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		 (val->type != XML_SCHEMAS_UBYTE))) {
5277560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard		return(-1);
5278560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
5279560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) {
5280560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	        if (val->value.decimal.total > facet->val->value.decimal.lo)
528101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard	            return(XML_SCHEMAV_CVC_TOTALDIGITS_VALID);
5282560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard
5283560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) {
5284560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	        if (val->value.decimal.frac > facet->val->value.decimal.lo)
528501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard		    return(XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID);
5286560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    }
5287560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard	    break;
52884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	default:
52894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard	    TODO
52904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    }
52914255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard    return(0);
5292b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard
52934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}
52944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard
52956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/**
52966c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacet:
52976c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @base:  the base type
52986c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @facet:  the facet to check
52996c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @value:  the lexical repr of the value to validate
53006c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @val:  the precomputed value
53016c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
53026c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Check a value against a facet condition
53036c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
53046c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns 0 if the element is schemas valid, a positive error code
53056c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *     number otherwise and -1 in case of internal or API error.
53066c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */
53076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikint
53089dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. BuchcikxmlSchemaValidateFacet(xmlSchemaTypePtr base,
53096c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	               xmlSchemaFacetPtr facet,
53106c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	               const xmlChar *value,
53116c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik		       xmlSchemaValPtr val)
53126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{
53136c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    /*
53146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    * This tries to ensure API compatibility regarding the old
53156c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    * xmlSchemaValidateFacet() and the new xmlSchemaValidateFacetInternal() and
53166c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    * xmlSchemaValidateFacetWhtsp().
53176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik    */
53189dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik    if (val != NULL)
53196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	return(xmlSchemaValidateFacetInternal(facet,
53209dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik	    XML_SCHEMA_WHITESPACE_UNKNOWN, val->type, value, val,
53216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	    XML_SCHEMA_WHITESPACE_UNKNOWN));
53229dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik    else if (base != NULL)
53236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik	return(xmlSchemaValidateFacetInternal(facet,
53249dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik	    XML_SCHEMA_WHITESPACE_UNKNOWN, base->builtInType, value, val,
5325478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    XML_SCHEMA_WHITESPACE_UNKNOWN));
53269dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik    return(-1);
53276c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik}
53286c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
53296c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/**
53306c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetWhtsp:
53316c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @facet:  the facet to check
53326c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @fws: the whitespace type of the facet's value
53336c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @valType: the built-in type of the value
53346c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @value:  the lexical (or normalized for pattern) repr of the value to validate
53356c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @val:  the precomputed value
53366c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @ws: the whitespace type of the value
53376c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
53386c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Check a value against a facet condition. This takes value normalization
53396c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * according to the specified whitespace types into account.
53406c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Note that @value needs to be the *normalized* value if the facet
53416c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * is of type "pattern".
53426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *
53436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns 0 if the element is schemas valid, a positive error code
53446c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *     number otherwise and -1 in case of internal or API error.
53456c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */
53466c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikint
53476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaValidateFacetWhtsp(xmlSchemaFacetPtr facet,
53486c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaWhitespaceValueType fws,
5349478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    xmlSchemaValType valType,
53506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    const xmlChar *value,
5351478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			    xmlSchemaValPtr val,
53526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik			    xmlSchemaWhitespaceValueType ws)
53536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{
53546c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik     return(xmlSchemaValidateFacetInternal(facet, fws, valType,
5355478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	 value, val, ws));
53566c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik}
53576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik
5358c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#if 0
5359c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifndef DBL_DIG
5360c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define DBL_DIG 16
5361c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif
5362c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifndef DBL_EPSILON
5363c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define DBL_EPSILON 1E-9
5364c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif
5365c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5366c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define INTEGER_DIGITS DBL_DIG
5367c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define FRACTION_DIGITS (DBL_DIG + 1)
5368c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define EXPONENT_DIGITS (3 + 2)
5369c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5370c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik/**
5371c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * xmlXPathFormatNumber:
5372c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @number:     number to format
5373c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @buffer:     output buffer
5374c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @buffersize: size of output buffer
5375c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
5376c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Convert the number into a string representation.
5377c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */
5378c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcikstatic void
5379c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. BuchcikxmlSchemaFormatFloat(double number, char buffer[], int buffersize)
5380c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik{
5381c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    switch (xmlXPathIsInf(number)) {
5382c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    case 1:
5383c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	if (buffersize > (int)sizeof("INF"))
5384c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    snprintf(buffer, buffersize, "INF");
5385c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	break;
5386c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    case -1:
5387c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	if (buffersize > (int)sizeof("-INF"))
5388c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    snprintf(buffer, buffersize, "-INF");
5389c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	break;
5390c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    default:
5391c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	if (xmlXPathIsNaN(number)) {
5392c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (buffersize > (int)sizeof("NaN"))
5393c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf(buffer, buffersize, "NaN");
5394c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	} else if (number == 0) {
5395c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    snprintf(buffer, buffersize, "0.0E0");
5396c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	} else {
5397c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /* 3 is sign, decimal point, and terminating zero */
5398c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    char work[DBL_DIG + EXPONENT_DIGITS + 3];
5399c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    int integer_place, fraction_place;
5400c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    char *ptr;
5401c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    char *after_fraction;
5402c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    double absolute_value;
5403c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    int size;
5404c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5405c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    absolute_value = fabs(number);
5406c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5407c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /*
5408c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	     * Result is in work, and after_fraction points
5409c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	     * just past the fractional part.
5410c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	     * Use scientific notation
5411c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    */
5412c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    integer_place = DBL_DIG + EXPONENT_DIGITS + 1;
5413c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    fraction_place = DBL_DIG - 1;
5414c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    snprintf(work, sizeof(work),"%*.*e",
5415c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		integer_place, fraction_place, number);
5416c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    after_fraction = strchr(work + DBL_DIG, 'e');
5417c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /* Remove fractional trailing zeroes */
5418c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    ptr = after_fraction;
5419c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    while (*(--ptr) == '0')
5420c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		;
5421c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (*ptr != '.')
5422c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	        ptr++;
5423c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    while ((*ptr++ = *after_fraction++) != 0);
5424c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5425c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /* Finally copy result back to caller */
5426c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    size = strlen(work) + 1;
5427c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (size > buffersize) {
5428c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		work[buffersize - 1] = 0;
5429c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		size = buffersize;
5430c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5431c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    memmove(buffer, work, size);
5432c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	}
5433c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	break;
5434c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    }
5435c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik}
5436c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif
5437c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
54386c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/**
54396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaGetCanonValue:
54406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @val: the precomputed value
54416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @retValue: the returned value
54426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
5443478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Get a the cononical lexical representation of the value.
5444c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * The caller has to FREE the returned retValue.
5445c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
5446478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * WARNING: Some value types are not supported yet, resulting
5447478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * in a @retValue of "???".
5448c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
5449c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: XML Schema 1.0 does not define canonical representations
5450c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * for: duration, gYearMonth, gYear, gMonthDay, gMonth, gDay,
5451c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * anyURI, QName, NOTATION. This will be fixed in XML Schema 1.1.
5452c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
54536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *
5454c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Returns 0 if the value could be built, 1 if the value type is
5455c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * not supported yet and -1 in case of API errors.
54566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */
54576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint
5458b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel VeillardxmlSchemaGetCanonValue(xmlSchemaValPtr val, const xmlChar **retValue)
54596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{
5460b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard    if ((retValue == NULL) || (val == NULL))
54616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	return (-1);
54626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    *retValue = NULL;
54636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    switch (val->type) {
5464478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	case XML_SCHEMAS_STRING:
5465478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (val->value.str == NULL)
5466478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
5467478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    else
5468478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue =
5469478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    BAD_CAST xmlStrdup((const xmlChar *) val->value.str);
5470478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    break;
54716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NORMSTRING:
5472478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (val->value.str == NULL)
5473478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
5474478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    else {
5475478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = xmlSchemaWhiteSpaceReplace(
5476478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    (const xmlChar *) val->value.str);
5477478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		if ((*retValue) == NULL)
5478478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    *retValue = BAD_CAST xmlStrdup(
5479478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik			(const xmlChar *) val->value.str);
5480478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    }
5481478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    break;
54826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_TOKEN:
54836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_LANGUAGE:
54846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NMTOKEN:
5485478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	case XML_SCHEMAS_NAME:
54866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_NCNAME:
54876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_ID:
54886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_IDREF:
54896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	case XML_SCHEMAS_ENTITY:
5490c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_NOTATION: /* Unclear */
5491c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_ANYURI:   /* Unclear */
54926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	    if (val->value.str == NULL)
5493478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		return (-1);
5494aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    *retValue =
5495aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		BAD_CAST xmlSchemaCollapseString(BAD_CAST val->value.str);
5496aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik	    if (*retValue == NULL)
5497aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		*retValue =
5498aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik		    BAD_CAST xmlStrdup((const xmlChar *) val->value.str);
5499478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    break;
5500478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	case XML_SCHEMAS_QNAME:
5501c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /* TODO: Unclear in XML Schema 1.0. */
5502478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    if (val->value.qname.uri == NULL) {
5503478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.qname.name);
5504478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		return (0);
5505478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    } else {
5506478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "{");
5507478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue),
5508478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    BAD_CAST val->value.qname.uri);
5509478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue),
5510478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    BAD_CAST "}");
5511478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		*retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue),
5512478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik		    BAD_CAST val->value.qname.uri);
5513478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    }
5514478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    break;
5515c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_DECIMAL:
5516c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /*
5517c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * TODO: Lookout for a more simple implementation.
5518c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    */
5519c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if ((val->value.decimal.total == 1) &&
5520c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		(val->value.decimal.lo == 0)) {
5521c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlStrdup(BAD_CAST "0.0");
5522c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    } else {
5523c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		xmlSchemaValDecimal dec = val->value.decimal;
5524c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		int bufsize;
5525c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char *buf = NULL, *offs;
5526c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5527c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* Add room for the decimal point as well. */
5528c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		bufsize = dec.total + 2;
5529c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.sign)
5530c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    bufsize++;
5531c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* Add room for leading/trailing zero. */
5532c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if ((dec.frac == 0) || (dec.frac == dec.total))
5533c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    bufsize++;
5534c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		buf = xmlMalloc(bufsize);
5535c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		offs = buf;
5536c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.sign)
5537c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs++ = '-';
5538c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.frac == dec.total) {
5539c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs++ = '0';
5540c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs++ = '.';
5541c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5542c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.hi != 0)
5543c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(offs, bufsize - (offs - buf),
5544c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%lu%lu%lu", dec.hi, dec.mi, dec.lo);
5545c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else if (dec.mi != 0)
5546c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(offs, bufsize - (offs - buf),
5547c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%lu%lu", dec.mi, dec.lo);
5548c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else
5549c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(offs, bufsize - (offs - buf),
5550c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%lu", dec.lo);
5551c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5552c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.frac != 0) {
5553c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (dec.frac != dec.total) {
5554c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			int diff = dec.total - dec.frac;
5555c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			/*
5556c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			* Insert the decimal point.
5557c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			*/
5558c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			memmove(offs + diff + 1, offs + diff, dec.frac +1);
5559c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			offs[diff] = '.';
5560c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    } else {
5561c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			unsigned int i = 0;
5562c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			/*
5563c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			* Insert missing zeroes behind the decimal point.
5564c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			*/
5565c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			while (*(offs + i) != 0)
5566c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    i++;
5567c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			if (i < dec.total) {
5568c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    memmove(offs + (dec.total - i), offs, i +1);
5569c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    memset(offs, '0', dec.total - i);
5570c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			}
5571c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    }
5572c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5573c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    /*
5574c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * Append decimal point and zero.
5575c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    */
5576c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    offs = buf + bufsize - 1;
5577c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs-- = 0;
5578c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs-- = '0';
5579c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *offs-- = '.';
5580c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5581c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST buf;
5582c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5583c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5584c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_INTEGER:
5585c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_PINTEGER:
5586c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_NPINTEGER:
5587c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_NINTEGER:
5588c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_NNINTEGER:
5589c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_LONG:
5590c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_BYTE:
5591c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_SHORT:
5592c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_INT:
5593c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_UINT:
5594c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_ULONG:
5595c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_USHORT:
5596c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_UBYTE:
5597c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if ((val->value.decimal.total == 1) &&
5598c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		(val->value.decimal.lo == 0))
5599c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlStrdup(BAD_CAST "0");
5600c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else {
5601c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		xmlSchemaValDecimal dec = val->value.decimal;
5602c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		int bufsize = dec.total + 1;
5603c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5604c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* Add room for the decimal point as well. */
5605c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.sign)
5606c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    bufsize++;
5607c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlMalloc(bufsize);
5608c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (dec.hi != 0) {
5609c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (dec.sign)
5610c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize,
5611c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    "-%lu%lu%lu", dec.hi, dec.mi, dec.lo);
5612c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    else
5613c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize,
5614c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    "%lu%lu%lu", dec.hi, dec.mi, dec.lo);
5615c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else if (dec.mi != 0) {
5616c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (dec.sign)
5617c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize,
5618c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    "-%lu%lu", dec.mi, dec.lo);
5619c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    else
5620c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize,
5621c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    "%lu%lu", dec.mi, dec.lo);
5622c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5623c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (dec.sign)
5624c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize, "-%lu", dec.lo);
5625c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    else
5626c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			snprintf((char *) *retValue, bufsize, "%lu", dec.lo);
5627c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5628c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5629c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5630c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_BOOLEAN:
5631c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (val->value.b)
5632c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "true");
5633c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else
5634c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "false");
5635c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5636c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_DURATION: {
5637c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[100];
5638c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		unsigned long year;
5639c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		unsigned long mon, day, hour = 0, min = 0;
5640c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		double sec = 0, left;
5641c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5642c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5643c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/*
5644c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* TODO: This results in a normalized output of the value
5645c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* - which is NOT conformant to the spec -
5646c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* since the exact values of each property are not
5647c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* recoverable. Think about extending the structure to
5648c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* provide a field for every property.
5649c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*/
5650c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		year = (unsigned long) FQUOTIENT(labs(val->value.dur.mon), 12);
5651c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		mon = labs(val->value.dur.mon) - 12 * year;
5652c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5653c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		day = (unsigned long) FQUOTIENT(fabs(val->value.dur.sec), 86400);
5654c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		left = fabs(val->value.dur.sec) - day * 86400;
5655c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (left > 0) {
5656c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    hour = (unsigned long) FQUOTIENT(left, 3600);
5657c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    left = left - (hour * 3600);
5658c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (left > 0) {
5659c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			min = (unsigned long) FQUOTIENT(left, 60);
5660c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			sec = left - (min * 60);
5661c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    }
5662c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5663c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if ((val->value.dur.mon < 0) || (val->value.dur.sec < 0))
5664c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 100, "P%luY%luM%luDT%luH%luM%.14gS",
5665c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			year, mon, day, hour, min, sec);
5666c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else
5667c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 100, "-P%luY%luM%luDT%luH%luM%.14gS",
5668c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			year, mon, day, hour, min, sec);
5669c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5670c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5671c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5672c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_GYEAR: {
5673c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[30];
5674c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5675c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5676c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf(buf, 30, "%04ld", val->value.date.year);
5677c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5678c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5679c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5680c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_GMONTH: {
5681c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5682c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5683c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlMalloc(5);
5684c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf((char *) *retValue, 6, "--%02u",
5685c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    val->value.date.mon);
5686c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5687c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5688c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_GDAY: {
5689c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5690c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5691c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlMalloc(6);
5692c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf((char *) *retValue, 6, "---%02u",
5693c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    val->value.date.day);
5694c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5695c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5696c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_GMONTHDAY: {
5697c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5698c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5699c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlMalloc(8);
5700c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf((char *) *retValue, 8, "--%02u-%02u",
5701c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    val->value.date.mon, val->value.date.day);
5702c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5703c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5704c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_GYEARMONTH: {
5705c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[35];
5706c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: Unclear in XML Schema 1.0 */
5707c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* TODO: What to do with the timezone? */
5708c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (val->value.date.year < 0)
5709c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 35, "-%04ld-%02u",
5710c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			labs(val->value.date.year),
5711c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.mon);
5712c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else
5713c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 35, "%04ld-%02u",
5714c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.year, val->value.date.mon);
5715c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5716c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5717c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5718c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_TIME:
5719c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    {
5720c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[30];
5721c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5722c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (val->value.date.tz_flag) {
5723c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaValPtr norm;
5724c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5725c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    norm = xmlSchemaDateNormalize(val, 0);
5726c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (norm == NULL)
5727c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			return (-1);
5728c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    /*
5729c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * TODO: Check if "%.14g" is portable.
5730c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    */
5731c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 30,
5732c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%02u:%02u:%02.14gZ",
5733c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.hour,
5734c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.min,
5735c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.sec);
5736c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaFreeValue(norm);
5737c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5738c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 30,
5739c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%02u:%02u:%02.14g",
5740c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.hour,
5741c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.min,
5742c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.sec);
5743c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5744c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5745c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5746c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5747c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_DATE:
5748c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    {
5749c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[30];
5750c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5751c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (val->value.date.tz_flag) {
5752c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaValPtr norm;
5753c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5754c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    norm = xmlSchemaDateNormalize(val, 0);
5755c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (norm == NULL)
5756c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			return (-1);
5757c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    /*
5758c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * TODO: Append the canonical value of the
5759c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * recoverable timezone and not "Z".
5760c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    */
5761c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 30,
5762c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%04ld:%02u:%02uZ",
5763c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.year, norm->value.date.mon,
5764c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.day);
5765c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaFreeValue(norm);
5766c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5767c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 30,
5768c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%04ld:%02u:%02u",
5769c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.year, val->value.date.mon,
5770c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.day);
5771c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5772c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5773c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5774c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5775c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik        case XML_SCHEMAS_DATETIME:
5776c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    {
5777c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[50];
5778c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5779c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (val->value.date.tz_flag) {
5780c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaValPtr norm;
5781c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5782c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    norm = xmlSchemaDateNormalize(val, 0);
5783c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    if (norm == NULL)
5784c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			return (-1);
5785c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    /*
5786c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    * TODO: Check if "%.14g" is portable.
5787c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    */
5788c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 50,
5789c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%04ld:%02u:%02uT%02u:%02u:%02.14gZ",
5790c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.year, norm->value.date.mon,
5791c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.day, norm->value.date.hour,
5792c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			norm->value.date.min, norm->value.date.sec);
5793c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    xmlSchemaFreeValue(norm);
5794c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		} else {
5795c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    snprintf(buf, 50,
5796c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			"%04ld:%02u:%02uT%02u:%02u:%02.14g",
5797c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.year, val->value.date.mon,
5798c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.day, val->value.date.hour,
5799c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			val->value.date.min, val->value.date.sec);
5800c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		}
5801c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5802c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5803c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5804c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_HEXBINARY:
5805c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.hex.str);
5806c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5807c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_BASE64BINARY:
5808c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    /*
5809c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * TODO: Is the following spec piece implemented?:
5810c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * SPEC: "Note: For some values the canonical form defined
5811c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * above does not conform to [RFC 2045], which requires breaking
5812c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    * with linefeeds at appropriate intervals."
5813c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    */
5814c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.base64.str);
5815c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5816c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_FLOAT: {
5817c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[30];
5818c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/*
5819c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* |m| < 16777216, -149 <= e <= 104.
5820c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* TODO: Handle, NaN, INF, -INF. The format is not
5821c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* yet conformant. The c type float does not cover
5822c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* the whole range.
5823c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*/
5824c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf(buf, 30, "%01.14e", val->value.f);
5825c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5826c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5827c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5828c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_DOUBLE: {
5829c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		char buf[40];
5830c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/* |m| < 9007199254740992, -1075 <= e <= 970 */
5831c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		/*
5832c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* TODO: Handle, NaN, INF, -INF. The format is not
5833c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* yet conformant. The c type float does not cover
5834c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		* the whole range.
5835c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*/
5836c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		snprintf(buf, 40, "%01.14e", val->value.d);
5837c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST buf);
5838c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5839c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
58406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik	default:
5841478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik	    *retValue = BAD_CAST xmlStrdup(BAD_CAST "???");
5842c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    return (1);
58436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik    }
5844478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    return (0);
5845478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik}
5846478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik
5847bda59576670f1cabea3c49520628d82e401702caDaniel Veillard/**
5848c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * xmlSchemaGetCanonValueWhtsp:
5849c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @val: the precomputed value
5850c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @retValue: the returned value
5851c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @ws: the whitespace type of the value
5852c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
5853c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Get a the cononical representation of the value.
5854c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * The caller has to free the returned @retValue.
5855c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *
5856c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Returns 0 if the value could be built, 1 if the value type is
5857c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * not supported yet and -1 in case of API errors.
5858c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */
5859c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcikint
5860c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. BuchcikxmlSchemaGetCanonValueWhtsp(xmlSchemaValPtr val,
5861c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    const xmlChar **retValue,
5862c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik			    xmlSchemaWhitespaceValueType ws)
5863c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik{
5864c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    if ((retValue == NULL) || (val == NULL))
5865c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	return (-1);
5866c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    if ((ws == XML_SCHEMA_WHITESPACE_UNKNOWN) ||
5867c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	(ws > XML_SCHEMA_WHITESPACE_COLLAPSE))
5868c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	return (-1);
5869c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5870c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    *retValue = NULL;
5871c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    switch (val->type) {
5872c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_STRING:
5873c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (val->value.str == NULL)
5874c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
5875c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
5876c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlSchemaCollapseString(val->value.str);
5877c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else if (ws == XML_SCHEMA_WHITESPACE_REPLACE)
5878c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = xmlSchemaWhiteSpaceReplace(val->value.str);
5879c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if ((*retValue) == NULL)
5880c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(val->value.str);
5881c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5882c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	case XML_SCHEMAS_NORMSTRING:
5883c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    if (val->value.str == NULL)
5884c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		*retValue = BAD_CAST xmlStrdup(BAD_CAST "");
5885c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    else {
5886c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE)
5887c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *retValue = xmlSchemaCollapseString(val->value.str);
5888c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		else
5889c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *retValue = xmlSchemaWhiteSpaceReplace(val->value.str);
5890c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		if ((*retValue) == NULL)
5891c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik		    *retValue = BAD_CAST xmlStrdup(val->value.str);
5892c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    }
5893c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    break;
5894c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	default:
5895c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik	    return (xmlSchemaGetCanonValue(val, retValue));
5896c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    }
5897c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik    return (0);
5898c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik}
5899c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik
5900c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik/**
5901bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * xmlSchemaGetValType:
5902bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * @val: a schemas value
5903bda59576670f1cabea3c49520628d82e401702caDaniel Veillard *
5904bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * Accessor for the type of a value
5905bda59576670f1cabea3c49520628d82e401702caDaniel Veillard *
5906bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * Returns the xmlSchemaValType of the value
5907bda59576670f1cabea3c49520628d82e401702caDaniel Veillard */
5908478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValType
5909478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaGetValType(xmlSchemaValPtr val)
5910478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{
5911bda59576670f1cabea3c49520628d82e401702caDaniel Veillard    if (val == NULL)
5912bda59576670f1cabea3c49520628d82e401702caDaniel Veillard        return(XML_SCHEMAS_UNKNOWN);
5913478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik    return (val->type);
59146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik}
59156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik
59165d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#define bottom_xmlschemastypes
59175d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#include "elfgcchack.h"
59184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#endif /* LIBXML_SCHEMAS_ENABLED */
5919