xmlschemastypes.c revision 2ee855d0d0b5aff0c20768ebe5afe6601443ee0b
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 687b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @value: the value 6886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 6896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Allocate a new simple type value. The type can be 6902ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * of XML_SCHEMAS_STRING. 6912ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * WARNING: This one is intended to be expanded for other 6922ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * string based types. We need this for anySimpleType as well. 6936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 6946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error 6956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 6966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaValPtr 6976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaNewStringValue(xmlSchemaValType type, 6986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar *value) 6996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 7006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaValPtr val; 7016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 7026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (type != XML_SCHEMAS_STRING) 7036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(NULL); 7046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik val = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal)); 7056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (val == NULL) { 7066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(NULL); 7076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 7086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik memset(val, 0, sizeof(xmlSchemaVal)); 7096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik val->type = type; 7106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik val->value.str = (xmlChar *) value; 7116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(val); 7126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 7136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 714b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik/** 715b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * xmlSchemaNewNOTATIONValue: 716b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @name: the notation name 717b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @ns: the notation namespace name or NULL 718b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * 719b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * Allocate a new NOTATION value. 720b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * 721b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error 722b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik */ 723b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. BuchcikxmlSchemaValPtr 724b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. BuchcikxmlSchemaNewNOTATIONValue(const xmlChar *name, 725b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik const xmlChar *ns) 726b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik{ 727b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik xmlSchemaValPtr val; 728b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik 729b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik val = xmlSchemaNewValue(XML_SCHEMAS_NOTATION); 730b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik if (val == NULL) 731b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik return (NULL); 732b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik 73312d37ab63441baf9e03db70168cc1d0d6f1c2373William M. Brack val->value.qname.name = (xmlChar *)name; 734b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik if (ns != NULL) 73512d37ab63441baf9e03db70168cc1d0d6f1c2373William M. Brack val->value.qname.uri = (xmlChar *)ns; 736b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik return(val); 737b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik} 7386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 7396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 7404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaFreeValue: 7414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to free 7424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 7434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library 7444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 7454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid 7464255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaFreeValue(xmlSchemaValPtr value) { 7474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (value == NULL) 7484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return; 749c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard switch (value->type) { 750c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_STRING: 751c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NORMSTRING: 752c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_TOKEN: 753c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_LANGUAGE: 754c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NMTOKEN: 755c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NMTOKENS: 756c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NAME: 757c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NCNAME: 758c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ID: 759c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_IDREF: 760c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_IDREFS: 761c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ENTITY: 762b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik case XML_SCHEMAS_ENTITIES: 763c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ANYURI: 764c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (value->value.str != NULL) 765c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard xmlFree(value->value.str); 766c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 767b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik case XML_SCHEMAS_NOTATION: 768e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_QNAME: 769e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (value->value.qname.uri != NULL) 770e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlFree(value->value.qname.uri); 771e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (value->value.qname.name != NULL) 772e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlFree(value->value.qname.name); 773e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard break; 77470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard case XML_SCHEMAS_HEXBINARY: 77570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard if (value->value.hex.str != NULL) 77670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard xmlFree(value->value.hex.str); 77770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard break; 7781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 7791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (value->value.base64.str != NULL) 7801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(value->value.base64.str); 7811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 782c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard default: 783c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 784c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 7854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlFree(value); 7864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 7874255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 7884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 7894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaGetPredefinedType: 7904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name: the type name 7914255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @ns: the URI of the namespace usually "http://www.w3.org/2001/XMLSchema" 7924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 7934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Lookup a type in the default XML Schemas type library 7944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 7954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns the type if found, NULL otherwise 7964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 7974255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaTypePtr 7984255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaGetPredefinedType(const xmlChar *name, const xmlChar *ns) { 7994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 8004255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaInitTypes(); 8014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (name == NULL) 8024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(NULL); 8034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return((xmlSchemaTypePtr) xmlHashLookup2(xmlSchemaTypesBank, name, ns)); 8044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 805070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 80601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 80701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInListSimpleTypeItemType: 80801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in simple type. 80901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 8106927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Lookup function 8116927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * 812c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns the item type of @type as defined by the built-in datatype 813c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * hierarchy of XML Schema Part 2: Datatypes, or NULL in case of an error. 81401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 81501fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr 81601fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInListSimpleTypeItemType(xmlSchemaTypePtr type) 81701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 8184259532303e96e089a185c6f55056cb7c4902d71Daniel Veillard if ((type == NULL) || (type->type != XML_SCHEMA_TYPE_BASIC)) 81901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (NULL); 82001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type->builtInType) { 82101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NMTOKENS: 82201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNmtokenDef ); 82301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_IDREFS: 82401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdrefDef); 82501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ENTITIES: 82601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeEntityDef); 82701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard default: 82801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (NULL); 82901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 83001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 83101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 832070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**************************************************************** 833070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 834070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Convenience macros and functions * 835070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 836070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/ 837070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 838070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_TZO_CHAR(c) \ 839070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ((c == 0) || (c == 'Z') || (c == '+') || (c == '-')) 840070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 841070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_YEAR(yr) (yr != 0) 842070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MONTH(mon) ((mon >= 1) && (mon <= 12)) 843070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* VALID_DAY should only be used when month is unknown */ 844070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DAY(day) ((day >= 1) && (day <= 31)) 845070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_HOUR(hr) ((hr >= 0) && (hr <= 23)) 846070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MIN(min) ((min >= 0) && (min <= 59)) 847070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_SEC(sec) ((sec >= 0) && (sec < 60)) 848070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TZO(tzo) ((tzo > -1440) && (tzo < 1440)) 849070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_LEAP(y) \ 850070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) 851070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 852ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonth[12] = 853070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 854ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonthLeap[12] = 855070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 856070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 8575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MAX_DAYINMONTH(yr,mon) \ 8585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1]) 8595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 860070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MDAY(dt) \ 861070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (IS_LEAP(dt->year) ? \ 862070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (dt->day <= daysInMonthLeap[dt->mon - 1]) : \ 863070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (dt->day <= daysInMonth[dt->mon - 1])) 864070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 865070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATE(dt) \ 866070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_YEAR(dt->year) && VALID_MONTH(dt->mon) && VALID_MDAY(dt)) 867070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 868070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TIME(dt) \ 869070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_HOUR(dt->hour) && VALID_MIN(dt->min) && \ 870070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard VALID_SEC(dt->sec) && VALID_TZO(dt->tzo)) 871070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 872070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATETIME(dt) \ 873070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_DATE(dt) && VALID_TIME(dt)) 874070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 875070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_MIN (60) 876070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_HOUR (60 * SECS_PER_MIN) 877070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_DAY (24 * SECS_PER_HOUR) 878070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 8795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInYearByMonth[12] = 8805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; 8815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInLeapYearByMonth[12] = 8825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 }; 8835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 8845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DAY_IN_YEAR(day, month, year) \ 8855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((IS_LEAP(year) ? \ 8865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dayInLeapYearByMonth[month - 1] : \ 8875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dayInYearByMonth[month - 1]) + day) 8885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 8895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#ifdef DEBUG 8905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt) \ 8915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 8925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard "type=%o %04ld-%02u-%02uT%02u:%02u:%03f", \ 8935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->type,dt->value.date.year,dt->value.date.mon, \ 8945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->value.date.day,dt->value.date.hour,dt->value.date.min, \ 8955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->value.date.sec); \ 8965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt->value.date.tz_flag) \ 8975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt->value.date.tzo != 0) \ 8985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 8995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard "%+05d\n",dt->value.date.tzo); \ 9005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else \ 9015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, "Z\n"); \ 9025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else \ 9035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext,"\n") 9045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#else 9055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt) 9065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#endif 9075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 908070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 909070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGYear: 910070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 911070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 912070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 913070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gYear without time zone and fills in the appropriate 914070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 915070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gYear. It is supposed that @dt->year is big enough to contain 916070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * the year. 917070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 918070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 919070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 920070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 921070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) { 922070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str, *firstChar; 923070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0, digcnt = 0; 924070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 925070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (((*cur < '0') || (*cur > '9')) && 926070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (*cur != '-') && (*cur != '+')) 927070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 928070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 929070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 930070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = 1; 931070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 932070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 933070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 934070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard firstChar = cur; 935070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 936070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 937070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->year = dt->year * 10 + (*cur - '0'); 938070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 939070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard digcnt++; 940070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 941070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 942070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* year must be at least 4 digits (CCYY); over 4 943070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * digits cannot have a leading zero. */ 944070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0'))) 945070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 946070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 947070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) 948070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->year = - dt->year; 949070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 950070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_YEAR(dt->year)) 951070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 952070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 953070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 954070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 955070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 956070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 957070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 958070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_2_DIGITS: 959070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the integer to fill in 960070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 961070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer 962070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 963070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a 2-digits integer and updates @num with the value. @cur is 964070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer. 965070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and 966070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 967070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 968070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_2_DIGITS(num, cur, invalid) \ 969070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((cur[0] < '0') || (cur[0] > '9') || \ 970070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (cur[1] < '0') || (cur[1] > '9')) \ 971070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard invalid = 1; \ 972070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 973070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = (cur[0] - '0') * 10 + (cur[1] - '0'); \ 974070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur += 2; 975070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 976070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 977070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_FLOAT: 978070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the double to fill in 979070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 980070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer 981070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 982070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float and updates @num with the value. @cur is 983070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the float. The float must have a 984070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2-digits integer part and may or may not have a decimal part. 985070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and 986070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 987070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 988070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_FLOAT(num, cur, invalid) \ 989070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(num, cur, invalid); \ 990070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!invalid && (*cur == '.')) { \ 991070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double mult = 1; \ 992070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 993070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 994070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard invalid = 1; \ 995070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 996070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mult /= 10; \ 997070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num += (*cur - '0') * mult; \ 998070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 999070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 1000070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1001070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1002070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1003070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGMonth: 1004070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1005070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1006070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1007070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gMonth 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:gMonth. 1010070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1011070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1012070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1013070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1014070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) { 1015070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 1016070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 1017070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1018070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(dt->mon, cur, ret); 1019070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1020070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1021070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1022070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_MONTH(dt->mon)) 1023070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1024070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1025070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1026070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1027070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1028070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1029070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1030070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGDay: 1031070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1032070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1033070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1034070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gDay without time zone and fills in the appropriate 1035070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1036070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay. 1037070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1038070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1039070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1040070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1041070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) { 1042070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 1043070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 1044070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1045070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(dt->day, cur, ret); 1046070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1047070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1048070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1049070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_DAY(dt->day)) 1050070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1051070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1052070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1053070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1054070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1055070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1056070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1057070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTime: 1058070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1059070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1060070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1061070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:time without time zone and fills in the appropriate 1062070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * fields of the @dt structure. @str is updated to point just after the 1063070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:time. 1064070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, values of @dt fields are undefined. 1065070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1066070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1067070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1068070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1069070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) { 1070070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 1071070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int hour = 0; /* use temp var in case str is not xs:time */ 1072070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 1073070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1074070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(hour, cur, ret); 1075070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1076070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1077070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1078070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1079070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1080070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1081070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1082070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* the ':' insures this string is xs:time */ 1083070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->hour = hour; 1084070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1085070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(dt->min, cur, ret); 1086070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1087070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1088070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1089070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1090070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1091070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1092070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1093070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_FLOAT(dt->sec, cur, ret); 1094070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1095070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1096070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1097070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_TIME(dt)) 1098070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1099070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1100070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1101070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1102070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1103070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1104070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1105070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTimeZone: 1106070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1107070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1108070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1109070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a time zone without time zone and fills in the appropriate 1110070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1111070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * time zone. 1112070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1113070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1114070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1115070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1116070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) { 1117070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 1118070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 1119070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1120070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (str == NULL) 1121070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1122070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1123070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard switch (*cur) { 1124070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 0: 1125070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tz_flag = 0; 1126070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = 0; 1127070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1128070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1129070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 'Z': 1130070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tz_flag = 1; 1131070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = 0; 1132070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1133070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1134070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1135070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case '+': 1136070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case '-': { 1137070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0, tmp = 0; 1138070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = (*cur == '-'); 1139070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1140070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1141070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1142070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(tmp, cur, ret); 1143070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1144070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1145070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_HOUR(tmp)) 1146070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1147070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1148070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1149070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1150070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1151070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1152070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = tmp * 60; 1153070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1154070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(tmp, cur, ret); 1155070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1156070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1157070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_MIN(tmp)) 1158070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1159070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1160070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo += tmp; 1161070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) 1162070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = - dt->tzo; 1163070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1164070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_TZO(dt->tzo)) 1165070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1166070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 11675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->tz_flag = 1; 1168070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1169070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1170070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard default: 1171070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1172070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1173070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1174070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1175070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1176070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1177070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 11781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard/** 11791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * _xmlSchemaBase64Decode: 11801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * @ch: a character 11811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 11821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Converts a base64 encoded character to its base 64 value. 11831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 11841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Returns 0-63 (value), 64 (pad), or -1 (not recognized) 11851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */ 11861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic int 11871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard_xmlSchemaBase64Decode (const xmlChar ch) { 11881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('A' <= ch) && (ch <= 'Z')) return ch - 'A'; 11891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('a' <= ch) && (ch <= 'z')) return ch - 'a' + 26; 11901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('0' <= ch) && (ch <= '9')) return ch - '0' + 52; 11911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('+' == ch) return 62; 11921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('/' == ch) return 63; 11931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('=' == ch) return 64; 11941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return -1; 11951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard} 11961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 1197070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**************************************************************** 1198070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 1199070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * XML Schema Dates/Times Datatypes Handling * 1200070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 1201070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/ 1202070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1203070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1204070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_DIGITS: 1205070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the integer to fill in 1206070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1207070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag 1208070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1209070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a digits integer and updates @num with the value. @cur is 1210070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer. 1211070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and 1212070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1213070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1214070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_DIGITS(num, cur, num_type) \ 1215070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 1216070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = -1; \ 1217070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 1218070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 1219070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = num * 10 + (*cur - '0'); \ 1220070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1221070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1222070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1223070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1224070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_NUM: 1225070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the double to fill in 1226070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1227070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag 1228070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1229070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float or integer and updates @num with the value. @cur is 1230070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the number. If the number is a float, 1231070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * then it must have an integer part and a decimal part; @num_type will 1232070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * be set to 1. If there is no decimal part, @num_type is set to zero. 1233070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and 1234070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1235070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1236070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_NUM(num, cur, num_type) \ 1237070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = 0; \ 1238070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_DIGITS(num, cur, num_type); \ 1239070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!num_type && (*cur == '.')) { \ 1240070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double mult = 1; \ 1241070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1242070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 1243070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = -1; \ 1244070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 1245070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = 1; \ 1246070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 1247070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mult /= 10; \ 1248070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num += (*cur - '0') * mult; \ 1249070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1250070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 1251070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1252070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1253070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 12545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDates: 1255455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard * @type: the expected type or XML_SCHEMAS_UNKNOWN 1256070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dateTime: string to analyze 1257070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val: the return computed value 1258070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1259070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @dateTime conforms to the lexical space of one of the date types. 1260070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val. 1261070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1262070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 1263070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * and -1 in case of internal or API error. 1264070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1265070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1266455cc07308c673b6714e2f5670c2091a1dab95dcDaniel VeillardxmlSchemaValidateDates (xmlSchemaValType type, 1267118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard const xmlChar *dateTime, xmlSchemaValPtr *val) { 1268070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValPtr dt; 1269070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret; 1270070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = dateTime; 1271070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1272070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define RETURN_TYPE_IF_VALID(t) \ 1273070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (IS_TZO_CHAR(*cur)) { \ 1274070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); \ 1275070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 0) { \ 1276070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != 0) \ 1277070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; \ 1278070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->type = t; \ 1279455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard goto done; \ 1280070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 1281070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1282070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1283070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dateTime == NULL) 1284070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1285070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1286070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur != '-') && (*cur < '0') && (*cur > '9')) 1287070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1288070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1289070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN); 1290070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dt == NULL) 1291070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1292070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1293070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((cur[0] == '-') && (cur[1] == '-')) { 1294070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1295070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * It's an incomplete date (xs:gMonthDay, xs:gMonth or 1296070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay) 1297070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1298070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur += 2; 1299070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1300070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gDay? */ 1301070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 1302455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard if (type == XML_SCHEMAS_GMONTH) 1303455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard goto error; 1304070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ++cur; 1305070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1306070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1307070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1308070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1309070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY); 1310070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1311070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1312070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1313070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1314070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1315070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * it should be an xs:gMonthDay or xs:gMonth 1316070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1317070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); 1318070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1319070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1320070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1321d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1322d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a '-' char could indicate this type is xs:gMonthDay or 1323d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a negative time zone offset. Check for xs:gMonthDay first. 1324d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * Also the first three char's of a negative tzo (-MM:SS) can 1325d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * appear to be a valid day; so even if the day portion 1326d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * of the xs:gMonthDay verifies, we must insure it was not 1327d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a tzo. 1328d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1329d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if (*cur == '-') { 1330d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const xmlChar *rewnd = cur; 1331d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard cur++; 1332d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1333d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1334d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((ret == 0) && ((*cur == 0) || (*cur != ':'))) { 1335d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1336d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1337d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * we can use the VALID_MDAY macro to validate the month 1338d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * and day because the leap year test will flag year zero 1339d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * as a leap year (even though zero is an invalid year). 1340d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1341d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if (VALID_MDAY((&(dt->value.date)))) { 1342d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1343d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY); 1344070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1345d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1346d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1347d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1348d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1349d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1350d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * not xs:gMonthDay so rewind and check if just xs:gMonth 1351d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * with an optional time zone. 1352d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1353d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard cur = rewnd; 1354d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1355d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1356d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH); 1357070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1358070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1359070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1360070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1361070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1362070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * It's a right-truncated date or an xs:time. 1363070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Try to parse an xs:time then fallback on right-truncated dates. 1364070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1365070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur >= '0') && (*cur <= '9')) { 1366070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTime(&(dt->value.date), &cur); 1367070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 0) { 1368070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* it's an xs:time */ 1369070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_TIME); 1370070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1371070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1372070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1373070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* fallback on date parsing */ 1374070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur = dateTime; 1375070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1376070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGYear(&(dt->value.date), &cur); 1377070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1378070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1379070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1380070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gYear? */ 1381070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEAR); 1382070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1383070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != '-') 1384070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1385070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1386070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1387070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); 1388070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1389070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1390070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1391070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gYearMonth? */ 1392070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEARMONTH); 1393070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1394070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != '-') 1395070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1396070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1397070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1398070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1399070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret != 0) || !VALID_DATE((&(dt->value.date)))) 1400070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1401070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1402070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:date? */ 1403070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_DATE); 1404070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1405070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != 'T') 1406070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1407070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1408070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1409070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* it should be an xs:dateTime */ 1410070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTime(&(dt->value.date), &cur); 1411070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1412070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1413070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1414070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); 1415070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret != 0) || (*cur != 0) || !VALID_DATETIME((&(dt->value.date)))) 1416070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1417070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1418455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard 1419070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->type = XML_SCHEMAS_DATETIME; 1420070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1421455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillarddone: 1422d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#if 1 1423d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) 1424d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1425d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#else 1426d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1427d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * insure the parsed type is equal to or less significant (right 1428d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * truncated) than the desired type. 1429d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1430d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) { 1431d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1432d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* time only matches time */ 1433d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_TIME) && (dt->type == XML_SCHEMAS_TIME)) 1434d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1435d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1436d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_DATETIME) && 1437d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard ((dt->type != XML_SCHEMAS_DATE) || 1438d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEARMONTH) || 1439d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEAR))) 1440d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1441d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1442d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_DATE) && 1443d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard ((dt->type != XML_SCHEMAS_GYEAR) || 1444d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEARMONTH))) 1445d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1446d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1447d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_GYEARMONTH) && (dt->type != XML_SCHEMAS_GYEAR)) 1448d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1449d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1450d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_GMONTHDAY) && (dt->type != XML_SCHEMAS_GMONTH)) 1451d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1452d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1453455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard#endif 1454455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard 1455070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (val != NULL) 1456070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *val = dt; 145780b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 145880b19092f24410a6b869abf519227686e8f207caDaniel Veillard xmlSchemaFreeValue(dt); 1459070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1460070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1461070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1462070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror: 1463070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dt != NULL) 1464070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaFreeValue(dt); 1465070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1466070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1467070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1468070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 14695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDuration: 1470070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @type: the predefined type 1471070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @duration: string to analyze 1472070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val: the return computed value 1473070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1474070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @duration conforms to the lexical space of the duration type. 1475070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val. 1476070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1477070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 1478070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * and -1 in case of internal or API error. 1479070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1480070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1481dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED, 1482118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard const xmlChar *duration, xmlSchemaValPtr *val) { 1483070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = duration; 1484070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValPtr dur; 1485070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0; 1486070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int seq = 0; 1487d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard double num; 1488d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard int num_type = 0; /* -1 = invalid, 0 = int, 1 = floating */ 1489d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const xmlChar desig[] = {'Y', 'M', 'D', 'H', 'M', 'S'}; 1490d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const double multi[] = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0}; 1491070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1492070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (duration == NULL) 1493070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1494070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1495070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 1496070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = 1; 1497070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1498070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1499070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1500070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* duration must start with 'P' (after sign) */ 1501070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur++ != 'P') 1502070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1503070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 150480b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (*cur == 0) 150580b19092f24410a6b869abf519227686e8f207caDaniel Veillard return 1; 150680b19092f24410a6b869abf519227686e8f207caDaniel Veillard 1507070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); 1508070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dur == NULL) 1509070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1510070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1511070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while (*cur != 0) { 1512070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1513070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* input string should be empty or invalid date/time item */ 1514070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (seq >= sizeof(desig)) 1515070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1516070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1517070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* T designator must be present for time items */ 1518070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == 'T') { 1519070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (seq <= 3) { 1520070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard seq = 3; 1521070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1522070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else 1523070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1524070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else if (seq == 3) 1525070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1526070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1527070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* parse the number portion of the item */ 1528070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_NUM(num, cur, num_type); 1529070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1530070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((num_type == -1) || (*cur == 0)) 1531070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1532070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1533070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* update duration based on item type */ 1534070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while (seq < sizeof(desig)) { 1535070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == desig[seq]) { 1536070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1537070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* verify numeric type; only seconds can be float */ 1538070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((num_type != 0) && (seq < (sizeof(desig)-1))) 1539070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1540070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1541070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard switch (seq) { 1542070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 0: 1543070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon = (long)num * 12; 1544070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1545070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 1: 1546070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon += (long)num; 1547070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1548070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard default: 1549070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* convert to seconds using multiplier */ 1550070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.sec += num * multi[seq]; 1551070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard seq++; 1552070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1553070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1554070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1555070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; /* exit loop */ 1556070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1557070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* no date designators found? */ 1558070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (++seq == 3) 1559070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1560070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1561070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1562070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1563070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1564070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) { 1565070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon = -dur->value.dur.mon; 1566070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.day = -dur->value.dur.day; 1567070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.sec = -dur->value.dur.sec; 1568070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1569070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1570070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (val != NULL) 1571070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *val = dur; 157280b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 157380b19092f24410a6b869abf519227686e8f207caDaniel Veillard xmlSchemaFreeValue(dur); 1574070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1575070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1576070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1577070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror: 1578070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dur != NULL) 1579070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaFreeValue(dur); 1580070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1581070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1582070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1583a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard/** 1584a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * xmlSchemaStrip: 1585a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * @value: a value 1586a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * 1587a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Removes the leading and ending spaces of a string 1588a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * 1589a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the new string or NULL if no change was required. 1590a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard */ 1591a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlChar * 1592a1a9d0410000cc69874e53e438b250037d3e14cdDaniel VeillardxmlSchemaStrip(const xmlChar *value) { 1593a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard const xmlChar *start = value, *end, *f; 1594a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard 1595a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if (value == NULL) return(NULL); 159676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*start != 0) && (IS_BLANK_CH(*start))) start++; 1597a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end = start; 1598a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard while (*end != 0) end++; 1599a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard f = end; 1600a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end--; 160176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((end > start) && (IS_BLANK_CH(*end))) end--; 1602a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end++; 1603a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if ((start == value) && (f == end)) return(NULL); 1604a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(xmlStrndup(start, end - start)); 1605a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard} 160696a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard 160796a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard/** 160891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * xmlSchemaWhiteSpaceReplace: 160991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * @value: a value 161091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * 161191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Replaces 0xd, 0x9 and 0xa with a space. 161291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * 161391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Returns the new string or NULL if no change was required. 161491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik */ 161591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlChar * 161691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlSchemaWhiteSpaceReplace(const xmlChar *value) { 161791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik const xmlChar *cur = value; 161891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik xmlChar *ret = NULL, *mcur; 161991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 162091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if (value == NULL) 162191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik return(NULL); 162291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 162391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik while ((*cur != 0) && 162491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik (((*cur) != 0xd) && ((*cur) != 0x9) && ((*cur) != 0xa))) { 162591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik cur++; 162691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik } 162791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if (*cur == 0) 162891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik return (NULL); 162991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik ret = xmlStrdup(value); 163091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik /* TODO FIXME: I guess gcc will bark at this. */ 163191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik mcur = (xmlChar *) (ret + (cur - value)); 163291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik do { 163391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if ( ((*mcur) == 0xd) || ((*mcur) == 0x9) || ((*mcur) == 0xa) ) 163491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik *mcur = ' '; 163591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik mcur++; 163691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik } while (*mcur != 0); 163791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik return(ret); 163891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik} 163991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 164091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik/** 1641b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCollapseString: 1642b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: a value 1643b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 1644b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Removes and normalize white spaces in the string 1645b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 1646b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns the new string or NULL if no change was required. 1647b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 164801fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlChar * 1649b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCollapseString(const xmlChar *value) { 1650b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard const xmlChar *start = value, *end, *f; 1651b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlChar *g; 1652b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard int col = 0; 1653b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1654b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (value == NULL) return(NULL); 165576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*start != 0) && (IS_BLANK_CH(*start))) start++; 1656b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end = start; 1657b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while (*end != 0) { 165876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if ((*end == ' ') && (IS_BLANK_CH(end[1]))) { 1659b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard col = end - start; 1660b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard break; 1661b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) { 1662b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard col = end - start; 1663b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard break; 1664b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1665b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 1666b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1667b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (col == 0) { 1668b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard f = end; 1669b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end--; 167076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((end > start) && (IS_BLANK_CH(*end))) end--; 1671b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 1672b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((start == value) && (f == end)) return(NULL); 1673b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(xmlStrndup(start, end - start)); 1674b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1675b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard start = xmlStrdup(start); 1676b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (start == NULL) return(NULL); 1677b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard g = (xmlChar *) (start + col); 1678b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end = g; 1679b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while (*end != 0) { 168076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (IS_BLANK_CH(*end)) { 1681b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 168276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*end)) end++; 1683b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*end != 0) 1684b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g++ = ' '; 1685b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else 1686b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g++ = *end++; 1687b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1688b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g = 0; 1689b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return((xmlChar *) start); 1690b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 1691b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1692b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 169328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * xmlSchemaValAtomicListNode: 169428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @type: the predefined atomic type for a token in the list 169528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @value: the list value to check 169628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @ret: the return computed value 169728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @node: the node containing the value 169828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * 169928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Check that a value conforms to the lexical space of the predefined 170028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * list type. if true a value is computed and returned in @ret. 170128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * 1702a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the number of items if this validates, a negative error code 1703a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * number otherwise 170428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */ 170528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillardstatic int 170628c52ab518d34a36fd8da6870a5850088f129a6aDaniel VeillardxmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value, 170728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlSchemaValPtr *ret, xmlNodePtr node) { 170828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlChar *val, *cur, *endval; 170928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard int nb_values = 0; 1710580ced8ee28ecd99374da9383897678e4ba6c358Daniel Veillard int tmp = 0; 171128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard 171228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (value == NULL) { 171328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard return(-1); 171428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 171528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard val = xmlStrdup(value); 171628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (val == NULL) { 171728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard return(-1); 171828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 17196fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard if (ret != NULL) { 17206fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard *ret = NULL; 17216fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard } 172228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur = val; 172328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard /* 172428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Split the list 172528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */ 172676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*cur)) *cur++ = 0; 172728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (*cur != 0) { 172876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (IS_BLANK_CH(*cur)) { 172928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *cur = 0; 173028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur++; 173176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*cur)) *cur++ = 0; 173228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } else { 173328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard nb_values++; 173428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur++; 173576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++; 173628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 173728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 173828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (nb_values == 0) { 173928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlFree(val); 1740a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(nb_values); 174128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 174228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard endval = cur; 174328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur = val; 174428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while ((*cur == 0) && (cur != endval)) cur++; 174528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (cur != endval) { 174628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node); 174728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (tmp != 0) 174828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard break; 174928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (*cur != 0) cur++; 175028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while ((*cur == 0) && (cur != endval)) cur++; 175128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 17526fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard /* TODO what return value ? c.f. bug #158628 175328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (ret != NULL) { 175428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard TODO 17556fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard } */ 17566fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard xmlFree(val); 1757a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if (tmp == 0) 1758a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(nb_values); 1759a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(-1); 176028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard} 176128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard 176228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard/** 1763e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * xmlSchemaParseUInt: 1764e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @str: pointer to the string R/W 1765e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @llo: pointer to the low result 1766e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lmi: pointer to the mid result 1767e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lhi: pointer to the high result 1768e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * 1769e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Parse an unsigned long into 3 fields. 1770e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * 1771e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Returns the number of chars parsed or -1 if overflow of the capacity 1772e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard */ 1773e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic int 1774e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel VeillardxmlSchemaParseUInt(const xmlChar **str, unsigned long *llo, 1775e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long *lmi, unsigned long *lhi) { 1776e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long lo = 0, mi = 0, hi = 0; 1777e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard const xmlChar *tmp, *cur = *str; 1778e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard int ret = 0, i = 0; 1779e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 1780e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (*cur == '0') { 1781e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ret++; 1782e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard cur++; 1783e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1784e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard tmp = cur; 1785e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) { 1786e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard i++;tmp++;ret++; 1787e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1788e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (i > 24) { 1789e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *str = tmp; 1790e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(-1); 1791e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1792e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 16) { 1793e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard hi = hi * 10 + (*cur++ - '0'); 1794e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard i--; 1795e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1796e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 8) { 1797e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard mi = mi * 10 + (*cur++ - '0'); 1798e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard i--; 1799e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1800e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 0) { 1801e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard lo = lo * 10 + (*cur++ - '0'); 1802e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard i--; 1803e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1804e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 1805e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *str = cur; 1806e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *llo = lo; 1807e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *lmi = mi; 1808e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *lhi = hi; 1809e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(ret); 1810e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard} 1811e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 1812e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard/** 1813b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValAtomicType: 18144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type: the predefined type 18154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to check 18164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val: the return computed value 1817c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @node: the node containing the value 1818b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * flags: flags to control the vlidation 18194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 1820b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the atomic type. 18214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * if true a value is computed and returned in @val. 182201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * This checks the value space for list types as well (IDREFS, NMTOKENS). 18234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 18244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 18254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * and -1 in case of internal or API error. 18264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 1827b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int 18281ac24d36b12487995b659a8fc23a02b9460edb36Daniel VeillardxmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, 18291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaValPtr * val, xmlNodePtr node, int flags) 18301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard{ 18314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValPtr v; 1832b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlChar *norm = NULL; 1833d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard int ret = 0; 18344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 18354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 183601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitTypes(); 18374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (type == NULL) 18381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (-1); 18395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 1840eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard /* 1841eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard * validating a non existant text node is similar to validating 1842eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard * an empty one. 1843eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard */ 1844eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard if (value == NULL) 1845eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard value = BAD_CAST ""; 1846eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard 18474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (val != NULL) 18481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = NULL; 1849b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((flags == 0) && (value != NULL)) { 185091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 185101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((type->builtInType != XML_SCHEMAS_STRING) && 185291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik (type->builtInType != XML_SCHEMAS_ANYTYPE) && 185391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik (type->builtInType != XML_SCHEMAS_ANYSIMPLETYPE)) { 185491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if (type->builtInType == XML_SCHEMAS_NORMSTRING) 185591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik norm = xmlSchemaWhiteSpaceReplace(value); 185691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik else 185791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 18581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 18591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value = norm; 18601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 1861b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1862b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 186301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type->builtInType) { 18642f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_UNKNOWN: 18651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 18662f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_ANYTYPE: 18672f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_ANYSIMPLETYPE: 18682f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack goto return0; 1869b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_STRING: 18701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 18711516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard case XML_SCHEMAS_NORMSTRING:{ 18721516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard const xmlChar *cur = value; 18731516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard 18741516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard while (*cur != 0) { 18751516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 18761516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard goto return1; 18771516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } else { 18781516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard cur++; 18791516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 18801516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 18811516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard if (val != NULL) { 18821516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NORMSTRING); 18831516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard if (v != NULL) { 18841516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard v->value.str = xmlStrdup(value); 18851516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard *val = v; 18861516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } else { 18871516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard goto error; 18881516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 18891516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 18901516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard goto return0; 18911516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 18921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_DECIMAL:{ 18931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value, *tmp; 18941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned int frac = 0, len, neg = 0; 18951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long base = 0; 18961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 18971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 18981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 18991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '+') 19001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 19011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (*cur == '-') { 19021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard neg = 1; 19031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 19041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard tmp = cur; 19061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 19071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base = base * 10 + (*cur - '0'); 19081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 19091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard len = cur - tmp; 19111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '.') { 19121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 19131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard tmp = cur; 19141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 19151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base = base * 10 + (*cur - '0'); 19161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 19171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard frac = cur - tmp; 19191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 19211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 19221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 19231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL); 19241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 19251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = base; 19261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = neg; 19271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = frac; 19281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.total = frac + len; 19291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 19301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 19331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 1934b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_TIME: 1935b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GDAY: 1936b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GMONTH: 1937b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GMONTHDAY: 1938b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GYEAR: 1939b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GYEARMONTH: 1940b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DATE: 1941b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DATETIME: 194201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard ret = xmlSchemaValidateDates(type->builtInType, value, val); 19431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 1944b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DURATION: 19451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValidateDuration(type, value, val); 19461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 1947b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_FLOAT: 19481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_DOUBLE:{ 19491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 19501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int neg = 0; 19511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 19521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 19531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 19541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) { 19551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur += 3; 19561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 19571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 19581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 19591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 19601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 19611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 19621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathNAN; 19631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 19641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 19651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 19661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 19681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 19691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 19701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathNAN; 19711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 19721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 19731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 19741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 19771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 19791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 19811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard neg = 1; 19821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 19831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) { 19851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur += 3; 19861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 19871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 19881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 19891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 19901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 19911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 19921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (neg) 19931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathNINF; 19941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 19951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathPINF; 19961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 19971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 19981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 19991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 20011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 20021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 20031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (neg) 20041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathNINF; 20051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 20061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathPINF; 20071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 20081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 20091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 20101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 20131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 20151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((neg == 0) && (*cur == '+')) 20171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 20181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-')) 20191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 20201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 20211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 20221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '.') { 20241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 20251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) 20261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 20271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((*cur == 'e') || (*cur == 'E')) { 20291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 20301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((*cur == '-') || (*cur == '+')) 20311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 20321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) 20331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 20341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 20361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 20371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 20381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 20391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 20401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 2041d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard if (sscanf((const char *) value, "%f", 20421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard &(v->value.f)) == 1) { 204301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *val = v; 20441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 20451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 20461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 20471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 20491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 20501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 20521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 20531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 2054d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard if (sscanf((const char *) value, "%lf", 20551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard &(v->value.d)) == 1) { 20561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 20571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 20581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 20591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 20601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 20621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 20631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 20671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BOOLEAN:{ 20691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 20701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 20711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == '0') && (cur[1] == 0)) 20721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 20731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if ((cur[0] == '1') && (cur[1] == 0)) 20741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 20751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if ((cur[0] == 't') && (cur[1] == 'r') 20761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard && (cur[2] == 'u') && (cur[3] == 'e') 20771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard && (cur[4] == 0)) 20781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 20791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if ((cur[0] == 'f') && (cur[1] == 'a') 20801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard && (cur[2] == 'l') && (cur[3] == 's') 20811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard && (cur[4] == 'e') && (cur[5] == 0)) 20821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 20831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 20841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 20851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 20861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN); 20871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 20881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.b = ret; 20891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 20901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 20911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 20921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 20951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_TOKEN:{ 20971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 20981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 209976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (IS_BLANK_CH(*cur)) 21001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 21011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 21021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while (*cur != 0) { 21031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 21041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 21051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (*cur == ' ') { 21061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 21071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == 0) 21081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 21091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == ' ') 21101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 21111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 21121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 21131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 21161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN); 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 } 2126b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_LANGUAGE: 21271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (xmlCheckLanguageID(value) == 1) { 21281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 21291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE); 21301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 21311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 21321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 21331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 21341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 21351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 21381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2140b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NMTOKEN: 21411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (xmlValidateNMToken(value, 1) == 0) { 21421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 21431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN); 21441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 21451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 21461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 21471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 21481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 21491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 21521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2154b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NMTOKENS: 21551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef, 21561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 21571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret > 0) 21581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 21591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 21601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 21611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2162b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NAME: 21631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateName(value, 1); 2164df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard if ((ret == 0) && (val != NULL) && (value != NULL)) { 2165df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NAME); 2166df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard if (v != NULL) { 2167df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard const xmlChar *start = value, *end; 2168df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard while (IS_BLANK_CH(*start)) start++; 2169df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard end = start; 2170df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard while ((*end != 0) && (!IS_BLANK_CH(*end))) end++; 2171df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard v->value.str = xmlStrndup(start, end - start); 2172df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard *val = v; 2173df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard } else { 2174df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard goto error; 2175df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard } 21761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 21781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_QNAME:{ 21791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *uri = NULL; 21801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *local = NULL; 21811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 21821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateQName(value, 1); 21831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL)) { 21841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *prefix; 21851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 21861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard local = xmlSplitQName2(value, &prefix); 21871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) { 21881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlNsPtr ns; 21891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 21901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ns = xmlSearchNs(node->doc, node, prefix); 21911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ns == NULL) 21921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 21931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (val != NULL) 21941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard uri = xmlStrdup(ns->href); 21951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((local != NULL) && ((val == NULL) || (ret != 0))) 21971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(local); 21981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) 21991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(prefix); 22001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 22021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_QNAME); 22031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 22041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (local != NULL) 22051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.name = local; 22061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 22071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.name = xmlStrdup(value); 22081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (uri != NULL) 22091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.uri = uri; 22101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 22111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 22121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 22131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (local != NULL) 22141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(local); 22151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (uri != NULL) 22161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(uri); 22171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 22181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 22211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2222b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NCNAME: 22231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 22241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 22251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME); 22261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 22271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 22281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 22291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 22301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 22311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2234b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_ID: 22351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 22361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 22371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_ID); 22381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 22391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 22401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 22411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 22421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 22431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 22461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 22471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 22481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 22491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 22501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * NOTE: the IDness might have already be declared in the DTD 22511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */ 22521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (attr->atype != XML_ATTRIBUTE_ID) { 22531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlIDPtr res; 22541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 22551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 22561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 22571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 22581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard res = xmlAddID(NULL, node->doc, strip, attr); 22591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 22601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 22611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard res = xmlAddID(NULL, node->doc, value, attr); 22621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (res == NULL) { 22631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 2; 22641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 22651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ID; 22661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2270b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_IDREF: 22711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 22721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 22736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik v = xmlSchemaNewValue(XML_SCHEMAS_IDREF); 22746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (v == NULL) 22756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik goto error; 22766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik v->value.str = xmlStrdup(value); 22776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *val = v; 22781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 22801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 22811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 22821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 22831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 22841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 22851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 22861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAddRef(NULL, node->doc, strip, attr); 22871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 22881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 22891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAddRef(NULL, node->doc, value, attr); 22901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_IDREF; 22911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2293b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_IDREFS: 22941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef, 22951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 22961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret < 0) 22971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 2; 22981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 22991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 23001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 23011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 23021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 2303249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard 23041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_IDREFS; 23051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 23071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_ENTITY:{ 23081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 23091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 23111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 23121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 3; 23131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 0) { 23141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlEntityPtr ent; 23151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 23171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 23181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ent = xmlGetDocEntity(node->doc, strip); 23191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 23201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 23211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ent = xmlGetDocEntity(node->doc, value); 23221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ent == NULL) || 23241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (ent->etype != 23251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard XML_EXTERNAL_GENERAL_UNPARSED_ENTITY)) 23261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 4; 23271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 23291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard TODO; 23301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 23321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 23331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 2334a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard 23351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ENTITY; 23361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 23381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2339b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_ENTITIES: 23401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 23411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return3; 23421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef, 23431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 23441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret <= 0) 23451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 23461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 23471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 23481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 23491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 23501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 23511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ENTITIES; 23531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 23551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_NOTATION:{ 23561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *uri = NULL; 23571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *local = NULL; 23581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateQName(value, 1); 23601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL)) { 23611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *prefix; 23621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard local = xmlSplitQName2(value, &prefix); 23641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) { 23651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlNsPtr ns; 23661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ns = xmlSearchNs(node->doc, node, prefix); 23681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ns == NULL) 23691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 23701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (val != NULL) 23711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard uri = xmlStrdup(ns->href); 23721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((local != NULL) && ((val == NULL) || (ret != 0))) 23741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(local); 23751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) 23761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(prefix); 23771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 23791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 3; 23801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 0) { 23811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNotationUse(NULL, node->doc, value); 23821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 1) 23831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 23841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 23851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 23861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 23881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION); 23891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 23901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (local != NULL) 23911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.name = local; 23921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 23931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.name = xmlStrdup(value); 23941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (uri != NULL) 23951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.uri = uri; 23961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 23981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 23991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (local != NULL) 24001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(local); 24011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (uri != NULL) 24021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(uri); 24031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2407560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 24081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_ANYURI:{ 240911c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (*value != 0) { 241011c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard xmlURIPtr uri = xmlParseURI((const char *) value); 241111c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (uri == NULL) 241211c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard goto return1; 241311c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard xmlFreeURI(uri); 241411c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard } 2415560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 24161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 241711c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_ANYURI); 241811c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (v == NULL) 241911c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard goto error; 242011c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard v->value.str = xmlStrdup(value); 242111c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard *val = v; 24221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 24241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_HEXBINARY:{ 24261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 24271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *base; 24281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int total, i = 0; 2429560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 2430f34a20e69dc675cd23d3eb558cad135ea280f472Daniel Veillard if (cur == NULL) 24311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2432560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 24331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while (((*cur >= '0') && (*cur <= '9')) || 24341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((*cur >= 'A') && (*cur <= 'F')) || 24351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((*cur >= 'a') && (*cur <= 'f'))) { 24361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard i++; 24371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2439560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 24401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 24411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((i % 2) != 0) 244370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard goto return1; 2444560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 24451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 24461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 24471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY); 24481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v == NULL) 24491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 24511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur = xmlStrdup(value); 24521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) { 2453d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard xmlSchemaTypeErrMemory(node, "allocating hexbin data"); 24541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(v); 24551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 24581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total = i / 2; /* number of octets */ 245970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 24601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base = (xmlChar *) cur; 24611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while (i-- > 0) { 24621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*base >= 'a') 24631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = *base - ('a' - 'A'); 24641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base++; 24651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 246670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 24671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.hex.str = (xmlChar *) cur; 24681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.hex.total = total; 24691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 24701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 24721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BASE64BINARY:{ 24741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* ISSUE: 24751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 24761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Ignore all stray characters? (yes, currently) 24771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Worry about long lines? (no, currently) 24781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 24791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * rfc2045.txt: 24801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 24811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * "The encoded output stream must be represented in lines of 24821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * no more than 76 characters each. All line breaks or other 24831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * characters not found in Table 1 must be ignored by decoding 24841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * software. In base64 data, characters other than those in 24851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Table 1, line breaks, and other white space probably 24861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * indicate a transmission error, about which a warning 24871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * message or even a message rejection might be appropriate 24881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * under some circumstances." */ 24891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 24901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *base; 24911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int total, i = 0, pad = 0; 24921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 24931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 24941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 24961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (; *cur; ++cur) { 24971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 24981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 24991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur); 25001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc < 0) ; 25011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (decc < 64) 25021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard i++; 25031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 25041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 25051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (; *cur; ++cur) { 25071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 25081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 25091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur); 25101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc < 0) ; 25111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (decc < 64) 25121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc == 64) 25141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard pad++; 25151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 25171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* rfc2045.txt: "Special processing is performed if fewer than 25181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 24 bits are available at the end of the data being encoded. 25191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * A full encoding quantum is always completed at the end of a 25201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * body. When fewer than 24 input bits are available in an 25211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * input group, zero bits are added (on the right) to form an 25221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * integral number of 6-bit groups. Padding at the end of the 25231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * data is performed using the "=" character. Since all 25241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * base64 input is an integral number of octets, only the 25251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * following cases can arise: (1) the final quantum of 25261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * encoding input is an integral multiple of 24 bits; here, 25271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * the final unit of encoded output will be an integral 25281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * multiple ofindent: Standard input:701: Warning:old style 25291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * assignment ambiguity in "=*". Assuming "= *" 4 characters 25301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * with no "=" padding, (2) the final 25311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * quantum of encoding input is exactly 8 bits; here, the 25321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * final unit of encoded output will be two characters 25331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * followed by two "=" padding characters, or (3) the final 25341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * quantum of encoding input is exactly 16 bits; here, the 25351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * final unit of encoded output will be three characters 25361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * followed by one "=" padding character." */ 25371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 25381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total = 3 * (i / 4); 25391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (pad == 0) { 25401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 0) 25411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (pad == 1) { 25431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 25441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 25451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 3) 25461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (decc = _xmlSchemaBase64Decode(*cur); 25481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (decc < 0) || (decc > 63); 25491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur)) 25501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard --cur; 25511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 16bits in 24bits means 2 pad bits: nnnnnn nnmmmm mmmm00*/ 25521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 00111100 -> 0x3c */ 25531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc & ~0x3c) 25541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total += 2; 25561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (pad == 2) { 25571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 25581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 25591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 2) 25601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (decc = _xmlSchemaBase64Decode(*cur); 25621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (decc < 0) || (decc > 63); 25631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur)) 25641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard --cur; 25651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 8bits in 12bits means 4 pad bits: nnnnnn nn0000 */ 25661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 00110000 -> 0x30 */ 25671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc & ~0x30) 25681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total += 1; 25701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 25711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 25731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 25741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_BASE64BINARY); 25751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v == NULL) 25761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 25771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base = 25781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (xmlChar *) xmlMallocAtomic((i + pad + 1) * 25791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sizeof(xmlChar)); 25801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (base == NULL) { 2581d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard xmlSchemaTypeErrMemory(node, "allocating base64 data"); 25821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(v); 25831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.base64.str = base; 25861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (cur = value; *cur; ++cur) 25871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (_xmlSchemaBase64Decode(*cur) >= 0) { 25881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = *cur; 25891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ++base; 25901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = 0; 25921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.base64.total = total; 25931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 25941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 259670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 2597e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_INTEGER: 2598e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_PINTEGER: 2599e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_NPINTEGER: 2600e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_NINTEGER: 26011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_NNINTEGER:{ 26021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 26031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 26041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int sign = 0; 26051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 26061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 26071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 26091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sign = 1; 26101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 26111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (*cur == '+') 26121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 26131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 26141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 0) 26151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 26171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 261801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_NPINTEGER) { 26191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && 26201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((hi != 0) || (mi != 0) || (lo != 0))) 26211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 262201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_PINTEGER) { 26231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (sign == 1) 26241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((hi == 0) && (mi == 0) && (lo == 0)) 26261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 262701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_NINTEGER) { 26281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (sign == 0) 26291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((hi == 0) && (mi == 0) && (lo == 0)) 26311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 263201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_NNINTEGER) { 26331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && 26341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((hi != 0) || (mi != 0) || (lo != 0))) 26351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 26381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * We can store a value only if no overflow occured 26391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */ 26401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret > 0) && (val != NULL)) { 264101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 26421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 26431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 26441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.mi = lo; 26451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.hi = lo; 26461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = sign; 26471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 26481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.total = cur - value; 26491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 26501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 26531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2654e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_LONG: 2655e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_BYTE: 2656e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_SHORT: 26571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_INT:{ 26581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 26591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 26601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int total = 0; 26611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int sign = 0; 26621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 26631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 26641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 26661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sign = 1; 26671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 26681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (*cur == '+') 26691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 26701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 26711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret <= 0) 26721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 26741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 267501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_LONG) { 26761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi >= 922) { 26771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi > 922) 26781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 33720368) { 26801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 33720368) 26811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 54775807)) 26831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 54775808)) 26851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 268801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_INT) { 26891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi != 0) 26901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 21) { 26921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 21) 26931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 47483647)) 26951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 47483648)) 26971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 269901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_SHORT) { 27001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 27011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 32768)) 27031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 32767)) 27051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 270601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_BYTE) { 27071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 27081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 128)) 27101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 127)) 27121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 271501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 27161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 27171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 27181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.mi = lo; 27191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.hi = lo; 27201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = sign; 27211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 27221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.total = total; 27231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 27241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 27271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2728e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_UINT: 2729e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_ULONG: 2730e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_USHORT: 27311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_UBYTE:{ 27321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 27331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 27341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int total = 0; 27351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 27361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 27371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 27391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret <= 0) 27401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 27421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 274301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_ULONG) { 27441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi >= 1844) { 27451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi > 1844) 27461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 67440737) { 27481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 67440737) 27491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 9551615) 27511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 275401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_UINT) { 27551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi != 0) 27561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 42) { 27581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 42) 27591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 94967295) 27611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 276301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_USHORT) { 27641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 27651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 65535) 27671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 276801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_UBYTE) { 27691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 27701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 255) 27721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 27731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 277501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 27761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 27771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 27781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.mi = mi; 27791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.hi = hi; 27801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = 0; 27811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 27821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.total = total; 27831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 27841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 27871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 2789b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 27901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard done: 27911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 27921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 27931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (ret); 27941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return3: 27951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 27961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 27971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (3); 27981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return1: 27991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 28001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 28011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (1); 28021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return0: 28031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 28041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 28051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (0); 28061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard error: 28071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 28081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 28091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (-1); 2810b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 2811b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 2812b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 2813b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValPredefTypeNode: 2814b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @type: the predefined type 2815b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: the value to check 2816b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @val: the return computed value 2817b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @node: the node containing the value 2818b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 2819b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the predefined type. 2820b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * if true a value is computed and returned in @val. 2821b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 2822b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns 0 if this validates, a positive error code number otherwise 2823b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * and -1 in case of internal or API error. 2824b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 2825b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardint 2826b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value, 2827b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlSchemaValPtr *val, xmlNodePtr node) { 2828b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(xmlSchemaValAtomicType(type, value, val, node, 0)); 28294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 28304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 28314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 2832c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaValPredefTypeNodeNoNorm: 2833c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the predefined type 2834c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the value to check 2835c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val: the return computed value 2836c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @node: the node containing the value 2837c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 2838c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Check that a value conforms to the lexical space of the predefined type. 2839c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * if true a value is computed and returned in @val. 2840c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * This one does apply any normalization to the value. 2841c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 2842c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 2843c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * and -1 in case of internal or API error. 2844c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 2845c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardint 2846c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, const xmlChar *value, 2847c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard xmlSchemaValPtr *val, xmlNodePtr node) { 2848c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(xmlSchemaValAtomicType(type, value, val, node, 1)); 2849c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 2850c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 2851c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/** 2852c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * xmlSchemaValidatePredefinedType: 2853c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @type: the predefined type 2854c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @value: the value to check 2855c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @val: the return computed value 2856c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * 2857c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Check that a value conforms to the lexical space of the predefined type. 2858c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * if true a value is computed and returned in @val. 2859c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * 2860c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 2861c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * and -1 in case of internal or API error. 2862c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard */ 2863c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillardint 2864c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel VeillardxmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value, 2865c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard xmlSchemaValPtr *val) { 2866c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard return(xmlSchemaValPredefTypeNode(type, value, val, NULL)); 2867c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard} 2868c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard 2869c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard/** 28704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareDecimals: 28714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x: a first decimal value 28724255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y: a second decimal value 28734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 28744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 decimals 28754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 28764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error 28774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 28784255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int 28794255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y) 28804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{ 28814255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValPtr swp; 2882e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard int order = 1, p; 28834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard unsigned long tmp; 28844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 2885e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((x->value.decimal.sign) && 2886e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((x->value.decimal.lo != 0) || 2887e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (x->value.decimal.mi != 0) || 2888e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (x->value.decimal.hi != 0))) { 2889e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((y->value.decimal.sign) && 2890e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((y->value.decimal.lo != 0) || 2891e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.mi != 0) || 2892e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.hi != 0))) 289380b19092f24410a6b869abf519227686e8f207caDaniel Veillard order = -1; 289480b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 289580b19092f24410a6b869abf519227686e8f207caDaniel Veillard return (-1); 2896e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } else if ((y->value.decimal.sign) && 2897e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((y->value.decimal.lo != 0) || 2898e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.mi != 0) || 2899e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.hi != 0))) { 29004255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (1); 290180b19092f24410a6b869abf519227686e8f207caDaniel Veillard } 29024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (x->value.decimal.frac == y->value.decimal.frac) { 2903e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.hi < y->value.decimal.hi) 2904e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (-order); 290501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (x->value.decimal.hi > y->value.decimal.hi) 2906e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (order); 2907e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.mi < y->value.decimal.mi) 2908e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (-order); 290901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (x->value.decimal.mi > y->value.decimal.mi) 2910e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (order); 2911e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.lo < y->value.decimal.lo) 291280b19092f24410a6b869abf519227686e8f207caDaniel Veillard return (-order); 2913e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.lo > y->value.decimal.lo) 291480b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(order); 291580b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(0); 29164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 29174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (y->value.decimal.frac > x->value.decimal.frac) { 29184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard swp = y; 29194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard y = x; 29204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard x = swp; 29214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard order = -order; 29224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 2923e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard p = powten[x->value.decimal.frac - y->value.decimal.frac]; 2924e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard tmp = x->value.decimal.lo / p; 2925e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (tmp > y->value.decimal.lo) 29264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (order); 2927e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (tmp < y->value.decimal.lo) 29284255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (-order); 2929e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard tmp = y->value.decimal.lo * p; 2930e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.lo < tmp) 29314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (-order); 2932e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.lo == tmp) 29334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (0); 29344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (order); 29354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 29364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 29374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 2938070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xmlSchemaCompareDurations: 2939070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @x: a first duration value 2940070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @y: a second duration value 2941070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2942070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Compare 2 durations 2943070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2944070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 2945070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * case of error 2946070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 2947070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 2948070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel VeillardxmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y) 2949070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard{ 2950070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard long carry, mon, day; 2951070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double sec; 295280b19092f24410a6b869abf519227686e8f207caDaniel Veillard int invert = 1; 295380b19092f24410a6b869abf519227686e8f207caDaniel Veillard long xmon, xday, myear, minday, maxday; 2954070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard static const long dayRange [2][12] = { 2955070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, }, 2956070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} }; 2957070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2958070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((x == NULL) || (y == NULL)) 29595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 2960070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2961070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* months */ 2962070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mon = x->value.dur.mon - y->value.dur.mon; 2963070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2964070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* seconds */ 2965070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard sec = x->value.dur.sec - y->value.dur.sec; 2966070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard carry = (long)sec / SECS_PER_DAY; 2967070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard sec -= (double)(carry * SECS_PER_DAY); 2968070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2969070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* days */ 2970070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard day = x->value.dur.day - y->value.dur.day + carry; 2971070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2972070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* easy test */ 2973070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (mon == 0) { 2974070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (day == 0) 2975070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (sec == 0.0) 2976070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 2977070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else if (sec < 0.0) 2978070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 2979070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else 2980070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 2981070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else if (day < 0) 2982070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 2983070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else 2984070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 2985070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 2986070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2987070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (mon > 0) { 2988070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((day >= 0) && (sec >= 0.0)) 2989070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 2990070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else { 2991070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = mon; 2992070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xday = -day; 2993070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 2994070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else if ((day <= 0) && (sec <= 0.0)) { 2995070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 2996070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else { 299780b19092f24410a6b869abf519227686e8f207caDaniel Veillard invert = -1; 2998070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = -mon; 2999070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xday = day; 3000070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 3001070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3002070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard myear = xmon / 12; 300380b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (myear == 0) { 300480b19092f24410a6b869abf519227686e8f207caDaniel Veillard minday = 0; 300580b19092f24410a6b869abf519227686e8f207caDaniel Veillard maxday = 0; 300680b19092f24410a6b869abf519227686e8f207caDaniel Veillard } else { 300780b19092f24410a6b869abf519227686e8f207caDaniel Veillard maxday = 366 * ((myear + 3) / 4) + 300880b19092f24410a6b869abf519227686e8f207caDaniel Veillard 365 * ((myear - 1) % 4); 300980b19092f24410a6b869abf519227686e8f207caDaniel Veillard minday = maxday - 1; 301080b19092f24410a6b869abf519227686e8f207caDaniel Veillard } 301180b19092f24410a6b869abf519227686e8f207caDaniel Veillard 3012070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = xmon % 12; 3013070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard minday += dayRange[0][xmon]; 3014070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard maxday += dayRange[1][xmon]; 3015070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 301680b19092f24410a6b869abf519227686e8f207caDaniel Veillard if ((maxday == minday) && (maxday == xday)) 301780b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(0); /* can this really happen ? */ 3018070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (maxday < xday) 301980b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(-invert); 302080b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (minday > xday) 302180b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(invert); 3022070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3023070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* indeterminate */ 30245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; 30255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 30265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/* 30285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * macros for adding date/times and durations 30295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 30305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT(a,b) (floor(((double)a/(double)b))) 30315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO(a,b) (a - FQUOTIENT(a,b) * b) 30325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT_RANGE(a,low,high) (FQUOTIENT((a-low),(high-low))) 30335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO_RANGE(a,low,high) ((MODULO((a-low),(high-low)))+low) 30345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 3036669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * xmlSchemaDupVal: 3037669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @v: the #xmlSchemaValPtr value to duplicate 3038669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * 3039669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Makes a copy of @v. The calling program is responsible for freeing 3040669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the returned value. 3041669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * 3042669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * returns a pointer to a duplicated #xmlSchemaValPtr or NULL if error. 3043669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard */ 3044669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillardstatic xmlSchemaValPtr 3045669adfcd3af5dfda873b10119d44202a7450bb20Daniel VeillardxmlSchemaDupVal (xmlSchemaValPtr v) 3046669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard{ 3047669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaValPtr ret = xmlSchemaNewValue(v->type); 3048669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard if (ret == NULL) 3049669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return NULL; 3050669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard 3051669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard memcpy(ret, v, sizeof(xmlSchemaVal)); 3052669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return ret; 3053669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard} 3054669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard 3055669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard/** 3056285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * xmlSchemaCopyValue: 3057285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * @val: the precomputed value to be copied 3058285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * 3059285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Copies the precomputed value. This duplicates any string within. 3060285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * 3061285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Returns the copy or NULL if a copy for a data-type is not implemented. 3062285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik */ 3063285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaValPtr 3064285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaCopyValue(xmlSchemaValPtr val) 3065285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik{ 3066285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik xmlSchemaValPtr ret; 3067285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik 3068285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik if (val == NULL) 3069285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik return (NULL); 3070285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik /* 3071285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Copy the string values. 3072285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik */ 3073285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik switch (val->type) { 3074285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik case XML_SCHEMAS_IDREFS: 3075285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik case XML_SCHEMAS_ENTITIES: 3076285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik case XML_SCHEMAS_NMTOKENS: 3077285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik case XML_SCHEMAS_ANYTYPE: 3078285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 3079285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik return (NULL); 3080285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik case XML_SCHEMAS_STRING: 3081285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 3082285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik case XML_SCHEMAS_TOKEN: 3083285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik case XML_SCHEMAS_LANGUAGE: 3084285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik case XML_SCHEMAS_NAME: 3085285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik case XML_SCHEMAS_NCNAME: 3086285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik case XML_SCHEMAS_ID: 3087285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 3088285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik case XML_SCHEMAS_ENTITY: 3089285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik case XML_SCHEMAS_NMTOKEN: 30902ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik case XML_SCHEMAS_ANYURI: 3091285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik ret = xmlSchemaDupVal(val); 3092285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik if (val->value.str != NULL) 3093285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik ret->value.str = xmlStrdup(BAD_CAST val->value.str); 3094285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik return (ret); 30952ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik case XML_SCHEMAS_QNAME: 3096285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik case XML_SCHEMAS_NOTATION: 3097285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik ret = xmlSchemaDupVal(val); 3098285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik if (val->value.qname.name != NULL) 3099285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik ret->value.qname.name = 3100285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik xmlStrdup(BAD_CAST val->value.qname.name); 3101285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik if (val->value.qname.uri != NULL) 3102285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik ret->value.qname.uri = 3103285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik xmlStrdup(BAD_CAST val->value.qname.uri); 3104285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik return (ret); 3105285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik case XML_SCHEMAS_HEXBINARY: 3106285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik ret = xmlSchemaDupVal(val); 3107285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik if (val->value.hex.str != NULL) 3108285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik ret->value.hex.str = xmlStrdup(BAD_CAST val->value.hex.str); 3109285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik return (ret); 3110285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik case XML_SCHEMAS_BASE64BINARY: 3111285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik ret = xmlSchemaDupVal(val); 3112285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik if (val->value.base64.str != NULL) 3113285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik ret->value.base64.str = 3114285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik xmlStrdup(BAD_CAST val->value.base64.str); 3115285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik return (ret); 3116285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik default: 3117285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik return (xmlSchemaDupVal(val)); 3118285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik } 3119285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik return (NULL); 3120285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik} 3121285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik 3122285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik/** 31235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateAdd: 31245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 31255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dur: an #xmlSchemaValPtr of type #XS_DURATION 31265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 31275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compute a new date/time from @dt and @dur. This function assumes @dt 31285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH, 3129669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * or #XML_SCHEMAS_GYEAR. The returned #xmlSchemaVal is the same type as 3130669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt. The calling program is responsible for freeing the returned value. 31315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3132669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a pointer to a new #xmlSchemaVal or NULL if error. 31335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 31345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr 31355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur) 31365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 3137669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaValPtr ret, tmp; 31385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long carry, tempdays, temp; 31395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValDatePtr r, d; 31405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValDurationPtr u; 31415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((dt == NULL) || (dur == NULL)) 31435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 31445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = xmlSchemaNewValue(dt->type); 31465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret == NULL) 31475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 31485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3149669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard /* make a copy so we don't alter the original value */ 3150669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard tmp = xmlSchemaDupVal(dt); 3151669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard if (tmp == NULL) { 3152669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaFreeValue(ret); 3153669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return NULL; 3154669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard } 3155669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard 31565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r = &(ret->value.date); 3157669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard d = &(tmp->value.date); 31585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard u = &(dur->value.dur); 31595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalization */ 31615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->mon == 0) 31625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->mon = 1; 31635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize for time zone offset */ 31655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard u->sec -= (d->tzo * 60); 31665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->tzo = 0; 31675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalization */ 31695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->day == 0) 31705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->day = 1; 31715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* month */ 31735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = d->mon + u->mon; 3174ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->mon = (unsigned int) MODULO_RANGE(carry, 1, 13); 3175ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT_RANGE(carry, 1, 13); 31765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* year (may be modified later) */ 31785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year = d->year + carry; 31795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->year == 0) { 31805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->year > 0) 31815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year--; 31825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 31835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year++; 31845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 31855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* time zone */ 31875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->tzo = d->tzo; 31885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->tz_flag = d->tz_flag; 31895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* seconds */ 31915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->sec = d->sec + u->sec; 3192ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT((long)r->sec, 60); 31935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->sec != 0.0) { 31945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->sec = MODULO(r->sec, 60.0); 31955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 31965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* minute */ 31985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry += d->min; 3199ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->min = (unsigned int) MODULO(carry, 60); 3200ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT(carry, 60); 32015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* hours */ 32035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry += d->hour; 3204ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->hour = (unsigned int) MODULO(carry, 24); 3205ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long)FQUOTIENT(carry, 24); 32065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 32085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * days 32095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Note we use tempdays because the temporary values may need more 32105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * than 5 bits 32115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 32125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) && 32135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (d->day > MAX_DAYINMONTH(r->year, r->mon))) 32145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = MAX_DAYINMONTH(r->year, r->mon); 32155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (d->day < 1) 32165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = 1; 32175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 32185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = d->day; 32195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays += u->day + carry; 32215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard while (1) { 32235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (tempdays < 1) { 3224ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard long tmon = (long) MODULO_RANGE(r->mon-1, 1, 13); 3225ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard long tyr = r->year + (long)FQUOTIENT_RANGE(r->mon-1, 1, 13); 32265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (tyr == 0) 32275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tyr--; 32285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays += MAX_DAYINMONTH(tyr, tmon); 32295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = -1; 3230ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard } else if (tempdays > (long) MAX_DAYINMONTH(r->year, r->mon)) { 32315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon); 32325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = 1; 32335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } else 32345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 32355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard temp = r->mon + carry; 3237ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->mon = (unsigned int) MODULO_RANGE(temp, 1, 13); 3238ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->year = r->year + (unsigned int) FQUOTIENT_RANGE(temp, 1, 13); 32395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->year == 0) { 32405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (temp < 1) 32415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year--; 32425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 32435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year++; 32445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 32455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 32465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->day = tempdays; 32485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 32505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * adjust the date/time type to the date values 32515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 32525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret->type != XML_SCHEMAS_DATETIME) { 32535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((r->hour) || (r->min) || (r->sec)) 32545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_DATETIME; 32555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (ret->type != XML_SCHEMAS_DATE) { 32565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((r->mon != 1) && (r->day != 1)) 32575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_DATE; 32585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1)) 32595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_GYEARMONTH; 32605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 32615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 32625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3263669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaFreeValue(tmp); 32645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 32665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 32675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 32695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaDateNormalize: 3270669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt: an #xmlSchemaValPtr of a date/time type value. 3271669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @offset: number of seconds to adjust @dt by. 32725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3273669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Normalize @dt to GMT time. The @offset parameter is subtracted from 3274669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the return value is a time-zone offset is present on @dt. 32755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3276669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a normalized copy of @dt or NULL if error. 32775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 32785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr 32795a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset) 32805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 32815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValPtr dur, ret; 32825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt == NULL) 32845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 32855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (((dt->type != XML_SCHEMAS_TIME) && 32875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (dt->type != XML_SCHEMAS_DATETIME)) || (dt->value.date.tzo == 0)) 32885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return xmlSchemaDupVal(dt); 32895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); 32915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dur == NULL) 32925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 32935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dur->value.date.sec -= offset; 32955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = _xmlSchemaDateAdd(dt, dur); 32975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret == NULL) 32985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 32995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaFreeValue(dur); 33015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* ret->value.date.tzo = 0; */ 33035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 33045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 33055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 33075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateCastYMToDays: 33085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 33095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 33105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Convert mon and year of @dt to total number of days. Take the 33115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * number of years since (or before) 1 AD and add the number of leap 33125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years. This is a function because negative 33135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years must be handled a little differently and there is no zero year. 33145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 33155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns number of days. 33165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 33175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic long 33185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt) 33195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 33205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long ret; 332149e8963c640865343327c67d4755a1af705717d3Daniel Veillard int mon; 33225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 332349e8963c640865343327c67d4755a1af705717d3Daniel Veillard mon = dt->value.date.mon; 332449e8963c640865343327c67d4755a1af705717d3Daniel Veillard if (mon <= 0) mon = 1; /* normalization */ 332549e8963c640865343327c67d4755a1af705717d3Daniel Veillard 332649e8963c640865343327c67d4755a1af705717d3Daniel Veillard if (dt->value.date.year <= 0) 33275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = (dt->value.date.year * 365) + 33285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+ 33295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((dt->value.date.year+1)/400)) + 333049e8963c640865343327c67d4755a1af705717d3Daniel Veillard DAY_IN_YEAR(0, mon, dt->value.date.year); 33315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 33325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = ((dt->value.date.year-1) * 365) + 33335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+ 33345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((dt->value.date.year-1)/400)) + 333549e8963c640865343327c67d4755a1af705717d3Daniel Veillard DAY_IN_YEAR(0, mon, dt->value.date.year); 33365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 33385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 33395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 33415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * TIME_TO_NUMBER: 33425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 33435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 33445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Calculates the number of seconds in the time portion of @dt. 33455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 33465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns seconds. 33475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 33485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define TIME_TO_NUMBER(dt) \ 33495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((double)((dt->value.date.hour * SECS_PER_HOUR) + \ 3350b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard (dt->value.date.min * SECS_PER_MIN) + \ 3351b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard (dt->value.date.tzo * SECS_PER_MIN)) + \ 3352b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard dt->value.date.sec) 33535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 33555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaCompareDates: 33565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @x: a first date/time value 33575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @y: a second date/time value 33585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 33595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compare 2 date/times 33605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 33615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 33625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error 33635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 33645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic int 33655a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y) 33665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 33675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard unsigned char xmask, ymask, xor_mask, and_mask; 33685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValPtr p1, p2, q1, q2; 33695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long p1d, p2d, q1d, q2d; 33705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((x == NULL) || (y == NULL)) 33725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 33735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.tz_flag) { 33755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (!y->value.date.tz_flag) { 33775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, 0); 33785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 33795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize y + 14:00 */ 33805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR)); 33815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 3383fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 3384fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3385fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 33865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 3387fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d == q1d) { 33885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 33895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 3391fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (sec < 0.0) { 3392fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3393fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 33945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 3395fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 33964aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 33975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize y - 14:00 */ 33985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR)); 33995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day; 34005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (p1d > q2d) 34014aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 34025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (p1d == q2d) { 34035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2); 34045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec > 0.0) 34054aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 34065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 34074aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 2; /* indeterminate */ 34085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 34094aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(p1); 34104aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q1); 34114aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q2); 34124aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard if (ret != 0) 34134aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 34145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 3415fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 3416fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3417fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 3418fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } 34195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 34205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } else if (y->value.date.tz_flag) { 34215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, 0); 34225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 34235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 34245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize x - 14:00 */ 34255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR)); 34265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 34275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3428fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 3429fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3430fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 34315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 3432fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d == q1d) { 34335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 34345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 34355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 3436fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (sec < 0.0) { 3437fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3438fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 34395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 3440fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 34414aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 34425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize x + 14:00 */ 34435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR)); 34445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day; 34455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 34466560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard if (p2d > q1d) { 34474aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 34486560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard } else if (p2d == q1d) { 34495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1); 34505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec > 0.0) 34514aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 34525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 34534aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 2; /* indeterminate */ 34545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 34556560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(p1); 34566560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(q1); 34576560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(p2); 34584aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard if (ret != 0) 34594aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 34605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 3461fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 3462fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3463fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 34645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 34655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 34665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 34675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 34685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * if the same type then calculate the difference 34695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 34705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->type == y->type) { 34714aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 34725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, 0); 34735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 34745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 34755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, 0); 34765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 34775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3478fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 34794aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = -1; 3480fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d > q1d) { 34814aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 3482fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 34835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 34845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 34855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 34865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec < 0.0) 34874aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = -1; 34885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (sec > 0.0) 34894aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 34905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 34915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 34924aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(p1); 34934aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q1); 34944aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 34955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 34965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 34975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard switch (x->type) { 34985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 34995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0xf; 35005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 35015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 35025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x7; 35035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 35045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 35055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x1; 35065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 35075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 35085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x2; 35095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 35105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 35115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x3; 35125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 35135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 35145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x3; 35155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 35165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 35175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x6; 35185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 35195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 35205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x8; 35215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 35225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard default: 35235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0; 35245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 35255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 35265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 35275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard switch (y->type) { 35285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 35295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0xf; 35305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 35315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 35325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x7; 35335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 35345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 35355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x1; 35365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 35375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 35385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x2; 35395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 35405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 35415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x3; 35425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 35435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 35445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x3; 35455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 35465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 35475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x6; 35485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 35495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 35505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x8; 35515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 35525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard default: 35535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0; 35545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 35555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 35565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 35575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xor_mask = xmask ^ ymask; /* mark type differences */ 35585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard and_mask = xmask & ymask; /* mark field specification */ 35595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 35605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* year */ 35615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 1) 35625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 35635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 1) { 35645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.year < y->value.date.year) 35655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 35665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.year > y->value.date.year) 35675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 35685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 35695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 35705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* month */ 35715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 2) 35725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 35735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 2) { 35745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.mon < y->value.date.mon) 35755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 35765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.mon > y->value.date.mon) 35775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 35785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 35795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 35805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* day */ 35815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 4) 35825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 35835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 4) { 35845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.day < y->value.date.day) 35855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 35865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.day > y->value.date.day) 35875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 35885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 35895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 35905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* time */ 35915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 8) 35925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 35935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 8) { 35945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.hour < y->value.date.hour) 35955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 35965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.hour > y->value.date.hour) 35975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 35985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.min < y->value.date.min) 35995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 36005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.min > y->value.date.min) 36015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 36025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.sec < y->value.date.sec) 36035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 36045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.sec > y->value.date.sec) 36055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 36065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 36075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3608070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 3609070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 3610070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3611070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 36126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveReplaceStrings: 36136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 36146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 36156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @invert: inverts the result if x < y or x > y. 36166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 36176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 36186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is 36196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "replace". I.e. @x could 36206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString". 36216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 36226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 36236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 36246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 36256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 36266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaComparePreserveReplaceStrings(xmlSchemaValPtr x, xmlSchemaValPtr y, 36276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int invert) 36286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 36296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar *utf1; 36306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar *utf2; 36316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 36326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 36336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 36346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-2); 36356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf1 = x->value.str; 36366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2 = y->value.str; 36376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 36386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik while ((*utf1 != 0) && (*utf2 != 0)) { 36396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (IS_WSP_REPLACE_CH(*utf2)) { 36406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (! IS_WSP_SPACE_CH(*utf1)) { 36416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if ((*utf1 - 0x20) < 0) { 36426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 36436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 36446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 36456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 36466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 36476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 36486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 36496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 36506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 36516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 36526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 36536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 36546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik tmp = *utf1 - *utf2; 36556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) { 36566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 36576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 36586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 36596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 36606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 36616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) { 36626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 36636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 36646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 36656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 36666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 36676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 36686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf1++; 36696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2++; 36706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 36716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (*utf1 != 0) { 36726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 36736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 36746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 36756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 36766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 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 return(0); 36846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 36856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 36866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 36876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings: 36886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 36896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 36906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 36916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 36926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is 36936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could 36946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString". 36956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 36966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 36976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 36986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 36996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 37006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaComparePreserveCollapseStrings(xmlSchemaValPtr x, xmlSchemaValPtr y, 37016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int invert) 37026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 37036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar *utf1; 37046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar *utf2; 37056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 37066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 37076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 37086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-2); 37096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf1 = x->value.str; 37106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2 = y->value.str; 37116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 37126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 37136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip leading blank chars of the collapsed string. 37146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 37156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2)) 37166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2++; 37176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 37186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik while ((*utf1 != 0) && (*utf2 != 0)) { 37196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2)) { 37206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (! IS_WSP_SPACE_CH(*utf1)) { 37216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 37226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * The utf2 character would have been replaced to 0x20. 37236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 37246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if ((*utf1 - 0x20) < 0) { 37256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 37266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 37276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 37286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 37296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 37306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 37316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 37326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 37336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 37346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 37356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 37366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf1++; 37376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2++; 37386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 37396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip contiguous blank chars of the collapsed string. 37406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 37416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2)) 37426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2++; 37436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 37446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik tmp = *utf1++ - *utf2++; 37456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) { 37466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 37476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 37486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 37496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 37506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 37516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) { 37526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 37536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 37546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 37556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 37566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 37576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 37586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 37596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (*utf1 != 0) { 37606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 37616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 37626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 37636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 37646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 37656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (*utf2 != 0) { 37666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 37676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip trailing blank chars of the collapsed string. 37686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 37696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2)) 37706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2++; 37716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (*utf2 != 0) { 37726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 37736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 37746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 37756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 37766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 37776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 37786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 37796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 37806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 37816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 37826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings: 37836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 37846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 37856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 37866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 37876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is 37886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could 37896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString". 37906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 37916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 37926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 37936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 37946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 37956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareReplaceCollapseStrings(xmlSchemaValPtr x, xmlSchemaValPtr y, 37966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int invert) 37976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 37986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar *utf1; 37996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar *utf2; 38006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 38016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 38026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 38036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-2); 38046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf1 = x->value.str; 38056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2 = y->value.str; 38066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 38076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 38086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip leading blank chars of the collapsed string. 38096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 38106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2)) 38116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2++; 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 /* 38176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * The utf2 character would have been replaced to 0x20. 38186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 38196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if ((*utf1 - 0x20) < 0) { 38206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 38216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 38226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 38236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 38246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 38256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 38266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 38276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 38286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 38296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 38306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 38316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf1++; 38326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2++; 38336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 38346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip contiguous blank chars of the collapsed string. 38356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 38366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2)) 38376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2++; 38386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 38396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (IS_WSP_SPACE_CH(*utf1) || IS_WSP_REPLACE_CH(*utf1)) { 38406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 38416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * The utf1 character would have been replaced to 0x20. 38426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 38436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if ((0x20 - *utf2) < 0) { 38446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 38456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 38466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 38476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 38486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 38496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 38506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 38516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 38526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 38536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 38546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 38556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik tmp = *utf1++ - *utf2++; 38566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) 38576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 38586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) 38596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 38606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 38616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 38626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (*utf1 != 0) { 38636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 38646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 38656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 38666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 38676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 38686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (*utf2 != 0) { 38696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 38706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip trailing blank chars of the collapsed string. 38716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 38726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik while (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2)) 38736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2++; 38746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (*utf2 != 0) { 38756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 38766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 38776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 38786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 38796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 38806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 38816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 38826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 38836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 38846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 38856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 38866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareReplacedStrings: 38876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 38886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 38896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 38906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 38916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 38926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 38936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 38946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 38956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 38966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareReplacedStrings(xmlSchemaValPtr x, xmlSchemaValPtr y) 38976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 38986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar *utf1; 38996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar *utf2; 39006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 39016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 39026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 39036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-2); 39046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf1 = x->value.str; 39056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2 = y->value.str; 39066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 39076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik while ((*utf1 != 0) && (*utf2 != 0)) { 39086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (IS_WSP_SPACE_CH(*utf2) || IS_WSP_REPLACE_CH(*utf2)) { 39096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (! (IS_WSP_SPACE_CH(*utf1) || IS_WSP_REPLACE_CH(*utf1))) { 39106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if ((*utf1 - 0x20) < 0) 39116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 39126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 39136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 39146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 39156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 39166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (IS_WSP_SPACE_CH(*utf1) || IS_WSP_REPLACE_CH(*utf1)) { 39176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if ((0x20 - *utf2) < 0) 39186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 39196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 39206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 39216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 39226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik tmp = *utf1 - *utf2; 39236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) 39246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 39256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) 39266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 39276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 39286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf1++; 39296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik utf2++; 39306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 39316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (*utf1 != 0) 39326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 39336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (*utf2 != 0) 39346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 39356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 39366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 39376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 39386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 3939c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaCompareNormStrings: 3940c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @x: a first string value 3941c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @y: a second string value 3942c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 3943c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Compare 2 string for their normalized values. 3944c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 3945c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 3946c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * case of error 3947c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */ 3948c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int 3949c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaCompareNormStrings(xmlSchemaValPtr x, xmlSchemaValPtr y) { 3950c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard const xmlChar *utf1; 3951c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard const xmlChar *utf2; 3952c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard int tmp; 3953c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 3954c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((x == NULL) || (y == NULL)) 3955c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-2); 3956c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf1 = x->value.str; 3957c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf2 = y->value.str; 3958c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 395976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf1)) utf1++; 396076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf2)) utf2++; 3961c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard while ((*utf1 != 0) && (*utf2 != 0)) { 396276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (IS_BLANK_CH(*utf1)) { 396376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (!IS_BLANK_CH(*utf2)) { 3964c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard tmp = *utf1 - *utf2; 3965c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(tmp); 3966c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 396776e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf1)) utf1++; 396876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf2)) utf2++; 3969c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 3970c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard tmp = *utf1++ - *utf2++; 3971c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (tmp < 0) 3972c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 3973c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (tmp > 0) 3974c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(1); 3975c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 3976c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 3977c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf1 != 0) { 397876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf1)) utf1++; 3979c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf1 != 0) 3980c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(1); 3981c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 3982c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf2 != 0) { 398376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf2)) utf2++; 3984c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf2 != 0) 3985c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 3986c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 3987c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(0); 3988c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard} 3989c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 3990c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/** 3991b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCompareFloats: 3992b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @x: a first float or double value 3993b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @y: a second float or double value 3994b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 3995b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Compare 2 values 3996b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 3997b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 3998b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * case of error 3999b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4000b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int 4001b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) { 4002b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard double d1, d2; 4003b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4004b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((x == NULL) || (y == NULL)) 4005b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 4006b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4007b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 4008b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Cast everything to doubles. 4009b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4010b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->type == XML_SCHEMAS_DOUBLE) 4011b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d1 = x->value.d; 4012b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else if (x->type == XML_SCHEMAS_FLOAT) 4013b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d1 = x->value.f; 4014b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 4015b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 4016b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4017b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (y->type == XML_SCHEMAS_DOUBLE) 4018b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d2 = y->value.d; 4019b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else if (y->type == XML_SCHEMAS_FLOAT) 4020b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d2 = y->value.f; 4021b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 4022b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 4023b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4024b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 4025b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check for special cases. 4026b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4027b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d1)) { 4028b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d2)) 4029b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4030b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4031b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4032b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d2)) 4033b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4034b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == xmlXPathPINF) { 4035b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathPINF) 4036b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4037b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4038b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4039b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathPINF) 4040b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4041b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == xmlXPathNINF) { 4042b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathNINF) 4043b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4044b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4045b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4046b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathNINF) 4047b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4048b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4049b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 4050b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * basic tests, the last one we should have equality, but 4051b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * portability is more important than speed and handling 4052b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * NaN or Inf in a portable way is always a challenge, so ... 4053b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4054b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 < d2) 4055b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4056b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 > d2) 4057b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4058b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == d2) 4059b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4060b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(2); 4061b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 4062b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4063b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 40644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareValues: 40654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x: a first value 40666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xwtsp: the whitespace type 40674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y: a second value 40686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @ywtsp: the whitespace type 40694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 40704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 values 40714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 40725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 40735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error 40744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 40756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 40766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValuesInternal(xmlSchemaValPtr x, 40776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, 40786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaValPtr y, 40796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaWhitespaceValueType yws) { 40804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if ((x == NULL) || (y == NULL)) 40814255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(-2); 40824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 40834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard switch (x->type) { 408480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UNKNOWN: 40852f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_ANYTYPE: 408680b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(-2); 408780b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_INTEGER: 408880b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NPINTEGER: 408980b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NINTEGER: 409080b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NNINTEGER: 409180b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_PINTEGER: 409280b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_INT: 409380b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UINT: 409480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_LONG: 409580b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ULONG: 409680b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_SHORT: 409780b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_USHORT: 409880b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_BYTE: 409980b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UBYTE: 41004255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMAS_DECIMAL: 410180b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (y->type == x->type) 410280b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(xmlSchemaCompareDecimals(x, y)); 410380b19092f24410a6b869abf519227686e8f207caDaniel Veillard if ((y->type == XML_SCHEMAS_DECIMAL) || 410480b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_INTEGER) || 410580b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_NPINTEGER) || 410680b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_NINTEGER) || 410780b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_NNINTEGER) || 410880b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_PINTEGER) || 410980b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_INT) || 411080b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_UINT) || 411180b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_LONG) || 411280b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_ULONG) || 411380b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_SHORT) || 411480b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_USHORT) || 411580b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_BYTE) || 411680b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_UBYTE)) 41174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(xmlSchemaCompareDecimals(x, y)); 41185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return(-2); 4119070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMAS_DURATION: 4120070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (y->type == XML_SCHEMAS_DURATION) 4121070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(xmlSchemaCompareDurations(x, y)); 41225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return(-2); 41235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 41245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 41255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 41265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 41275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 41285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 41295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 41305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 41315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((y->type == XML_SCHEMAS_DATETIME) || 41325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_TIME) || 41335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_GDAY) || 41345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_GMONTH) || 41355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_GMONTHDAY) || 41365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_GYEAR) || 41375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_DATE) || 41385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_GYEARMONTH)) 41395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return (xmlSchemaCompareDates(x, y)); 41405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return (-2); 41412ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik /* 41422ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * Note that we will support comparison of string types against 41432ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * anySimpleType as well. 41442ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik */ 41452ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 41466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_STRING: 41476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 414880b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_TOKEN: 414980b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_LANGUAGE: 415080b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NMTOKEN: 415180b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NAME: 415280b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NCNAME: 415380b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ID: 415480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_IDREF: 415580b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ENTITY: 415680b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NOTATION: 415780b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ANYURI: 41586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 41596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * TODO: Compare those against QName. 41606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 41616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (y->type == XML_SCHEMAS_QNAME) { 41626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik TODO 41636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-2); 41646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 41652ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik if ((y->type == XML_SCHEMAS_ANYSIMPLETYPE) || 41662ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik (y->type == XML_SCHEMAS_STRING) || 41676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik (y->type == XML_SCHEMAS_NORMSTRING) || 4168c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_TOKEN) || 4169c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_LANGUAGE) || 4170c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_NMTOKEN) || 4171c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_NAME) || 4172c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_NCNAME) || 4173c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_ID) || 4174c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_IDREF) || 4175c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_ENTITY) || 4176c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_NOTATION) || 41776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik (y->type == XML_SCHEMAS_ANYURI)) { 41786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 41796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (xws == XML_SCHEMA_WHITESPACE_PRESERVE) { 41806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 41816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) { 41826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* TODO: What about x < y or x > y. */ 41836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (xmlStrEqual(x->value.str, y->value.str)) 41846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (0); 41856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 41866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (2); 41876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else if (yws == XML_SCHEMA_WHITESPACE_REPLACE) 41886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (xmlSchemaComparePreserveReplaceStrings(x, y, 0)); 41896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) 41906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (xmlSchemaComparePreserveCollapseStrings(x, y, 0)); 41916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 41926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else if (xws == XML_SCHEMA_WHITESPACE_REPLACE) { 41936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 41946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) 41956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (xmlSchemaComparePreserveReplaceStrings(y, x, 1)); 41966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_REPLACE) 41976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (xmlSchemaCompareReplacedStrings(x, y)); 41986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) 41996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (xmlSchemaCompareReplaceCollapseStrings(x, y, 0)); 42006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 42016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else if (xws == XML_SCHEMA_WHITESPACE_COLLAPSE) { 42026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 42036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) 42046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (xmlSchemaComparePreserveCollapseStrings(y, x, 1)); 42056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_REPLACE) 42066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (xmlSchemaCompareReplaceCollapseStrings(y, x, 1)); 42076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) 42086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (xmlSchemaCompareNormStrings(x, y)); 42096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else 42106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-2); 42116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 42126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4213c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return (-2); 4214e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_QNAME: 4215e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (y->type == XML_SCHEMAS_QNAME) { 4216e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) && 4217e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (xmlStrEqual(x->value.qname.uri, y->value.qname.uri))) 4218e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(0); 4219e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(2); 4220e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 4221e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (-2); 4222c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_FLOAT: 4223c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_DOUBLE: 4224b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((y->type == XML_SCHEMAS_FLOAT) || 4225b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard (y->type == XML_SCHEMAS_DOUBLE)) 4226b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (xmlSchemaCompareFloats(x, y)); 4227b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (-2); 4228c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_BOOLEAN: 4229b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (y->type == XML_SCHEMAS_BOOLEAN) { 4230b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->value.b == y->value.b) 4231b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4232b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->value.b == 0) 4233b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4234b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4235b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4236b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (-2); 4237560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_HEXBINARY: 423870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard if (y->type == XML_SCHEMAS_HEXBINARY) { 423970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard if (x->value.hex.total == y->value.hex.total) { 424070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard int ret = xmlStrcmp(x->value.hex.str, y->value.hex.str); 424170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard if (ret > 0) 424270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(1); 424370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard else if (ret == 0) 424470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(0); 424570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 424670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard else if (x->value.hex.total > y->value.hex.total) 424770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(1); 424870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 424970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(-1); 425070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 4251560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return (-2); 42521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 42531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (y->type == XML_SCHEMAS_BASE64BINARY) { 42541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (x->value.base64.total == y->value.base64.total) { 42551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int ret = xmlStrcmp(x->value.base64.str, 42561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard y->value.base64.str); 42571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret > 0) 42581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(1); 42591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (ret == 0) 42601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(0); 42611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 42621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (x->value.base64.total > y->value.base64.total) 42631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(1); 42641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 42651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(-1); 42661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 42676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-2); 4268c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_IDREFS: 4269c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ENTITIES: 4270c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NMTOKENS: 4271c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard TODO 4272c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 42734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 42745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 42754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 42764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 42774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 42786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValues: 42796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first value 42806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second value 42816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 42826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values 42836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 42846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 42856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 42866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 42876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint 42886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) { 42896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, yws; 42906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 42915e094143e423c01739ac9221f371846fd290be4eDaniel Veillard if ((x == NULL) || (y == NULL)) 42925e094143e423c01739ac9221f371846fd290be4eDaniel Veillard return(-2); 42936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (x->type == XML_SCHEMAS_STRING) 42946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xws = XML_SCHEMA_WHITESPACE_PRESERVE; 42956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else if (x->type == XML_SCHEMAS_NORMSTRING) 42966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xws = XML_SCHEMA_WHITESPACE_REPLACE; 42976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xws = XML_SCHEMA_WHITESPACE_COLLAPSE; 42996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 43006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (y->type == XML_SCHEMAS_STRING) 43016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik yws = XML_SCHEMA_WHITESPACE_PRESERVE; 43026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else if (x->type == XML_SCHEMAS_NORMSTRING) 43036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik yws = XML_SCHEMA_WHITESPACE_REPLACE; 43046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik yws = XML_SCHEMA_WHITESPACE_COLLAPSE; 43066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 43076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(xmlSchemaCompareValuesInternal(x, xws, y, yws)); 43086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 43096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 43106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 43116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValuesWhtsp: 43126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first value 43136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xws: the whitespace value of x 43146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second value 43156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @yws: the whitespace value of y 43166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 43176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values 43186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 43196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 43206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 43216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 43226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint 43236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValuesWhtsp(xmlSchemaValPtr x, 43246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, 43256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaValPtr y, 43266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaWhitespaceValueType yws) { 43276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(xmlSchemaCompareValuesInternal(x, xws, y, yws)); 43286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 43296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 43306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 4331c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaNormLen: 4332c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @value: a string 4333c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 4334c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Computes the UTF8 length of the normalized value of the string 4335c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 4336c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns the length or -1 in case of error. 4337c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */ 4338c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int 4339c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaNormLen(const xmlChar *value) { 4340c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard const xmlChar *utf; 4341c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard int ret = 0; 4342c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 4343c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (value == NULL) 4344c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4345c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf = value; 434676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf)) utf++; 4347c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard while (*utf != 0) { 4348c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (utf[0] & 0x80) { 4349c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[1] & 0xc0) != 0x80) 4350c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4351c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xe0) == 0xe0) { 4352c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[2] & 0xc0) != 0x80) 4353c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4354c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xf0) == 0xf0) { 4355c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80) 4356c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4357c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 4; 4358c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 4359c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 3; 4360c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4361c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 4362c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 2; 4363c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 436476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack } else if (IS_BLANK_CH(*utf)) { 436576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf)) utf++; 4366c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf == 0) 4367c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 4368c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 4369c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf++; 4370c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4371c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard ret++; 4372c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4373c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(ret); 4374c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard} 4375c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 43766927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard/** 43776927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaGetFacetValueAsULong: 43786927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * @facet: an schemas type facet 43796927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * 43806927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Extract the value of a facet 43816927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * 43826927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Returns the value as a long 43836927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard */ 4384c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardunsigned long 4385c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaGetFacetValueAsULong(xmlSchemaFacetPtr facet) 4386c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{ 4387c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard /* 4388c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * TODO: Check if this is a decimal. 4389c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 4390094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack if (facet == NULL) 4391094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack return 0; 4392c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return ((unsigned long) facet->val->value.decimal.lo); 4393c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 4394c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 4395c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/** 439601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateListSimpleTypeFacet: 439701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facet: the facet to check 439801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @value: the lexical repr of the value to validate 439901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @actualLen: the number of list items 440001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @expectedLen: the resulting expected number of list items 440101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 440201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Checks the value of a list simple type against a facet. 440301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 440401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 0 if the value is valid, a positive error code 440501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * number otherwise and -1 in case of an internal error. 440601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 440701fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint 440801fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaValidateListSimpleTypeFacet(xmlSchemaFacetPtr facet, 440901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard const xmlChar *value, 441001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard unsigned long actualLen, 441101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard unsigned long *expectedLen) 441201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 4413ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard if (facet == NULL) 4414ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard return(-1); 441501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 441601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * TODO: Check if this will work with large numbers. 441701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * (compare value.decimal.mi and value.decimal.hi as well?). 441801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 441901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 442001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen != facet->val->value.decimal.lo) { 4421c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (expectedLen != 0) 4422c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 442301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_LENGTH_VALID); 442401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 442501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 442601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen < facet->val->value.decimal.lo) { 4427c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (expectedLen != 0) 4428c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 442901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_MINLENGTH_VALID); 443001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 443101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MAXLENGTH) { 443201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen > facet->val->value.decimal.lo) { 4433c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (expectedLen != 0) 4434c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 443501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_MAXLENGTH_VALID); 443601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 443701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else 443801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 443901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * NOTE: That we can pass NULL as xmlSchemaValPtr to 444001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateFacet, since the remaining facet types 444101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * are: XML_SCHEMA_FACET_PATTERN, XML_SCHEMA_FACET_ENUMERATION. 444201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 444301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(xmlSchemaValidateFacet(NULL, facet, value, NULL)); 444401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 444501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 444601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 444701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 44486927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaValidateLengthFacet: 4449c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the built-in type 4450c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @facet: the facet to check 4451c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the lexical repr. of the value to be validated 4452c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val: the precomputed value 4453c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @length: the actual length of the value 4454c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 4455c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength" 4456c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * facet; sets @length to the computed length of @value. 4457c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 4458c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if the value is valid, a positive error code 4459c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * otherwise and -1 in case of an internal or API error. 4460c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 4461c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardint 4462c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaValidateLengthFacet(xmlSchemaTypePtr type, 4463c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard xmlSchemaFacetPtr facet, 4464c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard const xmlChar *value, 4465c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard xmlSchemaValPtr val, 4466c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard unsigned long *length) 4467c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{ 4468c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard unsigned int len = 0; 4469c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 4470ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard if ((length == NULL) || (facet == NULL) || (type == NULL)) 4471ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard return (-1); 4472c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *length = 0; 4473c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((facet->type != XML_SCHEMA_FACET_LENGTH) && 4474c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->type != XML_SCHEMA_FACET_MAXLENGTH) && 4475c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->type != XML_SCHEMA_FACET_MINLENGTH)) 4476c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return (-1); 4477c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 4478c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((facet->val == NULL) || 4479c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard ((facet->val->type != XML_SCHEMAS_DECIMAL) && 4480c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 4481c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->val->value.decimal.frac != 0)) { 4482c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(-1); 4483c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 4484c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) 4485c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard len = val->value.hex.total; 4486c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY)) 4487c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard len = val->value.base64.total; 4488c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard else { 4489c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard switch (type->builtInType) { 4490c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_IDREF: 4491c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NORMSTRING: 4492c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_TOKEN: 4493c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_LANGUAGE: 4494c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NMTOKEN: 4495c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NAME: 4496c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NCNAME: 4497c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_ID: 4498c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard len = xmlSchemaNormLen(value); 4499c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard break; 4500c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_STRING: 4501c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard /* 4502c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * FIXME: What exactly to do with anyURI? 4503c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 4504c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_ANYURI: 4505c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (value != NULL) 4506c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard len = xmlUTF8Strlen(value); 4507c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard break; 4508c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard default: 4509c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard TODO 4510c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 4511c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 4512c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *length = (unsigned long) len; 4513c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 4514c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len != facet->val->value.decimal.lo) 4515c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_LENGTH_VALID); 4516c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 4517c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len < facet->val->value.decimal.lo) 4518c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_MINLENGTH_VALID); 4519c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } else { 4520c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len > facet->val->value.decimal.lo) 4521c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_MAXLENGTH_VALID); 4522c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 4523c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 4524c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return (0); 4525c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 4526c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 4527c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/** 4528c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaValidateFacet: 452901c13b5be2d249ef66d86585adee87901bb8efa2Daniel Veillard * @base: the base type 45304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @facet: the facet to check 45314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the lexical repr of the value to validate 45324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val: the precomputed value 45334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 45344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Check a value against a facet condition 45354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 45364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if the element is schemas valid, a positive error code 45374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * number otherwise and -1 in case of internal or API error. 45384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 45394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardint 4540dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateFacet(xmlSchemaTypePtr base ATTRIBUTE_UNUSED, 4541118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard xmlSchemaFacetPtr facet, 45424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard const xmlChar *value, xmlSchemaValPtr val) 45434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{ 45444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard int ret; 45454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 4546ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard if ((facet == NULL) || (value == NULL)) 4547ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard return(-1); 45484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard switch (facet->type) { 45494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMA_FACET_PATTERN: 45504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = xmlRegexpExec(facet->regexp, value); 45514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == 1) 45524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 45534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == 0) { 455401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_PATTERN_VALID); 45554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 45564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(ret); 45574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMA_FACET_MAXEXCLUSIVE: 45584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 45594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == -2) { 45608bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO error code */ 45614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(-1); 45624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 45634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == -1) 45644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 45655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* error code */ 456601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID); 4567070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MAXINCLUSIVE: 4568070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 4569070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == -2) { 45708bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO error code */ 4571070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 4572070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 4573070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret == -1) || (ret == 0)) 4574070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 45755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* error code */ 457601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID); 4577070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MINEXCLUSIVE: 4578070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 4579070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == -2) { 45808bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO error code */ 4581070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 4582070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 4583070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 1) 4584070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 45855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* error code */ 458601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID); 4587070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MININCLUSIVE: 4588070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 4589070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == -2) { 45908bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO error code */ 4591070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 4592070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 4593070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret == 1) || (ret == 0)) 4594070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 45955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* error code */ 459601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MININCLUSIVE_VALID); 45978651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard case XML_SCHEMA_FACET_WHITESPACE: 45988bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO whitespaces */ 459901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 460001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * NOTE: Whitespace should be handled to normalize 460101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * the value to be validated against a the facets; 460201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * not to normalize the value in-between. 460301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 46048651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard return(0); 46058bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_ENUMERATION: 46068bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard if ((facet->value != NULL) && 46078bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard (xmlStrEqual(facet->value, value))) 46088bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard return(0); 460901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_ENUMERATION_VALID); 46108bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_LENGTH: 4611e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard case XML_SCHEMA_FACET_MAXLENGTH: 46128bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_MINLENGTH: { 46138bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard unsigned int len = 0; 4614e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard 46158bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard if ((facet->val == NULL) || 4616e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((facet->val->type != XML_SCHEMAS_DECIMAL) && 4617e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 46188bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard (facet->val->value.decimal.frac != 0)) { 46198bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard return(-1); 46208bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 4621560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) 462270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard len = val->value.hex.total; 46231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY)) 46241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard len = val->value.base64.total; 46251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else { 462601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (base->builtInType) { 4627560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_IDREF: 4628560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NORMSTRING: 4629560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_TOKEN: 4630560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_LANGUAGE: 4631560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NMTOKEN: 4632560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NAME: 4633560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NCNAME: 4634560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_ID: 463570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard len = xmlSchemaNormLen(value); 463670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard break; 4637560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_STRING: 463801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 463901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * FIXME: What exactly to do with anyURI? 464001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 464101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 4642fbf2c5eaf550a8e7b94e87d5a4940db53bdffeacWilliam M. Brack if (value != NULL) 4643fbf2c5eaf550a8e7b94e87d5a4940db53bdffeacWilliam M. Brack len = xmlUTF8Strlen(value); 464470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard break; 4645560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard default: 4646560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard TODO 464770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 46488bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 46498bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 4650e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len != facet->val->value.decimal.lo) 465101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_LENGTH_VALID); 46528bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 4653e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len < facet->val->value.decimal.lo) 465401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MINLENGTH_VALID); 46558bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } else { 4656e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len > facet->val->value.decimal.lo) 465701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXLENGTH_VALID); 4658e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard } 46598bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard break; 46608bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 4661560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMA_FACET_TOTALDIGITS: 4662560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMA_FACET_FRACTIONDIGITS: 4663560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 4664560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((facet->val == NULL) || 4665560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard ((facet->val->type != XML_SCHEMAS_DECIMAL) && 4666560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 4667560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (facet->val->value.decimal.frac != 0)) { 4668560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return(-1); 4669560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 4670560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((val == NULL) || 4671560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard ((val->type != XML_SCHEMAS_DECIMAL) && 4672560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_INTEGER) && 4673560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NPINTEGER) && 4674560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NINTEGER) && 4675560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NNINTEGER) && 4676560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_PINTEGER) && 4677560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_INT) && 4678560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_UINT) && 4679560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_LONG) && 4680560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_ULONG) && 4681560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_SHORT) && 4682560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_USHORT) && 4683560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_BYTE) && 4684560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_UBYTE))) { 4685560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return(-1); 4686560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 4687560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) { 4688560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (val->value.decimal.total > facet->val->value.decimal.lo) 468901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_TOTALDIGITS_VALID); 4690560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 4691560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) { 4692560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (val->value.decimal.frac > facet->val->value.decimal.lo) 469301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID); 4694560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 4695560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard break; 46964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard default: 46974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard TODO 46984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 46994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 4700b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 47014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 47024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 47036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 47046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaGetCanonValue: 47056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @val: the precomputed value 47066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @retValue: the returned value 47076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 4708b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * Get a the cononical representation of the value. 4709b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * The caller has to free the returned retValue. 47106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 47116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns 0 if the value could be built and -1 in case of 47126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * API errors or if the value type is not supported yet. 47136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 47146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint 4715b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel VeillardxmlSchemaGetCanonValue(xmlSchemaValPtr val, const xmlChar **retValue) 47166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 4717b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard if ((retValue == NULL) || (val == NULL)) 47186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-1); 47196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *retValue = NULL; 47206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik switch (val->type) { 47216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_STRING: 47226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 47236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 47246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_TOKEN: 47256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_LANGUAGE: 47266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NMTOKEN: 47276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NAME: 47286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_QNAME: 47296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NCNAME: 47306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_ID: 47316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 47326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_ENTITY: 47336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NOTATION: 47346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_ANYURI: 47356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 47366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (val->value.str == NULL) 47376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *retValue = NULL; 47386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 47396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* TODO: This is not yet correct for non-normalized values. */ 47406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *retValue = 47416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik BAD_CAST xmlStrdup((const xmlChar *) val->value.str); 47426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (0); 47436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik default: 47446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-1); 47456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 47466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-1); 47476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 47486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 47494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#endif /* LIBXML_SCHEMAS_ENABLED */ 4750