xmlschemastypes.c revision 6e224f1272bc2a7d069b72f70b3ce737caf3cf81
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 31070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define DEBUG 334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 34d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillard#ifndef LIBXML_XPATH_ENABLED 35d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillardextern double xmlXPathNAN; 36d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillardextern double xmlXPathPINF; 37d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillardextern double xmlXPathNINF; 38d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillard#endif 39d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillard 404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define TODO \ 414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard "Unimplemented block at %s:%d\n", \ 434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard __FILE__, __LINE__); 444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define XML_SCHEMAS_NAMESPACE_NAME \ 464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard (const xmlChar *)"http://www.w3.org/2001/XMLSchema" 474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik#define IS_WSP_REPLACE_CH(c) ((((c) == 0x9) || ((c) == 0xa)) || \ 496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik ((c) == 0xd)) 506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik#define IS_WSP_SPACE_CH(c) ((c) == 0x20) 526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 545f704afe98c584b7188aa0e4fbc9d9e68e0d7b1bDaniel Veillardstatic unsigned long powten[10] = { 554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000L, 564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 100000000L, 1000000000L 574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}; 584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 5901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 60070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* Date value */ 61070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef struct _xmlSchemaValDate xmlSchemaValDate; 62070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef xmlSchemaValDate *xmlSchemaValDatePtr; 63070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstruct _xmlSchemaValDate { 64070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard long year; 65070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int mon :4; /* 1 <= mon <= 12 */ 66070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int day :5; /* 1 <= day <= 31 */ 67070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int hour :5; /* 0 <= hour <= 23 */ 68070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int min :6; /* 0 <= min <= 59 */ 69070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double sec; 70a77cf71f453249f224d609f2f20789a897c5bdebDaniel Veillard unsigned int tz_flag :1; /* is tzo explicitely set? */ 71070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int tzo :11; /* -1440 <= tzo <= 1440 */ 72070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}; 73070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 74070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* Duration value */ 75070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef struct _xmlSchemaValDuration xmlSchemaValDuration; 76070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef xmlSchemaValDuration *xmlSchemaValDurationPtr; 77070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstruct _xmlSchemaValDuration { 78070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard long mon; /* mon stores years also */ 79070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard long day; 80070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double sec; /* sec stores min and hour also */ 81070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}; 82070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardtypedef struct _xmlSchemaValDecimal xmlSchemaValDecimal; 844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardtypedef xmlSchemaValDecimal *xmlSchemaValDecimalPtr; 854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstruct _xmlSchemaValDecimal { 864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard /* would use long long but not portable */ 87e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long lo; 88e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long mi; 89e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long hi; 904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard unsigned int extra; 915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard unsigned int sign:1; 92c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack unsigned int frac:7; 93c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack unsigned int total:8; 944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}; 954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 96e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardtypedef struct _xmlSchemaValQName xmlSchemaValQName; 97e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardtypedef xmlSchemaValQName *xmlSchemaValQNamePtr; 98e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstruct _xmlSchemaValQName { 99e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlChar *name; 100e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlChar *uri; 101e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard}; 102e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 10370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardtypedef struct _xmlSchemaValHex xmlSchemaValHex; 10470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardtypedef xmlSchemaValHex *xmlSchemaValHexPtr; 10570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardstruct _xmlSchemaValHex { 10670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard xmlChar *str; 10770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard unsigned int total; 10870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard}; 10970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 1101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardtypedef struct _xmlSchemaValBase64 xmlSchemaValBase64; 1111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardtypedef xmlSchemaValBase64 *xmlSchemaValBase64Ptr; 1121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstruct _xmlSchemaValBase64 { 1131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *str; 1141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned int total; 1151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard}; 1161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 1174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstruct _xmlSchemaVal { 1184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValType type; 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 ************************************************************************/ 212c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard/* 2134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitBasicType: 2144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name: the type name 2158bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard * @type: the value type associated 2164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 21701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Initialize one primitive built-in type 2184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 2194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr 22001fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaInitBasicType(const char *name, xmlSchemaValType type, 22101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypePtr baseType) { 2224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypePtr ret; 2234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 2244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType)); 2254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == NULL) { 226d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard xmlSchemaTypeErrMemory(NULL, "could not initialize basic types"); 2274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(NULL); 2284255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 2294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard memset(ret, 0, sizeof(xmlSchemaType)); 230be9c6320d4ed8d5622322014310555bb88b02a85Daniel Veillard ret->name = (const xmlChar *)name; 2314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret->type = XML_SCHEMA_TYPE_BASIC; 23201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard ret->baseType = baseType; 23301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 23401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Hack to reflect the variety. 23501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 23601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((type == XML_SCHEMAS_IDREFS) || 23701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (type == XML_SCHEMAS_NMTOKENS) || 23801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (type == XML_SCHEMAS_ENTITIES)) 23901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard ret->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST; 2402f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack else if ((type != XML_SCHEMAS_ANYTYPE) && 2412f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack (type != XML_SCHEMAS_ANYSIMPLETYPE)) 24201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard ret->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC; 2434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret->contentType = XML_SCHEMA_CONTENT_BASIC; 24401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type) { 24501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_STRING: 24601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DECIMAL: 24701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATE: 24801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATETIME: 24901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_TIME: 25001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEAR: 25101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 25201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTH: 25301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 25401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GDAY: 25501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DURATION: 25601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_FLOAT: 25701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DOUBLE: 25801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BOOLEAN: 25901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 26001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_HEXBINARY: 26101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 26201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_QNAME: 26301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NOTATION: 26401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard ret->flags |= XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE; 26596d2effc735fb45cfa363b6a876ff23a862f87a5William M. Brack default: 26696d2effc735fb45cfa363b6a876ff23a862f87a5William M. Brack break; 26701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 26801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 2694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlHashAddEntry2(xmlSchemaTypesBank, ret->name, 2704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard XML_SCHEMAS_NAMESPACE_NAME, ret); 27101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard ret->builtInType = type; 2724255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(ret); 2734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 2744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 2754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/* 2764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitTypes: 2774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 2784255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Initialize the default XML Schemas type library 2794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 2804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid 2816560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel VeillardxmlSchemaInitTypes(void) 2826560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard{ 2834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized != 0) 2846560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard return; 2854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypesBank = xmlHashCreate(40); 2866560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard 28701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 288c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard /* 28901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 3.4.7 Built-in Complex Type Definition 29001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 2918bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeAnyTypeDef = xmlSchemaInitBasicType("anyType", 2922f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack XML_SCHEMAS_ANYTYPE, 29301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard NULL); 29401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef->baseType = xmlSchemaTypeAnyTypeDef; 29501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED; 29601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard { 29701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaWildcardPtr wild; 29801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 29901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard)); 30001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (wild == NULL) { 3012f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack xmlSchemaTypeErrMemory(NULL, "could not create an attribute wildcard on anyType"); 30201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return; 30301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 30401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard memset(wild, 0, sizeof(xmlSchemaWildcard)); 30501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard wild->any = 1; 30601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard wild->processContents = XML_SCHEMAS_ANY_LAX; 30701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard wild->minOccurs = 1; 30801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard wild->maxOccurs = 1; 30901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef->attributeWildcard = wild; 31001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 31101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef = xmlSchemaInitBasicType("anySimpleType", 3122f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack XML_SCHEMAS_ANYSIMPLETYPE, 31301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef); 31401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 31501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * primitive datatypes 31601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 31701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeStringDef = xmlSchemaInitBasicType("string", 31801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_STRING, 31901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3208bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDecimalDef = xmlSchemaInitBasicType("decimal", 32101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DECIMAL, 32201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3238bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDateDef = xmlSchemaInitBasicType("date", 32401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DATE, 32501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3268bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDatetimeDef = xmlSchemaInitBasicType("dateTime", 32701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DATETIME, 32801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3298bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeTimeDef = xmlSchemaInitBasicType("time", 33001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_TIME, 33101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3328bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGYearDef = xmlSchemaInitBasicType("gYear", 33301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GYEAR, 33401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3358bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGYearMonthDef = xmlSchemaInitBasicType("gYearMonth", 33601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GYEARMONTH, 33701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3388bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGMonthDef = xmlSchemaInitBasicType("gMonth", 33901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GMONTH, 34001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3418bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGMonthDayDef = xmlSchemaInitBasicType("gMonthDay", 34201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GMONTHDAY, 34301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3448bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGDayDef = xmlSchemaInitBasicType("gDay", 34501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GDAY, 34601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3478bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDurationDef = xmlSchemaInitBasicType("duration", 34801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DURATION, 34901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3508bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float", 35101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_FLOAT, 35201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3538bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double", 35401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DOUBLE, 35501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3568bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeBooleanDef = xmlSchemaInitBasicType("boolean", 35701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_BOOLEAN, 35801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3598bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeAnyURIDef = xmlSchemaInitBasicType("anyURI", 36001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_ANYURI, 36101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 362560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard xmlSchemaTypeHexBinaryDef = xmlSchemaInitBasicType("hexBinary", 36301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_HEXBINARY, 36401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaTypeBase64BinaryDef 36601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard = xmlSchemaInitBasicType("base64Binary", XML_SCHEMAS_BASE64BINARY, 36701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 36801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNotationDef = xmlSchemaInitBasicType("NOTATION", 36901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NOTATION, 37001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 37101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeQNameDef = xmlSchemaInitBasicType("QName", 37201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_QNAME, 37301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 375c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard /* 376c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * derived datatypes 377c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */ 3788bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeIntegerDef = xmlSchemaInitBasicType("integer", 37901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_INTEGER, 38001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeDecimalDef); 3816560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeNonPositiveIntegerDef = 3826560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaInitBasicType("nonPositiveInteger", 38301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NPINTEGER, 38401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntegerDef); 3856560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeNegativeIntegerDef = 38601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("negativeInteger", XML_SCHEMAS_NINTEGER, 38701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNonPositiveIntegerDef); 3886560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeLongDef = 38901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("long", XML_SCHEMAS_LONG, 39001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntegerDef); 39101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntDef = xmlSchemaInitBasicType("int", XML_SCHEMAS_INT, 39201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeLongDef); 3938bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeShortDef = xmlSchemaInitBasicType("short", 39401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_SHORT, 39501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntDef); 3968bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeByteDef = xmlSchemaInitBasicType("byte", 39701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_BYTE, 39801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeShortDef); 3996560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeNonNegativeIntegerDef = 4006560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaInitBasicType("nonNegativeInteger", 40101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NNINTEGER, 40201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntegerDef); 4036560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedLongDef = 40401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedLong", XML_SCHEMAS_ULONG, 40501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNonNegativeIntegerDef); 4066560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedIntDef = 40701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedInt", XML_SCHEMAS_UINT, 40801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeUnsignedLongDef); 4096560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedShortDef = 41001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedShort", XML_SCHEMAS_USHORT, 41101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeUnsignedIntDef); 4126560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedByteDef = 41301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedByte", XML_SCHEMAS_UBYTE, 41401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeUnsignedShortDef); 4156560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypePositiveIntegerDef = 41601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("positiveInteger", XML_SCHEMAS_PINTEGER, 41701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNonNegativeIntegerDef); 4188bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeNormStringDef = xmlSchemaInitBasicType("normalizedString", 41901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NORMSTRING, 42001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeStringDef); 4218bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeTokenDef = xmlSchemaInitBasicType("token", 42201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_TOKEN, 42301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNormStringDef); 4248bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeLanguageDef = xmlSchemaInitBasicType("language", 42501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_LANGUAGE, 42601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeTokenDef); 42701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNameDef = xmlSchemaInitBasicType("Name", 42801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NAME, 42901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeTokenDef); 43001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNmtokenDef = xmlSchemaInitBasicType("NMTOKEN", 43101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NMTOKEN, 43201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeTokenDef); 43301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNCNameDef = xmlSchemaInitBasicType("NCName", 43401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NCNAME, 43501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNameDef); 43601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIdDef = xmlSchemaInitBasicType("ID", XML_SCHEMAS_ID, 43701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNCNameDef); 4388bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeIdrefDef = xmlSchemaInitBasicType("IDREF", 43901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_IDREF, 44001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNCNameDef); 4418bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeIdrefsDef = xmlSchemaInitBasicType("IDREFS", 44201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_IDREFS, 44301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIdrefDef); 44401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNmtokensDef = xmlSchemaInitBasicType("NMTOKENS", 44501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NMTOKENS, 44601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNmtokenDef); 447a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard xmlSchemaTypeEntityDef = xmlSchemaInitBasicType("ENTITY", 44801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_ENTITY, 44901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNCNameDef); 450a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard xmlSchemaTypeEntitiesDef = xmlSchemaInitBasicType("ENTITIES", 45101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_ENTITIES, 45201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNCNameDef); 4534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypesInitialized = 1; 4544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 4554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 4564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 4574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCleanupTypes: 4584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 4594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library 4604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 4614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid 4624255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCleanupTypes(void) { 4634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 4644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return; 46501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaFreeWildcard(xmlSchemaTypeAnyTypeDef->attributeWildcard); 4664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlHashFree(xmlSchemaTypesBank, (xmlHashDeallocator) xmlSchemaFreeType); 4674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypesInitialized = 0; 4684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 4694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 4704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 4716927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaIsBuiltInTypeFacet: 47201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in type 47301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facetType: the facet type 47401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 47501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Evaluates if a specific facet can be 47601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * used in conjunction with a type. 47701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 47801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 1 if the facet can be used with the given built-in type, 47901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 0 otherwise and -1 in case the type is not a built-in type. 48001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 48101fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint 48201fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaIsBuiltInTypeFacet(xmlSchemaTypePtr type, int facetType) 48301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 484ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard if (type == NULL) 485ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard return (-1); 48601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->type != XML_SCHEMA_TYPE_BASIC) 48701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (-1); 48801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type->builtInType) { 48901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BOOLEAN: 49001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_PATTERN) || 49101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE)) 49201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 49301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 49401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 49501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_STRING: 49601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NOTATION: 49701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_QNAME: 49801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 49901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 50001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_HEXBINARY: 50101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_LENGTH) || 50201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MINLENGTH) || 50301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXLENGTH) || 50401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_PATTERN) || 50501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_ENUMERATION) || 50601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE)) 50701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 50801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 50901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 51001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DECIMAL: 51101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_TOTALDIGITS) || 51201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) || 51301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_PATTERN) || 51401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE) || 51501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_ENUMERATION) || 51601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) || 51701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) || 51801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MININCLUSIVE) || 51901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE)) 52001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 52101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 52201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 52301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_TIME: 52401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GDAY: 52501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTH: 52601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 52701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEAR: 52801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 52901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATE: 53001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATETIME: 53101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DURATION: 53201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_FLOAT: 53301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DOUBLE: 53401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_PATTERN) || 53501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_ENUMERATION) || 53601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE) || 53701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) || 53801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) || 53901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MININCLUSIVE) || 54001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE)) 54101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 54201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 54301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 54401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard default: 545c7e3cc49bade82dba0cda4ae7c07ffcd1e32fe25Daniel Veillard break; 54601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 54701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 54801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 54901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 55001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 55101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInType: 55201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the type of the built in type 55301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 55401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Gives you the type struct for a built-in 55501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * type by its type id. 55601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 55701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns the type if found, NULL otherwise. 55801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 55901fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr 56001fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInType(xmlSchemaValType type) 56101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 56201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (xmlSchemaTypesInitialized == 0) 56301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitTypes(); 56401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type) { 56501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 56601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYSIMPLETYPE: 56701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeAnySimpleTypeDef); 56801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_STRING: 56901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeStringDef); 57001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NORMSTRING: 57101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNormStringDef); 57201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DECIMAL: 57301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDecimalDef); 57401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_TIME: 57501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeTimeDef); 57601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GDAY: 57701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGDayDef); 57801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTH: 57901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGMonthDef); 58001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 58101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGMonthDayDef); 58201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEAR: 58301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGYearDef); 58401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 58501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGYearMonthDef); 58601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATE: 58701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDateDef); 58801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATETIME: 58901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDatetimeDef); 59001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DURATION: 59101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDurationDef); 59201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_FLOAT: 59301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeFloatDef); 59401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DOUBLE: 59501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDoubleDef); 59601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BOOLEAN: 59701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeBooleanDef); 59801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_TOKEN: 59901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeTokenDef); 60001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_LANGUAGE: 60101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeLanguageDef); 60201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NMTOKEN: 60301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNmtokenDef); 60401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NMTOKENS: 60501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNmtokensDef); 60601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NAME: 60701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNameDef); 60801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_QNAME: 60901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeQNameDef); 61001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NCNAME: 61101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNCNameDef); 61201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ID: 61301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdDef); 61401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_IDREF: 61501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdrefDef); 61601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_IDREFS: 61701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdrefsDef); 61801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ENTITY: 61901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeEntityDef); 62001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ENTITIES: 62101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeEntitiesDef); 62201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NOTATION: 62301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNotationDef); 62401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 62501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeAnyURIDef); 62601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_INTEGER: 62701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIntegerDef); 62801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NPINTEGER: 62901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNonPositiveIntegerDef); 63001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NINTEGER: 63101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNegativeIntegerDef); 63201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NNINTEGER: 63301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNonNegativeIntegerDef); 63401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_PINTEGER: 63501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypePositiveIntegerDef); 63601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_INT: 63701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIntDef); 63801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_UINT: 63901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedIntDef); 64001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_LONG: 64101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeLongDef); 64201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ULONG: 64301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedLongDef); 64401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_SHORT: 64501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeShortDef); 64601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_USHORT: 64701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedShortDef); 64801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BYTE: 64901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeByteDef); 65001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_UBYTE: 65101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedByteDef); 65201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_HEXBINARY: 65301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeHexBinaryDef); 65401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 65501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeBase64BinaryDef); 65601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYTYPE: 65701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeAnyTypeDef); 65801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard default: 65901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (NULL); 66001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 66101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 66201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 66301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 6644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaNewValue: 6654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type: the value type 6664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 6674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Allocate a new simple type value 6684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 6694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns a pointer to the new value or NULL in case of error 6704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 6714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaValPtr 6724255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaNewValue(xmlSchemaValType type) { 6734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValPtr value; 6744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 6754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard value = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal)); 6764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (value == NULL) { 6774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(NULL); 6784255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 6794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard memset(value, 0, sizeof(xmlSchemaVal)); 6804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard value->type = type; 6814255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(value); 6824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 6834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 6844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 6856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaNewStringValue: 6866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @type: the value type 6876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 6886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Allocate a new simple type value. The type can be 6896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * of XML_SCHEMAS_STRING. 6906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 6916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error 6926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 6936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaValPtr 6946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaNewStringValue(xmlSchemaValType type, 6956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar *value) 6966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 6976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaValPtr val; 6986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 6996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (type != XML_SCHEMAS_STRING) 7006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(NULL); 7016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik val = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal)); 7026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (val == NULL) { 7036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(NULL); 7046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 7056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik memset(val, 0, sizeof(xmlSchemaVal)); 7066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik val->type = type; 7076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik val->value.str = (xmlChar *) value; 7086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(val); 7096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 7106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 7116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 7126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 7134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaFreeValue: 7144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to free 7154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 7164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library 7174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 7184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid 7194255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaFreeValue(xmlSchemaValPtr value) { 7204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (value == NULL) 7214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return; 722c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard switch (value->type) { 723c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_STRING: 724c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NORMSTRING: 725c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_TOKEN: 726c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_LANGUAGE: 727c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NMTOKEN: 728c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NMTOKENS: 729c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NAME: 730c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NCNAME: 731c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ID: 732c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_IDREF: 733c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_IDREFS: 734c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ENTITY: 735c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ENTITIES: 736c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NOTATION: 737c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ANYURI: 738c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (value->value.str != NULL) 739c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard xmlFree(value->value.str); 740c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 741e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_QNAME: 742e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (value->value.qname.uri != NULL) 743e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlFree(value->value.qname.uri); 744e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (value->value.qname.name != NULL) 745e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlFree(value->value.qname.name); 746e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard break; 74770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard case XML_SCHEMAS_HEXBINARY: 74870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard if (value->value.hex.str != NULL) 74970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard xmlFree(value->value.hex.str); 75070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard break; 7511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 7521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (value->value.base64.str != NULL) 7531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(value->value.base64.str); 7541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 755c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard default: 756c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 757c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 7584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlFree(value); 7594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 7604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 7614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 7624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaGetPredefinedType: 7634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name: the type name 7644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @ns: the URI of the namespace usually "http://www.w3.org/2001/XMLSchema" 7654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 7664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Lookup a type in the default XML Schemas type library 7674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 7684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns the type if found, NULL otherwise 7694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 7704255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaTypePtr 7714255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaGetPredefinedType(const xmlChar *name, const xmlChar *ns) { 7724255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 7734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaInitTypes(); 7744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (name == NULL) 7754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(NULL); 7764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return((xmlSchemaTypePtr) xmlHashLookup2(xmlSchemaTypesBank, name, ns)); 7774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 778070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 77901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 78001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInListSimpleTypeItemType: 78101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in simple type. 78201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 7836927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Lookup function 7846927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * 785c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns the item type of @type as defined by the built-in datatype 786c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * hierarchy of XML Schema Part 2: Datatypes, or NULL in case of an error. 78701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 78801fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr 78901fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInListSimpleTypeItemType(xmlSchemaTypePtr type) 79001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 7914259532303e96e089a185c6f55056cb7c4902d71Daniel Veillard if ((type == NULL) || (type->type != XML_SCHEMA_TYPE_BASIC)) 79201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (NULL); 79301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type->builtInType) { 79401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NMTOKENS: 79501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNmtokenDef ); 79601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_IDREFS: 79701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdrefDef); 79801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ENTITIES: 79901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeEntityDef); 80001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard default: 80101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (NULL); 80201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 80301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 80401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 805070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**************************************************************** 806070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 807070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Convenience macros and functions * 808070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 809070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/ 810070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 811070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_TZO_CHAR(c) \ 812070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ((c == 0) || (c == 'Z') || (c == '+') || (c == '-')) 813070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 814070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_YEAR(yr) (yr != 0) 815070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MONTH(mon) ((mon >= 1) && (mon <= 12)) 816070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* VALID_DAY should only be used when month is unknown */ 817070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DAY(day) ((day >= 1) && (day <= 31)) 818070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_HOUR(hr) ((hr >= 0) && (hr <= 23)) 819070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MIN(min) ((min >= 0) && (min <= 59)) 820070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_SEC(sec) ((sec >= 0) && (sec < 60)) 821070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TZO(tzo) ((tzo > -1440) && (tzo < 1440)) 822070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_LEAP(y) \ 823070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) 824070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 825ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonth[12] = 826070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 827ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonthLeap[12] = 828070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 829070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 8305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MAX_DAYINMONTH(yr,mon) \ 8315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1]) 8325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 833070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MDAY(dt) \ 834070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (IS_LEAP(dt->year) ? \ 835070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (dt->day <= daysInMonthLeap[dt->mon - 1]) : \ 836070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (dt->day <= daysInMonth[dt->mon - 1])) 837070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 838070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATE(dt) \ 839070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_YEAR(dt->year) && VALID_MONTH(dt->mon) && VALID_MDAY(dt)) 840070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 841070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TIME(dt) \ 842070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_HOUR(dt->hour) && VALID_MIN(dt->min) && \ 843070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard VALID_SEC(dt->sec) && VALID_TZO(dt->tzo)) 844070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 845070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATETIME(dt) \ 846070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_DATE(dt) && VALID_TIME(dt)) 847070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 848070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_MIN (60) 849070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_HOUR (60 * SECS_PER_MIN) 850070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_DAY (24 * SECS_PER_HOUR) 851070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 8525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInYearByMonth[12] = 8535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; 8545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInLeapYearByMonth[12] = 8555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 }; 8565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 8575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DAY_IN_YEAR(day, month, year) \ 8585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((IS_LEAP(year) ? \ 8595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dayInLeapYearByMonth[month - 1] : \ 8605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dayInYearByMonth[month - 1]) + day) 8615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 8625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#ifdef DEBUG 8635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt) \ 8645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 8655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard "type=%o %04ld-%02u-%02uT%02u:%02u:%03f", \ 8665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->type,dt->value.date.year,dt->value.date.mon, \ 8675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->value.date.day,dt->value.date.hour,dt->value.date.min, \ 8685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->value.date.sec); \ 8695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt->value.date.tz_flag) \ 8705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt->value.date.tzo != 0) \ 8715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 8725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard "%+05d\n",dt->value.date.tzo); \ 8735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else \ 8745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, "Z\n"); \ 8755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else \ 8765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext,"\n") 8775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#else 8785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt) 8795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#endif 8805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 881070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 882070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGYear: 883070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 884070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 885070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 886070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gYear without time zone and fills in the appropriate 887070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 888070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gYear. It is supposed that @dt->year is big enough to contain 889070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * the year. 890070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 891070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 892070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 893070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 894070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) { 895070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str, *firstChar; 896070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0, digcnt = 0; 897070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 898070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (((*cur < '0') || (*cur > '9')) && 899070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (*cur != '-') && (*cur != '+')) 900070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 901070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 902070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 903070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = 1; 904070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 905070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 906070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 907070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard firstChar = cur; 908070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 909070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 910070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->year = dt->year * 10 + (*cur - '0'); 911070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 912070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard digcnt++; 913070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 914070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 915070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* year must be at least 4 digits (CCYY); over 4 916070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * digits cannot have a leading zero. */ 917070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0'))) 918070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 919070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 920070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) 921070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->year = - dt->year; 922070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 923070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_YEAR(dt->year)) 924070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 925070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 926070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 927070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 928070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 929070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 930070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 931070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_2_DIGITS: 932070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the integer to fill in 933070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 934070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer 935070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 936070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a 2-digits integer and updates @num with the value. @cur is 937070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer. 938070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and 939070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 940070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 941070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_2_DIGITS(num, cur, invalid) \ 942070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((cur[0] < '0') || (cur[0] > '9') || \ 943070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (cur[1] < '0') || (cur[1] > '9')) \ 944070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard invalid = 1; \ 945070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 946070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = (cur[0] - '0') * 10 + (cur[1] - '0'); \ 947070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur += 2; 948070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 949070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 950070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_FLOAT: 951070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the double to fill in 952070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 953070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer 954070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 955070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float and updates @num with the value. @cur is 956070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the float. The float must have a 957070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2-digits integer part and may or may not have a decimal part. 958070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and 959070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 960070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 961070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_FLOAT(num, cur, invalid) \ 962070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(num, cur, invalid); \ 963070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!invalid && (*cur == '.')) { \ 964070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double mult = 1; \ 965070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 966070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 967070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard invalid = 1; \ 968070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 969070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mult /= 10; \ 970070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num += (*cur - '0') * mult; \ 971070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 972070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 973070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 974070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 975070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 976070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGMonth: 977070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 978070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 979070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 980070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gMonth without time zone and fills in the appropriate 981070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 982070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gMonth. 983070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 984070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 985070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 986070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 987070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) { 988070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 989070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 990070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 991070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(dt->mon, cur, ret); 992070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 993070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 994070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 995070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_MONTH(dt->mon)) 996070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 997070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 998070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 999070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1000070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1001070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1002070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1003070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGDay: 1004070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1005070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1006070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1007070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gDay without time zone and fills in the appropriate 1008070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1009070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay. 1010070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1011070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1012070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1013070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1014070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) { 1015070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 1016070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 1017070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1018070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(dt->day, cur, ret); 1019070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1020070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1021070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1022070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_DAY(dt->day)) 1023070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1024070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1025070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1026070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1027070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1028070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1029070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1030070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTime: 1031070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1032070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1033070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1034070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:time without time zone and fills in the appropriate 1035070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * fields of the @dt structure. @str is updated to point just after the 1036070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:time. 1037070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, values of @dt fields are undefined. 1038070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1039070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1040070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1041070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1042070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) { 1043070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 1044070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int hour = 0; /* use temp var in case str is not xs:time */ 1045070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 1046070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1047070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(hour, cur, ret); 1048070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1049070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1050070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1051070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1052070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1053070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1054070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1055070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* the ':' insures this string is xs:time */ 1056070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->hour = hour; 1057070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1058070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(dt->min, cur, ret); 1059070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1060070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1061070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1062070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1063070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1064070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1065070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1066070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_FLOAT(dt->sec, cur, ret); 1067070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1068070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1069070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1070070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_TIME(dt)) 1071070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1072070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1073070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1074070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1075070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1076070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1077070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1078070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTimeZone: 1079070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1080070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1081070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1082070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a time zone without time zone and fills in the appropriate 1083070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1084070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * time zone. 1085070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1086070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1087070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1088070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1089070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) { 1090070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 1091070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 1092070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1093070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (str == NULL) 1094070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1095070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1096070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard switch (*cur) { 1097070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 0: 1098070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tz_flag = 0; 1099070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = 0; 1100070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1101070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1102070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 'Z': 1103070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tz_flag = 1; 1104070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = 0; 1105070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1106070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1107070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1108070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case '+': 1109070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case '-': { 1110070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0, tmp = 0; 1111070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = (*cur == '-'); 1112070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1113070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1114070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1115070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(tmp, cur, ret); 1116070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1117070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1118070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_HOUR(tmp)) 1119070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1120070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1121070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1122070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1123070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1124070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1125070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = tmp * 60; 1126070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1127070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(tmp, cur, ret); 1128070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1129070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1130070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_MIN(tmp)) 1131070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1132070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1133070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo += tmp; 1134070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) 1135070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = - dt->tzo; 1136070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1137070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_TZO(dt->tzo)) 1138070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1139070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 11405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->tz_flag = 1; 1141070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1142070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1143070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard default: 1144070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1145070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1146070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1147070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1148070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1149070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1150070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 11511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard/** 11521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * _xmlSchemaBase64Decode: 11531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * @ch: a character 11541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 11551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Converts a base64 encoded character to its base 64 value. 11561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 11571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Returns 0-63 (value), 64 (pad), or -1 (not recognized) 11581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */ 11591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic int 11601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard_xmlSchemaBase64Decode (const xmlChar ch) { 11611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('A' <= ch) && (ch <= 'Z')) return ch - 'A'; 11621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('a' <= ch) && (ch <= 'z')) return ch - 'a' + 26; 11631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('0' <= ch) && (ch <= '9')) return ch - '0' + 52; 11641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('+' == ch) return 62; 11651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('/' == ch) return 63; 11661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('=' == ch) return 64; 11671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return -1; 11681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard} 11691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 1170070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**************************************************************** 1171070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 1172070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * XML Schema Dates/Times Datatypes Handling * 1173070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 1174070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/ 1175070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1176070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1177070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_DIGITS: 1178070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the integer to fill in 1179070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1180070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag 1181070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1182070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a digits integer and updates @num with the value. @cur is 1183070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer. 1184070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and 1185070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1186070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1187070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_DIGITS(num, cur, num_type) \ 1188070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 1189070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = -1; \ 1190070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 1191070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 1192070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = num * 10 + (*cur - '0'); \ 1193070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1194070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1195070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1196070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1197070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_NUM: 1198070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the double to fill in 1199070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1200070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag 1201070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1202070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float or integer and updates @num with the value. @cur is 1203070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the number. If the number is a float, 1204070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * then it must have an integer part and a decimal part; @num_type will 1205070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * be set to 1. If there is no decimal part, @num_type is set to zero. 1206070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and 1207070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1208070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1209070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_NUM(num, cur, num_type) \ 1210070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = 0; \ 1211070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_DIGITS(num, cur, num_type); \ 1212070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!num_type && (*cur == '.')) { \ 1213070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double mult = 1; \ 1214070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1215070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 1216070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = -1; \ 1217070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 1218070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = 1; \ 1219070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 1220070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mult /= 10; \ 1221070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num += (*cur - '0') * mult; \ 1222070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1223070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 1224070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1225070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1226070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 12275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDates: 1228455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard * @type: the expected type or XML_SCHEMAS_UNKNOWN 1229070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dateTime: string to analyze 1230070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val: the return computed value 1231070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1232070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @dateTime conforms to the lexical space of one of the date types. 1233070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val. 1234070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1235070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 1236070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * and -1 in case of internal or API error. 1237070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1238070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1239455cc07308c673b6714e2f5670c2091a1dab95dcDaniel VeillardxmlSchemaValidateDates (xmlSchemaValType type, 1240118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard const xmlChar *dateTime, xmlSchemaValPtr *val) { 1241070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValPtr dt; 1242070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret; 1243070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = dateTime; 1244070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1245070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define RETURN_TYPE_IF_VALID(t) \ 1246070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (IS_TZO_CHAR(*cur)) { \ 1247070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); \ 1248070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 0) { \ 1249070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != 0) \ 1250070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; \ 1251070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->type = t; \ 1252455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard goto done; \ 1253070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 1254070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1255070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1256070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dateTime == NULL) 1257070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1258070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1259070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur != '-') && (*cur < '0') && (*cur > '9')) 1260070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1261070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1262070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN); 1263070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dt == NULL) 1264070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1265070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1266070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((cur[0] == '-') && (cur[1] == '-')) { 1267070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1268070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * It's an incomplete date (xs:gMonthDay, xs:gMonth or 1269070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay) 1270070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1271070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur += 2; 1272070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1273070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gDay? */ 1274070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 1275455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard if (type == XML_SCHEMAS_GMONTH) 1276455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard goto error; 1277070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ++cur; 1278070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1279070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1280070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1281070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1282070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY); 1283070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1284070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1285070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1286070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1287070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1288070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * it should be an xs:gMonthDay or xs:gMonth 1289070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1290070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); 1291070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1292070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1293070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1294d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1295d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a '-' char could indicate this type is xs:gMonthDay or 1296d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a negative time zone offset. Check for xs:gMonthDay first. 1297d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * Also the first three char's of a negative tzo (-MM:SS) can 1298d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * appear to be a valid day; so even if the day portion 1299d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * of the xs:gMonthDay verifies, we must insure it was not 1300d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a tzo. 1301d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1302d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if (*cur == '-') { 1303d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const xmlChar *rewnd = cur; 1304d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard cur++; 1305d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1306d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1307d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((ret == 0) && ((*cur == 0) || (*cur != ':'))) { 1308d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1309d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1310d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * we can use the VALID_MDAY macro to validate the month 1311d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * and day because the leap year test will flag year zero 1312d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * as a leap year (even though zero is an invalid year). 1313d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1314d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if (VALID_MDAY((&(dt->value.date)))) { 1315d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1316d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY); 1317070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1318d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1319d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1320d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1321d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1322d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1323d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * not xs:gMonthDay so rewind and check if just xs:gMonth 1324d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * with an optional time zone. 1325d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1326d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard cur = rewnd; 1327d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1328d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1329d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH); 1330070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1331070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1332070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1333070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1334070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1335070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * It's a right-truncated date or an xs:time. 1336070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Try to parse an xs:time then fallback on right-truncated dates. 1337070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1338070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur >= '0') && (*cur <= '9')) { 1339070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTime(&(dt->value.date), &cur); 1340070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 0) { 1341070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* it's an xs:time */ 1342070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_TIME); 1343070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1344070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1345070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1346070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* fallback on date parsing */ 1347070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur = dateTime; 1348070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1349070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGYear(&(dt->value.date), &cur); 1350070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1351070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1352070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1353070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gYear? */ 1354070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEAR); 1355070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1356070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != '-') 1357070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1358070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1359070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1360070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); 1361070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1362070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1363070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1364070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gYearMonth? */ 1365070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEARMONTH); 1366070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1367070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != '-') 1368070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1369070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1370070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1371070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1372070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret != 0) || !VALID_DATE((&(dt->value.date)))) 1373070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1374070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1375070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:date? */ 1376070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_DATE); 1377070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1378070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != 'T') 1379070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1380070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1381070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1382070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* it should be an xs:dateTime */ 1383070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTime(&(dt->value.date), &cur); 1384070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1385070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1386070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1387070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); 1388070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret != 0) || (*cur != 0) || !VALID_DATETIME((&(dt->value.date)))) 1389070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1390070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1391455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard 1392070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->type = XML_SCHEMAS_DATETIME; 1393070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1394455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillarddone: 1395d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#if 1 1396d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) 1397d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1398d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#else 1399d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1400d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * insure the parsed type is equal to or less significant (right 1401d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * truncated) than the desired type. 1402d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1403d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) { 1404d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1405d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* time only matches time */ 1406d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_TIME) && (dt->type == XML_SCHEMAS_TIME)) 1407d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1408d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1409d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_DATETIME) && 1410d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard ((dt->type != XML_SCHEMAS_DATE) || 1411d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEARMONTH) || 1412d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEAR))) 1413d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1414d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1415d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_DATE) && 1416d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard ((dt->type != XML_SCHEMAS_GYEAR) || 1417d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEARMONTH))) 1418d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1419d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1420d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_GYEARMONTH) && (dt->type != XML_SCHEMAS_GYEAR)) 1421d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1422d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1423d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_GMONTHDAY) && (dt->type != XML_SCHEMAS_GMONTH)) 1424d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1425d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1426455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard#endif 1427455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard 1428070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (val != NULL) 1429070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *val = dt; 143080b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 143180b19092f24410a6b869abf519227686e8f207caDaniel Veillard xmlSchemaFreeValue(dt); 1432070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1433070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1434070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1435070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror: 1436070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dt != NULL) 1437070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaFreeValue(dt); 1438070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1439070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1440070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1441070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 14425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDuration: 1443070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @type: the predefined type 1444070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @duration: string to analyze 1445070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val: the return computed value 1446070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1447070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @duration conforms to the lexical space of the duration type. 1448070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val. 1449070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1450070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 1451070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * and -1 in case of internal or API error. 1452070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1453070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1454dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED, 1455118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard const xmlChar *duration, xmlSchemaValPtr *val) { 1456070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = duration; 1457070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValPtr dur; 1458070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0; 1459070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int seq = 0; 1460d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard double num; 1461d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard int num_type = 0; /* -1 = invalid, 0 = int, 1 = floating */ 1462d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const xmlChar desig[] = {'Y', 'M', 'D', 'H', 'M', 'S'}; 1463d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const double multi[] = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0}; 1464070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1465070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (duration == NULL) 1466070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1467070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1468070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 1469070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = 1; 1470070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1471070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1472070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1473070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* duration must start with 'P' (after sign) */ 1474070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur++ != 'P') 1475070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1476070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 147780b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (*cur == 0) 147880b19092f24410a6b869abf519227686e8f207caDaniel Veillard return 1; 147980b19092f24410a6b869abf519227686e8f207caDaniel Veillard 1480070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); 1481070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dur == NULL) 1482070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1483070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1484070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while (*cur != 0) { 1485070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1486070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* input string should be empty or invalid date/time item */ 1487070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (seq >= sizeof(desig)) 1488070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1489070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1490070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* T designator must be present for time items */ 1491070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == 'T') { 1492070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (seq <= 3) { 1493070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard seq = 3; 1494070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1495070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else 1496070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1497070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else if (seq == 3) 1498070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1499070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1500070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* parse the number portion of the item */ 1501070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_NUM(num, cur, num_type); 1502070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1503070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((num_type == -1) || (*cur == 0)) 1504070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1505070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1506070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* update duration based on item type */ 1507070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while (seq < sizeof(desig)) { 1508070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == desig[seq]) { 1509070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1510070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* verify numeric type; only seconds can be float */ 1511070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((num_type != 0) && (seq < (sizeof(desig)-1))) 1512070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1513070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1514070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard switch (seq) { 1515070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 0: 1516070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon = (long)num * 12; 1517070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1518070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 1: 1519070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon += (long)num; 1520070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1521070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard default: 1522070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* convert to seconds using multiplier */ 1523070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.sec += num * multi[seq]; 1524070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard seq++; 1525070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1526070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1527070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1528070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; /* exit loop */ 1529070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1530070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* no date designators found? */ 1531070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (++seq == 3) 1532070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1533070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1534070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1535070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1536070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1537070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) { 1538070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon = -dur->value.dur.mon; 1539070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.day = -dur->value.dur.day; 1540070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.sec = -dur->value.dur.sec; 1541070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1542070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1543070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (val != NULL) 1544070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *val = dur; 154580b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 154680b19092f24410a6b869abf519227686e8f207caDaniel Veillard xmlSchemaFreeValue(dur); 1547070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1548070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1549070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1550070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror: 1551070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dur != NULL) 1552070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaFreeValue(dur); 1553070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1554070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1555070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1556a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard/** 1557a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * xmlSchemaStrip: 1558a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * @value: a value 1559a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * 1560a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Removes the leading and ending spaces of a string 1561a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * 1562a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the new string or NULL if no change was required. 1563a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard */ 1564a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlChar * 1565a1a9d0410000cc69874e53e438b250037d3e14cdDaniel VeillardxmlSchemaStrip(const xmlChar *value) { 1566a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard const xmlChar *start = value, *end, *f; 1567a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard 1568a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if (value == NULL) return(NULL); 156976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*start != 0) && (IS_BLANK_CH(*start))) start++; 1570a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end = start; 1571a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard while (*end != 0) end++; 1572a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard f = end; 1573a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end--; 157476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((end > start) && (IS_BLANK_CH(*end))) end--; 1575a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end++; 1576a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if ((start == value) && (f == end)) return(NULL); 1577a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(xmlStrndup(start, end - start)); 1578a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard} 157996a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard 158096a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard/** 158191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * xmlSchemaWhiteSpaceReplace: 158291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * @value: a value 158391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * 158491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Replaces 0xd, 0x9 and 0xa with a space. 158591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * 158691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Returns the new string or NULL if no change was required. 158791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik */ 158891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlChar * 158991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlSchemaWhiteSpaceReplace(const xmlChar *value) { 159091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik const xmlChar *cur = value; 159191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik xmlChar *ret = NULL, *mcur; 159291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 159391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if (value == NULL) 159491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik return(NULL); 159591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 159691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik while ((*cur != 0) && 159791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik (((*cur) != 0xd) && ((*cur) != 0x9) && ((*cur) != 0xa))) { 159891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik cur++; 159991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik } 160091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if (*cur == 0) 160191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik return (NULL); 160291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik ret = xmlStrdup(value); 160391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik /* TODO FIXME: I guess gcc will bark at this. */ 160491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik mcur = (xmlChar *) (ret + (cur - value)); 160591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik do { 160691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if ( ((*mcur) == 0xd) || ((*mcur) == 0x9) || ((*mcur) == 0xa) ) 160791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik *mcur = ' '; 160891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik mcur++; 160991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik } while (*mcur != 0); 161091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik return(ret); 161191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik} 161291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 161391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik/** 1614b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCollapseString: 1615b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: a value 1616b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 1617b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Removes and normalize white spaces in the string 1618b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 1619b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns the new string or NULL if no change was required. 1620b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 162101fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlChar * 1622b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCollapseString(const xmlChar *value) { 1623b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard const xmlChar *start = value, *end, *f; 1624b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlChar *g; 1625b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard int col = 0; 1626b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1627b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (value == NULL) return(NULL); 162876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*start != 0) && (IS_BLANK_CH(*start))) start++; 1629b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end = start; 1630b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while (*end != 0) { 163176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if ((*end == ' ') && (IS_BLANK_CH(end[1]))) { 1632b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard col = end - start; 1633b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard break; 1634b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) { 1635b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard col = end - start; 1636b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard break; 1637b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1638b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 1639b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1640b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (col == 0) { 1641b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard f = end; 1642b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end--; 164376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((end > start) && (IS_BLANK_CH(*end))) end--; 1644b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 1645b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((start == value) && (f == end)) return(NULL); 1646b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(xmlStrndup(start, end - start)); 1647b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1648b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard start = xmlStrdup(start); 1649b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (start == NULL) return(NULL); 1650b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard g = (xmlChar *) (start + col); 1651b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end = g; 1652b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while (*end != 0) { 165376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (IS_BLANK_CH(*end)) { 1654b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 165576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*end)) end++; 1656b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*end != 0) 1657b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g++ = ' '; 1658b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else 1659b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g++ = *end++; 1660b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1661b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g = 0; 1662b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return((xmlChar *) start); 1663b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 1664b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1665b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 166628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * xmlSchemaValAtomicListNode: 166728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @type: the predefined atomic type for a token in the list 166828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @value: the list value to check 166928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @ret: the return computed value 167028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @node: the node containing the value 167128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * 167228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Check that a value conforms to the lexical space of the predefined 167328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * list type. if true a value is computed and returned in @ret. 167428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * 1675a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the number of items if this validates, a negative error code 1676a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * number otherwise 167728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */ 167828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillardstatic int 167928c52ab518d34a36fd8da6870a5850088f129a6aDaniel VeillardxmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value, 168028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlSchemaValPtr *ret, xmlNodePtr node) { 168128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlChar *val, *cur, *endval; 168228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard int nb_values = 0; 1683580ced8ee28ecd99374da9383897678e4ba6c358Daniel Veillard int tmp = 0; 168428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard 168528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (value == NULL) { 168628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard return(-1); 168728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 168828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard val = xmlStrdup(value); 168928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (val == NULL) { 169028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard return(-1); 169128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 16926fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard if (ret != NULL) { 16936fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard *ret = NULL; 16946fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard } 169528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur = val; 169628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard /* 169728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Split the list 169828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */ 169976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*cur)) *cur++ = 0; 170028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (*cur != 0) { 170176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (IS_BLANK_CH(*cur)) { 170228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *cur = 0; 170328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur++; 170476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*cur)) *cur++ = 0; 170528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } else { 170628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard nb_values++; 170728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur++; 170876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++; 170928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 171028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 171128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (nb_values == 0) { 171228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlFree(val); 1713a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(nb_values); 171428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 171528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard endval = cur; 171628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur = val; 171728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while ((*cur == 0) && (cur != endval)) cur++; 171828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (cur != endval) { 171928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node); 172028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (tmp != 0) 172128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard break; 172228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (*cur != 0) cur++; 172328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while ((*cur == 0) && (cur != endval)) cur++; 172428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 17256fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard /* TODO what return value ? c.f. bug #158628 172628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (ret != NULL) { 172728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard TODO 17286fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard } */ 17296fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard xmlFree(val); 1730a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if (tmp == 0) 1731a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(nb_values); 1732a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(-1); 173328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard} 173428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard 173528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard/** 1736e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * xmlSchemaParseUInt: 1737e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @str: pointer to the string R/W 1738e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @llo: pointer to the low result 1739e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lmi: pointer to the mid result 1740e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lhi: pointer to the high result 1741e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * 1742e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Parse an unsigned long into 3 fields. 1743e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * 1744e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Returns the number of chars parsed or -1 if overflow of the capacity 1745e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard */ 1746e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic int 1747e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel VeillardxmlSchemaParseUInt(const xmlChar **str, unsigned long *llo, 1748e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long *lmi, unsigned long *lhi) { 1749e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long lo = 0, mi = 0, hi = 0; 1750e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard const xmlChar *tmp, *cur = *str; 1751e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard int ret = 0, i = 0; 1752e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 1753e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (*cur == '0') { 1754e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ret++; 1755e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard cur++; 1756e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1757e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard tmp = cur; 1758e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) { 1759e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard i++;tmp++;ret++; 1760e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1761e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (i > 24) { 1762e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *str = tmp; 1763e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(-1); 1764e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1765e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 16) { 1766e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard hi = hi * 10 + (*cur++ - '0'); 1767e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard i--; 1768e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1769e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 8) { 1770e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard mi = mi * 10 + (*cur++ - '0'); 1771e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard i--; 1772e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1773e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 0) { 1774e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard lo = lo * 10 + (*cur++ - '0'); 1775e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard i--; 1776e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1777e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 1778e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *str = cur; 1779e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *llo = lo; 1780e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *lmi = mi; 1781e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *lhi = hi; 1782e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(ret); 1783e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard} 1784e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 1785e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard/** 1786b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValAtomicType: 17874255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type: the predefined type 17884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to check 17894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val: the return computed value 1790c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @node: the node containing the value 1791b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * flags: flags to control the vlidation 17924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 1793b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the atomic type. 17944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * if true a value is computed and returned in @val. 179501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * This checks the value space for list types as well (IDREFS, NMTOKENS). 17964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 17974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 17984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * and -1 in case of internal or API error. 17994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 1800b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int 18011ac24d36b12487995b659a8fc23a02b9460edb36Daniel VeillardxmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, 18021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaValPtr * val, xmlNodePtr node, int flags) 18031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard{ 18044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValPtr v; 1805b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlChar *norm = NULL; 1806d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard int ret = 0; 18074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 18084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 180901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitTypes(); 18104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (type == NULL) 18111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (-1); 18125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 1813eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard /* 1814eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard * validating a non existant text node is similar to validating 1815eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard * an empty one. 1816eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard */ 1817eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard if (value == NULL) 1818eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard value = BAD_CAST ""; 1819eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard 18204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (val != NULL) 18211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = NULL; 1822b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((flags == 0) && (value != NULL)) { 182391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 182401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((type->builtInType != XML_SCHEMAS_STRING) && 182591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik (type->builtInType != XML_SCHEMAS_ANYTYPE) && 182691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik (type->builtInType != XML_SCHEMAS_ANYSIMPLETYPE)) { 182791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if (type->builtInType == XML_SCHEMAS_NORMSTRING) 182891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik norm = xmlSchemaWhiteSpaceReplace(value); 182991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik else 183091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 18311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 18321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value = norm; 18331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 1834b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1835b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 183601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type->builtInType) { 18372f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_UNKNOWN: 18381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 18392f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_ANYTYPE: 18402f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_ANYSIMPLETYPE: 18412f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack goto return0; 1842b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_STRING: 18431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 18441516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard case XML_SCHEMAS_NORMSTRING:{ 18451516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard const xmlChar *cur = value; 18461516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard 18471516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard while (*cur != 0) { 18481516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 18491516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard goto return1; 18501516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } else { 18511516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard cur++; 18521516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 18531516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 18541516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard if (val != NULL) { 18551516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NORMSTRING); 18561516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard if (v != NULL) { 18571516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard v->value.str = xmlStrdup(value); 18581516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard *val = v; 18591516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } else { 18601516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard goto error; 18611516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 18621516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 18631516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard goto return0; 18641516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 18651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_DECIMAL:{ 18661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value, *tmp; 18671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned int frac = 0, len, neg = 0; 18681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long base = 0; 18691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 18701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 18711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 18721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '+') 18731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 18741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (*cur == '-') { 18751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard neg = 1; 18761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 18771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 18781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard tmp = cur; 18791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 18801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base = base * 10 + (*cur - '0'); 18811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 18821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 18831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard len = cur - tmp; 18841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '.') { 18851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 18861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard tmp = cur; 18871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 18881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base = base * 10 + (*cur - '0'); 18891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 18901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 18911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard frac = cur - tmp; 18921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 18931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 18941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 18951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 18961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL); 18971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 18981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = base; 18991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = neg; 19001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = frac; 19011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.total = frac + len; 19021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 19031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 19061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 1907b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_TIME: 1908b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GDAY: 1909b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GMONTH: 1910b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GMONTHDAY: 1911b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GYEAR: 1912b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GYEARMONTH: 1913b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DATE: 1914b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DATETIME: 191501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard ret = xmlSchemaValidateDates(type->builtInType, value, val); 19161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 1917b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DURATION: 19181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValidateDuration(type, value, val); 19191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 1920b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_FLOAT: 19211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_DOUBLE:{ 19221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 19231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int neg = 0; 19241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 19251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 19261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 19271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) { 19281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur += 3; 19291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 19301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 19311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 19321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 19331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 19341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 19351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathNAN; 19361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 19371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 19381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 19391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 19411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 19421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 19431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathNAN; 19441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 19451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 19461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 19471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 19501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 19521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 19541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard neg = 1; 19551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 19561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) { 19581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur += 3; 19591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 19601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 19611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 19621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 19631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 19641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 19651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (neg) 19661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathNINF; 19671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 19681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathPINF; 19691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 19701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 19711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 19721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 19741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 19751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 19761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (neg) 19771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathNINF; 19781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 19791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathPINF; 19801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 19811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 19821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 19831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 19861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 19881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((neg == 0) && (*cur == '+')) 19901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 19911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-')) 19921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 19931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 19941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 19951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '.') { 19971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 19981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) 19991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 20001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((*cur == 'e') || (*cur == 'E')) { 20021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 20031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((*cur == '-') || (*cur == '+')) 20041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 20051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) 20061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 20071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 20091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 20101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 20111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 20121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 20131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 2014d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard if (sscanf((const char *) value, "%f", 20151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard &(v->value.f)) == 1) { 201601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *val = v; 20171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 20181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 20191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 20201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 20221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 20231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 20251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 20261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 2027d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard if (sscanf((const char *) value, "%lf", 20281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard &(v->value.d)) == 1) { 20291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 20301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 20311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 20321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 20331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 20351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 20361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 20401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BOOLEAN:{ 20421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 20431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 20441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == '0') && (cur[1] == 0)) 20451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 20461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if ((cur[0] == '1') && (cur[1] == 0)) 20471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 20481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if ((cur[0] == 't') && (cur[1] == 'r') 20491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard && (cur[2] == 'u') && (cur[3] == 'e') 20501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard && (cur[4] == 0)) 20511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 20521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if ((cur[0] == 'f') && (cur[1] == 'a') 20531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard && (cur[2] == 'l') && (cur[3] == 's') 20541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard && (cur[4] == 'e') && (cur[5] == 0)) 20551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 20561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 20571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 20581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 20591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN); 20601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 20611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.b = ret; 20621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 20631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 20641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 20651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 20681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_TOKEN:{ 20701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 20711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 207276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (IS_BLANK_CH(*cur)) 20731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 20741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 20751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while (*cur != 0) { 20761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 20771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 20781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (*cur == ' ') { 20791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 20801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == 0) 20811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 20821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == ' ') 20831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 20841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 20851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 20861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 20891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN); 20901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 20911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 20921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 20931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 20941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 20951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 20981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2099b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_LANGUAGE: 21001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (xmlCheckLanguageID(value) == 1) { 21011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 21021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE); 21031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 21041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 21051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 21061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 21071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 21081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 21111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2113b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NMTOKEN: 21141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (xmlValidateNMToken(value, 1) == 0) { 21151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 21161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN); 21171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 21181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 21191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 21201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 21211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 21221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 21251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2127b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NMTOKENS: 21281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef, 21291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 21301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret > 0) 21311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 21321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 21331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 21341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2135b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NAME: 21361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateName(value, 1); 2137df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard if ((ret == 0) && (val != NULL) && (value != NULL)) { 2138df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NAME); 2139df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard if (v != NULL) { 2140df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard const xmlChar *start = value, *end; 2141df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard while (IS_BLANK_CH(*start)) start++; 2142df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard end = start; 2143df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard while ((*end != 0) && (!IS_BLANK_CH(*end))) end++; 2144df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard v->value.str = xmlStrndup(start, end - start); 2145df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard *val = v; 2146df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard } else { 2147df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard goto error; 2148df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard } 21491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 21511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_QNAME:{ 21521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *uri = NULL; 21531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *local = NULL; 21541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 21551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateQName(value, 1); 21561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL)) { 21571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *prefix; 21581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 21591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard local = xmlSplitQName2(value, &prefix); 21601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) { 21611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlNsPtr ns; 21621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 21631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ns = xmlSearchNs(node->doc, node, prefix); 21641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ns == NULL) 21651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 21661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (val != NULL) 21671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard uri = xmlStrdup(ns->href); 21681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((local != NULL) && ((val == NULL) || (ret != 0))) 21701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(local); 21711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) 21721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(prefix); 21731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 21751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_QNAME); 21761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 21771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (local != NULL) 21781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.name = local; 21791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 21801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.name = xmlStrdup(value); 21811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (uri != NULL) 21821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.uri = uri; 21831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 21841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 21851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 21861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (local != NULL) 21871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(local); 21881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (uri != NULL) 21891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(uri); 21901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 21911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 21941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2195b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NCNAME: 21961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 21971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 21981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME); 21991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 22001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 22011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 22021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 22031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 22041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2207b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_ID: 22081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 22091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 22101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_ID); 22111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 22121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 22131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 22141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 22151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 22161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 22191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 22201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 22211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 22221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 22231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * NOTE: the IDness might have already be declared in the DTD 22241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */ 22251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (attr->atype != XML_ATTRIBUTE_ID) { 22261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlIDPtr res; 22271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 22281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 22291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 22301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 22311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard res = xmlAddID(NULL, node->doc, strip, attr); 22321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 22331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 22341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard res = xmlAddID(NULL, node->doc, value, attr); 22351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (res == NULL) { 22361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 2; 22371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 22381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ID; 22391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2243b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_IDREF: 22441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 22451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 22466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik v = xmlSchemaNewValue(XML_SCHEMAS_IDREF); 22476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (v == NULL) 22486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik goto error; 22496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik v->value.str = xmlStrdup(value); 22506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *val = v; 22511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 22531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 22541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 22551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 22561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 22571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 22581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 22591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAddRef(NULL, node->doc, strip, attr); 22601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 22611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 22621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAddRef(NULL, node->doc, value, attr); 22631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_IDREF; 22641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2266b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_IDREFS: 22671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef, 22681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 22691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret < 0) 22701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 2; 22711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 22721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 22731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 22741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 22751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 2276249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard 22771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_IDREFS; 22781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 22801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_ENTITY:{ 22811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 22821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 22831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 22841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 22851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 3; 22861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 0) { 22871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlEntityPtr ent; 22881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 22891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 22901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 22911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ent = xmlGetDocEntity(node->doc, strip); 22921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 22931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 22941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ent = xmlGetDocEntity(node->doc, value); 22951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ent == NULL) || 22971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (ent->etype != 22981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard XML_EXTERNAL_GENERAL_UNPARSED_ENTITY)) 22991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 4; 23001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 23021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard TODO; 23031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 23051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 23061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 2307a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard 23081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ENTITY; 23091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 23111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2312b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_ENTITIES: 23131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 23141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return3; 23151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef, 23161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 23171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret <= 0) 23181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 23191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 23201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 23211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 23221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 23231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 23241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ENTITIES; 23261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 23281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_NOTATION:{ 23291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *uri = NULL; 23301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *local = NULL; 23311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateQName(value, 1); 23331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL)) { 23341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *prefix; 23351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard local = xmlSplitQName2(value, &prefix); 23371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) { 23381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlNsPtr ns; 23391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ns = xmlSearchNs(node->doc, node, prefix); 23411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ns == NULL) 23421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 23431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (val != NULL) 23441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard uri = xmlStrdup(ns->href); 23451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((local != NULL) && ((val == NULL) || (ret != 0))) 23471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(local); 23481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) 23491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(prefix); 23501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 23521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 3; 23531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 0) { 23541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNotationUse(NULL, node->doc, value); 23551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 1) 23561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 23571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 23581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 23591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 23611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION); 23621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 23631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (local != NULL) 23641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.name = local; 23651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 23661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.name = xmlStrdup(value); 23671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (uri != NULL) 23681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.uri = uri; 23691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 23711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 23721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (local != NULL) 23731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(local); 23741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (uri != NULL) 23751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(uri); 23761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 23771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2380560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 23811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_ANYURI:{ 238211c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (*value != 0) { 238311c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard xmlURIPtr uri = xmlParseURI((const char *) value); 238411c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (uri == NULL) 238511c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard goto return1; 238611c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard xmlFreeURI(uri); 238711c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard } 2388560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 23891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 239011c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_ANYURI); 239111c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (v == NULL) 239211c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard goto error; 239311c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard v->value.str = xmlStrdup(value); 239411c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard *val = v; 23951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 23971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_HEXBINARY:{ 23991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 24001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *base; 24011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int total, i = 0; 2402560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 2403f34a20e69dc675cd23d3eb558cad135ea280f472Daniel Veillard if (cur == NULL) 24041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2405560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 24061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while (((*cur >= '0') && (*cur <= '9')) || 24071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((*cur >= 'A') && (*cur <= 'F')) || 24081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((*cur >= 'a') && (*cur <= 'f'))) { 24091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard i++; 24101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2412560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 24131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 24141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((i % 2) != 0) 241670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard goto return1; 2417560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 24181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 24191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 24201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY); 24211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v == NULL) 24221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 24241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur = xmlStrdup(value); 24251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) { 2426d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard xmlSchemaTypeErrMemory(node, "allocating hexbin data"); 24271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(v); 24281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 24311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total = i / 2; /* number of octets */ 243270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 24331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base = (xmlChar *) cur; 24341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while (i-- > 0) { 24351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*base >= 'a') 24361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = *base - ('a' - 'A'); 24371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base++; 24381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 243970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 24401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.hex.str = (xmlChar *) cur; 24411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.hex.total = total; 24421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 24431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 24451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BASE64BINARY:{ 24471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* ISSUE: 24481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 24491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Ignore all stray characters? (yes, currently) 24501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Worry about long lines? (no, currently) 24511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 24521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * rfc2045.txt: 24531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 24541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * "The encoded output stream must be represented in lines of 24551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * no more than 76 characters each. All line breaks or other 24561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * characters not found in Table 1 must be ignored by decoding 24571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * software. In base64 data, characters other than those in 24581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Table 1, line breaks, and other white space probably 24591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * indicate a transmission error, about which a warning 24601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * message or even a message rejection might be appropriate 24611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * under some circumstances." */ 24621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 24631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *base; 24641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int total, i = 0, pad = 0; 24651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 24661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 24671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 24691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (; *cur; ++cur) { 24701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 24711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 24721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur); 24731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc < 0) ; 24741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (decc < 64) 24751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard i++; 24761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 24771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 24781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (; *cur; ++cur) { 24801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 24811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 24821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur); 24831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc < 0) ; 24841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (decc < 64) 24851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc == 64) 24871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard pad++; 24881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 24901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* rfc2045.txt: "Special processing is performed if fewer than 24911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 24 bits are available at the end of the data being encoded. 24921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * A full encoding quantum is always completed at the end of a 24931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * body. When fewer than 24 input bits are available in an 24941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * input group, zero bits are added (on the right) to form an 24951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * integral number of 6-bit groups. Padding at the end of the 24961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * data is performed using the "=" character. Since all 24971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * base64 input is an integral number of octets, only the 24981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * following cases can arise: (1) the final quantum of 24991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * encoding input is an integral multiple of 24 bits; here, 25001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * the final unit of encoded output will be an integral 25011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * multiple ofindent: Standard input:701: Warning:old style 25021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * assignment ambiguity in "=*". Assuming "= *" 4 characters 25031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * with no "=" padding, (2) the final 25041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * quantum of encoding input is exactly 8 bits; here, the 25051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * final unit of encoded output will be two characters 25061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * followed by two "=" padding characters, or (3) the final 25071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * quantum of encoding input is exactly 16 bits; here, the 25081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * final unit of encoded output will be three characters 25091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * followed by one "=" padding character." */ 25101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 25111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total = 3 * (i / 4); 25121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (pad == 0) { 25131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 0) 25141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (pad == 1) { 25161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 25171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 25181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 3) 25191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (decc = _xmlSchemaBase64Decode(*cur); 25211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (decc < 0) || (decc > 63); 25221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur)) 25231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard --cur; 25241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 16bits in 24bits means 2 pad bits: nnnnnn nnmmmm mmmm00*/ 25251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 00111100 -> 0x3c */ 25261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc & ~0x3c) 25271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total += 2; 25291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (pad == 2) { 25301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 25311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 25321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 2) 25331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (decc = _xmlSchemaBase64Decode(*cur); 25351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (decc < 0) || (decc > 63); 25361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur)) 25371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard --cur; 25381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 8bits in 12bits means 4 pad bits: nnnnnn nn0000 */ 25391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 00110000 -> 0x30 */ 25401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc & ~0x30) 25411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total += 1; 25431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 25441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 25461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 25471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_BASE64BINARY); 25481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v == NULL) 25491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 25501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base = 25511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (xmlChar *) xmlMallocAtomic((i + pad + 1) * 25521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sizeof(xmlChar)); 25531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (base == NULL) { 2554d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard xmlSchemaTypeErrMemory(node, "allocating base64 data"); 25551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(v); 25561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.base64.str = base; 25591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (cur = value; *cur; ++cur) 25601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (_xmlSchemaBase64Decode(*cur) >= 0) { 25611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = *cur; 25621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ++base; 25631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = 0; 25651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.base64.total = total; 25661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 25671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 256970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 2570e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_INTEGER: 2571e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_PINTEGER: 2572e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_NPINTEGER: 2573e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_NINTEGER: 25741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_NNINTEGER:{ 25751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 25761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 25771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int sign = 0; 25781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 25791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 25801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 25821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sign = 1; 25831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 25841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (*cur == '+') 25851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 25861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 25871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 0) 25881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 25901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 259101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_NPINTEGER) { 25921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && 25931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((hi != 0) || (mi != 0) || (lo != 0))) 25941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 259501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_PINTEGER) { 25961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (sign == 1) 25971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((hi == 0) && (mi == 0) && (lo == 0)) 25991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 260001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_NINTEGER) { 26011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (sign == 0) 26021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((hi == 0) && (mi == 0) && (lo == 0)) 26041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 260501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_NNINTEGER) { 26061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && 26071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((hi != 0) || (mi != 0) || (lo != 0))) 26081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 26111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * We can store a value only if no overflow occured 26121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */ 26131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret > 0) && (val != NULL)) { 261401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 26151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 26161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 26171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.mi = lo; 26181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.hi = lo; 26191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = sign; 26201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 26211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.total = cur - value; 26221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 26231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 26261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2627e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_LONG: 2628e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_BYTE: 2629e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_SHORT: 26301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_INT:{ 26311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 26321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 26331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int total = 0; 26341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int sign = 0; 26351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 26361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 26371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 26391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sign = 1; 26401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 26411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (*cur == '+') 26421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 26431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 26441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret <= 0) 26451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 26471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 264801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_LONG) { 26491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi >= 922) { 26501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi > 922) 26511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 33720368) { 26531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 33720368) 26541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 54775807)) 26561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 54775808)) 26581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 266101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_INT) { 26621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi != 0) 26631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 21) { 26651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 21) 26661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 47483647)) 26681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 47483648)) 26701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 267201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_SHORT) { 26731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 26741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 32768)) 26761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 32767)) 26781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 267901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_BYTE) { 26801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 26811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 128)) 26831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 127)) 26851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 268801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 26891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 26901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 26911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.mi = lo; 26921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.hi = lo; 26931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = sign; 26941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 26951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.total = total; 26961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 26971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 27001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2701e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_UINT: 2702e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_ULONG: 2703e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_USHORT: 27041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_UBYTE:{ 27051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 27061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 27071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int total = 0; 27081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 27091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 27101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 27121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret <= 0) 27131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 27151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 271601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_ULONG) { 27171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi >= 1844) { 27181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi > 1844) 27191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 67440737) { 27211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 67440737) 27221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 9551615) 27241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 272701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_UINT) { 27281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi != 0) 27291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 42) { 27311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 42) 27321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 94967295) 27341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 273601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_USHORT) { 27371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 27381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 65535) 27401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 274101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_UBYTE) { 27421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 27431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 255) 27451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 274801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 27491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 27501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 27511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.mi = mi; 27521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.hi = hi; 27531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = 0; 27541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 27551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.total = total; 27561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 27571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 27601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 2762b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 27631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard done: 27641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 27651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 27661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (ret); 27671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return3: 27681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 27691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 27701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (3); 27711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return1: 27721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 27731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 27741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (1); 27751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return0: 27761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 27771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 27781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (0); 27791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard error: 27801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 27811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 27821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (-1); 2783b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 2784b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 2785b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 2786b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValPredefTypeNode: 2787b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @type: the predefined type 2788b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: the value to check 2789b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @val: the return computed value 2790b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @node: the node containing the value 2791b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 2792b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the predefined type. 2793b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * if true a value is computed and returned in @val. 2794b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 2795b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns 0 if this validates, a positive error code number otherwise 2796b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * and -1 in case of internal or API error. 2797b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 2798b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardint 2799b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value, 2800b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlSchemaValPtr *val, xmlNodePtr node) { 2801b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(xmlSchemaValAtomicType(type, value, val, node, 0)); 28024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 28034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 28044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 2805c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaValPredefTypeNodeNoNorm: 2806c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the predefined type 2807c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the value to check 2808c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val: the return computed value 2809c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @node: the node containing the value 2810c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 2811c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Check that a value conforms to the lexical space of the predefined type. 2812c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * if true a value is computed and returned in @val. 2813c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * This one does apply any normalization to the value. 2814c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 2815c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 2816c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * and -1 in case of internal or API error. 2817c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 2818c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardint 2819c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, const xmlChar *value, 2820c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard xmlSchemaValPtr *val, xmlNodePtr node) { 2821c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(xmlSchemaValAtomicType(type, value, val, node, 1)); 2822c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 2823c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 2824c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/** 2825c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * xmlSchemaValidatePredefinedType: 2826c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @type: the predefined type 2827c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @value: the value to check 2828c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @val: the return computed value 2829c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * 2830c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Check that a value conforms to the lexical space of the predefined type. 2831c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * if true a value is computed and returned in @val. 2832c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * 2833c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 2834c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * and -1 in case of internal or API error. 2835c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard */ 2836c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillardint 2837c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel VeillardxmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value, 2838c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard xmlSchemaValPtr *val) { 2839c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard return(xmlSchemaValPredefTypeNode(type, value, val, NULL)); 2840c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard} 2841c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard 2842c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard/** 28434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareDecimals: 28444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x: a first decimal value 28454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y: a second decimal value 28464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 28474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 decimals 28484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 28494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error 28504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 28514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int 28524255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y) 28534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{ 28544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValPtr swp; 2855e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard int order = 1, p; 28564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard unsigned long tmp; 28574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 2858e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((x->value.decimal.sign) && 2859e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((x->value.decimal.lo != 0) || 2860e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (x->value.decimal.mi != 0) || 2861e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (x->value.decimal.hi != 0))) { 2862e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((y->value.decimal.sign) && 2863e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((y->value.decimal.lo != 0) || 2864e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.mi != 0) || 2865e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.hi != 0))) 286680b19092f24410a6b869abf519227686e8f207caDaniel Veillard order = -1; 286780b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 286880b19092f24410a6b869abf519227686e8f207caDaniel Veillard return (-1); 2869e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } else if ((y->value.decimal.sign) && 2870e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((y->value.decimal.lo != 0) || 2871e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.mi != 0) || 2872e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.hi != 0))) { 28734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (1); 287480b19092f24410a6b869abf519227686e8f207caDaniel Veillard } 28754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (x->value.decimal.frac == y->value.decimal.frac) { 2876e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.hi < y->value.decimal.hi) 2877e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (-order); 287801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (x->value.decimal.hi > y->value.decimal.hi) 2879e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (order); 2880e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.mi < y->value.decimal.mi) 2881e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (-order); 288201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (x->value.decimal.mi > y->value.decimal.mi) 2883e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (order); 2884e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.lo < y->value.decimal.lo) 288580b19092f24410a6b869abf519227686e8f207caDaniel Veillard return (-order); 2886e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.lo > y->value.decimal.lo) 288780b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(order); 288880b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(0); 28894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 28904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (y->value.decimal.frac > x->value.decimal.frac) { 28914255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard swp = y; 28924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard y = x; 28934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard x = swp; 28944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard order = -order; 28954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 2896e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard p = powten[x->value.decimal.frac - y->value.decimal.frac]; 2897e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard tmp = x->value.decimal.lo / p; 2898e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (tmp > y->value.decimal.lo) 28994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (order); 2900e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (tmp < y->value.decimal.lo) 29014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (-order); 2902e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard tmp = y->value.decimal.lo * p; 2903e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.lo < tmp) 29044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (-order); 2905e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.lo == tmp) 29064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (0); 29074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (order); 29084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 29094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 29104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 2911070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xmlSchemaCompareDurations: 2912070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @x: a first duration value 2913070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @y: a second duration value 2914070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2915070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Compare 2 durations 2916070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2917070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 2918070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * case of error 2919070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 2920070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 2921070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel VeillardxmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y) 2922070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard{ 2923070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard long carry, mon, day; 2924070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double sec; 292580b19092f24410a6b869abf519227686e8f207caDaniel Veillard int invert = 1; 292680b19092f24410a6b869abf519227686e8f207caDaniel Veillard long xmon, xday, myear, minday, maxday; 2927070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard static const long dayRange [2][12] = { 2928070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, }, 2929070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} }; 2930070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2931070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((x == NULL) || (y == NULL)) 29325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 2933070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2934070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* months */ 2935070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mon = x->value.dur.mon - y->value.dur.mon; 2936070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2937070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* seconds */ 2938070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard sec = x->value.dur.sec - y->value.dur.sec; 2939070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard carry = (long)sec / SECS_PER_DAY; 2940070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard sec -= (double)(carry * SECS_PER_DAY); 2941070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2942070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* days */ 2943070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard day = x->value.dur.day - y->value.dur.day + carry; 2944070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2945070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* easy test */ 2946070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (mon == 0) { 2947070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (day == 0) 2948070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (sec == 0.0) 2949070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 2950070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else if (sec < 0.0) 2951070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 2952070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else 2953070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 2954070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else if (day < 0) 2955070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 2956070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else 2957070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 2958070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 2959070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2960070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (mon > 0) { 2961070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((day >= 0) && (sec >= 0.0)) 2962070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 2963070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else { 2964070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = mon; 2965070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xday = -day; 2966070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 2967070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else if ((day <= 0) && (sec <= 0.0)) { 2968070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 2969070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else { 297080b19092f24410a6b869abf519227686e8f207caDaniel Veillard invert = -1; 2971070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = -mon; 2972070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xday = day; 2973070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 2974070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2975070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard myear = xmon / 12; 297680b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (myear == 0) { 297780b19092f24410a6b869abf519227686e8f207caDaniel Veillard minday = 0; 297880b19092f24410a6b869abf519227686e8f207caDaniel Veillard maxday = 0; 297980b19092f24410a6b869abf519227686e8f207caDaniel Veillard } else { 298080b19092f24410a6b869abf519227686e8f207caDaniel Veillard maxday = 366 * ((myear + 3) / 4) + 298180b19092f24410a6b869abf519227686e8f207caDaniel Veillard 365 * ((myear - 1) % 4); 298280b19092f24410a6b869abf519227686e8f207caDaniel Veillard minday = maxday - 1; 298380b19092f24410a6b869abf519227686e8f207caDaniel Veillard } 298480b19092f24410a6b869abf519227686e8f207caDaniel Veillard 2985070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = xmon % 12; 2986070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard minday += dayRange[0][xmon]; 2987070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard maxday += dayRange[1][xmon]; 2988070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 298980b19092f24410a6b869abf519227686e8f207caDaniel Veillard if ((maxday == minday) && (maxday == xday)) 299080b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(0); /* can this really happen ? */ 2991070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (maxday < xday) 299280b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(-invert); 299380b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (minday > xday) 299480b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(invert); 2995070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2996070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* indeterminate */ 29975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; 29985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 29995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/* 30015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * macros for adding date/times and durations 30025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 30035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT(a,b) (floor(((double)a/(double)b))) 30045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO(a,b) (a - FQUOTIENT(a,b) * b) 30055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT_RANGE(a,low,high) (FQUOTIENT((a-low),(high-low))) 30065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO_RANGE(a,low,high) ((MODULO((a-low),(high-low)))+low) 30075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 3009669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * xmlSchemaDupVal: 3010669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @v: the #xmlSchemaValPtr value to duplicate 3011669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * 3012669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Makes a copy of @v. The calling program is responsible for freeing 3013669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the returned value. 3014669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * 3015669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * returns a pointer to a duplicated #xmlSchemaValPtr or NULL if error. 3016669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard */ 3017669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillardstatic xmlSchemaValPtr 3018669adfcd3af5dfda873b10119d44202a7450bb20Daniel VeillardxmlSchemaDupVal (xmlSchemaValPtr v) 3019669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard{ 3020669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaValPtr ret = xmlSchemaNewValue(v->type); 3021669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard if (ret == NULL) 3022669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return NULL; 3023669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard 3024669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard memcpy(ret, v, sizeof(xmlSchemaVal)); 3025669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return ret; 3026669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard} 3027669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard 3028669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard/** 30295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateAdd: 30305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 30315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dur: an #xmlSchemaValPtr of type #XS_DURATION 30325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 30335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compute a new date/time from @dt and @dur. This function assumes @dt 30345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH, 3035669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * or #XML_SCHEMAS_GYEAR. The returned #xmlSchemaVal is the same type as 3036669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt. The calling program is responsible for freeing the returned value. 30375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3038669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a pointer to a new #xmlSchemaVal or NULL if error. 30395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 30405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr 30415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur) 30425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 3043669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaValPtr ret, tmp; 30445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long carry, tempdays, temp; 30455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValDatePtr r, d; 30465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValDurationPtr u; 30475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((dt == NULL) || (dur == NULL)) 30495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 30505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = xmlSchemaNewValue(dt->type); 30525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret == NULL) 30535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 30545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3055669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard /* make a copy so we don't alter the original value */ 3056669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard tmp = xmlSchemaDupVal(dt); 3057669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard if (tmp == NULL) { 3058669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaFreeValue(ret); 3059669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return NULL; 3060669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard } 3061669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard 30625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r = &(ret->value.date); 3063669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard d = &(tmp->value.date); 30645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard u = &(dur->value.dur); 30655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalization */ 30675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->mon == 0) 30685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->mon = 1; 30695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize for time zone offset */ 30715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard u->sec -= (d->tzo * 60); 30725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->tzo = 0; 30735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalization */ 30755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->day == 0) 30765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->day = 1; 30775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* month */ 30795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = d->mon + u->mon; 3080ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->mon = (unsigned int) MODULO_RANGE(carry, 1, 13); 3081ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT_RANGE(carry, 1, 13); 30825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* year (may be modified later) */ 30845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year = d->year + carry; 30855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->year == 0) { 30865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->year > 0) 30875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year--; 30885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 30895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year++; 30905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 30915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* time zone */ 30935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->tzo = d->tzo; 30945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->tz_flag = d->tz_flag; 30955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* seconds */ 30975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->sec = d->sec + u->sec; 3098ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT((long)r->sec, 60); 30995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->sec != 0.0) { 31005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->sec = MODULO(r->sec, 60.0); 31015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 31025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* minute */ 31045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry += d->min; 3105ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->min = (unsigned int) MODULO(carry, 60); 3106ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT(carry, 60); 31075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* hours */ 31095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry += d->hour; 3110ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->hour = (unsigned int) MODULO(carry, 24); 3111ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long)FQUOTIENT(carry, 24); 31125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 31145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * days 31155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Note we use tempdays because the temporary values may need more 31165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * than 5 bits 31175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 31185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) && 31195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (d->day > MAX_DAYINMONTH(r->year, r->mon))) 31205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = MAX_DAYINMONTH(r->year, r->mon); 31215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (d->day < 1) 31225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = 1; 31235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 31245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = d->day; 31255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays += u->day + carry; 31275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard while (1) { 31295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (tempdays < 1) { 3130ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard long tmon = (long) MODULO_RANGE(r->mon-1, 1, 13); 3131ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard long tyr = r->year + (long)FQUOTIENT_RANGE(r->mon-1, 1, 13); 31325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (tyr == 0) 31335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tyr--; 31345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays += MAX_DAYINMONTH(tyr, tmon); 31355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = -1; 3136ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard } else if (tempdays > (long) MAX_DAYINMONTH(r->year, r->mon)) { 31375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon); 31385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = 1; 31395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } else 31405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 31415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard temp = r->mon + carry; 3143ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->mon = (unsigned int) MODULO_RANGE(temp, 1, 13); 3144ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->year = r->year + (unsigned int) FQUOTIENT_RANGE(temp, 1, 13); 31455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->year == 0) { 31465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (temp < 1) 31475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year--; 31485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 31495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year++; 31505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 31515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 31525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->day = tempdays; 31545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 31565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * adjust the date/time type to the date values 31575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 31585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret->type != XML_SCHEMAS_DATETIME) { 31595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((r->hour) || (r->min) || (r->sec)) 31605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_DATETIME; 31615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (ret->type != XML_SCHEMAS_DATE) { 31625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((r->mon != 1) && (r->day != 1)) 31635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_DATE; 31645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1)) 31655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_GYEARMONTH; 31665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 31675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 31685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3169669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaFreeValue(tmp); 31705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 31725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 31735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 31755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaDateNormalize: 3176669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt: an #xmlSchemaValPtr of a date/time type value. 3177669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @offset: number of seconds to adjust @dt by. 31785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3179669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Normalize @dt to GMT time. The @offset parameter is subtracted from 3180669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the return value is a time-zone offset is present on @dt. 31815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3182669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a normalized copy of @dt or NULL if error. 31835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 31845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr 31855a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset) 31865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 31875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValPtr dur, ret; 31885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt == NULL) 31905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 31915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (((dt->type != XML_SCHEMAS_TIME) && 31935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (dt->type != XML_SCHEMAS_DATETIME)) || (dt->value.date.tzo == 0)) 31945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return xmlSchemaDupVal(dt); 31955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); 31975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dur == NULL) 31985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 31995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dur->value.date.sec -= offset; 32015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = _xmlSchemaDateAdd(dt, dur); 32035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret == NULL) 32045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 32055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaFreeValue(dur); 32075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* ret->value.date.tzo = 0; */ 32095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 32105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 32115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 32135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateCastYMToDays: 32145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 32155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 32165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Convert mon and year of @dt to total number of days. Take the 32175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * number of years since (or before) 1 AD and add the number of leap 32185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years. This is a function because negative 32195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years must be handled a little differently and there is no zero year. 32205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 32215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns number of days. 32225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 32235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic long 32245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt) 32255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 32265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long ret; 322749e8963c640865343327c67d4755a1af705717d3Daniel Veillard int mon; 32285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 322949e8963c640865343327c67d4755a1af705717d3Daniel Veillard mon = dt->value.date.mon; 323049e8963c640865343327c67d4755a1af705717d3Daniel Veillard if (mon <= 0) mon = 1; /* normalization */ 323149e8963c640865343327c67d4755a1af705717d3Daniel Veillard 323249e8963c640865343327c67d4755a1af705717d3Daniel Veillard if (dt->value.date.year <= 0) 32335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = (dt->value.date.year * 365) + 32345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+ 32355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((dt->value.date.year+1)/400)) + 323649e8963c640865343327c67d4755a1af705717d3Daniel Veillard DAY_IN_YEAR(0, mon, dt->value.date.year); 32375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 32385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = ((dt->value.date.year-1) * 365) + 32395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+ 32405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((dt->value.date.year-1)/400)) + 324149e8963c640865343327c67d4755a1af705717d3Daniel Veillard DAY_IN_YEAR(0, mon, dt->value.date.year); 32425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 32445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 32455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 32475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * TIME_TO_NUMBER: 32485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 32495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 32505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Calculates the number of seconds in the time portion of @dt. 32515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 32525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns seconds. 32535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 32545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define TIME_TO_NUMBER(dt) \ 32555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((double)((dt->value.date.hour * SECS_PER_HOUR) + \ 3256b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard (dt->value.date.min * SECS_PER_MIN) + \ 3257b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard (dt->value.date.tzo * SECS_PER_MIN)) + \ 3258b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard dt->value.date.sec) 32595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 32615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaCompareDates: 32625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @x: a first date/time value 32635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @y: a second date/time value 32645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 32655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compare 2 date/times 32665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 32675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 32685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error 32695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 32705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic int 32715a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y) 32725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 32735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard unsigned char xmask, ymask, xor_mask, and_mask; 32745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValPtr p1, p2, q1, q2; 32755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long p1d, p2d, q1d, q2d; 32765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((x == NULL) || (y == NULL)) 32785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 32795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.tz_flag) { 32815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (!y->value.date.tz_flag) { 32835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, 0); 32845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 32855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize y + 14:00 */ 32865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR)); 32875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 3289fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 3290fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3291fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 32925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 3293fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d == q1d) { 32945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 32955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 3297fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (sec < 0.0) { 3298fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3299fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 33005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 3301fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 33024aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 33035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize y - 14:00 */ 33045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR)); 33055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day; 33065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (p1d > q2d) 33074aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 33085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (p1d == q2d) { 33095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2); 33105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec > 0.0) 33114aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 33125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 33134aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 2; /* indeterminate */ 33145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 33154aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(p1); 33164aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q1); 33174aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q2); 33184aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard if (ret != 0) 33194aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 33205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 3321fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 3322fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3323fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 3324fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } 33255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 33265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } else if (y->value.date.tz_flag) { 33275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, 0); 33285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 33295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize x - 14:00 */ 33315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR)); 33325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 33335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3334fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 3335fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3336fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 33375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 3338fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d == q1d) { 33395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 33405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 3342fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (sec < 0.0) { 3343fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3344fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 33455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 3346fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 33474aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 33485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize x + 14:00 */ 33495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR)); 33505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day; 33515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33526560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard if (p2d > q1d) { 33534aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 33546560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard } else if (p2d == q1d) { 33555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1); 33565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec > 0.0) 33574aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 33585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 33594aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 2; /* indeterminate */ 33605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 33616560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(p1); 33626560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(q1); 33636560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(p2); 33644aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard if (ret != 0) 33654aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 33665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 3367fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 3368fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3369fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 33705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 33715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 33725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 33745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * if the same type then calculate the difference 33755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 33765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->type == y->type) { 33774aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 33785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, 0); 33795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 33805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, 0); 33825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 33835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3384fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 33854aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = -1; 3386fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d > q1d) { 33874aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 3388fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 33895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 33905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 33925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec < 0.0) 33934aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = -1; 33945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (sec > 0.0) 33954aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 33965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 33984aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(p1); 33994aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q1); 34004aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 34015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 34025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 34035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard switch (x->type) { 34045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 34055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0xf; 34065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 34075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 34085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x7; 34095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 34105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 34115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x1; 34125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 34135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 34145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x2; 34155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 34165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 34175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x3; 34185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 34195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 34205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x3; 34215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 34225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 34235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x6; 34245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 34255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 34265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x8; 34275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 34285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard default: 34295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0; 34305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 34315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 34325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 34335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard switch (y->type) { 34345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 34355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0xf; 34365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 34375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 34385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x7; 34395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 34405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 34415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x1; 34425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 34435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 34445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x2; 34455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 34465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 34475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x3; 34485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 34495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 34505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x3; 34515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 34525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 34535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x6; 34545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 34555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 34565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x8; 34575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 34585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard default: 34595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0; 34605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 34615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 34625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 34635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xor_mask = xmask ^ ymask; /* mark type differences */ 34645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard and_mask = xmask & ymask; /* mark field specification */ 34655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 34665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* year */ 34675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 1) 34685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 34695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 1) { 34705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.year < y->value.date.year) 34715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 34725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.year > y->value.date.year) 34735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 34745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 34755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 34765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* month */ 34775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 2) 34785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 34795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 2) { 34805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.mon < y->value.date.mon) 34815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 34825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.mon > y->value.date.mon) 34835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 34845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 34855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 34865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* day */ 34875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 4) 34885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 34895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 4) { 34905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.day < y->value.date.day) 34915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 34925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.day > y->value.date.day) 34935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 34945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 34955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 34965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* time */ 34975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 8) 34985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 34995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 8) { 35005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.hour < y->value.date.hour) 35015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 35025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.hour > y->value.date.hour) 35035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 35045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.min < y->value.date.min) 35055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 35065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.min > y->value.date.min) 35075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 35085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.sec < y->value.date.sec) 35095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 35105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.sec > y->value.date.sec) 35115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 35125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 35135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3514070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 3515070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 3516070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3517070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 35186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveReplaceStrings: 35196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 35206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 35216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @invert: inverts the result if x < y or x > y. 35226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 35236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 35246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is 35256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "replace". I.e. @x could 35266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString". 35276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 35286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 35296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 35306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 35316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 35326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaComparePreserveReplaceStrings(xmlSchemaValPtr x, xmlSchemaValPtr y, 35336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int invert) 35346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 35356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar *utf1; 35366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar *utf2; 35376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 35386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 35396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 35406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-2); 35416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf1 = x->value.str; 35426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2 = y->value.str; 35436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 35446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik while ((*utf1 != 0) && (*utf2 != 0)) { 35456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (IS_WSP_REPLACE_CH(*utf2)) { 35466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (! IS_WSP_SPACE_CH(*utf1)) { 35476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if ((*utf1 - 0x20) < 0) { 35486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 35496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 35506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 35516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 35526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 35536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 35546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 35556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 35566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 35576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 35586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 35596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 35606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik tmp = *utf1 - *utf2; 35616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) { 35626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 35636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 35646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 35656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 35666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 35676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) { 35686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 35696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 35706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 35716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 35726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 35736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 35746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf1++; 35756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2++; 35766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 35776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (*utf1 != 0) { 35786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 35796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 35806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 35816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 35826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 35836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (*utf2 != 0) { 35846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 35856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 35866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 35876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 35886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 35896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 35906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 35916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 35926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 35936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings: 35946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 35956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 35966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 35976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 35986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is 35996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could 36006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString". 36016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 36026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 36036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 36046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 36056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 36066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaComparePreserveCollapseStrings(xmlSchemaValPtr x, xmlSchemaValPtr y, 36076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int invert) 36086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 36096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar *utf1; 36106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar *utf2; 36116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 36126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 36136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 36146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-2); 36156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf1 = x->value.str; 36166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2 = y->value.str; 36176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 36186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 36196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip leading blank chars of the collapsed string. 36206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 36216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2)) 36226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2++; 36236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 36246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik while ((*utf1 != 0) && (*utf2 != 0)) { 36256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2)) { 36266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (! IS_WSP_SPACE_CH(*utf1)) { 36276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 36286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * The utf2 character would have been replaced to 0x20. 36296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 36306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if ((*utf1 - 0x20) < 0) { 36316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 36326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 36336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 36346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 36356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 36366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 36376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 36386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 36396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 36406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 36416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 36426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf1++; 36436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2++; 36446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 36456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip contiguous blank chars of the collapsed string. 36466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 36476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2)) 36486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2++; 36496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 36506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik tmp = *utf1++ - *utf2++; 36516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) { 36526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 36536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 36546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 36556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 36566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 36576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) { 36586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 36596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 36606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 36616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 36626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 36636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 36646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 36656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (*utf1 != 0) { 36666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 36676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 36686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 36696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 36706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 36716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (*utf2 != 0) { 36726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 36736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip trailing blank chars of the collapsed string. 36746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 36756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2)) 36766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2++; 36776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (*utf2 != 0) { 36786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 36796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 36806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 36816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 36826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 36836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 36846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 36856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 36866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 36876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 36886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings: 36896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 36906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 36916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 36926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 36936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is 36946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could 36956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString". 36966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 36976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 36986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 36996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 37006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 37016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareReplaceCollapseStrings(xmlSchemaValPtr x, xmlSchemaValPtr y, 37026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int invert) 37036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 37046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar *utf1; 37056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar *utf2; 37066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 37076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 37086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 37096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-2); 37106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf1 = x->value.str; 37116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2 = y->value.str; 37126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 37136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 37146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip leading blank chars of the collapsed string. 37156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 37166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2)) 37176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2++; 37186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 37196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik while ((*utf1 != 0) && (*utf2 != 0)) { 37206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2)) { 37216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (! (IS_WSP_SPACE_CH(*utf1) || IS_WSP_REPLACE_CH(*utf1))) { 37226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 37236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * The utf2 character would have been replaced to 0x20. 37246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 37256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if ((*utf1 - 0x20) < 0) { 37266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 37276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 37286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 37296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 37306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 37316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 37326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 37336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 37346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 37356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 37366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 37376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf1++; 37386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2++; 37396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 37406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip contiguous blank chars of the collapsed string. 37416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 37426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2)) 37436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2++; 37446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 37456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (IS_WSP_SPACE_CH(*utf1) || IS_WSP_REPLACE_CH(*utf1)) { 37466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 37476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * The utf1 character would have been replaced to 0x20. 37486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 37496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if ((0x20 - *utf2) < 0) { 37506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 37516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 37526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 37536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 37546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 37556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 37566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 37576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 37586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 37596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 37606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 37616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik tmp = *utf1++ - *utf2++; 37626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) 37636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 37646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) 37656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 37666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 37676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 37686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (*utf1 != 0) { 37696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 37706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 37716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 37726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 37736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 37746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (*utf2 != 0) { 37756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 37766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip trailing blank chars of the collapsed string. 37776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 37786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2)) 37796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2++; 37806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (*utf2 != 0) { 37816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 37826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 37836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 37846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 37856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 37866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 37876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 37886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 37896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 37906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 37916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 37926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareReplacedStrings: 37936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 37946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 37956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 37966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 37976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 37986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 37996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 38006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 38016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 38026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareReplacedStrings(xmlSchemaValPtr x, xmlSchemaValPtr y) 38036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 38046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar *utf1; 38056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar *utf2; 38066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 38076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 38086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 38096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-2); 38106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf1 = x->value.str; 38116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2 = y->value.str; 38126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 38136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik while ((*utf1 != 0) && (*utf2 != 0)) { 38146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2)) { 38156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (! (IS_WSP_SPACE_CH(*utf1) || IS_WSP_REPLACE_CH(*utf1))) { 38166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if ((*utf1 - 0x20) < 0) 38176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 38186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 38196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 38206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 38216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 38226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (IS_WSP_SPACE_CH(*utf1) || IS_WSP_REPLACE_CH(*utf1)) { 38236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if ((0x20 - *utf2) < 0) 38246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 38256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 38266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 38276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 38286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik tmp = *utf1 - *utf2; 38296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) 38306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 38316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) 38326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 38336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 38346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf1++; 38356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2++; 38366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 38376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (*utf1 != 0) 38386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 38396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (*utf2 != 0) 38406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 38416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 38426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 38436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 38446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 3845c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaCompareNormStrings: 3846c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @x: a first string value 3847c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @y: a second string value 3848c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 3849c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Compare 2 string for their normalized values. 3850c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 3851c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 3852c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * case of error 3853c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */ 3854c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int 3855c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaCompareNormStrings(xmlSchemaValPtr x, xmlSchemaValPtr y) { 3856c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard const xmlChar *utf1; 3857c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard const xmlChar *utf2; 3858c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard int tmp; 3859c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 3860c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((x == NULL) || (y == NULL)) 3861c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-2); 3862c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf1 = x->value.str; 3863c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf2 = y->value.str; 3864c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 386576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf1)) utf1++; 386676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf2)) utf2++; 3867c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard while ((*utf1 != 0) && (*utf2 != 0)) { 386876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (IS_BLANK_CH(*utf1)) { 386976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (!IS_BLANK_CH(*utf2)) { 3870c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard tmp = *utf1 - *utf2; 3871c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(tmp); 3872c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 387376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf1)) utf1++; 387476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf2)) utf2++; 3875c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 3876c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard tmp = *utf1++ - *utf2++; 3877c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (tmp < 0) 3878c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 3879c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (tmp > 0) 3880c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(1); 3881c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 3882c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 3883c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf1 != 0) { 388476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf1)) utf1++; 3885c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf1 != 0) 3886c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(1); 3887c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 3888c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf2 != 0) { 388976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf2)) utf2++; 3890c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf2 != 0) 3891c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 3892c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 3893c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(0); 3894c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard} 3895c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 3896c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/** 3897b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCompareFloats: 3898b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @x: a first float or double value 3899b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @y: a second float or double value 3900b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 3901b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Compare 2 values 3902b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 3903b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 3904b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * case of error 3905b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 3906b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int 3907b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) { 3908b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard double d1, d2; 3909b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 3910b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((x == NULL) || (y == NULL)) 3911b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 3912b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 3913b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 3914b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Cast everything to doubles. 3915b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 3916b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->type == XML_SCHEMAS_DOUBLE) 3917b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d1 = x->value.d; 3918b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else if (x->type == XML_SCHEMAS_FLOAT) 3919b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d1 = x->value.f; 3920b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 3921b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 3922b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 3923b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (y->type == XML_SCHEMAS_DOUBLE) 3924b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d2 = y->value.d; 3925b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else if (y->type == XML_SCHEMAS_FLOAT) 3926b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d2 = y->value.f; 3927b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 3928b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 3929b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 3930b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 3931b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check for special cases. 3932b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 3933b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d1)) { 3934b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d2)) 3935b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 3936b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 3937b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 3938b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d2)) 3939b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 3940b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == xmlXPathPINF) { 3941b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathPINF) 3942b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 3943b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 3944b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 3945b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathPINF) 3946b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 3947b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == xmlXPathNINF) { 3948b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathNINF) 3949b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 3950b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 3951b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 3952b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathNINF) 3953b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 3954b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 3955b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 3956b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * basic tests, the last one we should have equality, but 3957b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * portability is more important than speed and handling 3958b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * NaN or Inf in a portable way is always a challenge, so ... 3959b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 3960b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 < d2) 3961b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 3962b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 > d2) 3963b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 3964b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == d2) 3965b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 3966b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(2); 3967b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 3968b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 3969b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 39704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareValues: 39714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x: a first value 39726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xwtsp: the whitespace type 39734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y: a second value 39746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @ywtsp: the whitespace type 39754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 39764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 values 39774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 39785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 39795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error 39804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 39816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 39826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValuesInternal(xmlSchemaValPtr x, 39836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, 39846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaValPtr y, 39856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaWhitespaceValueType yws) { 39864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if ((x == NULL) || (y == NULL)) 39874255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(-2); 39884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 39894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard switch (x->type) { 399080b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UNKNOWN: 39912f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_ANYTYPE: 39922f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_ANYSIMPLETYPE: 399380b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(-2); 399480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_INTEGER: 399580b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NPINTEGER: 399680b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NINTEGER: 399780b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NNINTEGER: 399880b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_PINTEGER: 399980b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_INT: 400080b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UINT: 400180b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_LONG: 400280b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ULONG: 400380b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_SHORT: 400480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_USHORT: 400580b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_BYTE: 400680b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UBYTE: 40074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMAS_DECIMAL: 400880b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (y->type == x->type) 400980b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(xmlSchemaCompareDecimals(x, y)); 401080b19092f24410a6b869abf519227686e8f207caDaniel Veillard if ((y->type == XML_SCHEMAS_DECIMAL) || 401180b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_INTEGER) || 401280b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_NPINTEGER) || 401380b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_NINTEGER) || 401480b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_NNINTEGER) || 401580b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_PINTEGER) || 401680b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_INT) || 401780b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_UINT) || 401880b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_LONG) || 401980b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_ULONG) || 402080b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_SHORT) || 402180b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_USHORT) || 402280b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_BYTE) || 402380b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_UBYTE)) 40244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(xmlSchemaCompareDecimals(x, y)); 40255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return(-2); 4026070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMAS_DURATION: 4027070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (y->type == XML_SCHEMAS_DURATION) 4028070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(xmlSchemaCompareDurations(x, y)); 40295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return(-2); 40305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 40315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 40325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 40335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 40345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 40355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 40365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 40375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 40385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((y->type == XML_SCHEMAS_DATETIME) || 40395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_TIME) || 40405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_GDAY) || 40415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_GMONTH) || 40425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_GMONTHDAY) || 40435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_GYEAR) || 40445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_DATE) || 40455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_GYEARMONTH)) 40465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return (xmlSchemaCompareDates(x, y)); 40475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return (-2); 40486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_STRING: 40496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 405080b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_TOKEN: 405180b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_LANGUAGE: 405280b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NMTOKEN: 405380b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NAME: 405480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NCNAME: 405580b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ID: 405680b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_IDREF: 405780b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ENTITY: 405880b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NOTATION: 405980b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ANYURI: 40606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 40616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * TODO: Compare those against QName. 40626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 40636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (y->type == XML_SCHEMAS_QNAME) { 40646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik TODO 40656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-2); 40666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 40676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if ((y->type == XML_SCHEMAS_STRING) || 40686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik (y->type == XML_SCHEMAS_NORMSTRING) || 4069c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_TOKEN) || 4070c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_LANGUAGE) || 4071c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_NMTOKEN) || 4072c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_NAME) || 4073c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_NCNAME) || 4074c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_ID) || 4075c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_IDREF) || 4076c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_ENTITY) || 4077c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_NOTATION) || 40786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik (y->type == XML_SCHEMAS_ANYURI)) { 40796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 40806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (xws == XML_SCHEMA_WHITESPACE_PRESERVE) { 40816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 40826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) { 40836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* TODO: What about x < y or x > y. */ 40846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (xmlStrEqual(x->value.str, y->value.str)) 40856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (0); 40866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 40876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (2); 40886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else if (yws == XML_SCHEMA_WHITESPACE_REPLACE) 40896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (xmlSchemaComparePreserveReplaceStrings(x, y, 0)); 40906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) 40916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (xmlSchemaComparePreserveCollapseStrings(x, y, 0)); 40926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 40936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else if (xws == XML_SCHEMA_WHITESPACE_REPLACE) { 40946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 40956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) 40966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (xmlSchemaComparePreserveReplaceStrings(y, x, 1)); 40976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_REPLACE) 40986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (xmlSchemaCompareReplacedStrings(x, y)); 40996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) 41006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (xmlSchemaCompareReplaceCollapseStrings(x, y, 0)); 41016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 41026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else if (xws == XML_SCHEMA_WHITESPACE_COLLAPSE) { 41036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 41046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) 41056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (xmlSchemaComparePreserveCollapseStrings(y, x, 1)); 41066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_REPLACE) 41076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (xmlSchemaCompareReplaceCollapseStrings(y, x, 1)); 41086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) 41096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (xmlSchemaCompareNormStrings(x, y)); 41106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else 41116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-2); 41126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 41136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4114c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return (-2); 4115e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_QNAME: 4116e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (y->type == XML_SCHEMAS_QNAME) { 4117e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) && 4118e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (xmlStrEqual(x->value.qname.uri, y->value.qname.uri))) 4119e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(0); 4120e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(2); 4121e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 4122e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (-2); 4123c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_FLOAT: 4124c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_DOUBLE: 4125b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((y->type == XML_SCHEMAS_FLOAT) || 4126b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard (y->type == XML_SCHEMAS_DOUBLE)) 4127b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (xmlSchemaCompareFloats(x, y)); 4128b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (-2); 4129c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_BOOLEAN: 4130b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (y->type == XML_SCHEMAS_BOOLEAN) { 4131b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->value.b == y->value.b) 4132b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4133b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->value.b == 0) 4134b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4135b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4136b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4137b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (-2); 4138560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_HEXBINARY: 413970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard if (y->type == XML_SCHEMAS_HEXBINARY) { 414070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard if (x->value.hex.total == y->value.hex.total) { 414170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard int ret = xmlStrcmp(x->value.hex.str, y->value.hex.str); 414270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard if (ret > 0) 414370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(1); 414470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard else if (ret == 0) 414570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(0); 414670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 414770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard else if (x->value.hex.total > y->value.hex.total) 414870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(1); 414970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 415070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(-1); 415170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 4152560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return (-2); 41531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 41541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (y->type == XML_SCHEMAS_BASE64BINARY) { 41551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (x->value.base64.total == y->value.base64.total) { 41561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int ret = xmlStrcmp(x->value.base64.str, 41571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard y->value.base64.str); 41581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret > 0) 41591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(1); 41601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (ret == 0) 41611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(0); 41621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 41631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (x->value.base64.total > y->value.base64.total) 41641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(1); 41651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 41661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(-1); 41671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 41686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-2); 4169c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_IDREFS: 4170c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ENTITIES: 4171c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NMTOKENS: 4172c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard TODO 4173c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 41744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 41755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 41764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 41774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 41784255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 41796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValues: 41806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first value 41816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second value 41826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 41836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values 41846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 41856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 41866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 41876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 41886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint 41896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) { 41906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, yws; 41916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 41926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (x->type == XML_SCHEMAS_STRING) 41936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xws = XML_SCHEMA_WHITESPACE_PRESERVE; 41946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else if (x->type == XML_SCHEMAS_NORMSTRING) 41956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xws = XML_SCHEMA_WHITESPACE_REPLACE; 41966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 41976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xws = XML_SCHEMA_WHITESPACE_COLLAPSE; 41986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 41996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (y->type == XML_SCHEMAS_STRING) 42006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik yws = XML_SCHEMA_WHITESPACE_PRESERVE; 42016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else if (x->type == XML_SCHEMAS_NORMSTRING) 42026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik yws = XML_SCHEMA_WHITESPACE_REPLACE; 42036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik yws = XML_SCHEMA_WHITESPACE_COLLAPSE; 42056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 42066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(xmlSchemaCompareValuesInternal(x, xws, y, yws)); 42076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 42086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 42096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 42106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValuesWhtsp: 42116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first value 42126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xws: the whitespace value of x 42136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second value 42146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @yws: the whitespace value of y 42156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 42166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values 42176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 42186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 42196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 42206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 42216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint 42226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValuesWhtsp(xmlSchemaValPtr x, 42236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, 42246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaValPtr y, 42256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaWhitespaceValueType yws) { 42266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(xmlSchemaCompareValuesInternal(x, xws, y, yws)); 42276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 42286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 42296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 4230c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaNormLen: 4231c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @value: a string 4232c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 4233c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Computes the UTF8 length of the normalized value of the string 4234c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 4235c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns the length or -1 in case of error. 4236c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */ 4237c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int 4238c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaNormLen(const xmlChar *value) { 4239c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard const xmlChar *utf; 4240c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard int ret = 0; 4241c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 4242c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (value == NULL) 4243c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4244c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf = value; 424576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf)) utf++; 4246c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard while (*utf != 0) { 4247c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (utf[0] & 0x80) { 4248c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[1] & 0xc0) != 0x80) 4249c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4250c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xe0) == 0xe0) { 4251c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[2] & 0xc0) != 0x80) 4252c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4253c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xf0) == 0xf0) { 4254c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80) 4255c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4256c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 4; 4257c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 4258c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 3; 4259c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4260c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 4261c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 2; 4262c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 426376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack } else if (IS_BLANK_CH(*utf)) { 426476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf)) utf++; 4265c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf == 0) 4266c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 4267c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 4268c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf++; 4269c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4270c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard ret++; 4271c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4272c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(ret); 4273c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard} 4274c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 42756927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard/** 42766927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaGetFacetValueAsULong: 42776927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * @facet: an schemas type facet 42786927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * 42796927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Extract the value of a facet 42806927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * 42816927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Returns the value as a long 42826927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard */ 4283c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardunsigned long 4284c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaGetFacetValueAsULong(xmlSchemaFacetPtr facet) 4285c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{ 4286c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard /* 4287c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * TODO: Check if this is a decimal. 4288c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 4289094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack if (facet == NULL) 4290094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack return 0; 4291c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return ((unsigned long) facet->val->value.decimal.lo); 4292c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 4293c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 4294c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/** 429501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateListSimpleTypeFacet: 429601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facet: the facet to check 429701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @value: the lexical repr of the value to validate 429801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @actualLen: the number of list items 429901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @expectedLen: the resulting expected number of list items 430001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 430101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Checks the value of a list simple type against a facet. 430201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 430301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 0 if the value is valid, a positive error code 430401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * number otherwise and -1 in case of an internal error. 430501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 430601fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint 430701fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaValidateListSimpleTypeFacet(xmlSchemaFacetPtr facet, 430801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard const xmlChar *value, 430901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard unsigned long actualLen, 431001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard unsigned long *expectedLen) 431101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 4312ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard if (facet == NULL) 4313ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard return(-1); 431401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 431501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * TODO: Check if this will work with large numbers. 431601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * (compare value.decimal.mi and value.decimal.hi as well?). 431701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 431801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 431901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen != facet->val->value.decimal.lo) { 4320c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (expectedLen != 0) 4321c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 432201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_LENGTH_VALID); 432301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 432401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 432501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen < facet->val->value.decimal.lo) { 4326c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (expectedLen != 0) 4327c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 432801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_MINLENGTH_VALID); 432901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 433001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MAXLENGTH) { 433101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen > facet->val->value.decimal.lo) { 4332c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (expectedLen != 0) 4333c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 433401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_MAXLENGTH_VALID); 433501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 433601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else 433701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 433801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * NOTE: That we can pass NULL as xmlSchemaValPtr to 433901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateFacet, since the remaining facet types 434001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * are: XML_SCHEMA_FACET_PATTERN, XML_SCHEMA_FACET_ENUMERATION. 434101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 434201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(xmlSchemaValidateFacet(NULL, facet, value, NULL)); 434301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 434401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 434501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 434601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 43476927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaValidateLengthFacet: 4348c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the built-in type 4349c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @facet: the facet to check 4350c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the lexical repr. of the value to be validated 4351c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val: the precomputed value 4352c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @length: the actual length of the value 4353c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 4354c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength" 4355c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * facet; sets @length to the computed length of @value. 4356c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 4357c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if the value is valid, a positive error code 4358c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * otherwise and -1 in case of an internal or API error. 4359c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 4360c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardint 4361c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaValidateLengthFacet(xmlSchemaTypePtr type, 4362c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard xmlSchemaFacetPtr facet, 4363c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard const xmlChar *value, 4364c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard xmlSchemaValPtr val, 4365c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard unsigned long *length) 4366c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{ 4367c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard unsigned int len = 0; 4368c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 4369ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard if ((length == NULL) || (facet == NULL) || (type == NULL)) 4370ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard return (-1); 4371c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *length = 0; 4372c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((facet->type != XML_SCHEMA_FACET_LENGTH) && 4373c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->type != XML_SCHEMA_FACET_MAXLENGTH) && 4374c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->type != XML_SCHEMA_FACET_MINLENGTH)) 4375c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return (-1); 4376c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 4377c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((facet->val == NULL) || 4378c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard ((facet->val->type != XML_SCHEMAS_DECIMAL) && 4379c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 4380c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->val->value.decimal.frac != 0)) { 4381c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(-1); 4382c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 4383c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) 4384c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard len = val->value.hex.total; 4385c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY)) 4386c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard len = val->value.base64.total; 4387c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard else { 4388c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard switch (type->builtInType) { 4389c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_IDREF: 4390c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NORMSTRING: 4391c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_TOKEN: 4392c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_LANGUAGE: 4393c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NMTOKEN: 4394c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NAME: 4395c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NCNAME: 4396c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_ID: 4397c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard len = xmlSchemaNormLen(value); 4398c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard break; 4399c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_STRING: 4400c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard /* 4401c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * FIXME: What exactly to do with anyURI? 4402c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 4403c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_ANYURI: 4404c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (value != NULL) 4405c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard len = xmlUTF8Strlen(value); 4406c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard break; 4407c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard default: 4408c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard TODO 4409c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 4410c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 4411c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *length = (unsigned long) len; 4412c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 4413c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len != facet->val->value.decimal.lo) 4414c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_LENGTH_VALID); 4415c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 4416c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len < facet->val->value.decimal.lo) 4417c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_MINLENGTH_VALID); 4418c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } else { 4419c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len > facet->val->value.decimal.lo) 4420c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_MAXLENGTH_VALID); 4421c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 4422c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 4423c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return (0); 4424c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 4425c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 4426c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/** 4427c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaValidateFacet: 442801c13b5be2d249ef66d86585adee87901bb8efa2Daniel Veillard * @base: the base type 44294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @facet: the facet to check 44304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the lexical repr of the value to validate 44314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val: the precomputed value 44324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 44334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Check a value against a facet condition 44344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 44354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if the element is schemas valid, a positive error code 44364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * number otherwise and -1 in case of internal or API error. 44374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 44384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardint 4439dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateFacet(xmlSchemaTypePtr base ATTRIBUTE_UNUSED, 4440118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard xmlSchemaFacetPtr facet, 44414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard const xmlChar *value, xmlSchemaValPtr val) 44424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{ 44434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard int ret; 44444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 4445ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard if ((facet == NULL) || (value == NULL)) 4446ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard return(-1); 44474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard switch (facet->type) { 44484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMA_FACET_PATTERN: 44494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = xmlRegexpExec(facet->regexp, value); 44504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == 1) 44514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 44524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == 0) { 445301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_PATTERN_VALID); 44544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 44554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(ret); 44564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMA_FACET_MAXEXCLUSIVE: 44574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 44584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == -2) { 44598bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO error code */ 44604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(-1); 44614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 44624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == -1) 44634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 44645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* error code */ 446501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID); 4466070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MAXINCLUSIVE: 4467070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 4468070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == -2) { 44698bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO error code */ 4470070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 4471070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 4472070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret == -1) || (ret == 0)) 4473070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 44745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* error code */ 447501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID); 4476070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MINEXCLUSIVE: 4477070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 4478070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == -2) { 44798bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO error code */ 4480070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 4481070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 4482070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 1) 4483070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 44845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* error code */ 448501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID); 4486070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MININCLUSIVE: 4487070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 4488070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == -2) { 44898bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO error code */ 4490070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 4491070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 4492070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret == 1) || (ret == 0)) 4493070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 44945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* error code */ 449501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MININCLUSIVE_VALID); 44968651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard case XML_SCHEMA_FACET_WHITESPACE: 44978bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO whitespaces */ 449801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 449901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * NOTE: Whitespace should be handled to normalize 450001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * the value to be validated against a the facets; 450101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * not to normalize the value in-between. 450201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 45038651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard return(0); 45048bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_ENUMERATION: 45058bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard if ((facet->value != NULL) && 45068bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard (xmlStrEqual(facet->value, value))) 45078bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard return(0); 450801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_ENUMERATION_VALID); 45098bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_LENGTH: 4510e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard case XML_SCHEMA_FACET_MAXLENGTH: 45118bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_MINLENGTH: { 45128bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard unsigned int len = 0; 4513e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard 45148bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard if ((facet->val == NULL) || 4515e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((facet->val->type != XML_SCHEMAS_DECIMAL) && 4516e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 45178bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard (facet->val->value.decimal.frac != 0)) { 45188bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard return(-1); 45198bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 4520560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) 452170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard len = val->value.hex.total; 45221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY)) 45231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard len = val->value.base64.total; 45241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else { 452501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (base->builtInType) { 4526560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_IDREF: 4527560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NORMSTRING: 4528560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_TOKEN: 4529560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_LANGUAGE: 4530560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NMTOKEN: 4531560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NAME: 4532560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NCNAME: 4533560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_ID: 453470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard len = xmlSchemaNormLen(value); 453570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard break; 4536560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_STRING: 453701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 453801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * FIXME: What exactly to do with anyURI? 453901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 454001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 4541fbf2c5eaf550a8e7b94e87d5a4940db53bdffeacWilliam M. Brack if (value != NULL) 4542fbf2c5eaf550a8e7b94e87d5a4940db53bdffeacWilliam M. Brack len = xmlUTF8Strlen(value); 454370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard break; 4544560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard default: 4545560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard TODO 454670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 45478bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 45488bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 4549e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len != facet->val->value.decimal.lo) 455001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_LENGTH_VALID); 45518bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 4552e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len < facet->val->value.decimal.lo) 455301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MINLENGTH_VALID); 45548bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } else { 4555e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len > facet->val->value.decimal.lo) 455601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXLENGTH_VALID); 4557e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard } 45588bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard break; 45598bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 4560560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMA_FACET_TOTALDIGITS: 4561560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMA_FACET_FRACTIONDIGITS: 4562560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 4563560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((facet->val == NULL) || 4564560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard ((facet->val->type != XML_SCHEMAS_DECIMAL) && 4565560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 4566560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (facet->val->value.decimal.frac != 0)) { 4567560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return(-1); 4568560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 4569560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((val == NULL) || 4570560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard ((val->type != XML_SCHEMAS_DECIMAL) && 4571560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_INTEGER) && 4572560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NPINTEGER) && 4573560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NINTEGER) && 4574560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NNINTEGER) && 4575560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_PINTEGER) && 4576560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_INT) && 4577560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_UINT) && 4578560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_LONG) && 4579560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_ULONG) && 4580560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_SHORT) && 4581560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_USHORT) && 4582560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_BYTE) && 4583560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_UBYTE))) { 4584560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return(-1); 4585560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 4586560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) { 4587560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (val->value.decimal.total > facet->val->value.decimal.lo) 458801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_TOTALDIGITS_VALID); 4589560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 4590560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) { 4591560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (val->value.decimal.frac > facet->val->value.decimal.lo) 459201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID); 4593560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 4594560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard break; 45954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard default: 45964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard TODO 45974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 45984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 4599b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 46004255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 46014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 46026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 46036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaGetCanonValue: 46046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @val: the precomputed value 46056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @retValue: the returned value 46066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 46076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns a the cononical representation of the value. 46086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * The called has to free the returned retValue. 46096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 46106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns 0 if the value could be built and -1 in case of 46116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * API errors or if the value type is not supported yet. 46126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 46136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint 46146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaGetCanonValue(xmlSchemaValPtr val, 46156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar **retValue) 46166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 46176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (retValue == NULL) 46186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-1); 46196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *retValue = NULL; 46206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik switch (val->type) { 46216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_STRING: 46226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 46236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 46246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_TOKEN: 46256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_LANGUAGE: 46266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NMTOKEN: 46276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NAME: 46286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_QNAME: 46296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NCNAME: 46306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_ID: 46316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 46326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_ENTITY: 46336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NOTATION: 46346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_ANYURI: 46356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 46366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (val->value.str == NULL) 46376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *retValue = NULL; 46386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 46396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* TODO: This is not yet correct for non-normalized values. */ 46406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *retValue = 46416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik BAD_CAST xmlStrdup((const xmlChar *) val->value.str); 46426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (0); 46436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik default: 46446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-1); 46456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 46466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-1); 46476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 46486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 46494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#endif /* LIBXML_SCHEMAS_ENABLED */ 4650