xmlschemastypes.c revision c0826a7709eddbf10ade02f0ce80e5d077ac05f6
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 344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define TODO \ 354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard "Unimplemented block at %s:%d\n", \ 374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard __FILE__, __LINE__); 384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define XML_SCHEMAS_NAMESPACE_NAME \ 404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard (const xmlChar *)"http://www.w3.org/2001/XMLSchema" 414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 435f704afe98c584b7188aa0e4fbc9d9e68e0d7b1bDaniel Veillardstatic unsigned long powten[10] = { 444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000L, 454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 100000000L, 1000000000L 464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}; 474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 4801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 49070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* Date value */ 50070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef struct _xmlSchemaValDate xmlSchemaValDate; 51070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef xmlSchemaValDate *xmlSchemaValDatePtr; 52070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstruct _xmlSchemaValDate { 53070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard long year; 54070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int mon :4; /* 1 <= mon <= 12 */ 55070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int day :5; /* 1 <= day <= 31 */ 56070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int hour :5; /* 0 <= hour <= 23 */ 57070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int min :6; /* 0 <= min <= 59 */ 58070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double sec; 59a77cf71f453249f224d609f2f20789a897c5bdebDaniel Veillard unsigned int tz_flag :1; /* is tzo explicitely set? */ 60070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int tzo :11; /* -1440 <= tzo <= 1440 */ 61070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}; 62070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 63070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* Duration value */ 64070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef struct _xmlSchemaValDuration xmlSchemaValDuration; 65070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef xmlSchemaValDuration *xmlSchemaValDurationPtr; 66070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstruct _xmlSchemaValDuration { 67070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard long mon; /* mon stores years also */ 68070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard long day; 69070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double sec; /* sec stores min and hour also */ 70070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}; 71070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 724255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardtypedef struct _xmlSchemaValDecimal xmlSchemaValDecimal; 734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardtypedef xmlSchemaValDecimal *xmlSchemaValDecimalPtr; 744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstruct _xmlSchemaValDecimal { 754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard /* would use long long but not portable */ 76e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long lo; 77e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long mi; 78e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long hi; 794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard unsigned int extra; 805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard unsigned int sign:1; 81c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack unsigned int frac:7; 82c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack unsigned int total:8; 834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}; 844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 85e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardtypedef struct _xmlSchemaValQName xmlSchemaValQName; 86e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardtypedef xmlSchemaValQName *xmlSchemaValQNamePtr; 87e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstruct _xmlSchemaValQName { 88e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlChar *name; 89e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlChar *uri; 90e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard}; 91e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 9270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardtypedef struct _xmlSchemaValHex xmlSchemaValHex; 9370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardtypedef xmlSchemaValHex *xmlSchemaValHexPtr; 9470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardstruct _xmlSchemaValHex { 9570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard xmlChar *str; 9670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard unsigned int total; 9770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard}; 9870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardtypedef struct _xmlSchemaValBase64 xmlSchemaValBase64; 1001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardtypedef xmlSchemaValBase64 *xmlSchemaValBase64Ptr; 1011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstruct _xmlSchemaValBase64 { 1021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *str; 1031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned int total; 1041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard}; 1051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 1064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstruct _xmlSchemaVal { 1074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValType type; 1084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard union { 1095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValDecimal decimal; 110070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValDate date; 111070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValDuration dur; 112e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlSchemaValQName qname; 11370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard xmlSchemaValHex hex; 1141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaValBase64 base64; 11584d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard float f; 11684d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard double d; 117c5a70f264550ee39da267e81dccd95508ed367ddDaniel Veillard int b; 118c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard xmlChar *str; 1194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } value; 1204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}; 1214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 1224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int xmlSchemaTypesInitialized = 0; 1234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlHashTablePtr xmlSchemaTypesBank = NULL; 1244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 125c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard/* 126c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * Basic types 127c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */ 1284255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeStringDef = NULL; 1294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnyTypeDef = NULL; 1304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnySimpleTypeDef = NULL; 1314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDecimalDef = NULL; 132070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDatetimeDef = NULL; 1334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDateDef = NULL; 134070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeTimeDef = NULL; 135070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGYearDef = NULL; 136070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGYearMonthDef = NULL; 137070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGDayDef = NULL; 138070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGMonthDayDef = NULL; 139070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGMonthDef = NULL; 140070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDurationDef = NULL; 14184d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeFloatDef = NULL; 142c5a70f264550ee39da267e81dccd95508ed367ddDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeBooleanDef = NULL; 14384d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDoubleDef = NULL; 144560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeHexBinaryDef = NULL; 1451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeBase64BinaryDef = NULL; 146e5b110b3844d58ff4bea56bcb699144f6fbe0b83Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnyURIDef = NULL; 1474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 1484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/* 149c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * Derived types 150c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */ 151c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypePositiveIntegerDef = NULL; 152c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNonPositiveIntegerDef = NULL; 153c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNegativeIntegerDef = NULL; 154c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNonNegativeIntegerDef = NULL; 155c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIntegerDef = NULL; 156c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeLongDef = NULL; 157c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIntDef = NULL; 158c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeShortDef = NULL; 159c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeByteDef = NULL; 160c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedLongDef = NULL; 161c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedIntDef = NULL; 162c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedShortDef = NULL; 163c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedByteDef = NULL; 1648bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNormStringDef = NULL; 1658bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeTokenDef = NULL; 1668bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeLanguageDef = NULL; 1678bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNameDef = NULL; 1688bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeQNameDef = NULL; 169e5b110b3844d58ff4bea56bcb699144f6fbe0b83Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNCNameDef = NULL; 1708bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdDef = NULL; 1718bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdrefDef = NULL; 1728bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdrefsDef = NULL; 173a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeEntityDef = NULL; 174a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeEntitiesDef = NULL; 175e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNotationDef = NULL; 1768bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNmtokenDef = NULL; 1778bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNmtokensDef = NULL; 178c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard 179d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/************************************************************************ 180d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * * 181d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * Datatype error handlers * 182d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * * 183d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard ************************************************************************/ 184d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/** 185d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * xmlSchemaTypeErrMemory: 186d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * @extra: extra informations 187d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * 188d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * Handle an out of memory condition 189d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard */ 190d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillardstatic void 191d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel VeillardxmlSchemaTypeErrMemory(xmlNodePtr node, const char *extra) 192d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard{ 193d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard __xmlSimpleError(XML_FROM_DATATYPE, XML_ERR_NO_MEMORY, node, NULL, extra); 194d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard} 195d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard 196d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/************************************************************************ 197d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * * 198d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * Base types support * 199d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * * 200d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard ************************************************************************/ 201c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard/* 2024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitBasicType: 2034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name: the type name 2048bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard * @type: the value type associated 2054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 20601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Initialize one primitive built-in type 2074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 2084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr 20901fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaInitBasicType(const char *name, xmlSchemaValType type, 21001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypePtr baseType) { 2114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypePtr ret; 2124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 2134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType)); 2144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == NULL) { 215d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard xmlSchemaTypeErrMemory(NULL, "could not initialize basic types"); 2164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(NULL); 2174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 2184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard memset(ret, 0, sizeof(xmlSchemaType)); 219be9c6320d4ed8d5622322014310555bb88b02a85Daniel Veillard ret->name = (const xmlChar *)name; 2204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret->type = XML_SCHEMA_TYPE_BASIC; 22101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard ret->baseType = baseType; 22201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 22301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Hack to reflect the variety. 22401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 22501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((type == XML_SCHEMAS_IDREFS) || 22601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (type == XML_SCHEMAS_NMTOKENS) || 22701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (type == XML_SCHEMAS_ENTITIES)) 22801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard ret->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST; 22901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else if (type != XML_SCHEMAS_UNKNOWN) 23001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard ret->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC; 2314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret->contentType = XML_SCHEMA_CONTENT_BASIC; 23201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type) { 23301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_STRING: 23401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DECIMAL: 23501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATE: 23601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATETIME: 23701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_TIME: 23801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEAR: 23901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 24001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTH: 24101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 24201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GDAY: 24301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DURATION: 24401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_FLOAT: 24501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DOUBLE: 24601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BOOLEAN: 24701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 24801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_HEXBINARY: 24901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 25001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_QNAME: 25101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NOTATION: 25201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard ret->flags |= XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE; 25396d2effc735fb45cfa363b6a876ff23a862f87a5William M. Brack default: 25496d2effc735fb45cfa363b6a876ff23a862f87a5William M. Brack break; 25501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 25601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 2574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlHashAddEntry2(xmlSchemaTypesBank, ret->name, 2584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard XML_SCHEMAS_NAMESPACE_NAME, ret); 25901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard ret->builtInType = type; 2604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(ret); 2614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 2624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 2634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/* 2644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitTypes: 2654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 2664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Initialize the default XML Schemas type library 2674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 2684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid 2696560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel VeillardxmlSchemaInitTypes(void) 2706560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard{ 2714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized != 0) 2726560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard return; 2734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypesBank = xmlHashCreate(40); 2746560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard 27501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 276c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard /* 27701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 3.4.7 Built-in Complex Type Definition 27801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 2798bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeAnyTypeDef = xmlSchemaInitBasicType("anyType", 28001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_UNKNOWN, 28101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard NULL); 28201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef->baseType = xmlSchemaTypeAnyTypeDef; 28301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED; 28401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard { 28501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaWildcardPtr wild; 28601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 28701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard)); 28801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (wild == NULL) { 28901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeErrMemory(NULL, "could not create a wildcard on anyType"); 29001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return; 29101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 29201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard memset(wild, 0, sizeof(xmlSchemaWildcard)); 29301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard wild->any = 1; 29401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard wild->processContents = XML_SCHEMAS_ANY_LAX; 29501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard wild->minOccurs = 1; 29601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard wild->maxOccurs = 1; 29701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef->attributeWildcard = wild; 29801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 29901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef = xmlSchemaInitBasicType("anySimpleType", 30001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_UNKNOWN, 30101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef); 30201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 30301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * primitive datatypes 30401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 30501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeStringDef = xmlSchemaInitBasicType("string", 30601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_STRING, 30701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3088bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDecimalDef = xmlSchemaInitBasicType("decimal", 30901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DECIMAL, 31001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3118bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDateDef = xmlSchemaInitBasicType("date", 31201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DATE, 31301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3148bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDatetimeDef = xmlSchemaInitBasicType("dateTime", 31501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DATETIME, 31601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3178bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeTimeDef = xmlSchemaInitBasicType("time", 31801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_TIME, 31901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3208bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGYearDef = xmlSchemaInitBasicType("gYear", 32101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GYEAR, 32201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3238bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGYearMonthDef = xmlSchemaInitBasicType("gYearMonth", 32401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GYEARMONTH, 32501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3268bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGMonthDef = xmlSchemaInitBasicType("gMonth", 32701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GMONTH, 32801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3298bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGMonthDayDef = xmlSchemaInitBasicType("gMonthDay", 33001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GMONTHDAY, 33101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3328bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGDayDef = xmlSchemaInitBasicType("gDay", 33301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GDAY, 33401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3358bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDurationDef = xmlSchemaInitBasicType("duration", 33601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DURATION, 33701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3388bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float", 33901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_FLOAT, 34001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3418bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double", 34201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DOUBLE, 34301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3448bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeBooleanDef = xmlSchemaInitBasicType("boolean", 34501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_BOOLEAN, 34601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3478bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeAnyURIDef = xmlSchemaInitBasicType("anyURI", 34801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_ANYURI, 34901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 350560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard xmlSchemaTypeHexBinaryDef = xmlSchemaInitBasicType("hexBinary", 35101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_HEXBINARY, 35201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaTypeBase64BinaryDef 35401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard = xmlSchemaInitBasicType("base64Binary", XML_SCHEMAS_BASE64BINARY, 35501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 35601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNotationDef = xmlSchemaInitBasicType("NOTATION", 35701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NOTATION, 35801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 35901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeQNameDef = xmlSchemaInitBasicType("QName", 36001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_QNAME, 36101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 3624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 363c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard /* 364c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * derived datatypes 365c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */ 3668bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeIntegerDef = xmlSchemaInitBasicType("integer", 36701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_INTEGER, 36801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeDecimalDef); 3696560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeNonPositiveIntegerDef = 3706560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaInitBasicType("nonPositiveInteger", 37101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NPINTEGER, 37201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntegerDef); 3736560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeNegativeIntegerDef = 37401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("negativeInteger", XML_SCHEMAS_NINTEGER, 37501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNonPositiveIntegerDef); 3766560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeLongDef = 37701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("long", XML_SCHEMAS_LONG, 37801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntegerDef); 37901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntDef = xmlSchemaInitBasicType("int", XML_SCHEMAS_INT, 38001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeLongDef); 3818bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeShortDef = xmlSchemaInitBasicType("short", 38201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_SHORT, 38301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntDef); 3848bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeByteDef = xmlSchemaInitBasicType("byte", 38501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_BYTE, 38601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeShortDef); 3876560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeNonNegativeIntegerDef = 3886560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaInitBasicType("nonNegativeInteger", 38901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NNINTEGER, 39001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntegerDef); 3916560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedLongDef = 39201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedLong", XML_SCHEMAS_ULONG, 39301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNonNegativeIntegerDef); 3946560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedIntDef = 39501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedInt", XML_SCHEMAS_UINT, 39601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeUnsignedLongDef); 3976560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedShortDef = 39801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedShort", XML_SCHEMAS_USHORT, 39901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeUnsignedIntDef); 4006560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedByteDef = 40101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedByte", XML_SCHEMAS_UBYTE, 40201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeUnsignedShortDef); 4036560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypePositiveIntegerDef = 40401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("positiveInteger", XML_SCHEMAS_PINTEGER, 40501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNonNegativeIntegerDef); 4068bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeNormStringDef = xmlSchemaInitBasicType("normalizedString", 40701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NORMSTRING, 40801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeStringDef); 4098bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeTokenDef = xmlSchemaInitBasicType("token", 41001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_TOKEN, 41101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNormStringDef); 4128bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeLanguageDef = xmlSchemaInitBasicType("language", 41301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_LANGUAGE, 41401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeTokenDef); 41501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNameDef = xmlSchemaInitBasicType("Name", 41601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NAME, 41701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeTokenDef); 41801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNmtokenDef = xmlSchemaInitBasicType("NMTOKEN", 41901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NMTOKEN, 42001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeTokenDef); 42101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNCNameDef = xmlSchemaInitBasicType("NCName", 42201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NCNAME, 42301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNameDef); 42401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIdDef = xmlSchemaInitBasicType("ID", XML_SCHEMAS_ID, 42501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNCNameDef); 4268bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeIdrefDef = xmlSchemaInitBasicType("IDREF", 42701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_IDREF, 42801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNCNameDef); 4298bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeIdrefsDef = xmlSchemaInitBasicType("IDREFS", 43001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_IDREFS, 43101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIdrefDef); 43201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNmtokensDef = xmlSchemaInitBasicType("NMTOKENS", 43301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NMTOKENS, 43401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNmtokenDef); 435a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard xmlSchemaTypeEntityDef = xmlSchemaInitBasicType("ENTITY", 43601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_ENTITY, 43701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNCNameDef); 438a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard xmlSchemaTypeEntitiesDef = xmlSchemaInitBasicType("ENTITIES", 43901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_ENTITIES, 44001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNCNameDef); 4414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypesInitialized = 1; 4424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 4434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 4444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 4454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCleanupTypes: 4464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 4474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library 4484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 4494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid 4504255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCleanupTypes(void) { 4514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 4524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return; 45301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaFreeWildcard(xmlSchemaTypeAnyTypeDef->attributeWildcard); 4544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlHashFree(xmlSchemaTypesBank, (xmlHashDeallocator) xmlSchemaFreeType); 4554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypesInitialized = 0; 4564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 4574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 4584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 459c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaGetBuiltInType: 46001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in type 46101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facetType: the facet type 46201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 46301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Evaluates if a specific facet can be 46401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * used in conjunction with a type. 46501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 46601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 1 if the facet can be used with the given built-in type, 46701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 0 otherwise and -1 in case the type is not a built-in type. 46801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 46901fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint 47001fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaIsBuiltInTypeFacet(xmlSchemaTypePtr type, int facetType) 47101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 47201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->type != XML_SCHEMA_TYPE_BASIC) 47301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (-1); 47401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type->builtInType) { 47501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BOOLEAN: 47601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_PATTERN) || 47701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE)) 47801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 47901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 48001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 48101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_STRING: 48201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NOTATION: 48301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_QNAME: 48401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 48501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 48601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_HEXBINARY: 48701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_LENGTH) || 48801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MINLENGTH) || 48901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXLENGTH) || 49001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_PATTERN) || 49101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_ENUMERATION) || 49201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE)) 49301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 49401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 49501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 49601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DECIMAL: 49701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_TOTALDIGITS) || 49801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) || 49901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_PATTERN) || 50001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE) || 50101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_ENUMERATION) || 50201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) || 50301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) || 50401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MININCLUSIVE) || 50501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE)) 50601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 50701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 50801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 50901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_TIME: 51001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GDAY: 51101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTH: 51201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 51301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEAR: 51401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 51501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATE: 51601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATETIME: 51701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DURATION: 51801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_FLOAT: 51901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DOUBLE: 52001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_PATTERN) || 52101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_ENUMERATION) || 52201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE) || 52301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) || 52401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) || 52501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MININCLUSIVE) || 52601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE)) 52701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 52801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 52901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 53001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard default: 53101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 53201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 53301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 53401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 53501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 53601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 53701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInType: 53801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the type of the built in type 53901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 54001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Gives you the type struct for a built-in 54101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * type by its type id. 54201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 54301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns the type if found, NULL otherwise. 54401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 54501fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr 54601fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInType(xmlSchemaValType type) 54701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 54801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (xmlSchemaTypesInitialized == 0) 54901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitTypes(); 55001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type) { 55101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 55201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYSIMPLETYPE: 55301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeAnySimpleTypeDef); 55401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_STRING: 55501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeStringDef); 55601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NORMSTRING: 55701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNormStringDef); 55801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DECIMAL: 55901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDecimalDef); 56001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_TIME: 56101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeTimeDef); 56201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GDAY: 56301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGDayDef); 56401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTH: 56501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGMonthDef); 56601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 56701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGMonthDayDef); 56801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEAR: 56901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGYearDef); 57001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 57101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGYearMonthDef); 57201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATE: 57301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDateDef); 57401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATETIME: 57501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDatetimeDef); 57601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DURATION: 57701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDurationDef); 57801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_FLOAT: 57901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeFloatDef); 58001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DOUBLE: 58101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDoubleDef); 58201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BOOLEAN: 58301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeBooleanDef); 58401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_TOKEN: 58501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeTokenDef); 58601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_LANGUAGE: 58701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeLanguageDef); 58801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NMTOKEN: 58901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNmtokenDef); 59001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NMTOKENS: 59101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNmtokensDef); 59201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NAME: 59301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNameDef); 59401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_QNAME: 59501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeQNameDef); 59601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NCNAME: 59701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNCNameDef); 59801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ID: 59901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdDef); 60001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_IDREF: 60101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdrefDef); 60201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_IDREFS: 60301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdrefsDef); 60401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ENTITY: 60501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeEntityDef); 60601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ENTITIES: 60701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeEntitiesDef); 60801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NOTATION: 60901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNotationDef); 61001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 61101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeAnyURIDef); 61201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_INTEGER: 61301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIntegerDef); 61401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NPINTEGER: 61501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNonPositiveIntegerDef); 61601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NINTEGER: 61701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNegativeIntegerDef); 61801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NNINTEGER: 61901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNonNegativeIntegerDef); 62001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_PINTEGER: 62101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypePositiveIntegerDef); 62201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_INT: 62301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIntDef); 62401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_UINT: 62501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedIntDef); 62601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_LONG: 62701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeLongDef); 62801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ULONG: 62901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedLongDef); 63001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_SHORT: 63101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeShortDef); 63201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_USHORT: 63301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedShortDef); 63401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BYTE: 63501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeByteDef); 63601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_UBYTE: 63701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedByteDef); 63801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_HEXBINARY: 63901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeHexBinaryDef); 64001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 64101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeBase64BinaryDef); 64201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYTYPE: 64301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeAnyTypeDef); 64401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard default: 64501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (NULL); 64601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 64701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 64801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 64901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 6504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaNewValue: 6514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type: the value type 6524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 6534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Allocate a new simple type value 6544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 6554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns a pointer to the new value or NULL in case of error 6564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 6574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaValPtr 6584255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaNewValue(xmlSchemaValType type) { 6594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValPtr value; 6604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 6614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard value = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal)); 6624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (value == NULL) { 6634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(NULL); 6644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 6654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard memset(value, 0, sizeof(xmlSchemaVal)); 6664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard value->type = type; 6674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(value); 6684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 6694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 6704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 6714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaFreeValue: 6724255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to free 6734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 6744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library 6754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 6764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid 6774255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaFreeValue(xmlSchemaValPtr value) { 6784255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (value == NULL) 6794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return; 680c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard switch (value->type) { 681c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_STRING: 682c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NORMSTRING: 683c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_TOKEN: 684c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_LANGUAGE: 685c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NMTOKEN: 686c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NMTOKENS: 687c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NAME: 688c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NCNAME: 689c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ID: 690c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_IDREF: 691c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_IDREFS: 692c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ENTITY: 693c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ENTITIES: 694c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NOTATION: 695c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ANYURI: 696c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (value->value.str != NULL) 697c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard xmlFree(value->value.str); 698c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 699e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_QNAME: 700e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (value->value.qname.uri != NULL) 701e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlFree(value->value.qname.uri); 702e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (value->value.qname.name != NULL) 703e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlFree(value->value.qname.name); 704e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard break; 70570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard case XML_SCHEMAS_HEXBINARY: 70670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard if (value->value.hex.str != NULL) 70770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard xmlFree(value->value.hex.str); 70870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard break; 7091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 7101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (value->value.base64.str != NULL) 7111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(value->value.base64.str); 7121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 713c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard default: 714c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 715c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 7164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlFree(value); 7174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 7184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 7194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 7204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaGetPredefinedType: 7214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name: the type name 7224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @ns: the URI of the namespace usually "http://www.w3.org/2001/XMLSchema" 7234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 7244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Lookup a type in the default XML Schemas type library 7254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 7264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns the type if found, NULL otherwise 7274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 7284255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaTypePtr 7294255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaGetPredefinedType(const xmlChar *name, const xmlChar *ns) { 7304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 7314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaInitTypes(); 7324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (name == NULL) 7334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(NULL); 7344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return((xmlSchemaTypePtr) xmlHashLookup2(xmlSchemaTypesBank, name, ns)); 7354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 736070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 73701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 73801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInListSimpleTypeItemType: 73901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in simple type. 74001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 741c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns the item type of @type as defined by the built-in datatype 742c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * hierarchy of XML Schema Part 2: Datatypes, or NULL in case of an error. 74301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 74401fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr 74501fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInListSimpleTypeItemType(xmlSchemaTypePtr type) 74601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 74701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->type != XML_SCHEMA_TYPE_BASIC) 74801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (NULL); 74901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type->builtInType) { 75001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NMTOKENS: 75101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNmtokenDef ); 75201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_IDREFS: 75301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdrefDef); 75401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ENTITIES: 75501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeEntityDef); 75601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard default: 75701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (NULL); 75801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 75901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 76001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 761070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**************************************************************** 762070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 763070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Convenience macros and functions * 764070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 765070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/ 766070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 767070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_TZO_CHAR(c) \ 768070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ((c == 0) || (c == 'Z') || (c == '+') || (c == '-')) 769070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 770070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_YEAR(yr) (yr != 0) 771070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MONTH(mon) ((mon >= 1) && (mon <= 12)) 772070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* VALID_DAY should only be used when month is unknown */ 773070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DAY(day) ((day >= 1) && (day <= 31)) 774070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_HOUR(hr) ((hr >= 0) && (hr <= 23)) 775070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MIN(min) ((min >= 0) && (min <= 59)) 776070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_SEC(sec) ((sec >= 0) && (sec < 60)) 777070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TZO(tzo) ((tzo > -1440) && (tzo < 1440)) 778070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_LEAP(y) \ 779070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) 780070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 781ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonth[12] = 782070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 783ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonthLeap[12] = 784070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 785070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 7865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MAX_DAYINMONTH(yr,mon) \ 7875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1]) 7885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 789070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MDAY(dt) \ 790070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (IS_LEAP(dt->year) ? \ 791070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (dt->day <= daysInMonthLeap[dt->mon - 1]) : \ 792070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (dt->day <= daysInMonth[dt->mon - 1])) 793070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 794070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATE(dt) \ 795070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_YEAR(dt->year) && VALID_MONTH(dt->mon) && VALID_MDAY(dt)) 796070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 797070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TIME(dt) \ 798070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_HOUR(dt->hour) && VALID_MIN(dt->min) && \ 799070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard VALID_SEC(dt->sec) && VALID_TZO(dt->tzo)) 800070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 801070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATETIME(dt) \ 802070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_DATE(dt) && VALID_TIME(dt)) 803070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 804070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_MIN (60) 805070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_HOUR (60 * SECS_PER_MIN) 806070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_DAY (24 * SECS_PER_HOUR) 807070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 8085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInYearByMonth[12] = 8095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; 8105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInLeapYearByMonth[12] = 8115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 }; 8125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 8135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DAY_IN_YEAR(day, month, year) \ 8145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((IS_LEAP(year) ? \ 8155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dayInLeapYearByMonth[month - 1] : \ 8165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dayInYearByMonth[month - 1]) + day) 8175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 8185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#ifdef DEBUG 8195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt) \ 8205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 8215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard "type=%o %04ld-%02u-%02uT%02u:%02u:%03f", \ 8225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->type,dt->value.date.year,dt->value.date.mon, \ 8235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->value.date.day,dt->value.date.hour,dt->value.date.min, \ 8245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->value.date.sec); \ 8255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt->value.date.tz_flag) \ 8265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt->value.date.tzo != 0) \ 8275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 8285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard "%+05d\n",dt->value.date.tzo); \ 8295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else \ 8305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, "Z\n"); \ 8315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else \ 8325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext,"\n") 8335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#else 8345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt) 8355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#endif 8365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 837070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 838070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGYear: 839070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 840070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 841070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 842070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gYear without time zone and fills in the appropriate 843070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 844070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gYear. It is supposed that @dt->year is big enough to contain 845070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * the year. 846070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 847070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 848070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 849070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 850070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) { 851070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str, *firstChar; 852070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0, digcnt = 0; 853070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 854070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (((*cur < '0') || (*cur > '9')) && 855070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (*cur != '-') && (*cur != '+')) 856070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 857070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 858070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 859070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = 1; 860070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 861070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 862070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 863070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard firstChar = cur; 864070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 865070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 866070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->year = dt->year * 10 + (*cur - '0'); 867070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 868070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard digcnt++; 869070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 870070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 871070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* year must be at least 4 digits (CCYY); over 4 872070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * digits cannot have a leading zero. */ 873070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0'))) 874070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 875070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 876070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) 877070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->year = - dt->year; 878070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 879070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_YEAR(dt->year)) 880070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 881070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 882070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 883070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 884070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 885070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 886070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 887070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_2_DIGITS: 888070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the integer to fill in 889070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 890070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer 891070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 892070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a 2-digits integer and updates @num with the value. @cur is 893070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer. 894070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and 895070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 896070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 897070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_2_DIGITS(num, cur, invalid) \ 898070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((cur[0] < '0') || (cur[0] > '9') || \ 899070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (cur[1] < '0') || (cur[1] > '9')) \ 900070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard invalid = 1; \ 901070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 902070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = (cur[0] - '0') * 10 + (cur[1] - '0'); \ 903070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur += 2; 904070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 905070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 906070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_FLOAT: 907070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the double to fill in 908070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 909070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer 910070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 911070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float and updates @num with the value. @cur is 912070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the float. The float must have a 913070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2-digits integer part and may or may not have a decimal part. 914070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and 915070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 916070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 917070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_FLOAT(num, cur, invalid) \ 918070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(num, cur, invalid); \ 919070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!invalid && (*cur == '.')) { \ 920070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double mult = 1; \ 921070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 922070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 923070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard invalid = 1; \ 924070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 925070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mult /= 10; \ 926070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num += (*cur - '0') * mult; \ 927070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 928070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 929070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 930070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 931070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 932070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGMonth: 933070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 934070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 935070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 936070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gMonth without time zone and fills in the appropriate 937070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 938070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gMonth. 939070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 940070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 941070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 942070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 943070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) { 944070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 945070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 946070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 947070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(dt->mon, cur, ret); 948070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 949070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 950070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 951070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_MONTH(dt->mon)) 952070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 953070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 954070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 955070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 956070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 957070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 958070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 959070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGDay: 960070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 961070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 962070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 963070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gDay without time zone and fills in the appropriate 964070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 965070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay. 966070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 967070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 968070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 969070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 970070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) { 971070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 972070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 973070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 974070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(dt->day, cur, ret); 975070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 976070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 977070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 978070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_DAY(dt->day)) 979070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 980070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 981070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 982070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 983070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 984070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 985070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 986070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTime: 987070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 988070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 989070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 990070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:time without time zone and fills in the appropriate 991070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * fields of the @dt structure. @str is updated to point just after the 992070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:time. 993070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, values of @dt fields are undefined. 994070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 995070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 996070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 997070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 998070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) { 999070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 1000070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int hour = 0; /* use temp var in case str is not xs:time */ 1001070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 1002070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1003070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(hour, cur, ret); 1004070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1005070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1006070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1007070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1008070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1009070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1010070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1011070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* the ':' insures this string is xs:time */ 1012070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->hour = hour; 1013070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1014070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(dt->min, cur, ret); 1015070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1016070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1017070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1018070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1019070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1020070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1021070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1022070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_FLOAT(dt->sec, cur, ret); 1023070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1024070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1025070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1026070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_TIME(dt)) 1027070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1028070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1029070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1030070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1031070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1032070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1033070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1034070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTimeZone: 1035070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1036070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1037070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1038070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a time zone without time zone and fills in the appropriate 1039070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1040070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * time zone. 1041070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1042070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1043070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1044070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1045070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) { 1046070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 1047070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 1048070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1049070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (str == NULL) 1050070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1051070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1052070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard switch (*cur) { 1053070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 0: 1054070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tz_flag = 0; 1055070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = 0; 1056070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1057070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1058070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 'Z': 1059070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tz_flag = 1; 1060070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = 0; 1061070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1062070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1063070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1064070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case '+': 1065070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case '-': { 1066070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0, tmp = 0; 1067070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = (*cur == '-'); 1068070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1069070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1070070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1071070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(tmp, cur, ret); 1072070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1073070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1074070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_HOUR(tmp)) 1075070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1076070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1077070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1078070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1079070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1080070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1081070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = tmp * 60; 1082070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1083070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(tmp, cur, ret); 1084070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1085070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1086070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_MIN(tmp)) 1087070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1088070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1089070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo += tmp; 1090070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) 1091070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = - dt->tzo; 1092070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1093070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_TZO(dt->tzo)) 1094070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1095070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 10965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->tz_flag = 1; 1097070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1098070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1099070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard default: 1100070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1101070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1102070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1103070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1104070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1105070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1106070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 11071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard/** 11081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * _xmlSchemaBase64Decode: 11091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * @ch: a character 11101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 11111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Converts a base64 encoded character to its base 64 value. 11121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 11131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Returns 0-63 (value), 64 (pad), or -1 (not recognized) 11141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */ 11151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic int 11161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard_xmlSchemaBase64Decode (const xmlChar ch) { 11171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('A' <= ch) && (ch <= 'Z')) return ch - 'A'; 11181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('a' <= ch) && (ch <= 'z')) return ch - 'a' + 26; 11191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('0' <= ch) && (ch <= '9')) return ch - '0' + 52; 11201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('+' == ch) return 62; 11211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('/' == ch) return 63; 11221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('=' == ch) return 64; 11231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return -1; 11241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard} 11251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 1126070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**************************************************************** 1127070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 1128070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * XML Schema Dates/Times Datatypes Handling * 1129070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 1130070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/ 1131070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1132070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1133070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_DIGITS: 1134070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the integer to fill in 1135070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1136070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag 1137070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1138070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a digits integer and updates @num with the value. @cur is 1139070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer. 1140070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and 1141070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1142070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1143070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_DIGITS(num, cur, num_type) \ 1144070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 1145070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = -1; \ 1146070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 1147070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 1148070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = num * 10 + (*cur - '0'); \ 1149070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1150070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1151070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1152070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1153070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_NUM: 1154070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the double to fill in 1155070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1156070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag 1157070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1158070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float or integer and updates @num with the value. @cur is 1159070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the number. If the number is a float, 1160070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * then it must have an integer part and a decimal part; @num_type will 1161070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * be set to 1. If there is no decimal part, @num_type is set to zero. 1162070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and 1163070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1164070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1165070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_NUM(num, cur, num_type) \ 1166070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = 0; \ 1167070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_DIGITS(num, cur, num_type); \ 1168070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!num_type && (*cur == '.')) { \ 1169070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double mult = 1; \ 1170070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1171070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 1172070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = -1; \ 1173070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 1174070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = 1; \ 1175070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 1176070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mult /= 10; \ 1177070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num += (*cur - '0') * mult; \ 1178070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1179070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 1180070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1181070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1182070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 11835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDates: 1184455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard * @type: the expected type or XML_SCHEMAS_UNKNOWN 1185070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dateTime: string to analyze 1186070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val: the return computed value 1187070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1188070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @dateTime conforms to the lexical space of one of the date types. 1189070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val. 1190070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1191070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 1192070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * and -1 in case of internal or API error. 1193070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1194070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1195455cc07308c673b6714e2f5670c2091a1dab95dcDaniel VeillardxmlSchemaValidateDates (xmlSchemaValType type, 1196118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard const xmlChar *dateTime, xmlSchemaValPtr *val) { 1197070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValPtr dt; 1198070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret; 1199070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = dateTime; 1200070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1201070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define RETURN_TYPE_IF_VALID(t) \ 1202070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (IS_TZO_CHAR(*cur)) { \ 1203070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); \ 1204070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 0) { \ 1205070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != 0) \ 1206070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; \ 1207070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->type = t; \ 1208455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard goto done; \ 1209070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 1210070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1211070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1212070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dateTime == NULL) 1213070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1214070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1215070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur != '-') && (*cur < '0') && (*cur > '9')) 1216070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1217070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1218070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN); 1219070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dt == NULL) 1220070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1221070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1222070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((cur[0] == '-') && (cur[1] == '-')) { 1223070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1224070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * It's an incomplete date (xs:gMonthDay, xs:gMonth or 1225070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay) 1226070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1227070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur += 2; 1228070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1229070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gDay? */ 1230070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 1231455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard if (type == XML_SCHEMAS_GMONTH) 1232455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard goto error; 1233070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ++cur; 1234070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1235070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1236070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1237070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1238070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY); 1239070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1240070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1241070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1242070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1243070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1244070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * it should be an xs:gMonthDay or xs:gMonth 1245070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1246070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); 1247070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1248070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1249070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1250d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1251d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a '-' char could indicate this type is xs:gMonthDay or 1252d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a negative time zone offset. Check for xs:gMonthDay first. 1253d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * Also the first three char's of a negative tzo (-MM:SS) can 1254d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * appear to be a valid day; so even if the day portion 1255d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * of the xs:gMonthDay verifies, we must insure it was not 1256d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a tzo. 1257d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1258d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if (*cur == '-') { 1259d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const xmlChar *rewnd = cur; 1260d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard cur++; 1261d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1262d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1263d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((ret == 0) && ((*cur == 0) || (*cur != ':'))) { 1264d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1265d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1266d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * we can use the VALID_MDAY macro to validate the month 1267d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * and day because the leap year test will flag year zero 1268d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * as a leap year (even though zero is an invalid year). 1269d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1270d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if (VALID_MDAY((&(dt->value.date)))) { 1271d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1272d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY); 1273070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1274d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1275d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1276d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1277d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1278d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1279d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * not xs:gMonthDay so rewind and check if just xs:gMonth 1280d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * with an optional time zone. 1281d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1282d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard cur = rewnd; 1283d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1284d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1285d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH); 1286070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1287070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1288070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1289070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1290070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1291070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * It's a right-truncated date or an xs:time. 1292070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Try to parse an xs:time then fallback on right-truncated dates. 1293070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1294070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur >= '0') && (*cur <= '9')) { 1295070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTime(&(dt->value.date), &cur); 1296070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 0) { 1297070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* it's an xs:time */ 1298070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_TIME); 1299070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1300070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1301070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1302070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* fallback on date parsing */ 1303070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur = dateTime; 1304070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1305070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGYear(&(dt->value.date), &cur); 1306070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1307070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1308070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1309070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gYear? */ 1310070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEAR); 1311070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1312070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != '-') 1313070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1314070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1315070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1316070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); 1317070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1318070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1319070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1320070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gYearMonth? */ 1321070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEARMONTH); 1322070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1323070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != '-') 1324070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1325070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1326070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1327070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1328070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret != 0) || !VALID_DATE((&(dt->value.date)))) 1329070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1330070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1331070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:date? */ 1332070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_DATE); 1333070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1334070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != 'T') 1335070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1336070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1337070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1338070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* it should be an xs:dateTime */ 1339070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTime(&(dt->value.date), &cur); 1340070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1341070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1342070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1343070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); 1344070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret != 0) || (*cur != 0) || !VALID_DATETIME((&(dt->value.date)))) 1345070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1346070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1347455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard 1348070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->type = XML_SCHEMAS_DATETIME; 1349070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1350455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillarddone: 1351d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#if 1 1352d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) 1353d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1354d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#else 1355d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1356d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * insure the parsed type is equal to or less significant (right 1357d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * truncated) than the desired type. 1358d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1359d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) { 1360d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1361d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* time only matches time */ 1362d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_TIME) && (dt->type == XML_SCHEMAS_TIME)) 1363d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1364d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1365d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_DATETIME) && 1366d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard ((dt->type != XML_SCHEMAS_DATE) || 1367d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEARMONTH) || 1368d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEAR))) 1369d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1370d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1371d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_DATE) && 1372d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard ((dt->type != XML_SCHEMAS_GYEAR) || 1373d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEARMONTH))) 1374d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1375d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1376d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_GYEARMONTH) && (dt->type != XML_SCHEMAS_GYEAR)) 1377d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1378d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1379d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_GMONTHDAY) && (dt->type != XML_SCHEMAS_GMONTH)) 1380d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1381d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1382455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard#endif 1383455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard 1384070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (val != NULL) 1385070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *val = dt; 138680b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 138780b19092f24410a6b869abf519227686e8f207caDaniel Veillard xmlSchemaFreeValue(dt); 1388070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1389070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1390070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1391070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror: 1392070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dt != NULL) 1393070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaFreeValue(dt); 1394070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1395070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1396070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1397070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 13985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDuration: 1399070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @type: the predefined type 1400070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @duration: string to analyze 1401070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val: the return computed value 1402070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1403070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @duration conforms to the lexical space of the duration type. 1404070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val. 1405070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1406070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 1407070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * and -1 in case of internal or API error. 1408070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1409070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1410dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED, 1411118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard const xmlChar *duration, xmlSchemaValPtr *val) { 1412070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = duration; 1413070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValPtr dur; 1414070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0; 1415070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int seq = 0; 1416d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard double num; 1417d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard int num_type = 0; /* -1 = invalid, 0 = int, 1 = floating */ 1418d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const xmlChar desig[] = {'Y', 'M', 'D', 'H', 'M', 'S'}; 1419d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const double multi[] = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0}; 1420070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1421070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (duration == NULL) 1422070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1423070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1424070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 1425070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = 1; 1426070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1427070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1428070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1429070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* duration must start with 'P' (after sign) */ 1430070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur++ != 'P') 1431070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1432070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 143380b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (*cur == 0) 143480b19092f24410a6b869abf519227686e8f207caDaniel Veillard return 1; 143580b19092f24410a6b869abf519227686e8f207caDaniel Veillard 1436070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); 1437070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dur == NULL) 1438070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1439070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1440070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while (*cur != 0) { 1441070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1442070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* input string should be empty or invalid date/time item */ 1443070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (seq >= sizeof(desig)) 1444070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1445070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1446070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* T designator must be present for time items */ 1447070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == 'T') { 1448070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (seq <= 3) { 1449070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard seq = 3; 1450070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1451070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else 1452070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1453070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else if (seq == 3) 1454070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1455070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1456070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* parse the number portion of the item */ 1457070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_NUM(num, cur, num_type); 1458070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1459070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((num_type == -1) || (*cur == 0)) 1460070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1461070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1462070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* update duration based on item type */ 1463070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while (seq < sizeof(desig)) { 1464070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == desig[seq]) { 1465070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1466070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* verify numeric type; only seconds can be float */ 1467070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((num_type != 0) && (seq < (sizeof(desig)-1))) 1468070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1469070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1470070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard switch (seq) { 1471070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 0: 1472070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon = (long)num * 12; 1473070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1474070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 1: 1475070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon += (long)num; 1476070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1477070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard default: 1478070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* convert to seconds using multiplier */ 1479070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.sec += num * multi[seq]; 1480070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard seq++; 1481070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1482070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1483070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1484070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; /* exit loop */ 1485070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1486070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* no date designators found? */ 1487070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (++seq == 3) 1488070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1489070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1490070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1491070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1492070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1493070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) { 1494070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon = -dur->value.dur.mon; 1495070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.day = -dur->value.dur.day; 1496070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.sec = -dur->value.dur.sec; 1497070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1498070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1499070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (val != NULL) 1500070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *val = dur; 150180b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 150280b19092f24410a6b869abf519227686e8f207caDaniel Veillard xmlSchemaFreeValue(dur); 1503070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1504070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1505070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1506070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror: 1507070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dur != NULL) 1508070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaFreeValue(dur); 1509070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1510070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1511070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1512a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard/** 1513a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * xmlSchemaStrip: 1514a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * @value: a value 1515a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * 1516a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Removes the leading and ending spaces of a string 1517a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * 1518a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the new string or NULL if no change was required. 1519a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard */ 1520a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlChar * 1521a1a9d0410000cc69874e53e438b250037d3e14cdDaniel VeillardxmlSchemaStrip(const xmlChar *value) { 1522a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard const xmlChar *start = value, *end, *f; 1523a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard 1524a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if (value == NULL) return(NULL); 152576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*start != 0) && (IS_BLANK_CH(*start))) start++; 1526a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end = start; 1527a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard while (*end != 0) end++; 1528a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard f = end; 1529a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end--; 153076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((end > start) && (IS_BLANK_CH(*end))) end--; 1531a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end++; 1532a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if ((start == value) && (f == end)) return(NULL); 1533a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(xmlStrndup(start, end - start)); 1534a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard} 153596a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard 153696a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard/** 1537b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCollapseString: 1538b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: a value 1539b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 1540b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Removes and normalize white spaces in the string 1541b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 1542b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns the new string or NULL if no change was required. 1543b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 154401fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlChar * 1545b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCollapseString(const xmlChar *value) { 1546b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard const xmlChar *start = value, *end, *f; 1547b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlChar *g; 1548b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard int col = 0; 1549b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1550b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (value == NULL) return(NULL); 155176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*start != 0) && (IS_BLANK_CH(*start))) start++; 1552b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end = start; 1553b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while (*end != 0) { 155476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if ((*end == ' ') && (IS_BLANK_CH(end[1]))) { 1555b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard col = end - start; 1556b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard break; 1557b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) { 1558b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard col = end - start; 1559b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard break; 1560b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1561b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 1562b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1563b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (col == 0) { 1564b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard f = end; 1565b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end--; 156676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((end > start) && (IS_BLANK_CH(*end))) end--; 1567b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 1568b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((start == value) && (f == end)) return(NULL); 1569b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(xmlStrndup(start, end - start)); 1570b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1571b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard start = xmlStrdup(start); 1572b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (start == NULL) return(NULL); 1573b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard g = (xmlChar *) (start + col); 1574b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end = g; 1575b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while (*end != 0) { 157676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (IS_BLANK_CH(*end)) { 1577b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 157876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*end)) end++; 1579b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*end != 0) 1580b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g++ = ' '; 1581b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else 1582b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g++ = *end++; 1583b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1584b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g = 0; 1585b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return((xmlChar *) start); 1586b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 1587b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1588b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 158928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * xmlSchemaValAtomicListNode: 159028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @type: the predefined atomic type for a token in the list 159128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @value: the list value to check 159228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @ret: the return computed value 159328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @node: the node containing the value 159428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * 159528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Check that a value conforms to the lexical space of the predefined 159628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * list type. if true a value is computed and returned in @ret. 159728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * 1598a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the number of items if this validates, a negative error code 1599a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * number otherwise 160028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */ 160128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillardstatic int 160228c52ab518d34a36fd8da6870a5850088f129a6aDaniel VeillardxmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value, 160328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlSchemaValPtr *ret, xmlNodePtr node) { 160428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlChar *val, *cur, *endval; 160528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard int nb_values = 0; 1606580ced8ee28ecd99374da9383897678e4ba6c358Daniel Veillard int tmp = 0; 160728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard 160828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (value == NULL) { 160928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard return(-1); 161028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 161128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard val = xmlStrdup(value); 161228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (val == NULL) { 161328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard return(-1); 161428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 161528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur = val; 161628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard /* 161728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Split the list 161828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */ 161976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*cur)) *cur++ = 0; 162028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (*cur != 0) { 162176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (IS_BLANK_CH(*cur)) { 162228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *cur = 0; 162328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur++; 162476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*cur)) *cur++ = 0; 162528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } else { 162628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard nb_values++; 162728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur++; 162876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++; 162928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 163028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 163128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (nb_values == 0) { 163228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (ret != NULL) { 163328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard TODO 163428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 163528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlFree(val); 1636a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(nb_values); 163728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 163828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard endval = cur; 163928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur = val; 164028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while ((*cur == 0) && (cur != endval)) cur++; 164128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (cur != endval) { 164228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node); 164328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (tmp != 0) 164428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard break; 164528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (*cur != 0) cur++; 164628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while ((*cur == 0) && (cur != endval)) cur++; 164728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 164828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlFree(val); 164928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (ret != NULL) { 165028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard TODO 165128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 1652a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if (tmp == 0) 1653a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(nb_values); 1654a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(-1); 165528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard} 165628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard 165728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard/** 1658e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * xmlSchemaParseUInt: 1659e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @str: pointer to the string R/W 1660e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @llo: pointer to the low result 1661e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lmi: pointer to the mid result 1662e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lhi: pointer to the high result 1663e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * 1664e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Parse an unsigned long into 3 fields. 1665e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * 1666e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Returns the number of chars parsed or -1 if overflow of the capacity 1667e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard */ 1668e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic int 1669e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel VeillardxmlSchemaParseUInt(const xmlChar **str, unsigned long *llo, 1670e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long *lmi, unsigned long *lhi) { 1671e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long lo = 0, mi = 0, hi = 0; 1672e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard const xmlChar *tmp, *cur = *str; 1673e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard int ret = 0, i = 0; 1674e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 1675e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (*cur == '0') { 1676e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ret++; 1677e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard cur++; 1678e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1679e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard tmp = cur; 1680e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) { 1681e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard i++;tmp++;ret++; 1682e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1683e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (i > 24) { 1684e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *str = tmp; 1685e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(-1); 1686e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1687e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 16) { 1688e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard hi = hi * 10 + (*cur++ - '0'); 1689e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard i--; 1690e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1691e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 8) { 1692e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard mi = mi * 10 + (*cur++ - '0'); 1693e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard i--; 1694e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1695e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 0) { 1696e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard lo = lo * 10 + (*cur++ - '0'); 1697e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard i--; 1698e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 1699e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 1700e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *str = cur; 1701e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *llo = lo; 1702e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *lmi = mi; 1703e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *lhi = hi; 1704e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(ret); 1705e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard} 1706e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 1707e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard/** 1708b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValAtomicType: 17094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type: the predefined type 17104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to check 17114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val: the return computed value 1712c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @node: the node containing the value 1713b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * flags: flags to control the vlidation 17144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 1715b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the atomic type. 17164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * if true a value is computed and returned in @val. 171701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * This checks the value space for list types as well (IDREFS, NMTOKENS). 17184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 17194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 17204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * and -1 in case of internal or API error. 17214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 1722b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int 17231ac24d36b12487995b659a8fc23a02b9460edb36Daniel VeillardxmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, 17241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaValPtr * val, xmlNodePtr node, int flags) 17251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard{ 17264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValPtr v; 1727b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlChar *norm = NULL; 1728d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard int ret = 0; 17294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 17304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 173101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitTypes(); 17324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (type == NULL) 17331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (-1); 17345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 17354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (val != NULL) 17361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = NULL; 1737b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((flags == 0) && (value != NULL)) { 173801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((type->builtInType != XML_SCHEMAS_STRING) && 173901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (type->builtInType != XML_SCHEMAS_NORMSTRING)) { 17401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard norm = xmlSchemaCollapseString(value); 17411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 17421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value = norm; 17431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 1744b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1745b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 174601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type->builtInType) { 1747b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_UNKNOWN: 1748c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((type == xmlSchemaTypeAnySimpleTypeDef) || 1749c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (type == xmlSchemaTypeAnyTypeDef)) 17501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 17511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 1752b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_STRING: 17531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 17541516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard case XML_SCHEMAS_NORMSTRING:{ 17551516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard const xmlChar *cur = value; 17561516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard 17571516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard while (*cur != 0) { 17581516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 17591516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard goto return1; 17601516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } else { 17611516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard cur++; 17621516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 17631516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 17641516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard if (val != NULL) { 17651516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NORMSTRING); 17661516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard if (v != NULL) { 17671516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard v->value.str = xmlStrdup(value); 17681516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard *val = v; 17691516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } else { 17701516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard goto error; 17711516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 17721516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 17731516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard goto return0; 17741516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 17751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_DECIMAL:{ 17761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value, *tmp; 17771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned int frac = 0, len, neg = 0; 17781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long base = 0; 17791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 17801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 17811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 17821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '+') 17831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 17841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (*cur == '-') { 17851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard neg = 1; 17861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 17871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 17881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard tmp = cur; 17891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 17901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base = base * 10 + (*cur - '0'); 17911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 17921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 17931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard len = cur - tmp; 17941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '.') { 17951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 17961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard tmp = cur; 17971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 17981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base = base * 10 + (*cur - '0'); 17991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 18001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 18011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard frac = cur - tmp; 18021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 18031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 18041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 18051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 18061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL); 18071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 18081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = base; 18091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = neg; 18101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = frac; 18111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.total = frac + len; 18121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 18131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 18141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 18151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 18161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 1817b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_TIME: 1818b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GDAY: 1819b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GMONTH: 1820b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GMONTHDAY: 1821b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GYEAR: 1822b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GYEARMONTH: 1823b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DATE: 1824b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DATETIME: 182501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard ret = xmlSchemaValidateDates(type->builtInType, value, val); 18261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 1827b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DURATION: 18281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValidateDuration(type, value, val); 18291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 1830b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_FLOAT: 18311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_DOUBLE:{ 18321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 18331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int neg = 0; 18341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 18351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 18361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 18371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) { 18381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur += 3; 18391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 18401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 18411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 18421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 18431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 18441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 18451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathNAN; 18461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 18471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 18481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 18491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 18501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 18511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 18521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 18531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathNAN; 18541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 18551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 18561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 18571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 18581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 18591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 18601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 18611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 18621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 18631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 18641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard neg = 1; 18651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 18661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 18671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) { 18681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur += 3; 18691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 18701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 18711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 18721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 18731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 18741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 18751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (neg) 18761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathNINF; 18771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 18781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathPINF; 18791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 18801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 18811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 18821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 18831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 18841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 18851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 18861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (neg) 18871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathNINF; 18881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 18891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathPINF; 18901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 18911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 18921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 18931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 18941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 18951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 18961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 18971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 18981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 18991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((neg == 0) && (*cur == '+')) 19001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 19011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-')) 19021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 19031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 19041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 19051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '.') { 19071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 19081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) 19091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 19101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((*cur == 'e') || (*cur == 'E')) { 19121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 19131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((*cur == '-') || (*cur == '+')) 19141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 19151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) 19161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 19171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 19191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 19201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 19211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 19221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 19231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 1924d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard if (sscanf((const char *) value, "%f", 19251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard &(v->value.f)) == 1) { 192601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard *val = v; 19271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 19281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 19291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 19301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 19321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 19331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 19351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 19361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 1937d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard if (sscanf((const char *) value, "%lf", 19381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard &(v->value.d)) == 1) { 19391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 19401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 19411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 19421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 19431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 19451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 19461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 19501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BOOLEAN:{ 19521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 19531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 19541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == '0') && (cur[1] == 0)) 19551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 19561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if ((cur[0] == '1') && (cur[1] == 0)) 19571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 19581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if ((cur[0] == 't') && (cur[1] == 'r') 19591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard && (cur[2] == 'u') && (cur[3] == 'e') 19601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard && (cur[4] == 0)) 19611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 19621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if ((cur[0] == 'f') && (cur[1] == 'a') 19631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard && (cur[2] == 'l') && (cur[3] == 's') 19641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard && (cur[4] == 'e') && (cur[5] == 0)) 19651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 19661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 19671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 19681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 19691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN); 19701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 19711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.b = ret; 19721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 19731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 19741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 19751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 19781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_TOKEN:{ 19801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 19811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 198276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (IS_BLANK_CH(*cur)) 19831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 19841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 19851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while (*cur != 0) { 19861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 19871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 19881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (*cur == ' ') { 19891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 19901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == 0) 19911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 19921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == ' ') 19931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 19941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 19951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 19961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 19981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 19991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN); 20001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 20011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 20021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 20031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 20041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 20051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 20081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2009b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_LANGUAGE: 20101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (xmlCheckLanguageID(value) == 1) { 20111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 20121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE); 20131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 20141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 20151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 20161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 20171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 20181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 20211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2023b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NMTOKEN: 20241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (xmlValidateNMToken(value, 1) == 0) { 20251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 20261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN); 20271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 20281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 20291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 20301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 20311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 20321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 20351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2037b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NMTOKENS: 20381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef, 20391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 20401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret > 0) 20411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 20421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 20431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 20441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2045b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NAME: 20461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateName(value, 1); 20471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 20481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard TODO; 20491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 20511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_QNAME:{ 20521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *uri = NULL; 20531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *local = NULL; 20541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 20551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateQName(value, 1); 20561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL)) { 20571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *prefix; 20581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 20591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard local = xmlSplitQName2(value, &prefix); 20601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) { 20611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlNsPtr ns; 20621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 20631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ns = xmlSearchNs(node->doc, node, prefix); 20641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ns == NULL) 20651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 20661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (val != NULL) 20671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard uri = xmlStrdup(ns->href); 20681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((local != NULL) && ((val == NULL) || (ret != 0))) 20701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(local); 20711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) 20721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(prefix); 20731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 20751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_QNAME); 20761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 20771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (local != NULL) 20781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.name = local; 20791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 20801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.name = xmlStrdup(value); 20811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (uri != NULL) 20821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.uri = uri; 20831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 20841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 20851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 20861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (local != NULL) 20871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(local); 20881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (uri != NULL) 20891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(uri); 20901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 20911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 20931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 20941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2095b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NCNAME: 20961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 20971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 20981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME); 20991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 21001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 21011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 21021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 21031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 21041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2107b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_ID: 21081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 21091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 21101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_ID); 21111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 21121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 21131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 21141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 21151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 21161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 21191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 21201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 21211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 21221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 21231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * NOTE: the IDness might have already be declared in the DTD 21241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */ 21251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (attr->atype != XML_ATTRIBUTE_ID) { 21261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlIDPtr res; 21271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 21281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 21291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 21301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 21311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard res = xmlAddID(NULL, node->doc, strip, attr); 21321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 21331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 21341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard res = xmlAddID(NULL, node->doc, value, attr); 21351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (res == NULL) { 21361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 2; 21371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 21381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ID; 21391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2143b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_IDREF: 21441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 21451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 21461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard TODO; 21471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 21491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 21501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 21511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 21521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 21531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 21541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 21551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAddRef(NULL, node->doc, strip, attr); 21561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 21571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 21581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAddRef(NULL, node->doc, value, attr); 21591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_IDREF; 21601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2162b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_IDREFS: 21631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef, 21641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 21651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret < 0) 21661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 2; 21671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 21681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 21691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 21701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 21711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 2172249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard 21731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_IDREFS; 21741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 21761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_ENTITY:{ 21771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 21781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 21791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 21801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 21811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 3; 21821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 0) { 21831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlEntityPtr ent; 21841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 21851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 21861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 21871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ent = xmlGetDocEntity(node->doc, strip); 21881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 21891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 21901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ent = xmlGetDocEntity(node->doc, value); 21911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ent == NULL) || 21931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (ent->etype != 21941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard XML_EXTERNAL_GENERAL_UNPARSED_ENTITY)) 21951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 4; 21961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 21971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 21981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard TODO; 21991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 22011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 22021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 2203a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard 22041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ENTITY; 22051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 22071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2208b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_ENTITIES: 22091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 22101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return3; 22111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef, 22121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 22131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret <= 0) 22141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 22151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 22161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 22171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 22181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 22191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 22201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 22211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ENTITIES; 22221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 22241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_NOTATION:{ 22251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *uri = NULL; 22261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *local = NULL; 22271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 22281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateQName(value, 1); 22291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL)) { 22301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *prefix; 22311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 22321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard local = xmlSplitQName2(value, &prefix); 22331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) { 22341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlNsPtr ns; 22351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 22361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ns = xmlSearchNs(node->doc, node, prefix); 22371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ns == NULL) 22381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 22391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (val != NULL) 22401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard uri = xmlStrdup(ns->href); 22411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((local != NULL) && ((val == NULL) || (ret != 0))) 22431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(local); 22441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) 22451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(prefix); 22461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 22481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 3; 22491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 0) { 22501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNotationUse(NULL, node->doc, value); 22511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 1) 22521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 22531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 22541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 22551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 22571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION); 22581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 22591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (local != NULL) 22601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.name = local; 22611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 22621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.name = xmlStrdup(value); 22631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (uri != NULL) 22641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.uri = uri; 22651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 22661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 22671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 22681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (local != NULL) 22691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(local); 22701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (uri != NULL) 22711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(uri); 22721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 22731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2276560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 22771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_ANYURI:{ 227811c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (*value != 0) { 227911c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard xmlURIPtr uri = xmlParseURI((const char *) value); 228011c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (uri == NULL) 228111c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard goto return1; 228211c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard xmlFreeURI(uri); 228311c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard } 2284560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 22851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 228611c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_ANYURI); 228711c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (v == NULL) 228811c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard goto error; 228911c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard v->value.str = xmlStrdup(value); 229011c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard *val = v; 22911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 22931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 22941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_HEXBINARY:{ 22951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 22961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *base; 22971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int total, i = 0; 2298560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 22991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 23001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2301560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 23021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while (((*cur >= '0') && (*cur <= '9')) || 23031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((*cur >= 'A') && (*cur <= 'F')) || 23041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((*cur >= 'a') && (*cur <= 'f'))) { 23051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard i++; 23061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 23071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2308560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 23091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 23101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 23111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((i % 2) != 0) 231270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard goto return1; 2313560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 23141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 23151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY); 23171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v == NULL) 23181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 23191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur = xmlStrdup(value); 23211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) { 2322d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard xmlSchemaTypeErrMemory(node, "allocating hexbin data"); 23231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(v); 23241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 23251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total = i / 2; /* number of octets */ 232870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 23291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base = (xmlChar *) cur; 23301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while (i-- > 0) { 23311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*base >= 'a') 23321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = *base - ('a' - 'A'); 23331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base++; 23341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 233570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 23361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.hex.str = (xmlChar *) cur; 23371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.hex.total = total; 23381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 23391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 23411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BASE64BINARY:{ 23431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* ISSUE: 23441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 23451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Ignore all stray characters? (yes, currently) 23461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Worry about long lines? (no, currently) 23471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 23481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * rfc2045.txt: 23491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 23501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * "The encoded output stream must be represented in lines of 23511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * no more than 76 characters each. All line breaks or other 23521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * characters not found in Table 1 must be ignored by decoding 23531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * software. In base64 data, characters other than those in 23541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Table 1, line breaks, and other white space probably 23551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * indicate a transmission error, about which a warning 23561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * message or even a message rejection might be appropriate 23571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * under some circumstances." */ 23581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 23591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *base; 23601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int total, i = 0, pad = 0; 23611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 23631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 23641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (; *cur; ++cur) { 23661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 23671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur); 23691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc < 0) ; 23701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (decc < 64) 23711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard i++; 23721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 23731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 23741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (; *cur; ++cur) { 23761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 23771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur); 23791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc < 0) ; 23801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (decc < 64) 23811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 23821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc == 64) 23831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard pad++; 23841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* rfc2045.txt: "Special processing is performed if fewer than 23871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 24 bits are available at the end of the data being encoded. 23881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * A full encoding quantum is always completed at the end of a 23891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * body. When fewer than 24 input bits are available in an 23901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * input group, zero bits are added (on the right) to form an 23911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * integral number of 6-bit groups. Padding at the end of the 23921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * data is performed using the "=" character. Since all 23931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * base64 input is an integral number of octets, only the 23941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * following cases can arise: (1) the final quantum of 23951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * encoding input is an integral multiple of 24 bits; here, 23961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * the final unit of encoded output will be an integral 23971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * multiple ofindent: Standard input:701: Warning:old style 23981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * assignment ambiguity in "=*". Assuming "= *" 4 characters 23991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * with no "=" padding, (2) the final 24001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * quantum of encoding input is exactly 8 bits; here, the 24011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * final unit of encoded output will be two characters 24021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * followed by two "=" padding characters, or (3) the final 24031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * quantum of encoding input is exactly 16 bits; here, the 24041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * final unit of encoded output will be three characters 24051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * followed by one "=" padding character." */ 24061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 24071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total = 3 * (i / 4); 24081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (pad == 0) { 24091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 0) 24101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (pad == 1) { 24121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 24131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 24141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 3) 24151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (decc = _xmlSchemaBase64Decode(*cur); 24171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (decc < 0) || (decc > 63); 24181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur)) 24191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard --cur; 24201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 16bits in 24bits means 2 pad bits: nnnnnn nnmmmm mmmm00*/ 24211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 00111100 -> 0x3c */ 24221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc & ~0x3c) 24231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total += 2; 24251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (pad == 2) { 24261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 24271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 24281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 2) 24291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (decc = _xmlSchemaBase64Decode(*cur); 24311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (decc < 0) || (decc > 63); 24321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur)) 24331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard --cur; 24341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 8bits in 12bits means 4 pad bits: nnnnnn nn0000 */ 24351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 00110000 -> 0x30 */ 24361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc & ~0x30) 24371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total += 1; 24391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 24401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 24421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 24431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_BASE64BINARY); 24441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v == NULL) 24451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base = 24471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (xmlChar *) xmlMallocAtomic((i + pad + 1) * 24481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sizeof(xmlChar)); 24491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (base == NULL) { 2450d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard xmlSchemaTypeErrMemory(node, "allocating base64 data"); 24511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(v); 24521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.base64.str = base; 24551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (cur = value; *cur; ++cur) 24561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (_xmlSchemaBase64Decode(*cur) >= 0) { 24571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = *cur; 24581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ++base; 24591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = 0; 24611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.base64.total = total; 24621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 24631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 246570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 2466e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_INTEGER: 2467e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_PINTEGER: 2468e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_NPINTEGER: 2469e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_NINTEGER: 24701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_NNINTEGER:{ 24711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 24721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 24731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int sign = 0; 24741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 24751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 24761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 24781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sign = 1; 24791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (*cur == '+') 24811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 24831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 0) 24841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 24861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 248701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_NPINTEGER) { 24881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && 24891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((hi != 0) || (mi != 0) || (lo != 0))) 24901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 249101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_PINTEGER) { 24921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (sign == 1) 24931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((hi == 0) && (mi == 0) && (lo == 0)) 24951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 249601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_NINTEGER) { 24971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (sign == 0) 24981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((hi == 0) && (mi == 0) && (lo == 0)) 25001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 250101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_NNINTEGER) { 25021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && 25031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((hi != 0) || (mi != 0) || (lo != 0))) 25041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 25071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * We can store a value only if no overflow occured 25081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */ 25091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret > 0) && (val != NULL)) { 251001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 25111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 25121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 25131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.mi = lo; 25141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.hi = lo; 25151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = sign; 25161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 25171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.total = cur - value; 25181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 25191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 25221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2523e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_LONG: 2524e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_BYTE: 2525e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_SHORT: 25261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_INT:{ 25271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 25281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 25291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int total = 0; 25301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int sign = 0; 25311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 25321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 25331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 25351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sign = 1; 25361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 25371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (*cur == '+') 25381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 25391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 25401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret <= 0) 25411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 25431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 254401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_LONG) { 25451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi >= 922) { 25461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi > 922) 25471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 33720368) { 25491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 33720368) 25501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 54775807)) 25521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 54775808)) 25541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 255701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_INT) { 25581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi != 0) 25591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 21) { 25611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 21) 25621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 47483647)) 25641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 47483648)) 25661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 256801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_SHORT) { 25691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 25701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 32768)) 25721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 32767)) 25741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 257501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_BYTE) { 25761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 25771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 128)) 25791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 127)) 25811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 258401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 25851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 25861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 25871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.mi = lo; 25881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.hi = lo; 25891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = sign; 25901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 25911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.total = total; 25921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 25931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 25961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2597e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_UINT: 2598e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_ULONG: 2599e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_USHORT: 26001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_UBYTE:{ 26011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 26021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 26031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int total = 0; 26041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 26051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 26061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 26081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret <= 0) 26091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 26111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 261201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_ULONG) { 26131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi >= 1844) { 26141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi > 1844) 26151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 67440737) { 26171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 67440737) 26181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 9551615) 26201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 262301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_UINT) { 26241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi != 0) 26251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 42) { 26271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 42) 26281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 94967295) 26301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 263201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_USHORT) { 26331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 26341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 65535) 26361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 263701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_UBYTE) { 26381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 26391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 255) 26411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 26421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 264401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 26451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 26461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 26471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.mi = mi; 26481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.hi = hi; 26491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = 0; 26501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 26511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.total = total; 26521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 26531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 26561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 2658b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 26591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard done: 26601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 26611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 26621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (ret); 26631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return3: 26641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 26651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 26661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (3); 26671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return1: 26681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 26691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 26701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (1); 26711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return0: 26721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 26731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 26741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (0); 26751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard error: 26761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 26771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 26781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (-1); 2679b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 2680b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 2681b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 2682b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValPredefTypeNode: 2683b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @type: the predefined type 2684b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: the value to check 2685b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @val: the return computed value 2686b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @node: the node containing the value 2687b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 2688b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the predefined type. 2689b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * if true a value is computed and returned in @val. 2690b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 2691b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns 0 if this validates, a positive error code number otherwise 2692b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * and -1 in case of internal or API error. 2693b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 2694b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardint 2695b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value, 2696b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlSchemaValPtr *val, xmlNodePtr node) { 2697b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(xmlSchemaValAtomicType(type, value, val, node, 0)); 26984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 26994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 27004255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 2701c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaValPredefTypeNodeNoNorm: 2702c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the predefined type 2703c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the value to check 2704c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val: the return computed value 2705c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @node: the node containing the value 2706c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 2707c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Check that a value conforms to the lexical space of the predefined type. 2708c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * if true a value is computed and returned in @val. 2709c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * This one does apply any normalization to the value. 2710c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 2711c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 2712c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * and -1 in case of internal or API error. 2713c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 2714c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardint 2715c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, const xmlChar *value, 2716c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard xmlSchemaValPtr *val, xmlNodePtr node) { 2717c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(xmlSchemaValAtomicType(type, value, val, node, 1)); 2718c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 2719c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 2720c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/** 2721c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * xmlSchemaValidatePredefinedType: 2722c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @type: the predefined type 2723c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @value: the value to check 2724c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @val: the return computed value 2725c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * 2726c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Check that a value conforms to the lexical space of the predefined type. 2727c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * if true a value is computed and returned in @val. 2728c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * 2729c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 2730c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * and -1 in case of internal or API error. 2731c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard */ 2732c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillardint 2733c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel VeillardxmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value, 2734c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard xmlSchemaValPtr *val) { 2735c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard return(xmlSchemaValPredefTypeNode(type, value, val, NULL)); 2736c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard} 2737c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard 2738c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard/** 27394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareDecimals: 27404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x: a first decimal value 27414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y: a second decimal value 27424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 27434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 decimals 27444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 27454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error 27464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 27474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int 27484255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y) 27494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{ 27504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValPtr swp; 2751e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard int order = 1, p; 27524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard unsigned long tmp; 27534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 2754e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((x->value.decimal.sign) && 2755e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((x->value.decimal.lo != 0) || 2756e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (x->value.decimal.mi != 0) || 2757e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (x->value.decimal.hi != 0))) { 2758e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((y->value.decimal.sign) && 2759e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((y->value.decimal.lo != 0) || 2760e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.mi != 0) || 2761e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.hi != 0))) 276280b19092f24410a6b869abf519227686e8f207caDaniel Veillard order = -1; 276380b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 276480b19092f24410a6b869abf519227686e8f207caDaniel Veillard return (-1); 2765e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } else if ((y->value.decimal.sign) && 2766e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((y->value.decimal.lo != 0) || 2767e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.mi != 0) || 2768e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.hi != 0))) { 27694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (1); 277080b19092f24410a6b869abf519227686e8f207caDaniel Veillard } 27714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (x->value.decimal.frac == y->value.decimal.frac) { 2772e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.hi < y->value.decimal.hi) 2773e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (-order); 277401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (x->value.decimal.hi > y->value.decimal.hi) 2775e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (order); 2776e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.mi < y->value.decimal.mi) 2777e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (-order); 277801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (x->value.decimal.mi > y->value.decimal.mi) 2779e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (order); 2780e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.lo < y->value.decimal.lo) 278180b19092f24410a6b869abf519227686e8f207caDaniel Veillard return (-order); 2782e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.lo > y->value.decimal.lo) 278380b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(order); 278480b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(0); 27854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 27864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (y->value.decimal.frac > x->value.decimal.frac) { 27874255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard swp = y; 27884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard y = x; 27894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard x = swp; 27904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard order = -order; 27914255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 2792e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard p = powten[x->value.decimal.frac - y->value.decimal.frac]; 2793e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard tmp = x->value.decimal.lo / p; 2794e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (tmp > y->value.decimal.lo) 27954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (order); 2796e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (tmp < y->value.decimal.lo) 27974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (-order); 2798e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard tmp = y->value.decimal.lo * p; 2799e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.lo < tmp) 28004255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (-order); 2801e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (x->value.decimal.lo == tmp) 28024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (0); 28034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (order); 28044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 28054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 28064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 2807070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xmlSchemaCompareDurations: 2808070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @x: a first duration value 2809070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @y: a second duration value 2810070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2811070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Compare 2 durations 2812070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2813070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 2814070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * case of error 2815070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 2816070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 2817070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel VeillardxmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y) 2818070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard{ 2819070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard long carry, mon, day; 2820070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double sec; 282180b19092f24410a6b869abf519227686e8f207caDaniel Veillard int invert = 1; 282280b19092f24410a6b869abf519227686e8f207caDaniel Veillard long xmon, xday, myear, minday, maxday; 2823070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard static const long dayRange [2][12] = { 2824070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, }, 2825070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} }; 2826070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2827070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((x == NULL) || (y == NULL)) 28285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 2829070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2830070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* months */ 2831070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mon = x->value.dur.mon - y->value.dur.mon; 2832070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2833070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* seconds */ 2834070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard sec = x->value.dur.sec - y->value.dur.sec; 2835070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard carry = (long)sec / SECS_PER_DAY; 2836070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard sec -= (double)(carry * SECS_PER_DAY); 2837070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2838070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* days */ 2839070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard day = x->value.dur.day - y->value.dur.day + carry; 2840070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2841070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* easy test */ 2842070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (mon == 0) { 2843070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (day == 0) 2844070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (sec == 0.0) 2845070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 2846070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else if (sec < 0.0) 2847070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 2848070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else 2849070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 2850070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else if (day < 0) 2851070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 2852070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else 2853070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 2854070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 2855070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2856070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (mon > 0) { 2857070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((day >= 0) && (sec >= 0.0)) 2858070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 2859070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else { 2860070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = mon; 2861070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xday = -day; 2862070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 2863070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else if ((day <= 0) && (sec <= 0.0)) { 2864070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 2865070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else { 286680b19092f24410a6b869abf519227686e8f207caDaniel Veillard invert = -1; 2867070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = -mon; 2868070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xday = day; 2869070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 2870070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2871070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard myear = xmon / 12; 287280b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (myear == 0) { 287380b19092f24410a6b869abf519227686e8f207caDaniel Veillard minday = 0; 287480b19092f24410a6b869abf519227686e8f207caDaniel Veillard maxday = 0; 287580b19092f24410a6b869abf519227686e8f207caDaniel Veillard } else { 287680b19092f24410a6b869abf519227686e8f207caDaniel Veillard maxday = 366 * ((myear + 3) / 4) + 287780b19092f24410a6b869abf519227686e8f207caDaniel Veillard 365 * ((myear - 1) % 4); 287880b19092f24410a6b869abf519227686e8f207caDaniel Veillard minday = maxday - 1; 287980b19092f24410a6b869abf519227686e8f207caDaniel Veillard } 288080b19092f24410a6b869abf519227686e8f207caDaniel Veillard 2881070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = xmon % 12; 2882070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard minday += dayRange[0][xmon]; 2883070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard maxday += dayRange[1][xmon]; 2884070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 288580b19092f24410a6b869abf519227686e8f207caDaniel Veillard if ((maxday == minday) && (maxday == xday)) 288680b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(0); /* can this really happen ? */ 2887070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (maxday < xday) 288880b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(-invert); 288980b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (minday > xday) 289080b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(invert); 2891070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 2892070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* indeterminate */ 28935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; 28945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 28955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 28965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/* 28975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * macros for adding date/times and durations 28985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 28995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT(a,b) (floor(((double)a/(double)b))) 29005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO(a,b) (a - FQUOTIENT(a,b) * b) 29015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT_RANGE(a,low,high) (FQUOTIENT((a-low),(high-low))) 29025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO_RANGE(a,low,high) ((MODULO((a-low),(high-low)))+low) 29035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 29045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 2905669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * xmlSchemaDupVal: 2906669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @v: the #xmlSchemaValPtr value to duplicate 2907669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * 2908669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Makes a copy of @v. The calling program is responsible for freeing 2909669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the returned value. 2910669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * 2911669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * returns a pointer to a duplicated #xmlSchemaValPtr or NULL if error. 2912669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard */ 2913669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillardstatic xmlSchemaValPtr 2914669adfcd3af5dfda873b10119d44202a7450bb20Daniel VeillardxmlSchemaDupVal (xmlSchemaValPtr v) 2915669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard{ 2916669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaValPtr ret = xmlSchemaNewValue(v->type); 2917669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard if (ret == NULL) 2918669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return NULL; 2919669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard 2920669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard memcpy(ret, v, sizeof(xmlSchemaVal)); 2921669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return ret; 2922669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard} 2923669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard 2924669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard/** 29255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateAdd: 29265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 29275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dur: an #xmlSchemaValPtr of type #XS_DURATION 29285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 29295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compute a new date/time from @dt and @dur. This function assumes @dt 29305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH, 2931669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * or #XML_SCHEMAS_GYEAR. The returned #xmlSchemaVal is the same type as 2932669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt. The calling program is responsible for freeing the returned value. 29335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 2934669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a pointer to a new #xmlSchemaVal or NULL if error. 29355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 29365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr 29375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur) 29385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 2939669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaValPtr ret, tmp; 29405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long carry, tempdays, temp; 29415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValDatePtr r, d; 29425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValDurationPtr u; 29435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 29445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((dt == NULL) || (dur == NULL)) 29455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 29465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 29475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = xmlSchemaNewValue(dt->type); 29485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret == NULL) 29495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 29505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 2951669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard /* make a copy so we don't alter the original value */ 2952669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard tmp = xmlSchemaDupVal(dt); 2953669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard if (tmp == NULL) { 2954669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaFreeValue(ret); 2955669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return NULL; 2956669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard } 2957669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard 29585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r = &(ret->value.date); 2959669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard d = &(tmp->value.date); 29605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard u = &(dur->value.dur); 29615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 29625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalization */ 29635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->mon == 0) 29645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->mon = 1; 29655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 29665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize for time zone offset */ 29675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard u->sec -= (d->tzo * 60); 29685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->tzo = 0; 29695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 29705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalization */ 29715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->day == 0) 29725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->day = 1; 29735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 29745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* month */ 29755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = d->mon + u->mon; 2976ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->mon = (unsigned int) MODULO_RANGE(carry, 1, 13); 2977ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT_RANGE(carry, 1, 13); 29785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 29795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* year (may be modified later) */ 29805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year = d->year + carry; 29815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->year == 0) { 29825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->year > 0) 29835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year--; 29845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 29855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year++; 29865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 29875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 29885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* time zone */ 29895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->tzo = d->tzo; 29905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->tz_flag = d->tz_flag; 29915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 29925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* seconds */ 29935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->sec = d->sec + u->sec; 2994ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT((long)r->sec, 60); 29955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->sec != 0.0) { 29965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->sec = MODULO(r->sec, 60.0); 29975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 29985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 29995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* minute */ 30005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry += d->min; 3001ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->min = (unsigned int) MODULO(carry, 60); 3002ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT(carry, 60); 30035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* hours */ 30055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry += d->hour; 3006ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->hour = (unsigned int) MODULO(carry, 24); 3007ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long)FQUOTIENT(carry, 24); 30085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 30105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * days 30115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Note we use tempdays because the temporary values may need more 30125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * than 5 bits 30135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 30145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) && 30155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (d->day > MAX_DAYINMONTH(r->year, r->mon))) 30165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = MAX_DAYINMONTH(r->year, r->mon); 30175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (d->day < 1) 30185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = 1; 30195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 30205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = d->day; 30215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays += u->day + carry; 30235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard while (1) { 30255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (tempdays < 1) { 3026ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard long tmon = (long) MODULO_RANGE(r->mon-1, 1, 13); 3027ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard long tyr = r->year + (long)FQUOTIENT_RANGE(r->mon-1, 1, 13); 30285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (tyr == 0) 30295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tyr--; 30305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays += MAX_DAYINMONTH(tyr, tmon); 30315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = -1; 3032ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard } else if (tempdays > (long) MAX_DAYINMONTH(r->year, r->mon)) { 30335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon); 30345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = 1; 30355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } else 30365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 30375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard temp = r->mon + carry; 3039ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->mon = (unsigned int) MODULO_RANGE(temp, 1, 13); 3040ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->year = r->year + (unsigned int) FQUOTIENT_RANGE(temp, 1, 13); 30415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->year == 0) { 30425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (temp < 1) 30435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year--; 30445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 30455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year++; 30465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 30475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 30485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->day = tempdays; 30505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 30525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * adjust the date/time type to the date values 30535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 30545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret->type != XML_SCHEMAS_DATETIME) { 30555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((r->hour) || (r->min) || (r->sec)) 30565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_DATETIME; 30575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (ret->type != XML_SCHEMAS_DATE) { 30585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((r->mon != 1) && (r->day != 1)) 30595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_DATE; 30605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1)) 30615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_GYEARMONTH; 30625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 30635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 30645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3065669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaFreeValue(tmp); 30665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 30685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 30695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 30715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaDateNormalize: 3072669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt: an #xmlSchemaValPtr of a date/time type value. 3073669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @offset: number of seconds to adjust @dt by. 30745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3075669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Normalize @dt to GMT time. The @offset parameter is subtracted from 3076669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the return value is a time-zone offset is present on @dt. 30775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3078669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a normalized copy of @dt or NULL if error. 30795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 30805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr 30815a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset) 30825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 30835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValPtr dur, ret; 30845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt == NULL) 30865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 30875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (((dt->type != XML_SCHEMAS_TIME) && 30895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (dt->type != XML_SCHEMAS_DATETIME)) || (dt->value.date.tzo == 0)) 30905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return xmlSchemaDupVal(dt); 30915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); 30935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dur == NULL) 30945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 30955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dur->value.date.sec -= offset; 30975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 30985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = _xmlSchemaDateAdd(dt, dur); 30995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret == NULL) 31005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 31015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaFreeValue(dur); 31035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* ret->value.date.tzo = 0; */ 31055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 31065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 31075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 31095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateCastYMToDays: 31105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 31115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 31125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Convert mon and year of @dt to total number of days. Take the 31135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * number of years since (or before) 1 AD and add the number of leap 31145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years. This is a function because negative 31155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years must be handled a little differently and there is no zero year. 31165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 31175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns number of days. 31185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 31195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic long 31205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt) 31215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 31225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long ret; 31235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt->value.date.year < 0) 31255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = (dt->value.date.year * 365) + 31265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+ 31275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((dt->value.date.year+1)/400)) + 31285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard DAY_IN_YEAR(0, dt->value.date.mon, dt->value.date.year); 31295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 31305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = ((dt->value.date.year-1) * 365) + 31315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+ 31325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((dt->value.date.year-1)/400)) + 31335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard DAY_IN_YEAR(0, dt->value.date.mon, dt->value.date.year); 31345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 31365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 31375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 31395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * TIME_TO_NUMBER: 31405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 31415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 31425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Calculates the number of seconds in the time portion of @dt. 31435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 31445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns seconds. 31455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 31465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define TIME_TO_NUMBER(dt) \ 31475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((double)((dt->value.date.hour * SECS_PER_HOUR) + \ 3148b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard (dt->value.date.min * SECS_PER_MIN) + \ 3149b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard (dt->value.date.tzo * SECS_PER_MIN)) + \ 3150b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard dt->value.date.sec) 31515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 31535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaCompareDates: 31545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @x: a first date/time value 31555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @y: a second date/time value 31565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 31575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compare 2 date/times 31585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 31595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 31605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error 31615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 31625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic int 31635a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y) 31645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 31655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard unsigned char xmask, ymask, xor_mask, and_mask; 31665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValPtr p1, p2, q1, q2; 31675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long p1d, p2d, q1d, q2d; 31685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((x == NULL) || (y == NULL)) 31705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 31715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.tz_flag) { 31735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (!y->value.date.tz_flag) { 31755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, 0); 31765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 31775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize y + 14:00 */ 31785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR)); 31795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 3181fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 3182fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3183fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 31845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 3185fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d == q1d) { 31865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 31875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 31885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 3189fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (sec < 0.0) { 3190fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3191fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 31925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 3193fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 31944aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 31955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize y - 14:00 */ 31965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR)); 31975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day; 31985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (p1d > q2d) 31994aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 32005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (p1d == q2d) { 32015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2); 32025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec > 0.0) 32034aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 32045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 32054aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 2; /* indeterminate */ 32065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 32074aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(p1); 32084aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q1); 32094aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q2); 32104aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard if (ret != 0) 32114aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 32125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 3213fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 3214fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3215fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 3216fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } 32175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 32185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } else if (y->value.date.tz_flag) { 32195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, 0); 32205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 32215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize x - 14:00 */ 32235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR)); 32245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 32255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3226fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 3227fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3228fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 32295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 3230fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d == q1d) { 32315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 32325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 3234fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (sec < 0.0) { 3235fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3236fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 32375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 3238fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 32394aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 32405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize x + 14:00 */ 32415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR)); 32425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day; 32435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32446560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard if (p2d > q1d) { 32454aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 32466560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard } else if (p2d == q1d) { 32475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1); 32485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec > 0.0) 32494aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 32505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 32514aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 2; /* indeterminate */ 32525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 32536560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(p1); 32546560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(q1); 32556560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(p2); 32564aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard if (ret != 0) 32574aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 32585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 3259fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 3260fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3261fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 32625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 32635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 32645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 32665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * if the same type then calculate the difference 32675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 32685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->type == y->type) { 32694aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 32705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, 0); 32715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 32725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, 0); 32745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 32755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3276fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 32774aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = -1; 3278fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d > q1d) { 32794aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 3280fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 32815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 32825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 32845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec < 0.0) 32854aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = -1; 32865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (sec > 0.0) 32874aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 32885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 32904aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(p1); 32914aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q1); 32924aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 32935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 32945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 32955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard switch (x->type) { 32965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 32975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0xf; 32985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 32995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 33005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x7; 33015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 33025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 33035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x1; 33045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 33055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 33065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x2; 33075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 33085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 33095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x3; 33105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 33115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 33125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x3; 33135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 33145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 33155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x6; 33165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 33175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 33185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x8; 33195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 33205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard default: 33215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0; 33225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 33235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 33245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard switch (y->type) { 33265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 33275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0xf; 33285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 33295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 33305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x7; 33315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 33325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 33335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x1; 33345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 33355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 33365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x2; 33375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 33385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 33395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x3; 33405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 33415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 33425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x3; 33435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 33445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 33455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x6; 33465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 33475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 33485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x8; 33495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 33505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard default: 33515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0; 33525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 33535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 33545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xor_mask = xmask ^ ymask; /* mark type differences */ 33565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard and_mask = xmask & ymask; /* mark field specification */ 33575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* year */ 33595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 1) 33605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 33615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 1) { 33625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.year < y->value.date.year) 33635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 33645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.year > y->value.date.year) 33655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 33665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 33675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* month */ 33695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 2) 33705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 33715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 2) { 33725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.mon < y->value.date.mon) 33735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 33745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.mon > y->value.date.mon) 33755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 33765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 33775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* day */ 33795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 4) 33805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 33815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 4) { 33825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.day < y->value.date.day) 33835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 33845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.day > y->value.date.day) 33855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 33865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 33875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 33885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* time */ 33895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 8) 33905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 33915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 8) { 33925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.hour < y->value.date.hour) 33935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 33945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.hour > y->value.date.hour) 33955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 33965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.min < y->value.date.min) 33975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 33985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.min > y->value.date.min) 33995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 34005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.sec < y->value.date.sec) 34015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 34025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.sec > y->value.date.sec) 34035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 34045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 34055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3406070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 3407070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 3408070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3409070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 3410c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaCompareNormStrings: 3411c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @x: a first string value 3412c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @y: a second string value 3413c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 3414c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Compare 2 string for their normalized values. 3415c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 3416c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 3417c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * case of error 3418c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */ 3419c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int 3420c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaCompareNormStrings(xmlSchemaValPtr x, xmlSchemaValPtr y) { 3421c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard const xmlChar *utf1; 3422c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard const xmlChar *utf2; 3423c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard int tmp; 3424c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 3425c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((x == NULL) || (y == NULL)) 3426c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-2); 3427c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf1 = x->value.str; 3428c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf2 = y->value.str; 3429c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 343076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf1)) utf1++; 343176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf2)) utf2++; 3432c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard while ((*utf1 != 0) && (*utf2 != 0)) { 343376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (IS_BLANK_CH(*utf1)) { 343476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (!IS_BLANK_CH(*utf2)) { 3435c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard tmp = *utf1 - *utf2; 3436c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(tmp); 3437c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 343876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf1)) utf1++; 343976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf2)) utf2++; 3440c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 3441c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard tmp = *utf1++ - *utf2++; 3442c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (tmp < 0) 3443c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 3444c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (tmp > 0) 3445c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(1); 3446c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 3447c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 3448c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf1 != 0) { 344976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf1)) utf1++; 3450c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf1 != 0) 3451c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(1); 3452c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 3453c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf2 != 0) { 345476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf2)) utf2++; 3455c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf2 != 0) 3456c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 3457c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 3458c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(0); 3459c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard} 3460c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 3461c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/** 3462b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCompareFloats: 3463b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @x: a first float or double value 3464b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @y: a second float or double value 3465b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 3466b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Compare 2 values 3467b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 3468b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 3469b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * case of error 3470b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 3471b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int 3472b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) { 3473b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard double d1, d2; 3474b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 3475b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((x == NULL) || (y == NULL)) 3476b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 3477b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 3478b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 3479b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Cast everything to doubles. 3480b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 3481b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->type == XML_SCHEMAS_DOUBLE) 3482b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d1 = x->value.d; 3483b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else if (x->type == XML_SCHEMAS_FLOAT) 3484b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d1 = x->value.f; 3485b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 3486b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 3487b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 3488b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (y->type == XML_SCHEMAS_DOUBLE) 3489b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d2 = y->value.d; 3490b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else if (y->type == XML_SCHEMAS_FLOAT) 3491b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d2 = y->value.f; 3492b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 3493b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 3494b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 3495b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 3496b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check for special cases. 3497b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 3498b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d1)) { 3499b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d2)) 3500b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 3501b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 3502b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 3503b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d2)) 3504b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 3505b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == xmlXPathPINF) { 3506b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathPINF) 3507b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 3508b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 3509b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 3510b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathPINF) 3511b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 3512b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == xmlXPathNINF) { 3513b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathNINF) 3514b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 3515b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 3516b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 3517b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathNINF) 3518b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 3519b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 3520b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 3521b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * basic tests, the last one we should have equality, but 3522b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * portability is more important than speed and handling 3523b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * NaN or Inf in a portable way is always a challenge, so ... 3524b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 3525b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 < d2) 3526b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 3527b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 > d2) 3528b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 3529b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == d2) 3530b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 3531b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(2); 3532b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 3533b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 3534b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 35354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareValues: 35364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x: a first value 35374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y: a second value 35384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 35394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 values 35404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 35415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 35425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error 35434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 354480b19092f24410a6b869abf519227686e8f207caDaniel Veillardint 35454255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) { 35464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if ((x == NULL) || (y == NULL)) 35474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(-2); 35484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 35494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard switch (x->type) { 355080b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UNKNOWN: 355180b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(-2); 355280b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_INTEGER: 355380b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NPINTEGER: 355480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NINTEGER: 355580b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NNINTEGER: 355680b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_PINTEGER: 355780b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_INT: 355880b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UINT: 355980b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_LONG: 356080b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ULONG: 356180b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_SHORT: 356280b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_USHORT: 356380b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_BYTE: 356480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UBYTE: 35654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMAS_DECIMAL: 356680b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (y->type == x->type) 356780b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(xmlSchemaCompareDecimals(x, y)); 356880b19092f24410a6b869abf519227686e8f207caDaniel Veillard if ((y->type == XML_SCHEMAS_DECIMAL) || 356980b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_INTEGER) || 357080b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_NPINTEGER) || 357180b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_NINTEGER) || 357280b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_NNINTEGER) || 357380b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_PINTEGER) || 357480b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_INT) || 357580b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_UINT) || 357680b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_LONG) || 357780b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_ULONG) || 357880b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_SHORT) || 357980b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_USHORT) || 358080b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_BYTE) || 358180b19092f24410a6b869abf519227686e8f207caDaniel Veillard (y->type == XML_SCHEMAS_UBYTE)) 35824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(xmlSchemaCompareDecimals(x, y)); 35835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return(-2); 3584070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMAS_DURATION: 3585070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (y->type == XML_SCHEMAS_DURATION) 3586070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(xmlSchemaCompareDurations(x, y)); 35875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return(-2); 35885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 35895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 35905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 35915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 35925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 35935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 35945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 35955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 35965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((y->type == XML_SCHEMAS_DATETIME) || 35975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_TIME) || 35985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_GDAY) || 35995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_GMONTH) || 36005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_GMONTHDAY) || 36015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_GYEAR) || 36025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_DATE) || 36035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (y->type == XML_SCHEMAS_GYEARMONTH)) 36045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return (xmlSchemaCompareDates(x, y)); 36055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return (-2); 360680b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NORMSTRING: 360780b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_TOKEN: 360880b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_LANGUAGE: 360980b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NMTOKEN: 361080b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NAME: 361180b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NCNAME: 361280b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ID: 361380b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_IDREF: 361480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ENTITY: 361580b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NOTATION: 361680b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ANYURI: 3617c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((y->type == XML_SCHEMAS_NORMSTRING) || 3618c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_TOKEN) || 3619c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_LANGUAGE) || 3620c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_NMTOKEN) || 3621c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_NAME) || 3622c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_QNAME) || 3623c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_NCNAME) || 3624c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_ID) || 3625c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_IDREF) || 3626c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_ENTITY) || 3627c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_NOTATION) || 3628c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard (y->type == XML_SCHEMAS_ANYURI)) 3629c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return (xmlSchemaCompareNormStrings(x, y)); 3630c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return (-2); 3631e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_QNAME: 3632e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (y->type == XML_SCHEMAS_QNAME) { 3633e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) && 3634e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (xmlStrEqual(x->value.qname.uri, y->value.qname.uri))) 3635e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(0); 3636e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(2); 3637e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 3638e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (-2); 3639c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_FLOAT: 3640c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_DOUBLE: 3641b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((y->type == XML_SCHEMAS_FLOAT) || 3642b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard (y->type == XML_SCHEMAS_DOUBLE)) 3643b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (xmlSchemaCompareFloats(x, y)); 3644b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (-2); 3645c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_BOOLEAN: 3646b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (y->type == XML_SCHEMAS_BOOLEAN) { 3647b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->value.b == y->value.b) 3648b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 3649b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->value.b == 0) 3650b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 3651b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 3652b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 3653b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (-2); 3654560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_HEXBINARY: 365570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard if (y->type == XML_SCHEMAS_HEXBINARY) { 365670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard if (x->value.hex.total == y->value.hex.total) { 365770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard int ret = xmlStrcmp(x->value.hex.str, y->value.hex.str); 365870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard if (ret > 0) 365970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(1); 366070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard else if (ret == 0) 366170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(0); 366270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 366370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard else if (x->value.hex.total > y->value.hex.total) 366470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(1); 366570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 366670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(-1); 366770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 3668560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return (-2); 36691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 36701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (y->type == XML_SCHEMAS_BASE64BINARY) { 36711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (x->value.base64.total == y->value.base64.total) { 36721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int ret = xmlStrcmp(x->value.base64.str, 36731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard y->value.base64.str); 36741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret > 0) 36751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(1); 36761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (ret == 0) 36771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(0); 36781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 36791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (x->value.base64.total > y->value.base64.total) 36801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(1); 36811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 36821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(-1); 36831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 36841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (-2); 3685c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_STRING: 3686c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_IDREFS: 3687c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ENTITIES: 3688c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NMTOKENS: 3689c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard TODO 3690c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 369196d2effc735fb45cfa363b6a876ff23a862f87a5William M. Brack case XML_SCHEMAS_ANYTYPE: 369296d2effc735fb45cfa363b6a876ff23a862f87a5William M. Brack case XML_SCHEMAS_ANYSIMPLETYPE: 369396d2effc735fb45cfa363b6a876ff23a862f87a5William M. Brack break; 36944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 36955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 36964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 36974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 36984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 3699c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaNormLen: 3700c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @value: a string 3701c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 3702c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Computes the UTF8 length of the normalized value of the string 3703c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 3704c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns the length or -1 in case of error. 3705c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */ 3706c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int 3707c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaNormLen(const xmlChar *value) { 3708c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard const xmlChar *utf; 3709c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard int ret = 0; 3710c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 3711c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (value == NULL) 3712c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 3713c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf = value; 371476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf)) utf++; 3715c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard while (*utf != 0) { 3716c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (utf[0] & 0x80) { 3717c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[1] & 0xc0) != 0x80) 3718c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 3719c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xe0) == 0xe0) { 3720c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[2] & 0xc0) != 0x80) 3721c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 3722c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xf0) == 0xf0) { 3723c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80) 3724c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 3725c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 4; 3726c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 3727c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 3; 3728c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 3729c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 3730c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 2; 3731c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 373276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack } else if (IS_BLANK_CH(*utf)) { 373376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf)) utf++; 3734c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf == 0) 3735c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 3736c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 3737c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf++; 3738c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 3739c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard ret++; 3740c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 3741c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(ret); 3742c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard} 3743c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 3744c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardunsigned long 3745c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaGetFacetValueAsULong(xmlSchemaFacetPtr facet) 3746c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{ 3747c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard /* 3748c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * TODO: Check if this is a decimal. 3749c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 3750c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return ((unsigned long) facet->val->value.decimal.lo); 3751c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 3752c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 3753c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/** 375401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateListSimpleTypeFacet: 375501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facet: the facet to check 375601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @value: the lexical repr of the value to validate 375701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @actualLen: the number of list items 375801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @expectedLen: the resulting expected number of list items 375901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 376001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Checks the value of a list simple type against a facet. 376101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 376201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 0 if the value is valid, a positive error code 376301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * number otherwise and -1 in case of an internal error. 376401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 376501fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint 376601fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaValidateListSimpleTypeFacet(xmlSchemaFacetPtr facet, 376701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard const xmlChar *value, 376801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard unsigned long actualLen, 376901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard unsigned long *expectedLen) 377001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 377101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 377201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * TODO: Check if this will work with large numbers. 377301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * (compare value.decimal.mi and value.decimal.hi as well?). 377401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 377501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 377601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen != facet->val->value.decimal.lo) { 3777c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (expectedLen != 0) 3778c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 377901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_LENGTH_VALID); 378001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 378101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 378201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen < facet->val->value.decimal.lo) { 3783c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (expectedLen != 0) 3784c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 378501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_MINLENGTH_VALID); 378601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 378701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MAXLENGTH) { 378801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen > facet->val->value.decimal.lo) { 3789c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (expectedLen != 0) 3790c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 379101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_MAXLENGTH_VALID); 379201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 379301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else 379401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 379501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * NOTE: That we can pass NULL as xmlSchemaValPtr to 379601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateFacet, since the remaining facet types 379701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * are: XML_SCHEMA_FACET_PATTERN, XML_SCHEMA_FACET_ENUMERATION. 379801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 379901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(xmlSchemaValidateFacet(NULL, facet, value, NULL)); 380001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 380101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 380201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 380301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 38044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaValidateFacet: 3805c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the built-in type 3806c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @facet: the facet to check 3807c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the lexical repr. of the value to be validated 3808c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val: the precomputed value 3809c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @length: the actual length of the value 3810c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 3811c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength" 3812c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * facet; sets @length to the computed length of @value. 3813c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 3814c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if the value is valid, a positive error code 3815c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * otherwise and -1 in case of an internal or API error. 3816c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 3817c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardint 3818c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaValidateLengthFacet(xmlSchemaTypePtr type, 3819c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard xmlSchemaFacetPtr facet, 3820c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard const xmlChar *value, 3821c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard xmlSchemaValPtr val, 3822c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard unsigned long *length) 3823c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{ 3824c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard unsigned int len = 0; 3825c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 3826c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *length = 0; 3827c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((facet->type != XML_SCHEMA_FACET_LENGTH) && 3828c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->type != XML_SCHEMA_FACET_MAXLENGTH) && 3829c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->type != XML_SCHEMA_FACET_MINLENGTH)) 3830c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return (-1); 3831c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 3832c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((facet->val == NULL) || 3833c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard ((facet->val->type != XML_SCHEMAS_DECIMAL) && 3834c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 3835c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->val->value.decimal.frac != 0)) { 3836c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(-1); 3837c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 3838c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) 3839c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard len = val->value.hex.total; 3840c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY)) 3841c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard len = val->value.base64.total; 3842c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard else { 3843c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard switch (type->builtInType) { 3844c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_IDREF: 3845c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NORMSTRING: 3846c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_TOKEN: 3847c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_LANGUAGE: 3848c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NMTOKEN: 3849c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NAME: 3850c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NCNAME: 3851c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_ID: 3852c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard len = xmlSchemaNormLen(value); 3853c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard break; 3854c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_STRING: 3855c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard /* 3856c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * FIXME: What exactly to do with anyURI? 3857c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 3858c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_ANYURI: 3859c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (value != NULL) 3860c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard len = xmlUTF8Strlen(value); 3861c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard break; 3862c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard default: 3863c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard TODO 3864c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 3865c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 3866c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *length = (unsigned long) len; 3867c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 3868c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len != facet->val->value.decimal.lo) 3869c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_LENGTH_VALID); 3870c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 3871c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len < facet->val->value.decimal.lo) 3872c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_MINLENGTH_VALID); 3873c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } else { 3874c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len > facet->val->value.decimal.lo) 3875c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_MAXLENGTH_VALID); 3876c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 3877c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 3878c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return (0); 3879c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 3880c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 3881c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/** 3882c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaValidateFacet: 388301c13b5be2d249ef66d86585adee87901bb8efa2Daniel Veillard * @base: the base type 38844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @facet: the facet to check 38854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the lexical repr of the value to validate 38864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val: the precomputed value 38874255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 38884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Check a value against a facet condition 38894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 38904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if the element is schemas valid, a positive error code 38914255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * number otherwise and -1 in case of internal or API error. 38924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 38934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardint 3894dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateFacet(xmlSchemaTypePtr base ATTRIBUTE_UNUSED, 3895118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard xmlSchemaFacetPtr facet, 38964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard const xmlChar *value, xmlSchemaValPtr val) 38974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{ 38984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard int ret; 38994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 39004255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard switch (facet->type) { 39014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMA_FACET_PATTERN: 39024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = xmlRegexpExec(facet->regexp, value); 39034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == 1) 39044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 39054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == 0) { 390601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_PATTERN_VALID); 39074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 39084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(ret); 39094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMA_FACET_MAXEXCLUSIVE: 39104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 39114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == -2) { 39128bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO error code */ 39134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(-1); 39144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 39154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == -1) 39164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 39175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* error code */ 391801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID); 3919070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MAXINCLUSIVE: 3920070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 3921070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == -2) { 39228bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO error code */ 3923070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 3924070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 3925070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret == -1) || (ret == 0)) 3926070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 39275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* error code */ 392801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID); 3929070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MINEXCLUSIVE: 3930070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 3931070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == -2) { 39328bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO error code */ 3933070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 3934070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 3935070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 1) 3936070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 39375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* error code */ 393801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID); 3939070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MININCLUSIVE: 3940070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 3941070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == -2) { 39428bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO error code */ 3943070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 3944070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 3945070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret == 1) || (ret == 0)) 3946070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 39475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* error code */ 394801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MININCLUSIVE_VALID); 39498651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard case XML_SCHEMA_FACET_WHITESPACE: 39508bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO whitespaces */ 395101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 395201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * NOTE: Whitespace should be handled to normalize 395301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * the value to be validated against a the facets; 395401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * not to normalize the value in-between. 395501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 39568651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard return(0); 39578bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_ENUMERATION: 39588bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard if ((facet->value != NULL) && 39598bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard (xmlStrEqual(facet->value, value))) 39608bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard return(0); 396101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_ENUMERATION_VALID); 39628bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_LENGTH: 3963e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard case XML_SCHEMA_FACET_MAXLENGTH: 39648bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_MINLENGTH: { 39658bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard unsigned int len = 0; 3966e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard 39678bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard if ((facet->val == NULL) || 3968e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((facet->val->type != XML_SCHEMAS_DECIMAL) && 3969e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 39708bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard (facet->val->value.decimal.frac != 0)) { 39718bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard return(-1); 39728bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 3973560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) 397470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard len = val->value.hex.total; 39751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY)) 39761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard len = val->value.base64.total; 39771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else { 397801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (base->builtInType) { 3979560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_IDREF: 3980560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NORMSTRING: 3981560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_TOKEN: 3982560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_LANGUAGE: 3983560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NMTOKEN: 3984560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NAME: 3985560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NCNAME: 3986560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_ID: 398770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard len = xmlSchemaNormLen(value); 398870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard break; 3989560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_STRING: 399001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 399101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * FIXME: What exactly to do with anyURI? 399201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 399301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 3994fbf2c5eaf550a8e7b94e87d5a4940db53bdffeacWilliam M. Brack if (value != NULL) 3995fbf2c5eaf550a8e7b94e87d5a4940db53bdffeacWilliam M. Brack len = xmlUTF8Strlen(value); 399670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard break; 3997560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard default: 3998560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard TODO 399970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 40008bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 40018bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 4002e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len != facet->val->value.decimal.lo) 400301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_LENGTH_VALID); 40048bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 4005e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len < facet->val->value.decimal.lo) 400601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MINLENGTH_VALID); 40078bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } else { 4008e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len > facet->val->value.decimal.lo) 400901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXLENGTH_VALID); 4010e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard } 40118bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard break; 40128bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 4013560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMA_FACET_TOTALDIGITS: 4014560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMA_FACET_FRACTIONDIGITS: 4015560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 4016560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((facet->val == NULL) || 4017560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard ((facet->val->type != XML_SCHEMAS_DECIMAL) && 4018560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 4019560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (facet->val->value.decimal.frac != 0)) { 4020560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return(-1); 4021560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 4022560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((val == NULL) || 4023560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard ((val->type != XML_SCHEMAS_DECIMAL) && 4024560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_INTEGER) && 4025560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NPINTEGER) && 4026560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NINTEGER) && 4027560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NNINTEGER) && 4028560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_PINTEGER) && 4029560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_INT) && 4030560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_UINT) && 4031560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_LONG) && 4032560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_ULONG) && 4033560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_SHORT) && 4034560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_USHORT) && 4035560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_BYTE) && 4036560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_UBYTE))) { 4037560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return(-1); 4038560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 4039560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) { 4040560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (val->value.decimal.total > facet->val->value.decimal.lo) 404101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_TOTALDIGITS_VALID); 4042560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 4043560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) { 4044560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (val->value.decimal.frac > facet->val->value.decimal.lo) 404501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID); 4046560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 4047560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard break; 40484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard default: 40494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard TODO 40504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 40514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 4052b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 40534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 40544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 40554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#endif /* LIBXML_SCHEMAS_ENABLED */ 4056