14255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/* 24255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * schemastypes.c : implementation of the XML Schema Datatypes 34255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * definition and validity checking 44255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 54255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * See Copyright for the status of this software. 64255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 74255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Daniel Veillard <veillard@redhat.com> 84255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 94255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define IN_LIBXML 114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include "libxml.h" 124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#ifdef LIBXML_SCHEMAS_ENABLED 144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <string.h> 164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/xmlmemory.h> 174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/parser.h> 184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/parserInternals.h> 194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/hash.h> 204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/valid.h> 2196a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard#include <libxml/xpath.h> 2296a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard#include <libxml/uri.h> 234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/xmlschemas.h> 254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/schemasInternals.h> 264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#include <libxml/xmlschemastypes.h> 274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 28070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#ifdef HAVE_MATH_H 29070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#include <math.h> 30070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#endif 31c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifdef HAVE_FLOAT_H 32c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#include <float.h> 33c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif 34070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define DEBUG 364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 37d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillard#ifndef LIBXML_XPATH_ENABLED 38d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillardextern double xmlXPathNAN; 39d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillardextern double xmlXPathPINF; 40d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillardextern double xmlXPathNINF; 41d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillard#endif 42d0cf7f6eea7331cc398c232d7879e4239d989e14Daniel Veillard 43f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard#define TODO \ 444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard "Unimplemented block at %s:%d\n", \ 464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard __FILE__, __LINE__); 474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define XML_SCHEMAS_NAMESPACE_NAME \ 494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard (const xmlChar *)"http://www.w3.org/2001/XMLSchema" 504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik#define IS_WSP_REPLACE_CH(c) ((((c) == 0x9) || ((c) == 0xa)) || \ 526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik ((c) == 0xd)) 536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik#define IS_WSP_SPACE_CH(c) ((c) == 0x20) 556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 56478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik#define IS_WSP_BLANK_CH(c) IS_BLANK_CH(c) 57478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik 58070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* Date value */ 59070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef struct _xmlSchemaValDate xmlSchemaValDate; 60070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef xmlSchemaValDate *xmlSchemaValDatePtr; 61070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstruct _xmlSchemaValDate { 62070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard long year; 63070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int mon :4; /* 1 <= mon <= 12 */ 64070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int day :5; /* 1 <= day <= 31 */ 65070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int hour :5; /* 0 <= hour <= 23 */ 66070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int min :6; /* 0 <= min <= 59 */ 67070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double sec; 68a77cf71f453249f224d609f2f20789a897c5bdebDaniel Veillard unsigned int tz_flag :1; /* is tzo explicitely set? */ 69285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik signed int tzo :12; /* -1440 <= tzo <= 1440; 70285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik currently only -840 to +840 are needed */ 71070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}; 72070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 73070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* Duration value */ 74070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef struct _xmlSchemaValDuration xmlSchemaValDuration; 75070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef xmlSchemaValDuration *xmlSchemaValDurationPtr; 76070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstruct _xmlSchemaValDuration { 77070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard long mon; /* mon stores years also */ 78f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard long day; 79070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double sec; /* sec stores min and hour also */ 80070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}; 81070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardtypedef struct _xmlSchemaValDecimal xmlSchemaValDecimal; 834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardtypedef xmlSchemaValDecimal *xmlSchemaValDecimalPtr; 844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstruct _xmlSchemaValDecimal { 854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard /* would use long long but not portable */ 86e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long lo; 87e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long mi; 88e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long hi; 894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard unsigned int extra; 905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard unsigned int sign:1; 91c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack unsigned int frac:7; 92c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack unsigned int total:8; 934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}; 944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 95e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardtypedef struct _xmlSchemaValQName xmlSchemaValQName; 96e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardtypedef xmlSchemaValQName *xmlSchemaValQNamePtr; 97e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstruct _xmlSchemaValQName { 98e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlChar *name; 99e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlChar *uri; 100e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard}; 101e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 10270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardtypedef struct _xmlSchemaValHex xmlSchemaValHex; 10370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardtypedef xmlSchemaValHex *xmlSchemaValHexPtr; 10470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillardstruct _xmlSchemaValHex { 10570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard xmlChar *str; 10670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard unsigned int total; 10770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard}; 10870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 1091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardtypedef struct _xmlSchemaValBase64 xmlSchemaValBase64; 1101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardtypedef xmlSchemaValBase64 *xmlSchemaValBase64Ptr; 1111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstruct _xmlSchemaValBase64 { 1121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *str; 1131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned int total; 1141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard}; 1151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 1164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstruct _xmlSchemaVal { 1174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValType type; 1184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik struct _xmlSchemaVal *next; 1194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard union { 1205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValDecimal decimal; 121070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValDate date; 122070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValDuration dur; 123e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard xmlSchemaValQName qname; 12470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard xmlSchemaValHex hex; 1251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaValBase64 base64; 12684d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard float f; 12784d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillard double d; 128c5a70f264550ee39da267e81dccd95508ed367ddDaniel Veillard int b; 129c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard xmlChar *str; 1304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } value; 1314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard}; 1324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 1334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int xmlSchemaTypesInitialized = 0; 1344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlHashTablePtr xmlSchemaTypesBank = NULL; 1354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 136c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard/* 137c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * Basic types 138c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */ 1394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeStringDef = NULL; 1404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnyTypeDef = NULL; 1414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnySimpleTypeDef = NULL; 1424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDecimalDef = NULL; 143070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDatetimeDef = NULL; 1444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDateDef = NULL; 145070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeTimeDef = NULL; 146070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGYearDef = NULL; 147070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGYearMonthDef = NULL; 148070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGDayDef = NULL; 149070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGMonthDayDef = NULL; 150070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeGMonthDef = NULL; 151070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDurationDef = NULL; 15284d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeFloatDef = NULL; 153c5a70f264550ee39da267e81dccd95508ed367ddDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeBooleanDef = NULL; 15484d70a462ff443b310ca90fdce722f81261dc93bDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeDoubleDef = NULL; 155560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeHexBinaryDef = NULL; 1561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeBase64BinaryDef = NULL; 157e5b110b3844d58ff4bea56bcb699144f6fbe0b83Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeAnyURIDef = NULL; 1584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 1594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/* 160c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * Derived types 161c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */ 162c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypePositiveIntegerDef = NULL; 163c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNonPositiveIntegerDef = NULL; 164c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNegativeIntegerDef = NULL; 165c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNonNegativeIntegerDef = NULL; 166c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIntegerDef = NULL; 167c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeLongDef = NULL; 168c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIntDef = NULL; 169c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeShortDef = NULL; 170c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeByteDef = NULL; 171c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedLongDef = NULL; 172c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedIntDef = NULL; 173c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedShortDef = NULL; 174c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeUnsignedByteDef = NULL; 1758bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNormStringDef = NULL; 1768bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeTokenDef = NULL; 1778bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeLanguageDef = NULL; 1788bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNameDef = NULL; 1798bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeQNameDef = NULL; 180e5b110b3844d58ff4bea56bcb699144f6fbe0b83Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNCNameDef = NULL; 1818bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdDef = NULL; 1828bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdrefDef = NULL; 1838bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeIdrefsDef = NULL; 184a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeEntityDef = NULL; 185a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeEntitiesDef = NULL; 186e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNotationDef = NULL; 1878bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNmtokenDef = NULL; 1888bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillardstatic xmlSchemaTypePtr xmlSchemaTypeNmtokensDef = NULL; 189c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard 190d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/************************************************************************ 191d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * * 192f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Datatype error handlers * 193d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * * 194d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard ************************************************************************/ 195d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/** 196d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * xmlSchemaTypeErrMemory: 197d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * @extra: extra informations 198d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * 199d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * Handle an out of memory condition 200d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard */ 201d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillardstatic void 202d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel VeillardxmlSchemaTypeErrMemory(xmlNodePtr node, const char *extra) 203d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard{ 204d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard __xmlSimpleError(XML_FROM_DATATYPE, XML_ERR_NO_MEMORY, node, NULL, extra); 205d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard} 206d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard 207d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/************************************************************************ 208d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * * 209f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Base types support * 210d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * * 211d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard ************************************************************************/ 2124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 2134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik/** 2144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * xmlSchemaNewValue: 2154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * @type: the value type 2164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * 2174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Allocate a new simple type value 2184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * 2194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error 2204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */ 2214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikstatic xmlSchemaValPtr 2224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaNewValue(xmlSchemaValType type) { 2234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaValPtr value; 2244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 2254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal)); 2264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (value == NULL) { 2274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return(NULL); 2284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 2294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik memset(value, 0, sizeof(xmlSchemaVal)); 2304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value->type = type; 2314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return(value); 2324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik} 2334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 2344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikstatic xmlSchemaFacetPtr 2354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaNewMinLengthFacet(int value) 2364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{ 2374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaFacetPtr ret; 2384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 2394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = xmlSchemaNewFacet(); 24014b5643947845df089376106517c4f7ba061e4b0Daniel Veillard if (ret == NULL) { 24114b5643947845df089376106517c4f7ba061e4b0Daniel Veillard return(NULL); 24214b5643947845df089376106517c4f7ba061e4b0Daniel Veillard } 2434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->type = XML_SCHEMA_FACET_MINLENGTH; 2444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->val = xmlSchemaNewValue(XML_SCHEMAS_NNINTEGER); 245717042d2ae21e36c5efda8d2e64fc88385095503Daniel Veillard if (ret->val == NULL) { 246717042d2ae21e36c5efda8d2e64fc88385095503Daniel Veillard xmlFree(ret); 247717042d2ae21e36c5efda8d2e64fc88385095503Daniel Veillard return(NULL); 248717042d2ae21e36c5efda8d2e64fc88385095503Daniel Veillard } 2494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->val->value.decimal.lo = value; 2504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (ret); 2514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik} 2524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 253c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard/* 2544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitBasicType: 2554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name: the type name 2568bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard * @type: the value type associated 2574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 25801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Initialize one primitive built-in type 2594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 2604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr 261f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel VeillardxmlSchemaInitBasicType(const char *name, xmlSchemaValType type, 26201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypePtr baseType) { 2634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypePtr ret; 2644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 2654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType)); 2664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == NULL) { 267d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard xmlSchemaTypeErrMemory(NULL, "could not initialize basic types"); 2684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(NULL); 2694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 2704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard memset(ret, 0, sizeof(xmlSchemaType)); 271be9c6320d4ed8d5622322014310555bb88b02a85Daniel Veillard ret->name = (const xmlChar *)name; 2724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->targetNamespace = XML_SCHEMAS_NAMESPACE_NAME; 2734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret->type = XML_SCHEMA_TYPE_BASIC; 274f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard ret->baseType = baseType; 2754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->contentType = XML_SCHEMA_CONTENT_BASIC; 27601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 2774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Primitive types. 27801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 279f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard switch (type) { 280f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_STRING: 281f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_DECIMAL: 282f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_DATE: 283f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_DATETIME: 284f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_TIME: 285f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_GYEAR: 286f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 287f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_GMONTH: 288f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 289f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_GDAY: 290f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_DURATION: 291f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_FLOAT: 292f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_DOUBLE: 293f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_BOOLEAN: 294f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_ANYURI: 295f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_HEXBINARY: 296f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 297f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_QNAME: 298f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_NOTATION: 29901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard ret->flags |= XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE; 3004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 30196d2effc735fb45cfa363b6a876ff23a862f87a5William M. Brack default: 3024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 3034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 3044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* 3054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Set variety. 3064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */ 3074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik switch (type) { 3084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYTYPE: 3094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 3104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 3114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREFS: 3124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKENS: 3134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITIES: 3144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST; 3154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->facets = xmlSchemaNewMinLengthFacet(1); 316f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard ret->flags |= XML_SCHEMAS_TYPE_HAS_FACETS; 3174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 3184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik default: 3194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC; 3204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 32101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 3224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlHashAddEntry2(xmlSchemaTypesBank, ret->name, 3234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard XML_SCHEMAS_NAMESPACE_NAME, ret); 32401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard ret->builtInType = type; 3254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(ret); 3264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 3274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 3284255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/* 32911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* WARNING: Those type reside normally in xmlschemas.c but are 33011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* redefined here locally in oder of being able to use them for xs:anyType- 33111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* TODO: Remove those definition if we move the types to a header file. 33211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* TODO: Always keep those structs up-to-date with the originals. 33311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik*/ 33411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik#define UNBOUNDED (1 << 30) 33511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik 33611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef struct _xmlSchemaTreeItem xmlSchemaTreeItem; 33711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef xmlSchemaTreeItem *xmlSchemaTreeItemPtr; 33811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstruct _xmlSchemaTreeItem { 33911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeType type; 34011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaAnnotPtr annot; 34111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTreeItemPtr next; 34211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTreeItemPtr children; 34311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik}; 34411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik 34511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef struct _xmlSchemaParticle xmlSchemaParticle; 34611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef xmlSchemaParticle *xmlSchemaParticlePtr; 34711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstruct _xmlSchemaParticle { 34811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeType type; 34911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaAnnotPtr annot; 35011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTreeItemPtr next; 35111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTreeItemPtr children; 35211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik int minOccurs; 35311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik int maxOccurs; 35411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlNodePtr node; 35511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik}; 35611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik 35711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef struct _xmlSchemaModelGroup xmlSchemaModelGroup; 35811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef xmlSchemaModelGroup *xmlSchemaModelGroupPtr; 35911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstruct _xmlSchemaModelGroup { 36011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeType type; 36111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaAnnotPtr annot; 36211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTreeItemPtr next; 36311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTreeItemPtr children; 36411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlNodePtr node; 36511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik}; 36611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik 36711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstatic xmlSchemaParticlePtr 36811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. BuchcikxmlSchemaAddParticle(void) 36911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik{ 37011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaParticlePtr ret = NULL; 37111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik 37211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik ret = (xmlSchemaParticlePtr) 37311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlMalloc(sizeof(xmlSchemaParticle)); 37411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik if (ret == NULL) { 37511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeErrMemory(NULL, "allocating particle component"); 37611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik return (NULL); 37711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik } 37811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik memset(ret, 0, sizeof(xmlSchemaParticle)); 37911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik ret->type = XML_SCHEMA_TYPE_PARTICLE; 38011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik ret->minOccurs = 1; 38111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik ret->maxOccurs = 1; 38211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik return (ret); 38311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik} 38411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik 38511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik/* 3864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitTypes: 3874255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 3884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Initialize the default XML Schemas type library 3894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 3904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid 3916560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel VeillardxmlSchemaInitTypes(void) 3926560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard{ 3934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized != 0) 3946560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard return; 3954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypesBank = xmlHashCreate(40); 3966560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard 397f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 398c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard /* 39901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 3.4.7 Built-in Complex Type Definition 40001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 4018bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeAnyTypeDef = xmlSchemaInitBasicType("anyType", 402f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard XML_SCHEMAS_ANYTYPE, 40301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard NULL); 40401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef->baseType = xmlSchemaTypeAnyTypeDef; 40501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED; 40611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* 40711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik * Init the content type. 40811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik */ 409f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED; 41001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard { 41111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaParticlePtr particle; 41211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaModelGroupPtr sequence; 41301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaWildcardPtr wild; 41411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* First particle. */ 41511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle = xmlSchemaAddParticle(); 41611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik if (particle == NULL) 41711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik return; 41811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeAnyTypeDef->subtypes = (xmlSchemaTypePtr) particle; 41911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* Sequence model group. */ 42011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik sequence = (xmlSchemaModelGroupPtr) 42111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlMalloc(sizeof(xmlSchemaModelGroup)); 42211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik if (sequence == NULL) { 42311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeErrMemory(NULL, "allocating model group component"); 42411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik return; 42511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik } 42611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik memset(sequence, 0, sizeof(xmlSchemaModelGroup)); 427f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard sequence->type = XML_SCHEMA_TYPE_SEQUENCE; 42811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle->children = (xmlSchemaTreeItemPtr) sequence; 42911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* Second particle. */ 43011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle = xmlSchemaAddParticle(); 43111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik if (particle == NULL) 43211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik return; 43311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle->minOccurs = 0; 43411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle->maxOccurs = UNBOUNDED; 43511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik sequence->children = (xmlSchemaTreeItemPtr) particle; 43611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* The wildcard */ 43711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard)); 43811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik if (wild == NULL) { 43911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeErrMemory(NULL, "allocating wildcard component"); 44011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik return; 44111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik } 44211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik memset(wild, 0, sizeof(xmlSchemaWildcard)); 44311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik wild->type = XML_SCHEMA_TYPE_ANY; 444f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard wild->any = 1; 445f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard wild->processContents = XML_SCHEMAS_ANY_LAX; 446f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard particle->children = (xmlSchemaTreeItemPtr) wild; 44711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* 44811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik * Create the attribute wildcard. 44911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik */ 45001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard)); 45101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (wild == NULL) { 45211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeErrMemory(NULL, "could not create an attribute " 45311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik "wildcard on anyType"); 45401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return; 45501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 45601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard memset(wild, 0, sizeof(xmlSchemaWildcard)); 45701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard wild->any = 1; 458f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard wild->processContents = XML_SCHEMAS_ANY_LAX; 45901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef->attributeWildcard = wild; 46001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 461f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard xmlSchemaTypeAnySimpleTypeDef = xmlSchemaInitBasicType("anySimpleType", 4622f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack XML_SCHEMAS_ANYSIMPLETYPE, 46301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef); 46401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 46501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * primitive datatypes 46601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 46701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeStringDef = xmlSchemaInitBasicType("string", 46801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_STRING, 46901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4708bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDecimalDef = xmlSchemaInitBasicType("decimal", 47101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DECIMAL, 47201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4738bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDateDef = xmlSchemaInitBasicType("date", 47401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DATE, 47501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4768bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDatetimeDef = xmlSchemaInitBasicType("dateTime", 47701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DATETIME, 47801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4798bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeTimeDef = xmlSchemaInitBasicType("time", 48001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_TIME, 48101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4828bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGYearDef = xmlSchemaInitBasicType("gYear", 48301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GYEAR, 48401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4858bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGYearMonthDef = xmlSchemaInitBasicType("gYearMonth", 48601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GYEARMONTH, 48701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4888bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGMonthDef = xmlSchemaInitBasicType("gMonth", 48901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GMONTH, 49001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4918bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGMonthDayDef = xmlSchemaInitBasicType("gMonthDay", 49201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GMONTHDAY, 49301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4948bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGDayDef = xmlSchemaInitBasicType("gDay", 49501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GDAY, 49601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4978bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDurationDef = xmlSchemaInitBasicType("duration", 49801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DURATION, 49901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 5008bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float", 50101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_FLOAT, 50201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 5038bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double", 50401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DOUBLE, 50501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 5068bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeBooleanDef = xmlSchemaInitBasicType("boolean", 50701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_BOOLEAN, 50801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 5098bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeAnyURIDef = xmlSchemaInitBasicType("anyURI", 51001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_ANYURI, 51101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 512560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard xmlSchemaTypeHexBinaryDef = xmlSchemaInitBasicType("hexBinary", 51301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_HEXBINARY, 51401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 5151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaTypeBase64BinaryDef 51601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard = xmlSchemaInitBasicType("base64Binary", XML_SCHEMAS_BASE64BINARY, 51701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 51801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNotationDef = xmlSchemaInitBasicType("NOTATION", 51901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NOTATION, 520f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 52101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeQNameDef = xmlSchemaInitBasicType("QName", 52201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_QNAME, 52301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 5244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 525c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard /* 526c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * derived datatypes 527c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */ 5288bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeIntegerDef = xmlSchemaInitBasicType("integer", 52901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_INTEGER, 53001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeDecimalDef); 5316560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeNonPositiveIntegerDef = 5326560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaInitBasicType("nonPositiveInteger", 53301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NPINTEGER, 53401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntegerDef); 5356560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeNegativeIntegerDef = 53601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("negativeInteger", XML_SCHEMAS_NINTEGER, 53701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNonPositiveIntegerDef); 5386560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeLongDef = 53901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("long", XML_SCHEMAS_LONG, 54001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntegerDef); 54101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntDef = xmlSchemaInitBasicType("int", XML_SCHEMAS_INT, 54201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeLongDef); 5438bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeShortDef = xmlSchemaInitBasicType("short", 54401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_SHORT, 54501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntDef); 5468bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeByteDef = xmlSchemaInitBasicType("byte", 54701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_BYTE, 54801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeShortDef); 5496560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeNonNegativeIntegerDef = 5506560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaInitBasicType("nonNegativeInteger", 55101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NNINTEGER, 55201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntegerDef); 5536560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedLongDef = 55401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedLong", XML_SCHEMAS_ULONG, 55501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNonNegativeIntegerDef); 5566560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedIntDef = 55701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedInt", XML_SCHEMAS_UINT, 55801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeUnsignedLongDef); 5596560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedShortDef = 56001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedShort", XML_SCHEMAS_USHORT, 56101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeUnsignedIntDef); 5626560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedByteDef = 56301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedByte", XML_SCHEMAS_UBYTE, 56401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeUnsignedShortDef); 5656560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypePositiveIntegerDef = 56601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("positiveInteger", XML_SCHEMAS_PINTEGER, 56701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNonNegativeIntegerDef); 5688bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeNormStringDef = xmlSchemaInitBasicType("normalizedString", 56901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NORMSTRING, 57001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeStringDef); 5718bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeTokenDef = xmlSchemaInitBasicType("token", 57201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_TOKEN, 57301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNormStringDef); 5748bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeLanguageDef = xmlSchemaInitBasicType("language", 57501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_LANGUAGE, 57601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeTokenDef); 57701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNameDef = xmlSchemaInitBasicType("Name", 57801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NAME, 57901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeTokenDef); 58001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNmtokenDef = xmlSchemaInitBasicType("NMTOKEN", 58101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NMTOKEN, 5824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeTokenDef); 58301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNCNameDef = xmlSchemaInitBasicType("NCName", 58401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NCNAME, 58501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNameDef); 58601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIdDef = xmlSchemaInitBasicType("ID", XML_SCHEMAS_ID, 5874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeNCNameDef); 5888bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeIdrefDef = xmlSchemaInitBasicType("IDREF", 58901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_IDREF, 590f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard xmlSchemaTypeNCNameDef); 591a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard xmlSchemaTypeEntityDef = xmlSchemaInitBasicType("ENTITY", 59201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_ENTITY, 59301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNCNameDef); 5944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* 5954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Derived list types. 5964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */ 5974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* ENTITIES */ 598a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard xmlSchemaTypeEntitiesDef = xmlSchemaInitBasicType("ENTITIES", 59901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_ENTITIES, 6004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeAnySimpleTypeDef); 6014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeEntitiesDef->subtypes = xmlSchemaTypeEntityDef; 6024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* IDREFS */ 6034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeIdrefsDef = xmlSchemaInitBasicType("IDREFS", 6044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik XML_SCHEMAS_IDREFS, 6054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeAnySimpleTypeDef); 6064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeIdrefsDef->subtypes = xmlSchemaTypeIdrefDef; 6074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 6084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* NMTOKENS */ 6094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeNmtokensDef = xmlSchemaInitBasicType("NMTOKENS", 6104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik XML_SCHEMAS_NMTOKENS, 6114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeAnySimpleTypeDef); 6124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeNmtokensDef->subtypes = xmlSchemaTypeNmtokenDef; 6134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 6144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypesInitialized = 1; 6154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 6164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 6174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 6184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCleanupTypes: 6194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 6204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library 6214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 622f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillardvoid 6234255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCleanupTypes(void) { 6244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 6254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return; 62611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* 62711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik * Free xs:anyType. 62811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik */ 62911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik { 63011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaParticlePtr particle; 63111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* Attribute wildcard. */ 63211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaFreeWildcard(xmlSchemaTypeAnyTypeDef->attributeWildcard); 63311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* Content type. */ 63411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle = (xmlSchemaParticlePtr) xmlSchemaTypeAnyTypeDef->subtypes; 63511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* Wildcard. */ 636f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard xmlSchemaFreeWildcard((xmlSchemaWildcardPtr) 63711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle->children->children->children); 63811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlFree((xmlSchemaParticlePtr) particle->children->children); 63911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* Sequence model group. */ 64011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlFree((xmlSchemaModelGroupPtr) particle->children); 64111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlFree((xmlSchemaParticlePtr) particle); 642f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard xmlSchemaTypeAnyTypeDef->subtypes = NULL; 64311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik } 6444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlHashFree(xmlSchemaTypesBank, (xmlHashDeallocator) xmlSchemaFreeType); 6454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypesInitialized = 0; 6464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 6474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 6484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 6496927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaIsBuiltInTypeFacet: 65001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in type 65101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facetType: the facet type 65201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 65301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Evaluates if a specific facet can be 65401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * used in conjunction with a type. 65501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 65601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 1 if the facet can be used with the given built-in type, 65701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 0 otherwise and -1 in case the type is not a built-in type. 65801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 65901fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint 66001fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaIsBuiltInTypeFacet(xmlSchemaTypePtr type, int facetType) 66101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 662ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard if (type == NULL) 663ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard return (-1); 66401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->type != XML_SCHEMA_TYPE_BASIC) 66501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (-1); 66601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type->builtInType) { 66701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BOOLEAN: 66801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_PATTERN) || 66901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE)) 67001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 67101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 672f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard return (0); 67301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_STRING: 67401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NOTATION: 67501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_QNAME: 676f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_ANYURI: 677f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 67801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_HEXBINARY: 67901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_LENGTH) || 68001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MINLENGTH) || 68101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXLENGTH) || 68201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_PATTERN) || 68301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_ENUMERATION) || 68401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE)) 68501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 68601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 68701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 68801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DECIMAL: 68901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_TOTALDIGITS) || 69001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) || 69101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_PATTERN) || 69201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE) || 69301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_ENUMERATION) || 69401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) || 69501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) || 69601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MININCLUSIVE) || 69701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE)) 69801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 69901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 700f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard return (0); 70101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_TIME: 702f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_GDAY: 70301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTH: 704f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 705f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_GYEAR: 70601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 70701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATE: 70801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATETIME: 70901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DURATION: 71001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_FLOAT: 71101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DOUBLE: 71201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_PATTERN) || 71301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_ENUMERATION) || 71401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE) || 71501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) || 71601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) || 71701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MININCLUSIVE) || 71801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE)) 71901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 72001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 721f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard return (0); 72201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard default: 723c7e3cc49bade82dba0cda4ae7c07ffcd1e32fe25Daniel Veillard break; 72401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 72501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 72601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 72701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 72801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 72901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInType: 73001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the type of the built in type 73101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 73201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Gives you the type struct for a built-in 73301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * type by its type id. 73401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 73501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns the type if found, NULL otherwise. 73601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 73701fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr 73801fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInType(xmlSchemaValType type) 73901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 74001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (xmlSchemaTypesInitialized == 0) 74101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitTypes(); 74201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type) { 743f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 74401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYSIMPLETYPE: 74501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeAnySimpleTypeDef); 74601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_STRING: 74701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeStringDef); 74801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NORMSTRING: 74901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNormStringDef); 75001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DECIMAL: 75101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDecimalDef); 75201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_TIME: 75301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeTimeDef); 75401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GDAY: 75501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGDayDef); 75601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTH: 75701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGMonthDef); 75801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 759f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard return (xmlSchemaTypeGMonthDayDef); 76001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEAR: 76101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGYearDef); 76201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 76301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGYearMonthDef); 76401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATE: 76501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDateDef); 76601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATETIME: 76701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDatetimeDef); 76801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DURATION: 76901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDurationDef); 77001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_FLOAT: 77101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeFloatDef); 77201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DOUBLE: 77301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDoubleDef); 77401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BOOLEAN: 77501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeBooleanDef); 77601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_TOKEN: 77701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeTokenDef); 77801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_LANGUAGE: 77901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeLanguageDef); 78001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NMTOKEN: 78101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNmtokenDef); 78201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NMTOKENS: 78301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNmtokensDef); 78401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NAME: 78501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNameDef); 78601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_QNAME: 78701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeQNameDef); 78801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NCNAME: 78901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNCNameDef); 79001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ID: 79101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdDef); 79201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_IDREF: 79301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdrefDef); 79401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_IDREFS: 79501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdrefsDef); 79601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ENTITY: 79701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeEntityDef); 79801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ENTITIES: 79901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeEntitiesDef); 80001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NOTATION: 80101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNotationDef); 80201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 80301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeAnyURIDef); 80401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_INTEGER: 80501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIntegerDef); 80601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NPINTEGER: 80701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNonPositiveIntegerDef); 80801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NINTEGER: 80901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNegativeIntegerDef); 81001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NNINTEGER: 81101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNonNegativeIntegerDef); 81201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_PINTEGER: 81301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypePositiveIntegerDef); 81401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_INT: 81501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIntDef); 81601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_UINT: 81701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedIntDef); 81801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_LONG: 81901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeLongDef); 82001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ULONG: 82101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedLongDef); 82201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_SHORT: 82301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeShortDef); 82401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_USHORT: 82501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedShortDef); 82601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BYTE: 82701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeByteDef); 82801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_UBYTE: 82901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedByteDef); 83001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_HEXBINARY: 83101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeHexBinaryDef); 83201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 83301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeBase64BinaryDef); 83401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYTYPE: 835f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard return (xmlSchemaTypeAnyTypeDef); 83601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard default: 83701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (NULL); 83801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 83901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 84001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 8417f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/** 8427f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueAppend: 8437f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @prev: the value 8447f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @cur: the value to be appended 8457f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 8467f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Appends a next sibling to a list of computed values. 8477f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 8487f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns 0 if succeeded and -1 on API errors. 8497f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */ 8504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikint 8514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueAppend(xmlSchemaValPtr prev, xmlSchemaValPtr cur) { 8524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 8534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((prev == NULL) || (cur == NULL)) 8544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (-1); 8554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik prev->next = cur; 8564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (0); 8574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik} 8584efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 8597f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/** 8607f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetNext: 8617f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @cur: the value 8627f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 8637f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the next sibling of a list of computed values. 8647f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 8657f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns the next value or NULL if there was none, or on 8667f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * API errors. 8677f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */ 8684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValPtr 8694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetNext(xmlSchemaValPtr cur) { 8704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 8714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (cur == NULL) 8724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (NULL); 8734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (cur->next); 8744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik} 8754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 8767f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/** 8777f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetAsString: 8787f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @val: the value 8797f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 8807f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the string value of a computed value. 8817f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 8827f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns the string value or NULL if there was none, or on 8837f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * API errors. 8847f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */ 8854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikconst xmlChar * 8864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetAsString(xmlSchemaValPtr val) 887f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard{ 8884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val == NULL) 8894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (NULL); 8904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik switch (val->type) { 8914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_STRING: 8924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 8934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 8944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_TOKEN: 8954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_LANGUAGE: 8964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKEN: 8974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NAME: 8984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NCNAME: 8994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ID: 9004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 9014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITY: 9024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYURI: 9034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (BAD_CAST val->value.str); 9044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik default: 9054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 9064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 9074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (NULL); 9084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik} 9094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 9107f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/** 9117f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetAsBoolean: 9127f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @val: the value 9137f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 9147f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the boolean value of a computed value. 9157f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 9167f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns 1 if true and 0 if false, or in case of an error. Hmm. 9177f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */ 9184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikint 9194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetAsBoolean(xmlSchemaValPtr val) 920f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard{ 9214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((val == NULL) || (val->type != XML_SCHEMAS_BOOLEAN)) 9224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (0); 9234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (val->value.b); 9244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 9254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 9264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 9276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaNewStringValue: 9286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @type: the value type 929b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @value: the value 9306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 931f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Allocate a new simple type value. The type can be 932f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * of XML_SCHEMAS_STRING. 9332ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * WARNING: This one is intended to be expanded for other 9342ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * string based types. We need this for anySimpleType as well. 9354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given value is consumed and freed with the struct. 9366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 9376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error 9386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 9396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaValPtr 9406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaNewStringValue(xmlSchemaValType type, 9416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar *value) 9426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 9436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaValPtr val; 9446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 9456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (type != XML_SCHEMAS_STRING) 9466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(NULL); 9476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik val = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal)); 9486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (val == NULL) { 9496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(NULL); 9506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 9516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik memset(val, 0, sizeof(xmlSchemaVal)); 9526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik val->type = type; 9536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik val->value.str = (xmlChar *) value; 9546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(val); 9556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 9566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 957b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik/** 958b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * xmlSchemaNewNOTATIONValue: 959b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @name: the notation name 960b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @ns: the notation namespace name or NULL 961b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * 962b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * Allocate a new NOTATION value. 9634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given values are consumed and freed with the struct. 964b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * 965b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error 966b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik */ 967b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. BuchcikxmlSchemaValPtr 968b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. BuchcikxmlSchemaNewNOTATIONValue(const xmlChar *name, 969b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik const xmlChar *ns) 970b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik{ 971b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik xmlSchemaValPtr val; 972b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik 973b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik val = xmlSchemaNewValue(XML_SCHEMAS_NOTATION); 974b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik if (val == NULL) 975b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik return (NULL); 976b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik 97712d37ab63441baf9e03db70168cc1d0d6f1c2373William M. Brack val->value.qname.name = (xmlChar *)name; 978b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik if (ns != NULL) 97912d37ab63441baf9e03db70168cc1d0d6f1c2373William M. Brack val->value.qname.uri = (xmlChar *)ns; 980b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik return(val); 981b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik} 9826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 9836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 9844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * xmlSchemaNewQNameValue: 9854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * @namespaceName: the namespace name 9864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * @localName: the local name 9874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * 9884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Allocate a new QName value. 9894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given values are consumed and freed with the struct. 9904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * 9914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of an error. 9924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */ 9934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValPtr 9944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaNewQNameValue(const xmlChar *namespaceName, 9954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *localName) 9964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{ 9974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaValPtr val; 9984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 9994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik val = xmlSchemaNewValue(XML_SCHEMAS_QNAME); 10004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val == NULL) 10014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (NULL); 10024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 10034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik val->value.qname.name = (xmlChar *) localName; 10044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik val->value.qname.uri = (xmlChar *) namespaceName; 10054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return(val); 10064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik} 10074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 10084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik/** 10094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaFreeValue: 10104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to free 10114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 10124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library 10134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 1014f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillardvoid 10154255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaFreeValue(xmlSchemaValPtr value) { 10164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaValPtr prev; 10174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 1018f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard while (value != NULL) { 10194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik switch (value->type) { 10204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_STRING: 10214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 10224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_TOKEN: 10234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_LANGUAGE: 10244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKEN: 10254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKENS: 10264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NAME: 10274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NCNAME: 10284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ID: 10294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 10304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREFS: 10314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITY: 1032f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_ENTITIES: 10334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYURI: 10344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 10354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (value->value.str != NULL) 10364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(value->value.str); 10374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 10384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NOTATION: 10394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_QNAME: 10404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (value->value.qname.uri != NULL) 10414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(value->value.qname.uri); 10424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (value->value.qname.name != NULL) 10434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(value->value.qname.name); 10444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 10454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_HEXBINARY: 10464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (value->value.hex.str != NULL) 10474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(value->value.hex.str); 10484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 10494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_BASE64BINARY: 10504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (value->value.base64.str != NULL) 10514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(value->value.base64.str); 10524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 10534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik default: 10544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 10554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 10564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik prev = value; 10574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = value->next; 10584efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(prev); 1059f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 10604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 10614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 10624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 10634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaGetPredefinedType: 10644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name: the type name 10654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @ns: the URI of the namespace usually "http://www.w3.org/2001/XMLSchema" 10664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 10674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Lookup a type in the default XML Schemas type library 10684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 10694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns the type if found, NULL otherwise 10704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 10714255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaTypePtr 10724255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaGetPredefinedType(const xmlChar *name, const xmlChar *ns) { 10734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 10744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaInitTypes(); 10754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (name == NULL) 10764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(NULL); 10774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return((xmlSchemaTypePtr) xmlHashLookup2(xmlSchemaTypesBank, name, ns)); 10784255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 1079070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 108001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 108101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInListSimpleTypeItemType: 108201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in simple type. 108301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 10846927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Lookup function 10856927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * 1086c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns the item type of @type as defined by the built-in datatype 1087c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * hierarchy of XML Schema Part 2: Datatypes, or NULL in case of an error. 108801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 108901fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr 109001fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInListSimpleTypeItemType(xmlSchemaTypePtr type) 109101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 10924259532303e96e089a185c6f55056cb7c4902d71Daniel Veillard if ((type == NULL) || (type->type != XML_SCHEMA_TYPE_BASIC)) 109301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (NULL); 109401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type->builtInType) { 1095f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_NMTOKENS: 109601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNmtokenDef ); 1097f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_IDREFS: 109801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdrefDef); 109901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ENTITIES: 110001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeEntityDef); 110101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard default: 110201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (NULL); 110301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 110401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 110501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 1106070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**************************************************************** 1107070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 1108070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Convenience macros and functions * 1109070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 1110070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/ 1111070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1112070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_TZO_CHAR(c) \ 1113070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ((c == 0) || (c == 'Z') || (c == '+') || (c == '-')) 1114070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1115070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_YEAR(yr) (yr != 0) 1116070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MONTH(mon) ((mon >= 1) && (mon <= 12)) 1117070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* VALID_DAY should only be used when month is unknown */ 1118070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DAY(day) ((day >= 1) && (day <= 31)) 1119070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_HOUR(hr) ((hr >= 0) && (hr <= 23)) 1120070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MIN(min) ((min >= 0) && (min <= 59)) 1121070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_SEC(sec) ((sec >= 0) && (sec < 60)) 1122690a68095f589248c9e962c6b5468aacb6d3aabaKasimier T. Buchcik#define VALID_TZO(tzo) ((tzo > -840) && (tzo < 840)) 1123070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_LEAP(y) \ 1124070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) 1125070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1126ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonth[12] = 1127070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 1128ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonthLeap[12] = 1129070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 1130070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 11315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MAX_DAYINMONTH(yr,mon) \ 11325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1]) 11335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 1134070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MDAY(dt) \ 1135070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (IS_LEAP(dt->year) ? \ 1136070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (dt->day <= daysInMonthLeap[dt->mon - 1]) : \ 1137070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (dt->day <= daysInMonth[dt->mon - 1])) 1138070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1139070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATE(dt) \ 1140070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_YEAR(dt->year) && VALID_MONTH(dt->mon) && VALID_MDAY(dt)) 1141070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1142070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TIME(dt) \ 1143070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_HOUR(dt->hour) && VALID_MIN(dt->min) && \ 1144070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard VALID_SEC(dt->sec) && VALID_TZO(dt->tzo)) 1145070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1146070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATETIME(dt) \ 1147070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_DATE(dt) && VALID_TIME(dt)) 1148070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1149070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_MIN (60) 1150070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_HOUR (60 * SECS_PER_MIN) 1151070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_DAY (24 * SECS_PER_HOUR) 1152070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 11535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInYearByMonth[12] = 11545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; 11555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInLeapYearByMonth[12] = 11565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 }; 11575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 11585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DAY_IN_YEAR(day, month, year) \ 11595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((IS_LEAP(year) ? \ 11605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dayInLeapYearByMonth[month - 1] : \ 11615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dayInYearByMonth[month - 1]) + day) 11625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 11635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#ifdef DEBUG 11645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt) \ 11655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 11665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard "type=%o %04ld-%02u-%02uT%02u:%02u:%03f", \ 11675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->type,dt->value.date.year,dt->value.date.mon, \ 11685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->value.date.day,dt->value.date.hour,dt->value.date.min, \ 11695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->value.date.sec); \ 11705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt->value.date.tz_flag) \ 11715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt->value.date.tzo != 0) \ 11725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 11735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard "%+05d\n",dt->value.date.tzo); \ 11745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else \ 11755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, "Z\n"); \ 11765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else \ 11775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext,"\n") 11785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#else 11795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt) 11805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#endif 11815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 1182070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1183070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGYear: 1184070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1185070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1186070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1187070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gYear without time zone and fills in the appropriate 1188070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1189070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gYear. It is supposed that @dt->year is big enough to contain 1190070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * the year. 1191070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1192070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1193070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1194070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1195070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) { 1196070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str, *firstChar; 1197070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0, digcnt = 0; 1198070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1199070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (((*cur < '0') || (*cur > '9')) && 1200070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (*cur != '-') && (*cur != '+')) 1201070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1202070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1203070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 1204070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = 1; 1205070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1206070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1207070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1208070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard firstChar = cur; 1209070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1210070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 1211070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->year = dt->year * 10 + (*cur - '0'); 1212070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1213070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard digcnt++; 1214070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1215070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1216070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* year must be at least 4 digits (CCYY); over 4 1217070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * digits cannot have a leading zero. */ 1218070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0'))) 1219070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1220070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1221070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) 1222070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->year = - dt->year; 1223070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1224070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_YEAR(dt->year)) 1225070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1226070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1227070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1228070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1229070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1230070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1231070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1232070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_2_DIGITS: 1233070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the integer to fill in 1234070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1235070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer 1236070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1237070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a 2-digits integer and updates @num with the value. @cur is 1238070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer. 1239070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and 1240070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1241070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1242070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_2_DIGITS(num, cur, invalid) \ 1243070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((cur[0] < '0') || (cur[0] > '9') || \ 1244070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (cur[1] < '0') || (cur[1] > '9')) \ 1245070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard invalid = 1; \ 1246070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 1247070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = (cur[0] - '0') * 10 + (cur[1] - '0'); \ 1248070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur += 2; 1249070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1250070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1251070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_FLOAT: 1252070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the double to fill in 1253070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1254070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer 1255070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1256070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float and updates @num with the value. @cur is 1257070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the float. The float must have a 1258070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2-digits integer part and may or may not have a decimal part. 1259070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and 1260070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1261070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1262070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_FLOAT(num, cur, invalid) \ 1263070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(num, cur, invalid); \ 1264070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!invalid && (*cur == '.')) { \ 1265070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double mult = 1; \ 1266070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1267070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 1268070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard invalid = 1; \ 1269070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 1270070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mult /= 10; \ 1271070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num += (*cur - '0') * mult; \ 1272070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1273070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 1274070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1275070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1276070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1277070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGMonth: 1278070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1279070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1280070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1281070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gMonth without time zone and fills in the appropriate 1282070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1283070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gMonth. 1284070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1285070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1286070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1287070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1288070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) { 1289070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 1290070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 129164dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik unsigned int value = 0; 1292070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 129364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik PARSE_2_DIGITS(value, cur, ret); 1294070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1295070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1296070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 129764dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if (!VALID_MONTH(value)) 1298070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1299070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 130064dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik dt->mon = value; 130164dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik 1302070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1303070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1304070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1305070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1306070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1307070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGDay: 1308070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1309070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1310070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1311070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gDay without time zone and fills in the appropriate 1312070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1313070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay. 1314070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1315070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1316070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1317070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1318070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) { 1319070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 1320070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 132164dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik unsigned int value = 0; 1322070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 132364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik PARSE_2_DIGITS(value, cur, ret); 1324070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1325070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1326070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 132764dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if (!VALID_DAY(value)) 1328070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1329070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 133064dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik dt->day = value; 1331070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1332070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1333070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1334070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1335070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1336070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTime: 1337070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1338070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1339070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1340070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:time without time zone and fills in the appropriate 1341070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * fields of the @dt structure. @str is updated to point just after the 1342070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:time. 1343070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, values of @dt fields are undefined. 1344070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1345070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1346070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1347070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1348070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) { 1349f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard const xmlChar *cur = *str; 1350070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 1351285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik int value = 0; 1352070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 135364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik PARSE_2_DIGITS(value, cur, ret); 1354070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1355f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard return ret; 1356070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1357070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 135864dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if (!VALID_HOUR(value)) 135964dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik return 2; 1360070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1361070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1362070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* the ':' insures this string is xs:time */ 136364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik dt->hour = value; 1364070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 136564dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik PARSE_2_DIGITS(value, cur, ret); 1366070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1367070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 136864dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if (!VALID_MIN(value)) 136964dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik return 2; 137064dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik dt->min = value; 1371070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1372070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1373070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1374070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1375070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1376070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_FLOAT(dt->sec, cur, ret); 1377070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1378070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1379070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 138064dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if ((!VALID_SEC(dt->sec)) || (!VALID_TZO(dt->tzo))) 1381070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1382070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1383070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1384070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1385070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1386070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1387070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1388070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTimeZone: 1389070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1390070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1391070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1392070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a time zone without time zone and fills in the appropriate 1393070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1394070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * time zone. 1395070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1396070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1397070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1398070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1399070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) { 140014b5643947845df089376106517c4f7ba061e4b0Daniel Veillard const xmlChar *cur; 1401070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 1402070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1403070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (str == NULL) 1404070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 140514b5643947845df089376106517c4f7ba061e4b0Daniel Veillard cur = *str; 1406070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1407070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard switch (*cur) { 1408070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 0: 1409070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tz_flag = 0; 1410070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = 0; 1411070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1412070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1413070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 'Z': 1414070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tz_flag = 1; 1415070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = 0; 1416070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1417070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1418070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1419070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case '+': 1420070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case '-': { 1421070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0, tmp = 0; 1422070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = (*cur == '-'); 1423070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1424070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1425070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1426070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(tmp, cur, ret); 1427070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1428070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1429070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_HOUR(tmp)) 1430070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1431070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1432070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1433070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1434070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1435070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1436070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = tmp * 60; 1437070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1438070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(tmp, cur, ret); 1439070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1440070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1441070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_MIN(tmp)) 1442070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1443070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1444070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo += tmp; 1445070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) 1446070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = - dt->tzo; 1447070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1448070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_TZO(dt->tzo)) 1449070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1450070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 14515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->tz_flag = 1; 1452070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1453070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1454070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard default: 1455070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1456070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1457070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1458070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1459070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1460070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1461070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 14621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard/** 14631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * _xmlSchemaBase64Decode: 14641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * @ch: a character 14651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 14661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Converts a base64 encoded character to its base 64 value. 14671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 14681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Returns 0-63 (value), 64 (pad), or -1 (not recognized) 14691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */ 14701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic int 14711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard_xmlSchemaBase64Decode (const xmlChar ch) { 14721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('A' <= ch) && (ch <= 'Z')) return ch - 'A'; 14731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('a' <= ch) && (ch <= 'z')) return ch - 'a' + 26; 14741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('0' <= ch) && (ch <= '9')) return ch - '0' + 52; 14751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('+' == ch) return 62; 14761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('/' == ch) return 63; 14771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('=' == ch) return 64; 14781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return -1; 14791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard} 14801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 1481070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**************************************************************** 1482070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 1483070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * XML Schema Dates/Times Datatypes Handling * 1484070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 1485070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/ 1486070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1487070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1488070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_DIGITS: 1489070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the integer to fill in 1490070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1491070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag 1492070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1493070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a digits integer and updates @num with the value. @cur is 1494070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer. 1495070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and 1496070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1497070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1498070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_DIGITS(num, cur, num_type) \ 1499070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 1500070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = -1; \ 1501070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 1502070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 1503070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = num * 10 + (*cur - '0'); \ 1504070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1505070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1506070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1507070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1508070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_NUM: 1509070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the double to fill in 1510070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1511070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag 1512070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1513070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float or integer and updates @num with the value. @cur is 1514070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the number. If the number is a float, 1515070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * then it must have an integer part and a decimal part; @num_type will 1516070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * be set to 1. If there is no decimal part, @num_type is set to zero. 1517070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and 1518070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1519070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1520070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_NUM(num, cur, num_type) \ 1521070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = 0; \ 1522070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_DIGITS(num, cur, num_type); \ 1523070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!num_type && (*cur == '.')) { \ 1524070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double mult = 1; \ 1525070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1526070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 1527070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = -1; \ 1528070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 1529070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = 1; \ 1530070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 1531070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mult /= 10; \ 1532070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num += (*cur - '0') * mult; \ 1533070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1534070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 1535070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1536070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1537070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 15385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDates: 1539455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard * @type: the expected type or XML_SCHEMAS_UNKNOWN 1540070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dateTime: string to analyze 1541070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val: the return computed value 1542070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1543070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @dateTime conforms to the lexical space of one of the date types. 1544070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val. 1545070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1546070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 1547070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * and -1 in case of internal or API error. 1548070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1549070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1550455cc07308c673b6714e2f5670c2091a1dab95dcDaniel VeillardxmlSchemaValidateDates (xmlSchemaValType type, 15514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *dateTime, xmlSchemaValPtr *val, 15524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik int collapse) { 1553070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValPtr dt; 1554070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret; 1555070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = dateTime; 1556070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1557070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define RETURN_TYPE_IF_VALID(t) \ 1558070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (IS_TZO_CHAR(*cur)) { \ 1559070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); \ 1560070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 0) { \ 1561070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != 0) \ 1562070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; \ 1563070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->type = t; \ 1564455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard goto done; \ 1565070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 1566070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1567070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1568070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dateTime == NULL) 1569070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1570070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 15714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (collapse) 15724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 15734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 1574070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur != '-') && (*cur < '0') && (*cur > '9')) 1575070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1576070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1577070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN); 1578070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dt == NULL) 1579070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1580070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1581070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((cur[0] == '-') && (cur[1] == '-')) { 1582070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1583070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * It's an incomplete date (xs:gMonthDay, xs:gMonth or 1584070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay) 1585070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1586070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur += 2; 1587070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1588070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gDay? */ 1589070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 1590455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard if (type == XML_SCHEMAS_GMONTH) 1591455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard goto error; 1592070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ++cur; 1593070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1594070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1595070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1596070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1597070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY); 1598070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1599070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1600070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1601070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1602070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1603070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * it should be an xs:gMonthDay or xs:gMonth 1604070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1605070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); 1606070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1607070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1608070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1609d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1610d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a '-' char could indicate this type is xs:gMonthDay or 1611d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a negative time zone offset. Check for xs:gMonthDay first. 1612d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * Also the first three char's of a negative tzo (-MM:SS) can 1613d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * appear to be a valid day; so even if the day portion 1614d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * of the xs:gMonthDay verifies, we must insure it was not 1615d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a tzo. 1616d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1617d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if (*cur == '-') { 1618d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const xmlChar *rewnd = cur; 1619d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard cur++; 1620d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1621f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1622d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((ret == 0) && ((*cur == 0) || (*cur != ':'))) { 1623d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1624d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1625d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * we can use the VALID_MDAY macro to validate the month 1626d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * and day because the leap year test will flag year zero 1627d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * as a leap year (even though zero is an invalid year). 16284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * FUTURE TODO: Zero will become valid in XML Schema 1.1 16294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * probably. 1630d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1631d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if (VALID_MDAY((&(dt->value.date)))) { 1632d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1633d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY); 1634070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1635d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1636d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1637d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1638d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1639d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1640d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * not xs:gMonthDay so rewind and check if just xs:gMonth 1641d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * with an optional time zone. 1642d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1643d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard cur = rewnd; 1644d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1645d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1646d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH); 1647070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1648070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1649070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1650070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1651070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1652070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * It's a right-truncated date or an xs:time. 1653070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Try to parse an xs:time then fallback on right-truncated dates. 1654070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1655070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur >= '0') && (*cur <= '9')) { 1656070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTime(&(dt->value.date), &cur); 1657070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 0) { 1658070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* it's an xs:time */ 1659070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_TIME); 1660070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1661070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1662070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1663070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* fallback on date parsing */ 1664070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur = dateTime; 1665070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1666070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGYear(&(dt->value.date), &cur); 1667070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1668070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1669070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1670070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gYear? */ 1671070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEAR); 1672070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1673070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != '-') 1674070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1675070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1676070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1677070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); 1678070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1679070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1680070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1681070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gYearMonth? */ 1682070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEARMONTH); 1683070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1684070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != '-') 1685070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1686070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1687070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1688070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1689070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret != 0) || !VALID_DATE((&(dt->value.date)))) 1690070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1691070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1692070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:date? */ 1693070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_DATE); 1694070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1695070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != 'T') 1696070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1697070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1698070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1699070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* it should be an xs:dateTime */ 1700070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTime(&(dt->value.date), &cur); 1701070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1702070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1703070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1704070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); 17054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (collapse) 17064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 17076a0baa0cd89b402cdfbb63e9c40f291ebd191f1dDaniel Veillard if ((ret != 0) || (*cur != 0) || (!(VALID_DATETIME((&(dt->value.date)))))) 1708070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1709070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1710455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard 1711070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->type = XML_SCHEMAS_DATETIME; 1712070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1713455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillarddone: 1714d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#if 1 1715d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) 1716d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1717d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#else 1718d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1719d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * insure the parsed type is equal to or less significant (right 1720d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * truncated) than the desired type. 1721d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1722d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) { 1723d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1724d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* time only matches time */ 1725d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_TIME) && (dt->type == XML_SCHEMAS_TIME)) 1726d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1727d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1728d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_DATETIME) && 1729d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard ((dt->type != XML_SCHEMAS_DATE) || 1730d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEARMONTH) || 1731d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEAR))) 1732d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1733d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1734d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_DATE) && 1735d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard ((dt->type != XML_SCHEMAS_GYEAR) || 1736d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEARMONTH))) 1737d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1738d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1739d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_GYEARMONTH) && (dt->type != XML_SCHEMAS_GYEAR)) 1740d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1741d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1742d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_GMONTHDAY) && (dt->type != XML_SCHEMAS_GMONTH)) 1743d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1744d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1745455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard#endif 1746455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard 1747070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (val != NULL) 1748070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *val = dt; 174980b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 175080b19092f24410a6b869abf519227686e8f207caDaniel Veillard xmlSchemaFreeValue(dt); 1751070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1752070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1753070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1754070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror: 1755070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dt != NULL) 1756070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaFreeValue(dt); 1757070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1758070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1759070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1760070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 17615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDuration: 1762070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @type: the predefined type 1763070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @duration: string to analyze 1764070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val: the return computed value 1765070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1766070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @duration conforms to the lexical space of the duration type. 1767070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val. 1768070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1769070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 1770070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * and -1 in case of internal or API error. 1771070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1772070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1773dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED, 17744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *duration, xmlSchemaValPtr *val, 17754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik int collapse) { 1776070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = duration; 1777070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValPtr dur; 1778070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0; 1779070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int seq = 0; 1780d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard double num; 1781d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard int num_type = 0; /* -1 = invalid, 0 = int, 1 = floating */ 1782d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const xmlChar desig[] = {'Y', 'M', 'D', 'H', 'M', 'S'}; 1783d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const double multi[] = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0}; 1784070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1785070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (duration == NULL) 1786070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1787070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 17884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (collapse) 17894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 17904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 1791070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 1792070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = 1; 1793070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1794070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1795070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1796070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* duration must start with 'P' (after sign) */ 1797070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur++ != 'P') 1798070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1799070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 180080b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (*cur == 0) 180180b19092f24410a6b869abf519227686e8f207caDaniel Veillard return 1; 180280b19092f24410a6b869abf519227686e8f207caDaniel Veillard 1803070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); 1804070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dur == NULL) 1805070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1806070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1807070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while (*cur != 0) { 1808070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1809070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* input string should be empty or invalid date/time item */ 1810070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (seq >= sizeof(desig)) 1811070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1812070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1813070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* T designator must be present for time items */ 1814070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == 'T') { 1815070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (seq <= 3) { 1816070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard seq = 3; 1817070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1818070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else 1819070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1820070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else if (seq == 3) 1821070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1822070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1823070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* parse the number portion of the item */ 1824070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_NUM(num, cur, num_type); 1825070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1826070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((num_type == -1) || (*cur == 0)) 1827070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1828070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1829070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* update duration based on item type */ 1830070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while (seq < sizeof(desig)) { 1831070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == desig[seq]) { 1832070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1833070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* verify numeric type; only seconds can be float */ 1834070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((num_type != 0) && (seq < (sizeof(desig)-1))) 1835070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1836070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1837070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard switch (seq) { 1838070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 0: 1839070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon = (long)num * 12; 1840070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1841070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 1: 1842070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon += (long)num; 1843070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1844070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard default: 1845070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* convert to seconds using multiplier */ 1846070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.sec += num * multi[seq]; 1847070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard seq++; 1848070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1849070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1850070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1851070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; /* exit loop */ 1852070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1853070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* no date designators found? */ 1854c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((++seq == 3) || (seq == 6)) 1855070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1856070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 18574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 18584efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (collapse) 1859f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard while IS_WSP_BLANK_CH(*cur) cur++; 1860070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1861070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1862070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) { 1863070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon = -dur->value.dur.mon; 1864070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.day = -dur->value.dur.day; 1865070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.sec = -dur->value.dur.sec; 1866070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1867070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1868070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (val != NULL) 1869070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *val = dur; 187080b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 187180b19092f24410a6b869abf519227686e8f207caDaniel Veillard xmlSchemaFreeValue(dur); 1872070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1873070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1874070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1875070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror: 1876070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dur != NULL) 1877070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaFreeValue(dur); 1878070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1879070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1880070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1881a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard/** 1882a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * xmlSchemaStrip: 1883a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * @value: a value 1884a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * 1885a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Removes the leading and ending spaces of a string 1886a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * 1887a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the new string or NULL if no change was required. 1888a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard */ 1889a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlChar * 1890a1a9d0410000cc69874e53e438b250037d3e14cdDaniel VeillardxmlSchemaStrip(const xmlChar *value) { 1891a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard const xmlChar *start = value, *end, *f; 1892a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard 1893a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if (value == NULL) return(NULL); 189476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*start != 0) && (IS_BLANK_CH(*start))) start++; 1895a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end = start; 1896a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard while (*end != 0) end++; 1897a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard f = end; 1898a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end--; 189976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((end > start) && (IS_BLANK_CH(*end))) end--; 1900a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end++; 1901a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if ((start == value) && (f == end)) return(NULL); 1902a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(xmlStrndup(start, end - start)); 1903a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard} 190496a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard 190596a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard/** 190691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * xmlSchemaWhiteSpaceReplace: 190791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * @value: a value 190891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * 190991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Replaces 0xd, 0x9 and 0xa with a space. 191091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * 191191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Returns the new string or NULL if no change was required. 191291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik */ 191391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlChar * 191491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlSchemaWhiteSpaceReplace(const xmlChar *value) { 1915f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard const xmlChar *cur = value; 1916f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard xmlChar *ret = NULL, *mcur; 191791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 1918f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard if (value == NULL) 191991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik return(NULL); 1920f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 1921f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard while ((*cur != 0) && 192291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik (((*cur) != 0xd) && ((*cur) != 0x9) && ((*cur) != 0xa))) { 192391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik cur++; 192491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik } 192591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if (*cur == 0) 192691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik return (NULL); 192791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik ret = xmlStrdup(value); 192891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik /* TODO FIXME: I guess gcc will bark at this. */ 192991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik mcur = (xmlChar *) (ret + (cur - value)); 193091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik do { 193191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if ( ((*mcur) == 0xd) || ((*mcur) == 0x9) || ((*mcur) == 0xa) ) 193291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik *mcur = ' '; 193391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik mcur++; 1934f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } while (*mcur != 0); 193591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik return(ret); 193691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik} 193791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 193891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik/** 1939b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCollapseString: 1940b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: a value 1941b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 1942b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Removes and normalize white spaces in the string 1943b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 1944b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns the new string or NULL if no change was required. 1945b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 194601fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlChar * 1947b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCollapseString(const xmlChar *value) { 1948b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard const xmlChar *start = value, *end, *f; 1949b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlChar *g; 1950b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard int col = 0; 1951b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1952b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (value == NULL) return(NULL); 195376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*start != 0) && (IS_BLANK_CH(*start))) start++; 1954b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end = start; 1955b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while (*end != 0) { 195676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if ((*end == ' ') && (IS_BLANK_CH(end[1]))) { 1957b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard col = end - start; 1958b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard break; 1959b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) { 1960b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard col = end - start; 1961b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard break; 1962b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1963b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 1964b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1965b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (col == 0) { 1966b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard f = end; 1967b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end--; 196876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((end > start) && (IS_BLANK_CH(*end))) end--; 1969b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 1970b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((start == value) && (f == end)) return(NULL); 1971b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(xmlStrndup(start, end - start)); 1972b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1973b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard start = xmlStrdup(start); 1974b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (start == NULL) return(NULL); 1975b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard g = (xmlChar *) (start + col); 1976b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end = g; 1977b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while (*end != 0) { 197876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (IS_BLANK_CH(*end)) { 1979b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 198076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*end)) end++; 1981b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*end != 0) 1982b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g++ = ' '; 1983b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else 1984b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g++ = *end++; 1985b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1986b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g = 0; 1987b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return((xmlChar *) start); 1988b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 1989b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1990b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 199128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * xmlSchemaValAtomicListNode: 199228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @type: the predefined atomic type for a token in the list 199328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @value: the list value to check 199428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @ret: the return computed value 199528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @node: the node containing the value 199628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * 199728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Check that a value conforms to the lexical space of the predefined 199828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * list type. if true a value is computed and returned in @ret. 199928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * 2000a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the number of items if this validates, a negative error code 2001a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * number otherwise 200228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */ 200328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillardstatic int 200428c52ab518d34a36fd8da6870a5850088f129a6aDaniel VeillardxmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value, 200528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlSchemaValPtr *ret, xmlNodePtr node) { 200628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlChar *val, *cur, *endval; 200728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard int nb_values = 0; 2008580ced8ee28ecd99374da9383897678e4ba6c358Daniel Veillard int tmp = 0; 200928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard 201028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (value == NULL) { 201128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard return(-1); 201228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 201328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard val = xmlStrdup(value); 201428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (val == NULL) { 201528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard return(-1); 201628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 20176fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard if (ret != NULL) { 20186fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard *ret = NULL; 20196fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard } 202028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur = val; 202128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard /* 202228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Split the list 202328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */ 202476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*cur)) *cur++ = 0; 202528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (*cur != 0) { 202676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (IS_BLANK_CH(*cur)) { 202728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *cur = 0; 202828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur++; 202976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*cur)) *cur++ = 0; 203028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } else { 203128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard nb_values++; 203228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur++; 203376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++; 203428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 203528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 203628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (nb_values == 0) { 203728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlFree(val); 2038a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(nb_values); 203928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 204028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard endval = cur; 204128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur = val; 204228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while ((*cur == 0) && (cur != endval)) cur++; 204328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (cur != endval) { 204428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node); 204528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (tmp != 0) 204628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard break; 204728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (*cur != 0) cur++; 204828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while ((*cur == 0) && (cur != endval)) cur++; 204928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 20506fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard /* TODO what return value ? c.f. bug #158628 205128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (ret != NULL) { 205228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard TODO 20536fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard } */ 20546fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard xmlFree(val); 2055a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if (tmp == 0) 2056a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(nb_values); 2057a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(-1); 205828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard} 205928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard 206028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard/** 2061e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * xmlSchemaParseUInt: 2062e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @str: pointer to the string R/W 2063e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @llo: pointer to the low result 2064e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lmi: pointer to the mid result 2065e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lhi: pointer to the high result 2066e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * 2067e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Parse an unsigned long into 3 fields. 2068e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * 2069ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack * Returns the number of significant digits in the number or 2070bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard * -1 if overflow of the capacity and -2 if it's not a number. 2071e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard */ 2072e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic int 2073e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel VeillardxmlSchemaParseUInt(const xmlChar **str, unsigned long *llo, 2074478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik unsigned long *lmi, unsigned long *lhi) { 2075e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long lo = 0, mi = 0, hi = 0; 2076e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard const xmlChar *tmp, *cur = *str; 2077e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard int ret = 0, i = 0; 2078e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 2079f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard if (!((*cur >= '0') && (*cur <= '9'))) 2080bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard return(-2); 2081bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard 2082478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (*cur == '0') { /* ignore leading zeroes */ 2083478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik cur++; 2084e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2085e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard tmp = cur; 2086e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) { 2087478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik i++;tmp++;ret++; 2088e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2089e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (i > 24) { 2090478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *str = tmp; 2091478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return(-1); 2092e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2093e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 16) { 2094478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik hi = hi * 10 + (*cur++ - '0'); 2095478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik i--; 2096e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2097e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 8) { 2098478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik mi = mi * 10 + (*cur++ - '0'); 2099478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik i--; 2100e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2101e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 0) { 2102478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik lo = lo * 10 + (*cur++ - '0'); 2103478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik i--; 2104e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2105e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 2106e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *str = cur; 2107e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *llo = lo; 2108e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *lmi = mi; 2109e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *lhi = hi; 2110e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(ret); 2111e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard} 2112e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 2113e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard/** 2114b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValAtomicType: 21154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type: the predefined type 21164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to check 21174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val: the return computed value 2118c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @node: the node containing the value 2119b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * flags: flags to control the vlidation 21204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 2121b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the atomic type. 21224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * if true a value is computed and returned in @val. 212301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * This checks the value space for list types as well (IDREFS, NMTOKENS). 21244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 21254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 21264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * and -1 in case of internal or API error. 21274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 2128b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int 21291ac24d36b12487995b659a8fc23a02b9460edb36Daniel VeillardxmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, 21304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaValPtr * val, xmlNodePtr node, int flags, 21314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws, 21324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik int normOnTheFly, int applyNorm, int createStringValue) 21331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard{ 21344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValPtr v; 2135b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlChar *norm = NULL; 2136d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard int ret = 0; 21374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 21384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 213901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitTypes(); 21404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (type == NULL) 21411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (-1); 21425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 2143eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard /* 2144eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard * validating a non existant text node is similar to validating 2145eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard * an empty one. 2146eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard */ 2147eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard if (value == NULL) 2148eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard value = BAD_CAST ""; 2149eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard 21504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (val != NULL) 21511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = NULL; 2152b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((flags == 0) && (value != NULL)) { 215391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 215401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((type->builtInType != XML_SCHEMAS_STRING) && 2155f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard (type->builtInType != XML_SCHEMAS_ANYTYPE) && 215691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik (type->builtInType != XML_SCHEMAS_ANYSIMPLETYPE)) { 215791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if (type->builtInType == XML_SCHEMAS_NORMSTRING) 215891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik norm = xmlSchemaWhiteSpaceReplace(value); 215991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik else 216091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 21611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 21621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value = norm; 21631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2164b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 2165b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 216601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type->builtInType) { 2167f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_UNKNOWN: 21681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 21692f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_ANYTYPE: 21702f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_ANYSIMPLETYPE: 21714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((createStringValue) && (val != NULL)) { 21724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik v = xmlSchemaNewValue(XML_SCHEMAS_ANYSIMPLETYPE); 21734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (v != NULL) { 21744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik v->value.str = xmlStrdup(value); 21754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *val = v; 21764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 21774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto error; 2178f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 21794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21802f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack goto return0; 2181f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_STRING: 21824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (! normOnTheFly) { 21834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *cur = value; 21844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 21854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_REPLACE) { 21864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (*cur != 0) { 21874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 21884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 21894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 21904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 21914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) { 21944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (*cur != 0) { 21954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 21964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 21974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if IS_WSP_SPACE_CH(*cur) { 21984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 21994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if IS_WSP_SPACE_CH(*cur) 22004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 22014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 22024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 22034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (createStringValue && (val != NULL)) { 22084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (applyNorm) { 22094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 22104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 22114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else if (ws == XML_SCHEMA_WHITESPACE_REPLACE) 22124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaWhiteSpaceReplace(value); 22134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (norm != NULL) 22144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = norm; 22154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik v = xmlSchemaNewValue(XML_SCHEMAS_STRING); 22174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (v != NULL) { 22184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik v->value.str = xmlStrdup(value); 22194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *val = v; 22204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 22214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto error; 22224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 22251516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard case XML_SCHEMAS_NORMSTRING:{ 22264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) { 22274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (applyNorm) { 22284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 22294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 22304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else 22314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaWhiteSpaceReplace(value); 22324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (norm != NULL) 22334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = norm; 22344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 22364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *cur = value; 22374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (*cur != 0) { 22384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 22394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 22404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 22414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 22424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22451516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard if (val != NULL) { 22461516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NORMSTRING); 22471516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard if (v != NULL) { 22481516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard v->value.str = xmlStrdup(value); 22491516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard *val = v; 22501516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } else { 22511516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard goto error; 22521516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 22531516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 22541516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard goto return0; 22551516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 22561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_DECIMAL:{ 2257273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack const xmlChar *cur = value; 225872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik unsigned int len, neg, integ, hasLeadingZeroes; 2259273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack xmlChar cval[25]; 2260f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard xmlChar *cptr = cval; 22611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 226272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if ((cur == NULL) || (*cur == 0)) 22631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 22644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 226572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* 226672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * xs:decimal has a whitespace-facet value of 'collapse'. 226772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik */ 22684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 22694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 22704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 227172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* 227272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * First we handle an optional sign. 227372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik */ 227472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik neg = 0; 227572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (*cur == '-') { 227672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik neg = 1; 22771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 227872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } else if (*cur == '+') 22791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 228072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* 228172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * Disallow: "", "-", "- " 228272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik */ 228372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (*cur == 0) 228472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik goto return1; 2285273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 2286273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * Next we "pre-parse" the number, in preparation for calling 2287273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * the common routine xmlSchemaParseUInt. We get rid of any 2288273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * leading zeroes (because we have reserved only 25 chars), 228972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * and note the position of a decimal point. 2290273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 2291273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack len = 0; 229272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik integ = ~0u; 229372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik hasLeadingZeroes = 0; 2294c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 2295c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Skip leading zeroes. 2296c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 229772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik while (*cur == '0') { 2298273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack cur++; 229972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik hasLeadingZeroes = 1; 230072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } 2301c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (*cur != 0) { 230272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik do { 2303c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((*cur >= '0') && (*cur <= '9')) { 2304c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *cptr++ = *cur++; 2305c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik len++; 2306c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else if (*cur == '.') { 2307c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik cur++; 230872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik integ = len; 230972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik do { 231072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if ((*cur >= '0') && (*cur <= '9')) { 231172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik *cptr++ = *cur++; 231272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik len++; 231372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } else 231472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik break; 231572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } while (len < 24); 231672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* 231772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * Disallow "." but allow "00." 231872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik */ 231972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if ((len == 0) && (!hasLeadingZeroes)) 2320c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik goto return1; 2321c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 2322c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else 2323c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 232472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } while (len < 24); 2325273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 23264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 23274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 2328273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (*cur != 0) 232972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik goto return1; /* error if any extraneous chars */ 23301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 23311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL); 23321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 2333273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 2334f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Now evaluate the significant digits of the number 2335f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard */ 233672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (len != 0) { 2337f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 233872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (integ != ~0u) { 233972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* 234072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * Get rid of trailing zeroes in the 234172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * fractional part. 234272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik */ 234372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik while ((len != integ) && (*(cptr-1) == '0')) { 234472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik cptr--; 234572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik len--; 234672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } 234772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } 234872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* 234972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * Terminate the (preparsed) string. 235072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik */ 235172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (len != 0) { 2352bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard *cptr = 0; 235372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik cptr = cval; 2354bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard 235572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik xmlSchemaParseUInt((const xmlChar **)&cptr, 235672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik &v->value.decimal.lo, 235772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik &v->value.decimal.mi, 235872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik &v->value.decimal.hi); 2359273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 2360273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 2361c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 2362c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Set the total digits to 1 if a zero value. 2363c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 23641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = neg; 236572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (len == 0) { 236672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* Speedup for zero values. */ 236772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik v->value.decimal.total = 1; 2368273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else { 2369c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik v->value.decimal.total = len; 237072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (integ == ~0u) 237172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik v->value.decimal.frac = 0; 237272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik else 237372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik v->value.decimal.frac = len - integ; 2374273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 23751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 23761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 23791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2380b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_TIME: 2381b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GDAY: 2382b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GMONTH: 2383b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GMONTHDAY: 2384b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GYEAR: 2385b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GYEARMONTH: 2386b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DATE: 2387b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DATETIME: 23884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = xmlSchemaValidateDates(type->builtInType, value, val, 23894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik normOnTheFly); 23901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 2391b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DURATION: 23924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = xmlSchemaValidateDuration(type, value, val, 23934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik normOnTheFly); 23941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 2395b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_FLOAT: 23965f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly case XML_SCHEMAS_DOUBLE: { 23971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 23981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int neg = 0; 23995f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly int digits_before = 0; 24005f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly int digits_after = 0; 24011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 24024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 24034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 24044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 24051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) { 24061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur += 3; 24071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 24081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 24101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 24111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 24121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 24131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathNAN; 24141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 24161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 24201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 24211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathNAN; 24221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 24241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 24281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 24301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 24321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard neg = 1; 24331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) { 24361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur += 3; 24371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 24381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 24401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 24411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 24421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 24431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (neg) 24441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathNINF; 24451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 24461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathPINF; 24471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 24491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 24531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 24541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (neg) 24551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathNINF; 24561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 24571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathPINF; 24581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 24601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 24641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 24661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((neg == 0) && (*cur == '+')) 24681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-')) 24701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 24721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24735f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly digits_before++; 24741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '.') { 24761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24775f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly while ((*cur >= '0') && (*cur <= '9')) { 24781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24795f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly digits_after++; 24805f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly } 24811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24821ea95900468ec45c251dd44093830569af28e657Daniel Veillard if ((digits_before == 0) && (digits_after == 0)) 24835f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly goto return1; 24841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((*cur == 'e') || (*cur == 'E')) { 24851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((*cur == '-') || (*cur == '+')) 24871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) 24891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 24924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 24934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 24941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 24951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 24971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 24981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 24991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 25006c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik /* 25016c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * TODO: sscanf seems not to give the correct 25026c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * value for extremely high/low values. 25036c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * E.g. "1E-149" results in zero. 25046c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 2505d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard if (sscanf((const char *) value, "%f", 25061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard &(v->value.f)) == 1) { 25076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *val = v; 25081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 25091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 25101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 25131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 25141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 25161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 25171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 25186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik /* 25196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * TODO: sscanf seems not to give the correct 25206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * value for extremely high/low values. 25216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 2522d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard if (sscanf((const char *) value, "%lf", 25231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard &(v->value.d)) == 1) { 25241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 25251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 25261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 25271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 25301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 25311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 25351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BOOLEAN:{ 25371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 25381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 25394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) { 25404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 25414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur == '0') { 25424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 0; 25434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 25444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (*cur == '1') { 25454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 1; 25464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 25474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (*cur == 't') { 25484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 25494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur++ == 'r') && (*cur++ == 'u') && 25504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik (*cur++ == 'e')) { 25514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 1; 25524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else 25534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 25544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (*cur == 'f') { 25554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 25564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur++ == 'a') && (*cur++ == 'l') && 25574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik (*cur++ == 's') && (*cur++ == 'e')) { 25584efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 0; 25594efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else 25604efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 25611869be56906ed5488b7db6d7c16f1c473af1485dKasimier T. Buchcik } else 25621869be56906ed5488b7db6d7c16f1c473af1485dKasimier T. Buchcik goto return1; 25634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur != 0) { 25644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 25654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur != 0) 25664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 25674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 25684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 25694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((cur[0] == '0') && (cur[1] == 0)) 25704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 0; 25714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else if ((cur[0] == '1') && (cur[1] == 0)) 25724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 1; 25734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else if ((cur[0] == 't') && (cur[1] == 'r') 25744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik && (cur[2] == 'u') && (cur[3] == 'e') 25754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik && (cur[4] == 0)) 25764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 1; 25774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else if ((cur[0] == 'f') && (cur[1] == 'a') 25784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik && (cur[2] == 'l') && (cur[3] == 's') 25794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik && (cur[4] == 'e') && (cur[5] == 0)) 25804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 0; 25814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else 25824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 25834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 25841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 25851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN); 25861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 25871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.b = ret; 25881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 25891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 25901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 25911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 25941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_TOKEN:{ 25961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 25971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 25984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (! normOnTheFly) { 25994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (*cur != 0) { 26004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 26014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 26024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (*cur == ' ') { 26034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 26044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur == 0) 26054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 26064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur == ' ') 26074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 26084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 26094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 26104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 2611f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 2612f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 26131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 26141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN); 26151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 26161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 26171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 26181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 26191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 26201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 26231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2624b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_LANGUAGE: 2625f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard if (normOnTheFly) { 26264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 26274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (norm != NULL) 26284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = norm; 26294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 26301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (xmlCheckLanguageID(value) == 1) { 26311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 26321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE); 26331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 26341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 26351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 26361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 26371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 26381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 26411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2643b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NMTOKEN: 26441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (xmlValidateNMToken(value, 1) == 0) { 26451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 26461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN); 26471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 26481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 26491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 26501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 26511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 26521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 26551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2657b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NMTOKENS: 26581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef, 26591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 26601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret > 0) 26611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 26621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 26631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 26641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2665b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NAME: 26661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateName(value, 1); 2667df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard if ((ret == 0) && (val != NULL) && (value != NULL)) { 2668df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NAME); 2669df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard if (v != NULL) { 2670df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard const xmlChar *start = value, *end; 2671df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard while (IS_BLANK_CH(*start)) start++; 2672df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard end = start; 2673df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard while ((*end != 0) && (!IS_BLANK_CH(*end))) end++; 2674df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard v->value.str = xmlStrndup(start, end - start); 2675df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard *val = v; 2676df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard } else { 2677df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard goto error; 2678df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard } 26791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 26811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_QNAME:{ 26821c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik const xmlChar *uri = NULL; 26831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *local = NULL; 26841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 26851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateQName(value, 1); 26861c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (ret != 0) 26871c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik goto done; 26881c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (node != NULL) { 26891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *prefix; 26901c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlNsPtr ns; 26911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 26921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard local = xmlSplitQName2(value, &prefix); 26931c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik ns = xmlSearchNs(node->doc, node, prefix); 26941c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if ((ns == NULL) && (prefix != NULL)) { 26951c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlFree(prefix); 26961c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (local != NULL) 26971c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlFree(local); 26981c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik goto return1; 26991c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik } 27001c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (ns != NULL) 27011c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik uri = ns->href; 27021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) 27031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(prefix); 27041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27051c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (val != NULL) { 27061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_QNAME); 27071c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (v == NULL) { 27081c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (local != NULL) 27091c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlFree(local); 27101c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik goto error; 27111c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik } 27121c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (local != NULL) 27131c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik v->value.qname.name = local; 27141c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik else 27151c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik v->value.qname.name = xmlStrdup(value); 27161c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (uri != NULL) 27171c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik v->value.qname.uri = xmlStrdup(uri); 27181c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik *val = v; 27191c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik } else 27201c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (local != NULL) 27211c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlFree(local); 27221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 27231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2724b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NCNAME: 27251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 27261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 27271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME); 27281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 27291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 27301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 27311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 27321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 27331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2736b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_ID: 27371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 27381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 27391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_ID); 27401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 27411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 27421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 27431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 27441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 27451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 27481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 27491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 27501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 27511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 27521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * NOTE: the IDness might have already be declared in the DTD 27531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */ 27541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (attr->atype != XML_ATTRIBUTE_ID) { 27551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlIDPtr res; 27561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 27571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 27581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 27591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 27601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard res = xmlAddID(NULL, node->doc, strip, attr); 27611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 27621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 27631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard res = xmlAddID(NULL, node->doc, value, attr); 27641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (res == NULL) { 27651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 2; 27661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 27671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ID; 27681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2772b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_IDREF: 27731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 27741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 27756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik v = xmlSchemaNewValue(XML_SCHEMAS_IDREF); 27766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (v == NULL) 27776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik goto error; 27786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik v->value.str = xmlStrdup(value); 27796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *val = v; 27801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 27821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 27831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 27841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 27851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 27861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 27871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 27881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAddRef(NULL, node->doc, strip, attr); 27891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 27901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 27911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAddRef(NULL, node->doc, value, attr); 27921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_IDREF; 27931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2795b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_IDREFS: 27961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef, 27971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 27981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret < 0) 27991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 2; 28001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 28011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 28021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 28031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 28041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 2805249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard 28061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_IDREFS; 28071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 28091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_ENTITY:{ 28101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 28111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 28131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 28141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 3; 28151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 0) { 28161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlEntityPtr ent; 28171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 28191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 28201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ent = xmlGetDocEntity(node->doc, strip); 28211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 28221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 28231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ent = xmlGetDocEntity(node->doc, value); 28241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ent == NULL) || 28261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (ent->etype != 28271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard XML_EXTERNAL_GENERAL_UNPARSED_ENTITY)) 28281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 4; 28291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 28311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard TODO; 28321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 28341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 28351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 2836a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard 28371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ENTITY; 28381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 28401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2841b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_ENTITIES: 28421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 28431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return3; 28441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef, 28451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 28461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret <= 0) 28471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 28481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 28491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 28501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 28511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 28521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 28531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ENTITIES; 28551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 28571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_NOTATION:{ 28581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *uri = NULL; 28591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *local = NULL; 28601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateQName(value, 1); 28621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL)) { 28631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *prefix; 28641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard local = xmlSplitQName2(value, &prefix); 28661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) { 28671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlNsPtr ns; 28681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ns = xmlSearchNs(node->doc, node, prefix); 28701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ns == NULL) 28711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 28721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (val != NULL) 28731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard uri = xmlStrdup(ns->href); 28741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((local != NULL) && ((val == NULL) || (ret != 0))) 28761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(local); 28771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) 28781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(prefix); 28791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 28811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 3; 28821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 0) { 28831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNotationUse(NULL, node->doc, value); 28841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 1) 28851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 28861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 28871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 28881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 28901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION); 28911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 28921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (local != NULL) 28931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.name = local; 28941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 28951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.name = xmlStrdup(value); 28961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (uri != NULL) 28971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.uri = uri; 28981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 29001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 29011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (local != NULL) 29021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(local); 29031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (uri != NULL) 29041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(uri); 29051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 29061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2909560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 2910f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_ANYURI:{ 291111c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (*value != 0) { 29124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlURIPtr uri; 2913933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre xmlChar *tmpval, *cur; 2914f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard if (normOnTheFly) { 29154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 29164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (norm != NULL) 29174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = norm; 29184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 2919933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre tmpval = xmlStrdup(value); 2920933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre for (cur = tmpval; *cur; ++cur) { 2921933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre if (*cur < 32 || *cur >= 127 || *cur == ' ' || 2922933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre *cur == '<' || *cur == '>' || *cur == '"' || 2923933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre *cur == '{' || *cur == '}' || *cur == '|' || 2924933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre *cur == '\\' || *cur == '^' || *cur == '`' || 2925933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre *cur == '\'') 2926933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre *cur = '_'; 2927933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre } 2928933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre uri = xmlParseURI((const char *) tmpval); 2929933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre xmlFree(tmpval); 293011c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (uri == NULL) 293111c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard goto return1; 293211c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard xmlFreeURI(uri); 293311c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard } 2934560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 29351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 293611c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_ANYURI); 293711c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (v == NULL) 293811c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard goto error; 293911c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard v->value.str = xmlStrdup(value); 294011c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard *val = v; 29411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 29431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_HEXBINARY:{ 29458dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik const xmlChar *cur = value, *start; 29461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *base; 29471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int total, i = 0; 2948560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 2949f34a20e69dc675cd23d3eb558cad135ea280f472Daniel Veillard if (cur == NULL) 29501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2951560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 29524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 29534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 29544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 29558dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik start = cur; 29561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while (((*cur >= '0') && (*cur <= '9')) || 29571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((*cur >= 'A') && (*cur <= 'F')) || 29581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((*cur >= 'a') && (*cur <= 'f'))) { 29591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard i++; 29601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 29611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 29634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 2964560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 29651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 29661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 29671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((i % 2) != 0) 296870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard goto return1; 2969560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 29701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 29711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 29721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY); 29731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v == NULL) 29741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 29754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* 29764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Copy only the normalized piece. 29774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * CRITICAL TODO: Check this. 29784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */ 29798dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik cur = xmlStrndup(start, i); 29801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) { 2981d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard xmlSchemaTypeErrMemory(node, "allocating hexbin data"); 29821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(v); 29831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 29841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 29861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total = i / 2; /* number of octets */ 298770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 29881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base = (xmlChar *) cur; 29891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while (i-- > 0) { 29901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*base >= 'a') 29911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = *base - ('a' - 'A'); 29921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base++; 29931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 299470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 29951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.hex.str = (xmlChar *) cur; 29961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.hex.total = total; 29971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 29981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 30001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 30011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BASE64BINARY:{ 30021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* ISSUE: 3003f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * 30041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Ignore all stray characters? (yes, currently) 30051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Worry about long lines? (no, currently) 3006f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * 30071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * rfc2045.txt: 3008f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * 30091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * "The encoded output stream must be represented in lines of 30101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * no more than 76 characters each. All line breaks or other 30111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * characters not found in Table 1 must be ignored by decoding 30121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * software. In base64 data, characters other than those in 30131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Table 1, line breaks, and other white space probably 30141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * indicate a transmission error, about which a warning 30151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * message or even a message rejection might be appropriate 30161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * under some circumstances." */ 30171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 30181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *base; 30191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int total, i = 0, pad = 0; 30201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 30221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (; *cur; ++cur) { 30251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 30261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur); 30281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc < 0) ; 30291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (decc < 64) 30301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard i++; 30311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 30321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 30331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 30341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (; *cur; ++cur) { 30351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 30361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur); 30381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc < 0) ; 30391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (decc < 64) 30401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc == 64) 30421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard pad++; 30431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 30441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* rfc2045.txt: "Special processing is performed if fewer than 30461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 24 bits are available at the end of the data being encoded. 30471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * A full encoding quantum is always completed at the end of a 30481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * body. When fewer than 24 input bits are available in an 30491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * input group, zero bits are added (on the right) to form an 30501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * integral number of 6-bit groups. Padding at the end of the 30511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * data is performed using the "=" character. Since all 30521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * base64 input is an integral number of octets, only the 30531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * following cases can arise: (1) the final quantum of 30541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * encoding input is an integral multiple of 24 bits; here, 30551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * the final unit of encoded output will be an integral 30561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * multiple ofindent: Standard input:701: Warning:old style 30571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * assignment ambiguity in "=*". Assuming "= *" 4 characters 30581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * with no "=" padding, (2) the final 30591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * quantum of encoding input is exactly 8 bits; here, the 30601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * final unit of encoded output will be two characters 30611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * followed by two "=" padding characters, or (3) the final 30621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * quantum of encoding input is exactly 16 bits; here, the 30631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * final unit of encoded output will be three characters 30641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * followed by one "=" padding character." */ 30651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total = 3 * (i / 4); 30671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (pad == 0) { 30681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 0) 30691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (pad == 1) { 30711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 30721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 3) 30741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (decc = _xmlSchemaBase64Decode(*cur); 30761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (decc < 0) || (decc > 63); 30771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur)) 30781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard --cur; 30791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 16bits in 24bits means 2 pad bits: nnnnnn nnmmmm mmmm00*/ 30801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 00111100 -> 0x3c */ 30811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc & ~0x3c) 30821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total += 2; 30841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (pad == 2) { 30851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 30861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 2) 30881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (decc = _xmlSchemaBase64Decode(*cur); 30901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (decc < 0) || (decc > 63); 30911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur)) 30921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard --cur; 30931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 8bits in 12bits means 4 pad bits: nnnnnn nn0000 */ 30941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 00110000 -> 0x30 */ 30951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc & ~0x30) 30961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total += 1; 30981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 30991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 31011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 31021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_BASE64BINARY); 31031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v == NULL) 31041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 31051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base = 31061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (xmlChar *) xmlMallocAtomic((i + pad + 1) * 31071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sizeof(xmlChar)); 31081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (base == NULL) { 3109d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard xmlSchemaTypeErrMemory(node, "allocating base64 data"); 31101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(v); 31111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.base64.str = base; 31141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (cur = value; *cur; ++cur) 31151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (_xmlSchemaBase64Decode(*cur) >= 0) { 31161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = *cur; 31171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ++base; 31181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = 0; 31201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.base64.total = total; 31211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 31221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 312470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 3125e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_INTEGER: 3126e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_PINTEGER: 3127e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_NPINTEGER: 3128e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_NINTEGER: 31291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_NNINTEGER:{ 31301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 31311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 3132ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack int sign = 0; 31331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 31341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 31351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 31374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 31381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 31391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sign = 1; 31401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 31411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (*cur == '+') 31421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 3143ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 3144bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard if (ret < 0) 3145ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 31464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 31474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 3148ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (*cur != 0) 3149ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 315001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_NPINTEGER) { 31511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && 31521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((hi != 0) || (mi != 0) || (lo != 0))) 31531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 315401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_PINTEGER) { 31551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (sign == 1) 31561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((hi == 0) && (mi == 0) && (lo == 0)) 31581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 315901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_NINTEGER) { 31601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (sign == 0) 31611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((hi == 0) && (mi == 0) && (lo == 0)) 31631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 316401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_NNINTEGER) { 31651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && 31661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((hi != 0) || (mi != 0) || (lo != 0))) 31671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (val != NULL) { 317001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 31711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 3172c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (ret == 0) 3173c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik ret++; 31741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 31756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik v->value.decimal.mi = mi; 31766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik v->value.decimal.hi = hi; 31771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = sign; 31781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 3179ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack v->value.decimal.total = ret; 31801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 31811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 31841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 3185e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_LONG: 3186e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_BYTE: 3187e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_SHORT: 31881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_INT:{ 3189bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard const xmlChar *cur = value; 31901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 31911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int sign = 0; 31921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 31931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 31941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 31961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sign = 1; 31971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 31981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (*cur == '+') 31991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 3200ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 3201ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (ret < 0) 3202ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 3203ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (*cur != 0) 3204ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 320501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_LONG) { 32061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi >= 922) { 32071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi > 922) 32081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 33720368) { 32101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 33720368) 32111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 54775807)) 32131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 54775808)) 32151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 321801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_INT) { 32191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi != 0) 32201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 21) { 32221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 21) 32231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 47483647)) 32251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 47483648)) 32271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 322901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_SHORT) { 32301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 32311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 32768)) 32331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 32767)) 32351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 323601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_BYTE) { 32371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 32381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 128)) 32401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 127)) 32421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 324501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 32461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 32471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 32486c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik v->value.decimal.mi = mi; 32496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik v->value.decimal.hi = hi; 32501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = sign; 32511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 3252ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack v->value.decimal.total = ret; 32531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 32541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 32571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 3258e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_UINT: 3259e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_ULONG: 3260e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_USHORT: 32611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_UBYTE:{ 32621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 32631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 32641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 32651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 32661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 3267ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 3268ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (ret < 0) 3269ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 3270ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (*cur != 0) 3271ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 327201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_ULONG) { 32731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi >= 1844) { 32741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi > 1844) 32751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 67440737) { 32771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 67440737) 32781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 9551615) 32801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 328301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_UINT) { 32841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi != 0) 32851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 42) { 32871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 42) 32881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 94967295) 32901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 329201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_USHORT) { 32931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 32941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 65535) 32961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 329701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_UBYTE) { 32981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 32991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 33001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 255) 33011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 33021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 33031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 330401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 33051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 33061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 33071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.mi = mi; 33081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.hi = hi; 33091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = 0; 33101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 3311ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack v->value.decimal.total = ret; 33121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 33131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 33141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 33151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 33161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 33174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 3318b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 33191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard done: 33201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 33211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 33221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (ret); 33231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return3: 33241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 33251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 33261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (3); 33271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return1: 33281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 33291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 33301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (1); 33311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return0: 33321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 33331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 33341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (0); 33351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard error: 33361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 33371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 33381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (-1); 3339b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 3340b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 3341b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 3342b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValPredefTypeNode: 3343b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @type: the predefined type 3344b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: the value to check 3345b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @val: the return computed value 3346b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @node: the node containing the value 3347b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 3348b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the predefined type. 3349b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * if true a value is computed and returned in @val. 3350b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 3351b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns 0 if this validates, a positive error code number otherwise 3352b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * and -1 in case of internal or API error. 3353b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 3354b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardint 3355b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value, 3356b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlSchemaValPtr *val, xmlNodePtr node) { 33574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return(xmlSchemaValAtomicType(type, value, val, node, 0, 33584efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 1, 0)); 33594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 33604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 33614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 3362c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaValPredefTypeNodeNoNorm: 3363c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the predefined type 3364c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the value to check 3365c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val: the return computed value 3366c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @node: the node containing the value 3367c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 3368c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Check that a value conforms to the lexical space of the predefined type. 3369c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * if true a value is computed and returned in @val. 3370c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * This one does apply any normalization to the value. 3371c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 3372c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 3373c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * and -1 in case of internal or API error. 3374c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 3375c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardint 3376c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, const xmlChar *value, 3377c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard xmlSchemaValPtr *val, xmlNodePtr node) { 33784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return(xmlSchemaValAtomicType(type, value, val, node, 1, 33794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 0, 1)); 3380c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 3381c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 3382c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/** 3383c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * xmlSchemaValidatePredefinedType: 3384c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @type: the predefined type 3385c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @value: the value to check 3386c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @val: the return computed value 3387c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * 3388c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Check that a value conforms to the lexical space of the predefined type. 3389c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * if true a value is computed and returned in @val. 3390c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * 3391c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 3392c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * and -1 in case of internal or API error. 3393c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard */ 3394c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillardint 3395c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel VeillardxmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value, 3396c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard xmlSchemaValPtr *val) { 3397c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard return(xmlSchemaValPredefTypeNode(type, value, val, NULL)); 3398c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard} 3399c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard 3400c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard/** 34014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareDecimals: 34024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x: a first decimal value 34034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y: a second decimal value 34044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 34054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 decimals 34064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 34074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error 34084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 34094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int 34104255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y) 34114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{ 34124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValPtr swp; 3413273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack int order = 1, integx, integy, dlen; 3414273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack unsigned long hi, mi, lo; 34154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 3416273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3417273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * First test: If x is -ve and not zero 3418273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3419f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard if ((x->value.decimal.sign) && 3420e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((x->value.decimal.lo != 0) || 3421e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (x->value.decimal.mi != 0) || 3422e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (x->value.decimal.hi != 0))) { 3423273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3424273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * Then if y is -ve and not zero reverse the compare 3425273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3426e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((y->value.decimal.sign) && 3427e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((y->value.decimal.lo != 0) || 3428e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.mi != 0) || 3429e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.hi != 0))) 343080b19092f24410a6b869abf519227686e8f207caDaniel Veillard order = -1; 3431273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3432273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * Otherwise (y >= 0) we have the answer 3433273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 343480b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 343580b19092f24410a6b869abf519227686e8f207caDaniel Veillard return (-1); 3436273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3437273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * If x is not -ve and y is -ve we have the answer 3438273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3439e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } else if ((y->value.decimal.sign) && 3440e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((y->value.decimal.lo != 0) || 3441e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.mi != 0) || 3442e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.hi != 0))) { 34434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (1); 344480b19092f24410a6b869abf519227686e8f207caDaniel Veillard } 3445273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3446273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * If it's not simply determined by a difference in sign, 3447273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * then we need to compare the actual values of the two nums. 3448273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * To do this, we start by looking at the integral parts. 3449273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * If the number of integral digits differ, then we have our 3450273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * answer. 3451273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3452273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack integx = x->value.decimal.total - x->value.decimal.frac; 3453273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack integy = y->value.decimal.total - y->value.decimal.frac; 345472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* 345572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * NOTE: We changed the "total" for values like "0.1" 345672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * (or "-0.1" or ".1") to be 1, which was 2 previously. 345772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * Therefore the special case, when such values are 345872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * compared with 0, needs to be handled separately; 345972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * otherwise a zero would be recognized incorrectly as 346072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * greater than those values. This has the nice side effect 346172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * that we gain an overall optimized comparison with zeroes. 346272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * Note that a "0" has a "total" of 1 already. 346372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik */ 346472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (integx == 1) { 346572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (x->value.decimal.lo == 0) { 346672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (integy != 1) 346772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik return -order; 346872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik else if (y->value.decimal.lo != 0) 346972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik return -order; 347072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik else 347172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik return(0); 347272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } 347372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } 347472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (integy == 1) { 347572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (y->value.decimal.lo == 0) { 347672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (integx != 1) 347772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik return order; 347872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik else if (x->value.decimal.lo != 0) 347972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik return order; 348072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik else 348172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik return(0); 348272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } 348372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } 348472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik 3485273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (integx > integy) 3486273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3487273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack else if (integy > integx) 3488273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return -order; 348972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik 3490273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3491273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * If the number of integral digits is the same for both numbers, 3492273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * then things get a little more complicated. We need to "normalize" 3493273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * the numbers in order to properly compare them. To do this, we 3494273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * look at the total length of each number (length => number of 3495273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * significant digits), and divide the "shorter" by 10 (decreasing 3496273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * the length) until they are of equal length. 3497273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3498273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack dlen = x->value.decimal.total - y->value.decimal.total; 3499273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (dlen < 0) { /* y has more digits than x */ 3500273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack swp = x; 3501273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack hi = y->value.decimal.hi; 3502273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack mi = y->value.decimal.mi; 3503273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack lo = y->value.decimal.lo; 3504273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack dlen = -dlen; 3505273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack order = -order; 3506273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else { /* x has more digits than y */ 3507273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack swp = y; 3508273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack hi = x->value.decimal.hi; 3509273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack mi = x->value.decimal.mi; 3510273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack lo = x->value.decimal.lo; 3511273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 3512273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack while (dlen > 8) { /* in effect, right shift by 10**8 */ 3513273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack lo = mi; 3514273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack mi = hi; 3515273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack hi = 0; 3516273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack dlen -= 8; 35174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 3518273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack while (dlen > 0) { 3519273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack unsigned long rem1, rem2; 3520273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack rem1 = (hi % 10) * 100000000L; 3521273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack hi = hi / 10; 3522273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack rem2 = (mi % 10) * 100000000L; 3523273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack mi = (mi + rem1) / 10; 3524273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack lo = (lo + rem2) / 10; 3525273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack dlen--; 3526273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 3527273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (hi > swp->value.decimal.hi) { 3528273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3529273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else if (hi == swp->value.decimal.hi) { 3530273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (mi > swp->value.decimal.mi) { 3531273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3532273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else if (mi == swp->value.decimal.mi) { 3533273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (lo > swp->value.decimal.lo) { 3534273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3535273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else if (lo == swp->value.decimal.lo) { 3536273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (x->value.decimal.total == y->value.decimal.total) { 3537273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return 0; 3538273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else { 3539273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3540273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 3541273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 3542273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 35434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 3544273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return -order; 35454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 35464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 35474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 3548070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xmlSchemaCompareDurations: 3549070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @x: a first duration value 3550070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @y: a second duration value 3551070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 3552070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Compare 2 durations 3553070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 3554070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 3555070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * case of error 3556070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 3557070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 3558070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel VeillardxmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y) 3559070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard{ 3560070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard long carry, mon, day; 3561070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double sec; 356280b19092f24410a6b869abf519227686e8f207caDaniel Veillard int invert = 1; 356380b19092f24410a6b869abf519227686e8f207caDaniel Veillard long xmon, xday, myear, minday, maxday; 3564070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard static const long dayRange [2][12] = { 3565070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, }, 3566070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} }; 3567070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3568070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((x == NULL) || (y == NULL)) 35695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 3570070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3571070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* months */ 3572070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mon = x->value.dur.mon - y->value.dur.mon; 3573070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3574070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* seconds */ 3575070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard sec = x->value.dur.sec - y->value.dur.sec; 3576bbcf1275fec28915b170db31fa9ea9bed0ea39a4Daniel Veillard carry = (long)(sec / SECS_PER_DAY); 3577bbcf1275fec28915b170db31fa9ea9bed0ea39a4Daniel Veillard sec -= ((double)carry) * SECS_PER_DAY; 3578070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3579070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* days */ 3580070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard day = x->value.dur.day - y->value.dur.day + carry; 3581070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3582070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* easy test */ 3583070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (mon == 0) { 3584070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (day == 0) 3585070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (sec == 0.0) 3586070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 3587070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else if (sec < 0.0) 3588070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 3589070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else 3590070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 3591070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else if (day < 0) 3592070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 3593070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else 3594070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 3595070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 3596070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3597070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (mon > 0) { 3598070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((day >= 0) && (sec >= 0.0)) 3599070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 3600070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else { 3601070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = mon; 3602070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xday = -day; 3603070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 3604070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else if ((day <= 0) && (sec <= 0.0)) { 3605070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 3606070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else { 360780b19092f24410a6b869abf519227686e8f207caDaniel Veillard invert = -1; 3608070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = -mon; 3609070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xday = day; 3610070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 3611070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3612070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard myear = xmon / 12; 361380b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (myear == 0) { 361480b19092f24410a6b869abf519227686e8f207caDaniel Veillard minday = 0; 361580b19092f24410a6b869abf519227686e8f207caDaniel Veillard maxday = 0; 361680b19092f24410a6b869abf519227686e8f207caDaniel Veillard } else { 361780b19092f24410a6b869abf519227686e8f207caDaniel Veillard maxday = 366 * ((myear + 3) / 4) + 361880b19092f24410a6b869abf519227686e8f207caDaniel Veillard 365 * ((myear - 1) % 4); 361980b19092f24410a6b869abf519227686e8f207caDaniel Veillard minday = maxday - 1; 362080b19092f24410a6b869abf519227686e8f207caDaniel Veillard } 362180b19092f24410a6b869abf519227686e8f207caDaniel Veillard 3622070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = xmon % 12; 3623070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard minday += dayRange[0][xmon]; 3624070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard maxday += dayRange[1][xmon]; 3625070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 362680b19092f24410a6b869abf519227686e8f207caDaniel Veillard if ((maxday == minday) && (maxday == xday)) 362780b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(0); /* can this really happen ? */ 3628070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (maxday < xday) 362980b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(-invert); 363080b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (minday > xday) 363180b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(invert); 3632070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3633070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* indeterminate */ 36345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; 36355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 36365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 36375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/* 36385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * macros for adding date/times and durations 36395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 36405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT(a,b) (floor(((double)a/(double)b))) 36415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO(a,b) (a - FQUOTIENT(a,b) * b) 36425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT_RANGE(a,low,high) (FQUOTIENT((a-low),(high-low))) 36435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO_RANGE(a,low,high) ((MODULO((a-low),(high-low)))+low) 36445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 36455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 3646669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * xmlSchemaDupVal: 3647669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @v: the #xmlSchemaValPtr value to duplicate 3648669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * 3649669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Makes a copy of @v. The calling program is responsible for freeing 3650669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the returned value. 3651669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * 3652669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * returns a pointer to a duplicated #xmlSchemaValPtr or NULL if error. 3653669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard */ 3654669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillardstatic xmlSchemaValPtr 3655669adfcd3af5dfda873b10119d44202a7450bb20Daniel VeillardxmlSchemaDupVal (xmlSchemaValPtr v) 3656669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard{ 3657669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaValPtr ret = xmlSchemaNewValue(v->type); 3658669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard if (ret == NULL) 3659669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return NULL; 3660f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 3661669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard memcpy(ret, v, sizeof(xmlSchemaVal)); 36624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->next = NULL; 3663669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return ret; 3664669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard} 3665669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard 3666669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard/** 3667285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * xmlSchemaCopyValue: 3668285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * @val: the precomputed value to be copied 3669285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * 3670285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Copies the precomputed value. This duplicates any string within. 3671285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * 3672285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Returns the copy or NULL if a copy for a data-type is not implemented. 3673285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik */ 3674285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaValPtr 3675285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaCopyValue(xmlSchemaValPtr val) 3676285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik{ 36774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaValPtr ret = NULL, prev = NULL, cur; 3678285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik 3679285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik /* 3680285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Copy the string values. 3681285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik */ 36824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (val != NULL) { 36834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik switch (val->type) { 36844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYTYPE: 36854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREFS: 36864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITIES: 36874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKENS: 36884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaFreeValue(ret); 36894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (NULL); 36904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 36914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_STRING: 36924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 36934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_TOKEN: 36944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_LANGUAGE: 36954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NAME: 36964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NCNAME: 36974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ID: 36984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 36994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITY: 37004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKEN: 37014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYURI: 37024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 37034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.str != NULL) 37044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.str = xmlStrdup(BAD_CAST val->value.str); 37054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 3706f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_QNAME: 37074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NOTATION: 37084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 37094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.qname.name != NULL) 37104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.qname.name = 3711285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik xmlStrdup(BAD_CAST val->value.qname.name); 37124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.qname.uri != NULL) 37134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.qname.uri = 3714285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik xmlStrdup(BAD_CAST val->value.qname.uri); 37154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 37164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_HEXBINARY: 37174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 37184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.hex.str != NULL) 37194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.hex.str = xmlStrdup(BAD_CAST val->value.hex.str); 37204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 37214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_BASE64BINARY: 37224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 37234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.base64.str != NULL) 37244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.base64.str = 3725285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik xmlStrdup(BAD_CAST val->value.base64.str); 37264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 37274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik default: 37284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 37294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 37304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 37314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (ret == NULL) 37324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = cur; 37334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else 37344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik prev->next = cur; 37354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik prev = cur; 37364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik val = val->next; 3737285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik } 37384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (ret); 3739285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik} 3740285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik 3741285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik/** 37425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateAdd: 37435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 37445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dur: an #xmlSchemaValPtr of type #XS_DURATION 37455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 37465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compute a new date/time from @dt and @dur. This function assumes @dt 37475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH, 3748669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * or #XML_SCHEMAS_GYEAR. The returned #xmlSchemaVal is the same type as 3749669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt. The calling program is responsible for freeing the returned value. 37505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3751669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a pointer to a new #xmlSchemaVal or NULL if error. 37525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 37535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr 37545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur) 37555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 3756669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaValPtr ret, tmp; 37575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long carry, tempdays, temp; 37585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValDatePtr r, d; 37595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValDurationPtr u; 37605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((dt == NULL) || (dur == NULL)) 37625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 37635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = xmlSchemaNewValue(dt->type); 37655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret == NULL) 37665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 37675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3768669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard /* make a copy so we don't alter the original value */ 3769669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard tmp = xmlSchemaDupVal(dt); 3770669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard if (tmp == NULL) { 3771669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaFreeValue(ret); 3772669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return NULL; 3773669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard } 3774669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard 37755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r = &(ret->value.date); 3776669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard d = &(tmp->value.date); 37775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard u = &(dur->value.dur); 37785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalization */ 37805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->mon == 0) 37815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->mon = 1; 37825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize for time zone offset */ 37845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard u->sec -= (d->tzo * 60); 37855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->tzo = 0; 37865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalization */ 37885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->day == 0) 37895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->day = 1; 37905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* month */ 37925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = d->mon + u->mon; 3793ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->mon = (unsigned int) MODULO_RANGE(carry, 1, 13); 3794ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT_RANGE(carry, 1, 13); 37955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* year (may be modified later) */ 37975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year = d->year + carry; 37985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->year == 0) { 37995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->year > 0) 38005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year--; 38015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 38025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year++; 38035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 38045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* time zone */ 38065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->tzo = d->tzo; 38075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->tz_flag = d->tz_flag; 38085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* seconds */ 38105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->sec = d->sec + u->sec; 3811ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT((long)r->sec, 60); 38125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->sec != 0.0) { 38135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->sec = MODULO(r->sec, 60.0); 38145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 38155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* minute */ 38175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry += d->min; 3818ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->min = (unsigned int) MODULO(carry, 60); 3819ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT(carry, 60); 38205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* hours */ 38225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry += d->hour; 3823ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->hour = (unsigned int) MODULO(carry, 24); 3824ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long)FQUOTIENT(carry, 24); 38255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 38275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * days 38285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Note we use tempdays because the temporary values may need more 38295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * than 5 bits 38305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 38315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) && 38325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (d->day > MAX_DAYINMONTH(r->year, r->mon))) 38335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = MAX_DAYINMONTH(r->year, r->mon); 38345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (d->day < 1) 38355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = 1; 38365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 38375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = d->day; 38385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays += u->day + carry; 38405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard while (1) { 38425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (tempdays < 1) { 38435e9576a492e4fb8c2d517ccd6056a139e801ec9fDaniel Veillard long tmon = (long) MODULO_RANGE((int)r->mon-1, 1, 13); 38445e9576a492e4fb8c2d517ccd6056a139e801ec9fDaniel Veillard long tyr = r->year + (long)FQUOTIENT_RANGE((int)r->mon-1, 1, 13); 38455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (tyr == 0) 38465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tyr--; 384714b5643947845df089376106517c4f7ba061e4b0Daniel Veillard /* 3848f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Coverity detected an overrun in daysInMonth 384914b5643947845df089376106517c4f7ba061e4b0Daniel Veillard * of size 12 at position 12 with index variable "((r)->mon - 1)" 385014b5643947845df089376106517c4f7ba061e4b0Daniel Veillard */ 385130cf439efcea9732d0ecd33b7955666ce264129bDavid Kilzer if (tmon < 1) 385230cf439efcea9732d0ecd33b7955666ce264129bDavid Kilzer tmon = 1; 385314b5643947845df089376106517c4f7ba061e4b0Daniel Veillard if (tmon > 12) 385414b5643947845df089376106517c4f7ba061e4b0Daniel Veillard tmon = 12; 38555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays += MAX_DAYINMONTH(tyr, tmon); 38565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = -1; 38574ba5d3176938d3435ddc7347cdc904658e2999eePhilip Withnall } else if (VALID_YEAR(r->year) && VALID_MONTH(r->mon) && 38584ba5d3176938d3435ddc7347cdc904658e2999eePhilip Withnall tempdays > (long) MAX_DAYINMONTH(r->year, r->mon)) { 38595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon); 38605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = 1; 38615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } else 38625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 38635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard temp = r->mon + carry; 3865ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->mon = (unsigned int) MODULO_RANGE(temp, 1, 13); 3866ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->year = r->year + (unsigned int) FQUOTIENT_RANGE(temp, 1, 13); 38675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->year == 0) { 38685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (temp < 1) 38695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year--; 38705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 38715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year++; 38725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 38735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 3874f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 38755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->day = tempdays; 38765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 38785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * adjust the date/time type to the date values 38795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 38805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret->type != XML_SCHEMAS_DATETIME) { 38815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((r->hour) || (r->min) || (r->sec)) 38825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_DATETIME; 38835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (ret->type != XML_SCHEMAS_DATE) { 38845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((r->mon != 1) && (r->day != 1)) 38855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_DATE; 38865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1)) 38875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_GYEARMONTH; 38885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 38895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 38905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3891669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaFreeValue(tmp); 38925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 38945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 38955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 38975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaDateNormalize: 3898669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt: an #xmlSchemaValPtr of a date/time type value. 3899669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @offset: number of seconds to adjust @dt by. 39005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3901669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Normalize @dt to GMT time. The @offset parameter is subtracted from 3902669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the return value is a time-zone offset is present on @dt. 39035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3904669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a normalized copy of @dt or NULL if error. 39055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 39065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr 39075a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset) 39085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 39095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValPtr dur, ret; 39105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt == NULL) 39125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 39135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (((dt->type != XML_SCHEMAS_TIME) && 3915c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (dt->type != XML_SCHEMAS_DATETIME) && 3916c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (dt->type != XML_SCHEMAS_DATE)) || (dt->value.date.tzo == 0)) 39175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return xmlSchemaDupVal(dt); 39185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); 39205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dur == NULL) 39215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 39225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dur->value.date.sec -= offset; 39245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = _xmlSchemaDateAdd(dt, dur); 39265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret == NULL) 39275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 39285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaFreeValue(dur); 39305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* ret->value.date.tzo = 0; */ 39325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 39335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 39345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 39365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateCastYMToDays: 39375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 39385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3939f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Convert mon and year of @dt to total number of days. Take the 39405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * number of years since (or before) 1 AD and add the number of leap 39415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years. This is a function because negative 39425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years must be handled a little differently and there is no zero year. 39435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 39445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns number of days. 39455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 39465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic long 39475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt) 39485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 39495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long ret; 395049e8963c640865343327c67d4755a1af705717d3Daniel Veillard int mon; 39515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 395249e8963c640865343327c67d4755a1af705717d3Daniel Veillard mon = dt->value.date.mon; 395349e8963c640865343327c67d4755a1af705717d3Daniel Veillard if (mon <= 0) mon = 1; /* normalization */ 395449e8963c640865343327c67d4755a1af705717d3Daniel Veillard 395549e8963c640865343327c67d4755a1af705717d3Daniel Veillard if (dt->value.date.year <= 0) 39565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = (dt->value.date.year * 365) + 39575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+ 39585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((dt->value.date.year+1)/400)) + 395949e8963c640865343327c67d4755a1af705717d3Daniel Veillard DAY_IN_YEAR(0, mon, dt->value.date.year); 39605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 39615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = ((dt->value.date.year-1) * 365) + 39625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+ 39635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((dt->value.date.year-1)/400)) + 396449e8963c640865343327c67d4755a1af705717d3Daniel Veillard DAY_IN_YEAR(0, mon, dt->value.date.year); 39655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 39675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 39685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 39705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * TIME_TO_NUMBER: 39715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 39725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 39735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Calculates the number of seconds in the time portion of @dt. 39745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 39755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns seconds. 39765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 39775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define TIME_TO_NUMBER(dt) \ 39785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((double)((dt->value.date.hour * SECS_PER_HOUR) + \ 3979b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard (dt->value.date.min * SECS_PER_MIN) + \ 3980b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard (dt->value.date.tzo * SECS_PER_MIN)) + \ 3981b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard dt->value.date.sec) 39825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 39845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaCompareDates: 39855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @x: a first date/time value 39865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @y: a second date/time value 39875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 39885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compare 2 date/times 39895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 39905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 39915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error 39925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 39935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic int 39945a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y) 39955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 39965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard unsigned char xmask, ymask, xor_mask, and_mask; 39975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValPtr p1, p2, q1, q2; 39985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long p1d, p2d, q1d, q2d; 39995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((x == NULL) || (y == NULL)) 40015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 40025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.tz_flag) { 40045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (!y->value.date.tz_flag) { 40065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, 0); 40075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 40085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize y + 14:00 */ 40095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR)); 40105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 4012fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 4013fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 4014fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 40155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 4016fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d == q1d) { 40175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 40185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 4020fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (sec < 0.0) { 4021fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 4022fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 40235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 4024fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 40254aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 40265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize y - 14:00 */ 40275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR)); 40285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day; 40295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (p1d > q2d) 40304aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 40315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (p1d == q2d) { 40325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2); 40335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec > 0.0) 40344aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 40355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 40364aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 2; /* indeterminate */ 40375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40384aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(p1); 40394aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q1); 40404aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q2); 40414aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard if (ret != 0) 40424aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 40435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 4044fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 4045fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 4046fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 4047fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } 40485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } else if (y->value.date.tz_flag) { 40505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, 0); 40515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 40525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize x - 14:00 */ 40545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR)); 40555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 40565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 4057fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 4058fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 4059fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 40605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 4061fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d == q1d) { 40625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 40635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 4065fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (sec < 0.0) { 4066fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 4067fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 40685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 4069fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 40704aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 40715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize x + 14:00 */ 40725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR)); 40735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day; 40745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40756560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard if (p2d > q1d) { 40764aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 40776560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard } else if (p2d == q1d) { 40785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1); 40795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec > 0.0) 40804aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 40815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 40824aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 2; /* indeterminate */ 40835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40846560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(p1); 40856560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(q1); 40866560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(p2); 40874aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard if (ret != 0) 40884aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 40895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 4090fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 4091fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 4092fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 40935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 40975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * if the same type then calculate the difference 40985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 40995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->type == y->type) { 41004aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 41015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, 0); 41025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 41035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, 0); 41055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 41065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 4107fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 41084aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = -1; 4109fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d > q1d) { 41104aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 4111fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 41125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 41135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 41155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec < 0.0) 41164aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = -1; 41175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (sec > 0.0) 41184aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 4119f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 41205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 41214aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(p1); 41224aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q1); 41234aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 41245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 41255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard switch (x->type) { 41275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 41285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0xf; 41295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 41315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x7; 41325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 41345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x1; 41355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 41375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x2; 41385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 41405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x3; 41415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 41435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x3; 41445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 41465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x6; 41475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 41495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x8; 41505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard default: 41525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0; 41535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 41555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard switch (y->type) { 41575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 41585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0xf; 41595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 41615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x7; 41625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 41645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x1; 41655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 41675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x2; 41685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 41705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x3; 41715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 41735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x3; 41745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 41765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x6; 41775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 41795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x8; 41805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard default: 41825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0; 41835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 41855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xor_mask = xmask ^ ymask; /* mark type differences */ 41875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard and_mask = xmask & ymask; /* mark field specification */ 41885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* year */ 41905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 1) 41915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 41925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 1) { 41935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.year < y->value.date.year) 41945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 41955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.year > y->value.date.year) 41965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 41975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 41985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* month */ 42005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 2) 42015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 42025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 2) { 42035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.mon < y->value.date.mon) 42045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 42055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.mon > y->value.date.mon) 42065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 42075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 42085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 42095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* day */ 42105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 4) 42115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 42125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 4) { 42135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.day < y->value.date.day) 42145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 42155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.day > y->value.date.day) 42165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 42175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 42185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 42195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* time */ 42205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 8) 42215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 42225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 8) { 42235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.hour < y->value.date.hour) 42245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 42255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.hour > y->value.date.hour) 42265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 42275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.min < y->value.date.min) 42285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 42295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.min > y->value.date.min) 42305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 42315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.sec < y->value.date.sec) 42325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 42335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.sec > y->value.date.sec) 42345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 42355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 42365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 4237070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 4238070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 4239070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 4240070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 42416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveReplaceStrings: 4242478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @x: a first string value 4243478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @y: a second string value 42446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @invert: inverts the result if x < y or x > y. 42456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 42466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 42476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is 42486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "replace". I.e. @x could 42496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString". 42506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 42516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 42526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 42536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 42546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 4255478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaComparePreserveReplaceStrings(const xmlChar *x, 4256478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y, 42576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int invert) 42586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 42596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 4260f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 4261478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4262478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (IS_WSP_REPLACE_CH(*y)) { 4263478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (! IS_WSP_SPACE_CH(*x)) { 4264478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*x - 0x20) < 0) { 42656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 42706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4275f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 42766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 4277478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x - *y; 42786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) { 42796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 42846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) { 42856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 42906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4291478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik x++; 4292478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 42936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4294478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) { 42956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4300478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 43016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 43076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 43086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 43096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 43106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings: 43116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 43126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 43136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 43146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 43156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is 43166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could 43176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString". 43186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 43196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 43206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 43216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 43226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 4323478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaComparePreserveCollapseStrings(const xmlChar *x, 4324478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y, 43256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int invert) 43266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 43276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 43286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 4329f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard /* 43306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip leading blank chars of the collapsed string. 43316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4332478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4333478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 43346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 4335478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4336478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*y) { 4337478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (! IS_WSP_SPACE_CH(*x)) { 43386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 4339478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * The yv character would have been replaced to 0x20. 43406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4341478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*x - 0x20) < 0) { 43426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 43476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4353478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik x++; 4354478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 43556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 43566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip contiguous blank chars of the collapsed string. 43576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4358478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4359478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 43606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 4361478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x++ - *y++; 43626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) { 43636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) { 43696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4376478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) { 43776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4382478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 43836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 43846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip trailing blank chars of the collapsed string. 43856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4386478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4387478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 4388478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 43896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 43966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 43976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 43986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 43996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings: 44006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 44016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 44026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 44036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 44046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is 44056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could 44066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString". 44076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 44086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 44096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 44106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 44116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 4412478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareReplaceCollapseStrings(const xmlChar *x, 4413478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y, 44146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int invert) 44156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 44166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 44176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 4418f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard /* 44196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip leading blank chars of the collapsed string. 44206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4421478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4422478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 4423f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 4424478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4425478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*y) { 4426478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (! IS_WSP_BLANK_CH(*x)) { 44276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 4428478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * The yv character would have been replaced to 0x20. 44296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4430478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*x - 0x20) < 0) { 44316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 44326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 44346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 44366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 44376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 44396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 44416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4442478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik x++; 4443f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard y++; 4444f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard /* 44456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip contiguous blank chars of the collapsed string. 44466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4447478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4448478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 44496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 4450478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*x) { 44516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 4452478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * The xv character would have been replaced to 0x20. 44536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4454478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((0x20 - *y) < 0) { 44556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 44566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 44586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 44606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 44616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 44636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 44656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4466478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x++ - *y++; 44676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) 44686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) 44706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 44726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4473478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) { 44746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 44756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 44776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 4478f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 4479478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 44806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 44816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip trailing blank chars of the collapsed string. 44826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4483478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4484478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 4485478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 44866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 44876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 44896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 44916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 44926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 44936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 44946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 44956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 44966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 44976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareReplacedStrings: 44986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 44996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 45006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 45016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 45026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 45036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 45046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 45056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 45066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 4507478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareReplacedStrings(const xmlChar *x, 4508478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y) 45096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 45106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 4511f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 4512478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4513478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*y) { 4514478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (! IS_WSP_BLANK_CH(*x)) { 4515478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*x - 0x20) < 0) 4516f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard return(-1); 45176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 45186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 4519f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 45206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 4521478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*x) { 4522478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((0x20 - *y) < 0) 4523f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard return(-1); 45246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 45256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 45266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4527478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x - *y; 45286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) 4529f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard return(-1); 45306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) 4531f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard return(1); 45326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4533478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik x++; 4534478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 45356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4536478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) 45376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 4538478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) 45396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 45406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 45416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 45426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 45436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 4544c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaCompareNormStrings: 4545c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @x: a first string value 4546c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @y: a second string value 4547c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 4548c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Compare 2 string for their normalized values. 4549c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 4550c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 4551c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * case of error 4552c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */ 4553c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int 4554478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareNormStrings(const xmlChar *x, 4555478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y) { 4556c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard int tmp; 4557f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 4558478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*x)) x++; 4559478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*y)) y++; 4560478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4561478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (IS_BLANK_CH(*x)) { 4562478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (!IS_BLANK_CH(*y)) { 4563478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x - *y; 4564c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(tmp); 4565c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4566478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*x)) x++; 4567478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*y)) y++; 4568c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 4569478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x++ - *y++; 4570c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (tmp < 0) 4571c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4572c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (tmp > 0) 4573c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(1); 4574c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4575c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4576478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) { 4577478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*x)) x++; 4578478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) 4579c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(1); 4580c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4581478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 4582478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*y)) y++; 4583478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) 4584c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4585c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4586c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(0); 4587c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard} 4588c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 4589c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/** 4590b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCompareFloats: 4591b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @x: a first float or double value 4592b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @y: a second float or double value 4593b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 4594b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Compare 2 values 4595b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 4596b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 4597b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * case of error 4598b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4599b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int 4600b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) { 4601b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard double d1, d2; 4602b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4603b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((x == NULL) || (y == NULL)) 4604b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 4605b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4606b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 4607b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Cast everything to doubles. 4608b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4609b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->type == XML_SCHEMAS_DOUBLE) 4610b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d1 = x->value.d; 4611b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else if (x->type == XML_SCHEMAS_FLOAT) 4612b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d1 = x->value.f; 4613b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 4614b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 4615b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4616b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (y->type == XML_SCHEMAS_DOUBLE) 4617b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d2 = y->value.d; 4618b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else if (y->type == XML_SCHEMAS_FLOAT) 4619b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d2 = y->value.f; 4620b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 4621b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 4622b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4623b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 4624b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check for special cases. 4625b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4626b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d1)) { 4627b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d2)) 4628b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4629b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4630b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4631b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d2)) 4632b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4633b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == xmlXPathPINF) { 4634b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathPINF) 4635b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4636b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4637b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4638b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathPINF) 4639b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4640b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == xmlXPathNINF) { 4641b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathNINF) 4642b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4643b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4644b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4645b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathNINF) 4646b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4647b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4648b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 4649b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * basic tests, the last one we should have equality, but 4650b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * portability is more important than speed and handling 4651b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * NaN or Inf in a portable way is always a challenge, so ... 4652b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4653b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 < d2) 4654b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4655b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 > d2) 4656b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4657b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == d2) 4658b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4659b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(2); 4660b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 4661b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4662b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 46634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareValues: 46644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x: a first value 46656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xvalue: the first value as a string (optional) 46666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xwtsp: the whitespace type 46674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y: a second value 46686c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xvalue: the second value as a string (optional) 46696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @ywtsp: the whitespace type 46704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 46714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 values 46724255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 46734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, 3 if not 46744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * comparable and -2 in case of error 46754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 46766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 46776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaCompareValuesInternal(xmlSchemaValType xtype, 46786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr x, 46796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *xvalue, 46806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, 46816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValType ytype, 46826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaValPtr y, 46836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *yvalue, 4684478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaWhitespaceValueType yws) 4685478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{ 46866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik switch (xtype) { 468780b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UNKNOWN: 46882f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_ANYTYPE: 468980b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(-2); 469080b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_INTEGER: 469180b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NPINTEGER: 469280b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NINTEGER: 469380b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NNINTEGER: 469480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_PINTEGER: 469580b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_INT: 469680b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UINT: 469780b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_LONG: 469880b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ULONG: 469980b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_SHORT: 470080b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_USHORT: 470180b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_BYTE: 470280b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UBYTE: 47034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMAS_DECIMAL: 47046c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 47056c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 47066c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == xtype) 470780b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(xmlSchemaCompareDecimals(x, y)); 47086c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((ytype == XML_SCHEMAS_DECIMAL) || 47096c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_INTEGER) || 47106c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NPINTEGER) || 47116c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NINTEGER) || 47126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NNINTEGER) || 47136c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_PINTEGER) || 47146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_INT) || 47156c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_UINT) || 47166c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_LONG) || 47176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_ULONG) || 47186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_SHORT) || 47196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_USHORT) || 47206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_BYTE) || 47216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_UBYTE)) 47224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(xmlSchemaCompareDecimals(x, y)); 47235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return(-2); 4724070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMAS_DURATION: 47256c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 47266c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 4727478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_DURATION) 4728070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(xmlSchemaCompareDurations(x, y)); 47295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return(-2); 47305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 47315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 47325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 47335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 47345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 47355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 47365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 47375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 47386c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 47396c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 47406c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((ytype == XML_SCHEMAS_DATETIME) || 47416c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_TIME) || 47426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GDAY) || 47436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GMONTH) || 47446c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GMONTHDAY) || 47456c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GYEAR) || 47466c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_DATE) || 47476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GYEARMONTH)) 47485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return (xmlSchemaCompareDates(x, y)); 47495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return (-2); 4750f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard /* 47512ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * Note that we will support comparison of string types against 47522ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * anySimpleType as well. 47532ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik */ 47542ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 47556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_STRING: 4756f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_NORMSTRING: 475780b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_TOKEN: 475880b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_LANGUAGE: 475980b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NMTOKEN: 476080b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NAME: 476180b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NCNAME: 476280b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ID: 476380b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_IDREF: 476480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ENTITY: 476580b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ANYURI: 47666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik { 47676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *xv, *yv; 47686c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 47696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (x == NULL) 47706c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xv = xvalue; 47716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik else 47726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xv = x->value.str; 47736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (y == NULL) 47746c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik yv = yvalue; 47756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik else 47766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik yv = y->value.str; 47776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 47786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * TODO: Compare those against QName. 47796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4780f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard if (ytype == XML_SCHEMAS_QNAME) { 47816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik TODO 47826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (y == NULL) 4783f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard return(-2); 47846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-2); 47856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 47866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((ytype == XML_SCHEMAS_ANYSIMPLETYPE) || 47876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_STRING) || 47886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NORMSTRING) || 47896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_TOKEN) || 47906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_LANGUAGE) || 47916c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NMTOKEN) || 47926c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NAME) || 47936c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NCNAME) || 47946c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_ID) || 47956c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_IDREF) || 47966c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_ENTITY) || 47976c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_ANYURI)) { 47986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 47996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (xws == XML_SCHEMA_WHITESPACE_PRESERVE) { 48006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 48016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) { 48026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* TODO: What about x < y or x > y. */ 48036c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (xmlStrEqual(xv, yv)) 48046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (0); 4805f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard else 48066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (2); 48076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else if (yws == XML_SCHEMA_WHITESPACE_REPLACE) 48086c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaComparePreserveReplaceStrings(xv, yv, 0)); 48096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) 48106c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaComparePreserveCollapseStrings(xv, yv, 0)); 48116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 48126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else if (xws == XML_SCHEMA_WHITESPACE_REPLACE) { 48136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 48146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) 48156c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaComparePreserveReplaceStrings(yv, xv, 1)); 48166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_REPLACE) 48176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaCompareReplacedStrings(xv, yv)); 48186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) 48196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaCompareReplaceCollapseStrings(xv, yv, 0)); 48206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 48216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else if (xws == XML_SCHEMA_WHITESPACE_COLLAPSE) { 48226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 48236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) 48246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaComparePreserveCollapseStrings(yv, xv, 1)); 48256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_REPLACE) 48266c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaCompareReplaceCollapseStrings(yv, xv, 1)); 48276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) 48286c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaCompareNormStrings(xv, yv)); 48296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else 48306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-2); 4831f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 48326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4833c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return (-2); 48346c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik } 4835e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_QNAME: 4836c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NOTATION: 48376c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 48386c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 4839c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((ytype == XML_SCHEMAS_QNAME) || 4840c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (ytype == XML_SCHEMAS_NOTATION)) { 4841e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) && 4842e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (xmlStrEqual(x->value.qname.uri, y->value.qname.uri))) 4843e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(0); 4844e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(2); 4845e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 4846e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (-2); 4847c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_FLOAT: 4848c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_DOUBLE: 48496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 48506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 48516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((ytype == XML_SCHEMAS_FLOAT) || 48526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_DOUBLE)) 4853b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (xmlSchemaCompareFloats(x, y)); 4854b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (-2); 4855c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_BOOLEAN: 48566c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 48576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 48586c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_BOOLEAN) { 4859b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->value.b == y->value.b) 4860b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4861b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->value.b == 0) 4862b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4863b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4864b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4865b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (-2); 4866560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_HEXBINARY: 48676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 48686c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 48696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_HEXBINARY) { 487070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard if (x->value.hex.total == y->value.hex.total) { 487170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard int ret = xmlStrcmp(x->value.hex.str, y->value.hex.str); 487270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard if (ret > 0) 487370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(1); 487470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard else if (ret == 0) 487570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(0); 487670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 487770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard else if (x->value.hex.total > y->value.hex.total) 487870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(1); 487970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 488070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(-1); 488170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 4882560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return (-2); 48831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 48846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 48856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 48866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_BASE64BINARY) { 48871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (x->value.base64.total == y->value.base64.total) { 48881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int ret = xmlStrcmp(x->value.base64.str, 48891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard y->value.base64.str); 48901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret > 0) 48911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(1); 48921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (ret == 0) 48931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(0); 4894d369b1387e592791049a41eb4cc16046fe52e985Daniel Veillard else 4895d369b1387e592791049a41eb4cc16046fe52e985Daniel Veillard return(-1); 48961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 48971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (x->value.base64.total > y->value.base64.total) 48981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(1); 48991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 49001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(-1); 49011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 4902f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard return (-2); 4903c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_IDREFS: 4904c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ENTITIES: 4905c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NMTOKENS: 4906c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard TODO 4907c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 49084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 49095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 49104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 49114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 49124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 49136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValues: 49146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first value 49156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second value 49166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 49176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values 49186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 49196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 49206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 49216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 49226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint 49236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) { 49246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, yws; 49256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 49265e094143e423c01739ac9221f371846fd290be4eDaniel Veillard if ((x == NULL) || (y == NULL)) 49275e094143e423c01739ac9221f371846fd290be4eDaniel Veillard return(-2); 49286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (x->type == XML_SCHEMAS_STRING) 49296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xws = XML_SCHEMA_WHITESPACE_PRESERVE; 49306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else if (x->type == XML_SCHEMAS_NORMSTRING) 49316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xws = XML_SCHEMA_WHITESPACE_REPLACE; 49326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 49336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xws = XML_SCHEMA_WHITESPACE_COLLAPSE; 49346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 49356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (y->type == XML_SCHEMAS_STRING) 49366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik yws = XML_SCHEMA_WHITESPACE_PRESERVE; 4937e79226ccdb377cb61fdee69aaf366bb9c5838de9Gaurav else if (y->type == XML_SCHEMAS_NORMSTRING) 49386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik yws = XML_SCHEMA_WHITESPACE_REPLACE; 49396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 49406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik yws = XML_SCHEMA_WHITESPACE_COLLAPSE; 49416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 49426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type, 49436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik y, NULL, yws)); 49446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 49456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 49466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 49476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValuesWhtsp: 49486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first value 49496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xws: the whitespace value of x 49506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second value 49516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @yws: the whitespace value of y 49526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 49536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values 49546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 49556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 49566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 49576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 49586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint 49596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValuesWhtsp(xmlSchemaValPtr x, 49606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, 49616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr y, 49626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType yws) 49636c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{ 49649dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 49659dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik return(-2); 49666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type, 49676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik y, NULL, yws)); 49686c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik} 49696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 49706c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/** 49716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaCompareValuesWhtspExt: 49726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @x: a first value 49736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xws: the whitespace value of x 49746c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @y: a second value 49756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @yws: the whitespace value of y 49766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 49776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Compare 2 values 49786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 49796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 49806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * case of error 49816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 49826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikstatic int 49836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaCompareValuesWhtspExt(xmlSchemaValType xtype, 49846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr x, 49856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *xvalue, 49866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, 49876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValType ytype, 49886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr y, 49896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *yvalue, 49906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType yws) 49916c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{ 49926c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaCompareValuesInternal(xtype, x, xvalue, xws, ytype, y, 49936c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik yvalue, yws)); 49946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 49956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 49966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 4997c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaNormLen: 4998c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @value: a string 4999c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 5000c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Computes the UTF8 length of the normalized value of the string 5001c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 5002c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns the length or -1 in case of error. 5003c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */ 5004c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int 5005c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaNormLen(const xmlChar *value) { 5006c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard const xmlChar *utf; 5007c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard int ret = 0; 5008c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 5009c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (value == NULL) 5010c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 5011c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf = value; 501276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf)) utf++; 5013c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard while (*utf != 0) { 5014c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (utf[0] & 0x80) { 5015c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[1] & 0xc0) != 0x80) 5016c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 5017c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xe0) == 0xe0) { 5018c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[2] & 0xc0) != 0x80) 5019c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 5020c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xf0) == 0xf0) { 5021c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80) 5022c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 5023c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 4; 5024c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 5025c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 3; 5026c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 5027c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 5028c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 2; 5029c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 503076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack } else if (IS_BLANK_CH(*utf)) { 503176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf)) utf++; 5032c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf == 0) 5033c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 5034c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 5035c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf++; 5036c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 5037c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard ret++; 5038c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 5039c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(ret); 5040c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard} 5041c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 50426927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard/** 50436927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaGetFacetValueAsULong: 50446927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * @facet: an schemas type facet 50456927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * 50466927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Extract the value of a facet 50476927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * 50486927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Returns the value as a long 50496927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard */ 5050c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardunsigned long 5051c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaGetFacetValueAsULong(xmlSchemaFacetPtr facet) 5052c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{ 5053c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard /* 5054c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * TODO: Check if this is a decimal. 5055c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 5056094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack if (facet == NULL) 5057094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack return 0; 5058c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return ((unsigned long) facet->val->value.decimal.lo); 5059c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 5060c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 5061c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/** 506201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateListSimpleTypeFacet: 506301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facet: the facet to check 506401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @value: the lexical repr of the value to validate 506501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @actualLen: the number of list items 506601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @expectedLen: the resulting expected number of list items 506701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 506801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Checks the value of a list simple type against a facet. 506901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 507001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 0 if the value is valid, a positive error code 507101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * number otherwise and -1 in case of an internal error. 507201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 507301fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint 507401fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaValidateListSimpleTypeFacet(xmlSchemaFacetPtr facet, 507501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard const xmlChar *value, 507601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard unsigned long actualLen, 507701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard unsigned long *expectedLen) 507801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 5079ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard if (facet == NULL) 5080ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard return(-1); 508101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 508201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * TODO: Check if this will work with large numbers. 508301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * (compare value.decimal.mi and value.decimal.hi as well?). 508401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 508501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 508601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen != facet->val->value.decimal.lo) { 5087478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (expectedLen != NULL) 5088c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 508901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_LENGTH_VALID); 5090f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 509101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 509201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen < facet->val->value.decimal.lo) { 5093478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (expectedLen != NULL) 5094c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 509501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_MINLENGTH_VALID); 509601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 509701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MAXLENGTH) { 509801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen > facet->val->value.decimal.lo) { 5099478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (expectedLen != NULL) 5100c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 510101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_MAXLENGTH_VALID); 510201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 510301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else 5104f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard /* 5105f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * NOTE: That we can pass NULL as xmlSchemaValPtr to 510601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateFacet, since the remaining facet types 5107f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * are: XML_SCHEMA_FACET_PATTERN, XML_SCHEMA_FACET_ENUMERATION. 510801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 5109f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard return(xmlSchemaValidateFacet(NULL, facet, value, NULL)); 511001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 511101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 511201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 511301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 51146927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaValidateLengthFacet: 5115c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the built-in type 5116c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @facet: the facet to check 5117c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the lexical repr. of the value to be validated 5118c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val: the precomputed value 5119478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value 5120c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @length: the actual length of the value 5121c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 5122f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength" 5123c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * facet; sets @length to the computed length of @value. 5124c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 5125c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if the value is valid, a positive error code 5126c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * otherwise and -1 in case of an internal or API error. 5127c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 5128478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikstatic int 5129478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacetInternal(xmlSchemaFacetPtr facet, 5130aae48e64dfbf2b46b157a4c1857e30645116388fNico Weber xmlSchemaValType valType, 5131478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *value, 5132aae48e64dfbf2b46b157a4c1857e30645116388fNico Weber xmlSchemaValPtr val, 5133478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik unsigned long *length, 5134f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard xmlSchemaWhitespaceValueType ws) 5135c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{ 5136c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard unsigned int len = 0; 5137c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 5138478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((length == NULL) || (facet == NULL)) 5139ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard return (-1); 5140c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *length = 0; 5141c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((facet->type != XML_SCHEMA_FACET_LENGTH) && 5142c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->type != XML_SCHEMA_FACET_MAXLENGTH) && 5143c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->type != XML_SCHEMA_FACET_MINLENGTH)) 5144c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return (-1); 5145f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 5146478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5147478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: length, maxLength and minLength must be of type 5148478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * nonNegativeInteger only. Check if decimal is used somehow. 5149478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5150c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((facet->val == NULL) || 5151c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard ((facet->val->type != XML_SCHEMAS_DECIMAL) && 5152c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 5153c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->val->value.decimal.frac != 0)) { 5154c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(-1); 5155c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 5156c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) 5157c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard len = val->value.hex.total; 5158c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY)) 5159c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard len = val->value.base64.total; 5160c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard else { 5161478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik switch (valType) { 5162478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_STRING: 5163c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NORMSTRING: 5164478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { 5165478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5166478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * This is to ensure API compatibility with the old 5167478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateLengthFacet(). Anyway, this was and 5168478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * is not the correct handling. 5169478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: Get rid of this case somehow. 5170478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5171478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (valType == XML_SCHEMAS_STRING) 5172478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlUTF8Strlen(value); 5173478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5174478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5175478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } else if (value != NULL) { 5176478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 5177478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5178478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5179f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard /* 5180478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Should be OK for "preserve" as well. 5181478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5182478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlUTF8Strlen(value); 5183478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } 5184478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 5185478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 5186c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_TOKEN: 5187c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_LANGUAGE: 5188c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NMTOKEN: 5189c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NAME: 5190c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NCNAME: 5191f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_ID: 5192bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik /* 5193bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik * FIXME: What exactly to do with anyURI? 5194478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5195c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_ANYURI: 5196c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (value != NULL) 5197478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5198c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard break; 5199bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik case XML_SCHEMAS_QNAME: 5200f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_NOTATION: 5201f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard /* 52024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * For QName and NOTATION, those facets are 52034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * deprecated and should be ignored. 5204f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard */ 5205bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik return (0); 5206c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard default: 5207c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard TODO 5208c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 5209c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 5210c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *length = (unsigned long) len; 5211478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5212478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: Return the whole expected value, i.e. "lo", "mi" and "hi". 5213478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5214c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 5215c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len != facet->val->value.decimal.lo) 5216c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_LENGTH_VALID); 5217c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 5218c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len < facet->val->value.decimal.lo) 5219c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_MINLENGTH_VALID); 5220c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } else { 5221c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len > facet->val->value.decimal.lo) 5222c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_MAXLENGTH_VALID); 5223c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 5224f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 5225c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return (0); 5226c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 5227c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 5228c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/** 5229478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateLengthFacet: 5230478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @type: the built-in type 5231478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @facet: the facet to check 5232478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @value: the lexical repr. of the value to be validated 5233478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @val: the precomputed value 5234478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @length: the actual length of the value 5235478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * 5236f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength" 5237478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * facet; sets @length to the computed length of @value. 5238478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * 5239478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Returns 0 if the value is valid, a positive error code 5240478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * otherwise and -1 in case of an internal or API error. 5241478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5242478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikint 5243f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel VeillardxmlSchemaValidateLengthFacet(xmlSchemaTypePtr type, 5244478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaFacetPtr facet, 5245478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *value, 5246478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 5247f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard unsigned long *length) 5248478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{ 5249cc5e2330ef2432493afce6566d3651195366d822Daniel Veillard if (type == NULL) 5250cc5e2330ef2432493afce6566d3651195366d822Daniel Veillard return(-1); 5251478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (xmlSchemaValidateLengthFacetInternal(facet, 5252478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik type->builtInType, value, val, length, 5253478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN)); 5254478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik} 5255478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik 5256478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik/** 5257f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * xmlSchemaValidateLengthFacetWhtsp: 5258478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @facet: the facet to check 5259478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @valType: the built-in type 5260478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @value: the lexical repr. of the value to be validated 5261478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @val: the precomputed value 5262478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value 5263478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @length: the actual length of the value 5264478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * 5265f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength" 5266478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * facet; sets @length to the computed length of @value. 5267478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * 5268478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Returns 0 if the value is valid, a positive error code 5269478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * otherwise and -1 in case of an internal or API error. 5270478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5271478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikint 5272478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacetWhtsp(xmlSchemaFacetPtr facet, 5273478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValType valType, 5274478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *value, 5275478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 5276478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik unsigned long *length, 5277478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 5278478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{ 5279478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (xmlSchemaValidateLengthFacetInternal(facet, valType, value, val, 5280478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik length, ws)); 5281478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik} 5282478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik 5283478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik/** 52846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetInternal: 52854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @facet: the facet to check 5286478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @fws: the whitespace type of the facet's value 5287478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @valType: the built-in type of the value 52884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the lexical repr of the value to validate 52894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val: the precomputed value 5290478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value 52914255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 52924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Check a value against a facet condition 52934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 52944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if the element is schemas valid, a positive error code 52954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * number otherwise and -1 in case of internal or API error. 52964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 52976c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikstatic int 52986c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaValidateFacetInternal(xmlSchemaFacetPtr facet, 52996c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType fws, 5300f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard xmlSchemaValType valType, 53016c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *value, 5302478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 53036c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 53044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{ 53054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard int ret; 53064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 53076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (facet == NULL) 53086c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-1); 53096c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 53104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard switch (facet->type) { 53114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMA_FACET_PATTERN: 5312f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard /* 53136c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * NOTE that for patterns, the @value needs to be the normalized 53146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * value, *not* the lexical initial value or the canonical value. 53156c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 53166c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (value == NULL) 53176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-1); 53184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = xmlRegexpExec(facet->regexp, value); 53194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == 1) 53204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 53216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == 0) 532201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_PATTERN_VALID); 53234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(ret); 53244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMA_FACET_MAXEXCLUSIVE: 53254255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 53266c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 53274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(-1); 53284255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == -1) 53294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 533001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID); 5331070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MAXINCLUSIVE: 5332070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 53336c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 5334070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 5335070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret == -1) || (ret == 0)) 5336070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 533701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID); 5338070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MINEXCLUSIVE: 5339070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 53406c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 5341070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 5342070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 1) 5343070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 534401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID); 5345070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MININCLUSIVE: 5346070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 53476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 5348070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 5349070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret == 1) || (ret == 0)) 5350070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 535101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MININCLUSIVE_VALID); 53528651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard case XML_SCHEMA_FACET_WHITESPACE: 53538bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO whitespaces */ 535401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 535501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * NOTE: Whitespace should be handled to normalize 535601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * the value to be validated against a the facets; 535701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * not to normalize the value in-between. 535801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 53598651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard return(0); 53608bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_ENUMERATION: 5361478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { 5362478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5363478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * This is to ensure API compatibility with the old 5364478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateFacet(). 5365478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: Get rid of this case. 5366478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 53676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((facet->value != NULL) && 53686c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (xmlStrEqual(facet->value, value))) 53696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(0); 53706c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik } else { 53716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik ret = xmlSchemaCompareValuesWhtspExt(facet->val->type, 53726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik facet->val, facet->value, fws, valType, val, 53736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik value, ws); 53746c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 53756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-1); 53766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == 0) 53776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(0); 53786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik } 537901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_ENUMERATION_VALID); 53808bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_LENGTH: 5381aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik /* 5382aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik * SPEC (1.3) "if {primitive type definition} is QName or NOTATION, 5383aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik * then any {value} is facet-valid." 5384aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik */ 5385aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik if ((valType == XML_SCHEMAS_QNAME) || 5386aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik (valType == XML_SCHEMAS_NOTATION)) 5387aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik return (0); 5388aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik /* No break on purpose. */ 5389e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard case XML_SCHEMA_FACET_MAXLENGTH: 53908bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_MINLENGTH: { 53918bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard unsigned int len = 0; 5392e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard 53934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((valType == XML_SCHEMAS_QNAME) || 53944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik (valType == XML_SCHEMAS_NOTATION)) 53954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (0); 5396478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5397478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: length, maxLength and minLength must be of type 5398478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * nonNegativeInteger only. Check if decimal is used somehow. 5399478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 54008bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard if ((facet->val == NULL) || 5401e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((facet->val->type != XML_SCHEMAS_DECIMAL) && 5402e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 54038bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard (facet->val->value.decimal.frac != 0)) { 54048bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard return(-1); 54058bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 5406560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) 540770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard len = val->value.hex.total; 54081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY)) 54091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard len = val->value.base64.total; 54101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else { 54116c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik switch (valType) { 5412478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_STRING: 5413f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_NORMSTRING: 5414478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { 5415478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5416478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * This is to ensure API compatibility with the old 5417478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateFacet(). Anyway, this was and 5418478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * is not the correct handling. 5419478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: Get rid of this case somehow. 5420478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5421478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (valType == XML_SCHEMAS_STRING) 5422478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlUTF8Strlen(value); 5423478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5424478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5425478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } else if (value != NULL) { 5426478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 5427478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5428478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5429f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard /* 5430478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Should be OK for "preserve" as well. 5431478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5432478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlUTF8Strlen(value); 5433478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } 5434478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 5435f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_IDREF: 5436560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_TOKEN: 5437560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_LANGUAGE: 5438560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NMTOKEN: 5439560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NAME: 5440560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NCNAME: 5441560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_ID: 544201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 5443478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (value != NULL) 5444f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard len = xmlSchemaNormLen(value); 5445f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard break; 5446560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard default: 5447560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard TODO 5448f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 54498bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 54508bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 5451e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len != facet->val->value.decimal.lo) 545201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_LENGTH_VALID); 54538bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 5454e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len < facet->val->value.decimal.lo) 545501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MINLENGTH_VALID); 54568bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } else { 5457e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len > facet->val->value.decimal.lo) 545801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXLENGTH_VALID); 5459e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard } 54608bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard break; 54618bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 5462560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMA_FACET_TOTALDIGITS: 5463560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMA_FACET_FRACTIONDIGITS: 5464560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 5465560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((facet->val == NULL) || 546669dea3a0c01e8a952b1d2f07ab0a3aa450f0cdfeKasimier T. Buchcik ((facet->val->type != XML_SCHEMAS_PINTEGER) && 5467560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 5468560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (facet->val->value.decimal.frac != 0)) { 5469560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return(-1); 5470560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 5471560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((val == NULL) || 5472560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard ((val->type != XML_SCHEMAS_DECIMAL) && 5473560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_INTEGER) && 5474560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NPINTEGER) && 5475560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NINTEGER) && 5476560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NNINTEGER) && 5477560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_PINTEGER) && 5478560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_INT) && 5479560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_UINT) && 5480560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_LONG) && 5481560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_ULONG) && 5482560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_SHORT) && 5483560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_USHORT) && 5484560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_BYTE) && 5485560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_UBYTE))) { 5486560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return(-1); 5487560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 5488560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) { 5489560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (val->value.decimal.total > facet->val->value.decimal.lo) 549001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_TOTALDIGITS_VALID); 5491560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 5492560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) { 5493560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (val->value.decimal.frac > facet->val->value.decimal.lo) 549401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID); 5495560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 5496560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard break; 54974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard default: 54984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard TODO 54994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 55004255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 5501b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 55024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 55034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 55046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 55056c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacet: 55066c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @base: the base type 55076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @facet: the facet to check 55086c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @value: the lexical repr of the value to validate 55096c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @val: the precomputed value 55106c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 55116c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Check a value against a facet condition 55126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 55136c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns 0 if the element is schemas valid, a positive error code 55146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * number otherwise and -1 in case of internal or API error. 55156c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 55166c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikint 55179dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. BuchcikxmlSchemaValidateFacet(xmlSchemaTypePtr base, 55186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaFacetPtr facet, 55196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *value, 55206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr val) 55216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{ 55226c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik /* 55236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * This tries to ensure API compatibility regarding the old 55246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacet() and the new xmlSchemaValidateFacetInternal() and 55256c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetWhtsp(). 55266c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 55279dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik if (val != NULL) 55286c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaValidateFacetInternal(facet, 55299dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN, val->type, value, val, 55306c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN)); 55319dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik else if (base != NULL) 55326c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaValidateFacetInternal(facet, 55339dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN, base->builtInType, value, val, 5534478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN)); 55359dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik return(-1); 55366c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik} 55376c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 55386c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/** 55396c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetWhtsp: 55406c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @facet: the facet to check 55416c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @fws: the whitespace type of the facet's value 55426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @valType: the built-in type of the value 55436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @value: the lexical (or normalized for pattern) repr of the value to validate 55446c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @val: the precomputed value 55456c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @ws: the whitespace type of the value 55466c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 55476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Check a value against a facet condition. This takes value normalization 55486c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * according to the specified whitespace types into account. 55496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Note that @value needs to be the *normalized* value if the facet 55506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * is of type "pattern". 55516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 55526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns 0 if the element is schemas valid, a positive error code 55536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * number otherwise and -1 in case of internal or API error. 55546c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 55556c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikint 55566c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaValidateFacetWhtsp(xmlSchemaFacetPtr facet, 55576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType fws, 5558f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard xmlSchemaValType valType, 55596c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *value, 5560478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 55616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 55626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{ 55636c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaValidateFacetInternal(facet, fws, valType, 5564478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik value, val, ws)); 55656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik} 55666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 5567c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#if 0 5568c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifndef DBL_DIG 5569c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define DBL_DIG 16 5570c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif 5571c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifndef DBL_EPSILON 5572c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define DBL_EPSILON 1E-9 5573c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif 5574c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5575c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define INTEGER_DIGITS DBL_DIG 5576c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define FRACTION_DIGITS (DBL_DIG + 1) 5577c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define EXPONENT_DIGITS (3 + 2) 5578c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5579c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik/** 5580c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * xmlXPathFormatNumber: 5581c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @number: number to format 5582c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @buffer: output buffer 5583c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @buffersize: size of output buffer 5584c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 5585c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Convert the number into a string representation. 5586c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5587c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcikstatic void 5588c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. BuchcikxmlSchemaFormatFloat(double number, char buffer[], int buffersize) 5589c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik{ 5590c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik switch (xmlXPathIsInf(number)) { 5591c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case 1: 5592c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (buffersize > (int)sizeof("INF")) 5593c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buffer, buffersize, "INF"); 5594c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5595c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case -1: 5596c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (buffersize > (int)sizeof("-INF")) 5597c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buffer, buffersize, "-INF"); 5598c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5599c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik default: 5600c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (xmlXPathIsNaN(number)) { 5601c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (buffersize > (int)sizeof("NaN")) 5602c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buffer, buffersize, "NaN"); 5603c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else if (number == 0) { 5604c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buffer, buffersize, "0.0E0"); 5605c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5606c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 3 is sign, decimal point, and terminating zero */ 5607c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char work[DBL_DIG + EXPONENT_DIGITS + 3]; 5608c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int integer_place, fraction_place; 5609c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char *ptr; 5610c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char *after_fraction; 5611c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik double absolute_value; 5612c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int size; 5613c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5614c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik absolute_value = fabs(number); 5615c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5616c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5617c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Result is in work, and after_fraction points 5618c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * just past the fractional part. 5619f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Use scientific notation 5620c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5621c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik integer_place = DBL_DIG + EXPONENT_DIGITS + 1; 5622c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik fraction_place = DBL_DIG - 1; 5623c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(work, sizeof(work),"%*.*e", 5624c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik integer_place, fraction_place, number); 5625f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard after_fraction = strchr(work + DBL_DIG, 'e'); 5626c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Remove fractional trailing zeroes */ 5627c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik ptr = after_fraction; 5628c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik while (*(--ptr) == '0') 5629c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik ; 5630c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (*ptr != '.') 5631c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik ptr++; 5632c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik while ((*ptr++ = *after_fraction++) != 0); 5633c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5634c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Finally copy result back to caller */ 5635c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik size = strlen(work) + 1; 5636c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (size > buffersize) { 5637c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik work[buffersize - 1] = 0; 5638c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik size = buffersize; 5639c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5640c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik memmove(buffer, work, size); 5641c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5642c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5643c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5644c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik} 5645c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif 5646c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 56476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/** 56486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaGetCanonValue: 56496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @val: the precomputed value 56506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @retValue: the returned value 56516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 56527a7cad6ed40dff815fd26416192bfbae1b44923fJan Pokorný * Get the canonical lexical representation of the value. 5653c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * The caller has to FREE the returned retValue. 5654c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 5655478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * WARNING: Some value types are not supported yet, resulting 5656478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * in a @retValue of "???". 5657f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * 5658c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: XML Schema 1.0 does not define canonical representations 5659c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * for: duration, gYearMonth, gYear, gMonthDay, gMonth, gDay, 5660c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * anyURI, QName, NOTATION. This will be fixed in XML Schema 1.1. 5661c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 56626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 5663c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Returns 0 if the value could be built, 1 if the value type is 5664c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * not supported yet and -1 in case of API errors. 56656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 56666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint 5667b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel VeillardxmlSchemaGetCanonValue(xmlSchemaValPtr val, const xmlChar **retValue) 56686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 5669b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard if ((retValue == NULL) || (val == NULL)) 56706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-1); 56716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *retValue = NULL; 56726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik switch (val->type) { 5673478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_STRING: 5674478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (val->value.str == NULL) 5675478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); 5676478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5677f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard *retValue = 5678478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik BAD_CAST xmlStrdup((const xmlChar *) val->value.str); 5679478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 56806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 5681478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (val->value.str == NULL) 5682478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); 5683478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else { 5684478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = xmlSchemaWhiteSpaceReplace( 5685478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik (const xmlChar *) val->value.str); 5686478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*retValue) == NULL) 5687478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup( 5688478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik (const xmlChar *) val->value.str); 5689478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } 5690478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 56916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_TOKEN: 56926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_LANGUAGE: 56936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NMTOKEN: 5694f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_NAME: 56956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NCNAME: 56966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_ID: 56976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 56986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_ENTITY: 5699c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NOTATION: /* Unclear */ 5700c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_ANYURI: /* Unclear */ 57016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (val->value.str == NULL) 5702478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (-1); 5703f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard *retValue = 5704aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik BAD_CAST xmlSchemaCollapseString(BAD_CAST val->value.str); 5705aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik if (*retValue == NULL) 5706f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard *retValue = 5707aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik BAD_CAST xmlStrdup((const xmlChar *) val->value.str); 5708478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 5709478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_QNAME: 5710c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0. */ 5711478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (val->value.qname.uri == NULL) { 5712478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.qname.name); 5713478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (0); 5714478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } else { 5715478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST "{"); 5716478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), 5717478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik BAD_CAST val->value.qname.uri); 5718478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), 5719478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik BAD_CAST "}"); 5720478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), 5721478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik BAD_CAST val->value.qname.uri); 5722478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } 5723478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 5724c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DECIMAL: 5725c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5726c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Lookout for a more simple implementation. 5727c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5728f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard if ((val->value.decimal.total == 1) && 5729c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (val->value.decimal.lo == 0)) { 5730c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlStrdup(BAD_CAST "0.0"); 5731c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5732c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValDecimal dec = val->value.decimal; 5733c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int bufsize; 5734c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char *buf = NULL, *offs; 5735c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5736c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Add room for the decimal point as well. */ 5737c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik bufsize = dec.total + 2; 5738c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5739c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik bufsize++; 5740c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Add room for leading/trailing zero. */ 5741c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((dec.frac == 0) || (dec.frac == dec.total)) 5742c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik bufsize++; 5743c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik buf = xmlMalloc(bufsize); 574426ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard if (buf == NULL) 574526ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard return(-1); 5746c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik offs = buf; 5747c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5748c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs++ = '-'; 5749c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.frac == dec.total) { 5750c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs++ = '0'; 5751c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs++ = '.'; 5752c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5753c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.hi != 0) 5754c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(offs, bufsize - (offs - buf), 5755c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu%lu%lu", dec.hi, dec.mi, dec.lo); 5756c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else if (dec.mi != 0) 5757c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(offs, bufsize - (offs - buf), 5758c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu%lu", dec.mi, dec.lo); 5759c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5760c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(offs, bufsize - (offs - buf), 5761c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu", dec.lo); 5762f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 5763c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.frac != 0) { 5764c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.frac != dec.total) { 5765c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int diff = dec.total - dec.frac; 5766c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5767c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Insert the decimal point. 5768c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5769c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik memmove(offs + diff + 1, offs + diff, dec.frac +1); 5770c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik offs[diff] = '.'; 5771c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5772c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik unsigned int i = 0; 5773c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5774c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Insert missing zeroes behind the decimal point. 5775f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard */ 5776c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik while (*(offs + i) != 0) 5777c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik i++; 5778c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (i < dec.total) { 5779c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik memmove(offs + (dec.total - i), offs, i +1); 5780c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik memset(offs, '0', dec.total - i); 5781c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5782c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5783c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5784c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5785c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Append decimal point and zero. 5786c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5787c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik offs = buf + bufsize - 1; 5788c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs-- = 0; 5789c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs-- = '0'; 5790c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs-- = '.'; 5791c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5792c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST buf; 5793c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5794c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5795c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_INTEGER: 5796c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_PINTEGER: 5797c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NPINTEGER: 5798c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NINTEGER: 5799c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NNINTEGER: 5800c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_LONG: 5801c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_BYTE: 5802c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_SHORT: 5803c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_INT: 5804c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_UINT: 5805c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_ULONG: 5806c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_USHORT: 5807c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_UBYTE: 5808c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((val->value.decimal.total == 1) && 5809c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (val->value.decimal.lo == 0)) 5810c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlStrdup(BAD_CAST "0"); 5811c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else { 5812c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValDecimal dec = val->value.decimal; 5813c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int bufsize = dec.total + 1; 5814c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5815c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Add room for the decimal point as well. */ 5816c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5817c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik bufsize++; 5818c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlMalloc(bufsize); 581926ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard if (*retValue == NULL) 582026ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard return(-1); 5821c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.hi != 0) { 5822c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5823c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, 5824c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "-%lu%lu%lu", dec.hi, dec.mi, dec.lo); 5825c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5826c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, 5827c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu%lu%lu", dec.hi, dec.mi, dec.lo); 5828c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else if (dec.mi != 0) { 5829c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5830c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, 5831c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "-%lu%lu", dec.mi, dec.lo); 5832c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5833c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, 5834c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu%lu", dec.mi, dec.lo); 5835c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5836c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5837c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, "-%lu", dec.lo); 5838c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5839c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, "%lu", dec.lo); 5840c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5841c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5842c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5843c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_BOOLEAN: 5844c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.b) 5845c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST "true"); 5846c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5847c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST "false"); 5848c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5849c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DURATION: { 5850c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[100]; 5851c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik unsigned long year; 5852c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik unsigned long mon, day, hour = 0, min = 0; 5853c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik double sec = 0, left; 5854c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5855c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5856c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5857c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: This results in a normalized output of the value 5858c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * - which is NOT conformant to the spec - 5859c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * since the exact values of each property are not 5860c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * recoverable. Think about extending the structure to 5861c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * provide a field for every property. 5862c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5863c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik year = (unsigned long) FQUOTIENT(labs(val->value.dur.mon), 12); 5864c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik mon = labs(val->value.dur.mon) - 12 * year; 5865c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5866c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik day = (unsigned long) FQUOTIENT(fabs(val->value.dur.sec), 86400); 5867c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik left = fabs(val->value.dur.sec) - day * 86400; 5868c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (left > 0) { 5869c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik hour = (unsigned long) FQUOTIENT(left, 3600); 5870c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik left = left - (hour * 3600); 5871c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (left > 0) { 5872c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik min = (unsigned long) FQUOTIENT(left, 60); 5873c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik sec = left - (min * 60); 5874c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5875c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5876c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((val->value.dur.mon < 0) || (val->value.dur.sec < 0)) 5877c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 100, "P%luY%luM%luDT%luH%luM%.14gS", 5878c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik year, mon, day, hour, min, sec); 5879c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5880c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 100, "-P%luY%luM%luDT%luH%luM%.14gS", 5881c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik year, mon, day, hour, min, sec); 5882c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5883c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5884c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5885c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GYEAR: { 5886c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[30]; 5887c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5888c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5889c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, "%04ld", val->value.date.year); 5890c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5891c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5892c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5893c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GMONTH: { 5894c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5895c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 589626ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard *retValue = xmlMalloc(6); 589726ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard if (*retValue == NULL) 589826ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard return(-1); 5899c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, 6, "--%02u", 5900c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.mon); 5901c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5902c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5903c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GDAY: { 5904c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5905c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5906c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlMalloc(6); 590726ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard if (*retValue == NULL) 590826ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard return(-1); 5909c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, 6, "---%02u", 5910c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.day); 5911c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5912f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard break; 5913c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GMONTHDAY: { 5914c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5915c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5916c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlMalloc(8); 591726ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard if (*retValue == NULL) 591826ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard return(-1); 5919c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, 8, "--%02u-%02u", 5920c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.mon, val->value.date.day); 5921c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5922c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5923c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GYEARMONTH: { 5924c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[35]; 5925c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5926c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5927c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.date.year < 0) 5928c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 35, "-%04ld-%02u", 5929f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard labs(val->value.date.year), 5930c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.mon); 5931c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5932c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 35, "%04ld-%02u", 5933c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.year, val->value.date.mon); 5934c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5935c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5936f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard break; 5937c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_TIME: 5938c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik { 5939c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[30]; 5940c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5941c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.date.tz_flag) { 5942c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValPtr norm; 5943c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5944c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm = xmlSchemaDateNormalize(val, 0); 5945c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (norm == NULL) 5946c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 5947f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard /* 5948f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * TODO: Check if "%.14g" is portable. 5949c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5950c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, 5951c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%02u:%02u:%02.14gZ", 5952c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.hour, 5953c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.min, 5954c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.sec); 5955c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaFreeValue(norm); 5956c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5957c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, 5958c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%02u:%02u:%02.14g", 5959c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.hour, 5960c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.min, 5961c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.sec); 5962c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5963c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5964f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 5965c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5966c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DATE: 5967c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik { 5968c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[30]; 5969c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5970c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.date.tz_flag) { 5971c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValPtr norm; 5972c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5973c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm = xmlSchemaDateNormalize(val, 0); 5974c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (norm == NULL) 5975c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 5976c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5977c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Append the canonical value of the 5978c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * recoverable timezone and not "Z". 5979c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5980c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, 5981c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%04ld:%02u:%02uZ", 5982c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.year, norm->value.date.mon, 5983c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.day); 5984c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaFreeValue(norm); 5985c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5986c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, 5987c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%04ld:%02u:%02u", 5988c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.year, val->value.date.mon, 5989c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.day); 5990c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5991c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5992f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 5993c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5994c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DATETIME: 5995c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik { 5996c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[50]; 5997c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5998c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.date.tz_flag) { 5999c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValPtr norm; 6000c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 6001c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm = xmlSchemaDateNormalize(val, 0); 6002c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (norm == NULL) 6003c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 6004c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 6005c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Check if "%.14g" is portable. 6006c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 6007c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 50, 6008c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%04ld:%02u:%02uT%02u:%02u:%02.14gZ", 6009c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.year, norm->value.date.mon, 6010c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.day, norm->value.date.hour, 6011c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.min, norm->value.date.sec); 6012c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaFreeValue(norm); 6013c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 6014c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 50, 6015c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%04ld:%02u:%02uT%02u:%02u:%02.14g", 6016c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.year, val->value.date.mon, 6017c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.day, val->value.date.hour, 6018c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.min, val->value.date.sec); 6019c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 6020c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 6021c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 6022c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 6023c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_HEXBINARY: 6024c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.hex.str); 6025c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 6026c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_BASE64BINARY: 6027c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 6028c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Is the following spec piece implemented?: 6029c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * SPEC: "Note: For some values the canonical form defined 6030c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * above does not conform to [RFC 2045], which requires breaking 6031c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * with linefeeds at appropriate intervals." 6032c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 6033c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.base64.str); 6034c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 6035c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_FLOAT: { 6036f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard char buf[30]; 6037f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard /* 6038c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * |m| < 16777216, -149 <= e <= 104. 6039c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Handle, NaN, INF, -INF. The format is not 6040c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * yet conformant. The c type float does not cover 6041c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * the whole range. 6042c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 6043c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, "%01.14e", val->value.f); 6044c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 6045c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 6046c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 6047c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DOUBLE: { 6048c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[40]; 6049c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* |m| < 9007199254740992, -1075 <= e <= 970 */ 6050c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 6051c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Handle, NaN, INF, -INF. The format is not 6052c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * yet conformant. The c type float does not cover 6053c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * the whole range. 6054c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 6055c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 40, "%01.14e", val->value.d); 6056c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 6057c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 6058f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard break; 60596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik default: 6060478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST "???"); 6061c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (1); 60626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 606326ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard if (*retValue == NULL) 606426ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard return(-1); 6065478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (0); 6066478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik} 6067478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik 6068bda59576670f1cabea3c49520628d82e401702caDaniel Veillard/** 6069c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * xmlSchemaGetCanonValueWhtsp: 6070c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @val: the precomputed value 6071c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @retValue: the returned value 6072c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @ws: the whitespace type of the value 6073c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 60747a7cad6ed40dff815fd26416192bfbae1b44923fJan Pokorný * Get the canonical representation of the value. 6075c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * The caller has to free the returned @retValue. 6076c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 6077c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Returns 0 if the value could be built, 1 if the value type is 6078c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * not supported yet and -1 in case of API errors. 6079c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 6080c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcikint 6081c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. BuchcikxmlSchemaGetCanonValueWhtsp(xmlSchemaValPtr val, 6082c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik const xmlChar **retValue, 6083c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 6084c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik{ 6085c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((retValue == NULL) || (val == NULL)) 6086c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 6087c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((ws == XML_SCHEMA_WHITESPACE_UNKNOWN) || 6088c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (ws > XML_SCHEMA_WHITESPACE_COLLAPSE)) 6089c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 6090c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 6091c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = NULL; 6092c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik switch (val->type) { 6093c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_STRING: 6094c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.str == NULL) 6095c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); 6096c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 6097c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlSchemaCollapseString(val->value.str); 6098c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else if (ws == XML_SCHEMA_WHITESPACE_REPLACE) 6099c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlSchemaWhiteSpaceReplace(val->value.str); 6100c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((*retValue) == NULL) 6101c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(val->value.str); 6102c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 6103c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 6104c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.str == NULL) 6105c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); 6106c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else { 6107c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 6108c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlSchemaCollapseString(val->value.str); 6109c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 6110c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlSchemaWhiteSpaceReplace(val->value.str); 6111c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((*retValue) == NULL) 6112c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(val->value.str); 6113c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 6114c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 6115c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik default: 6116c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (xmlSchemaGetCanonValue(val, retValue)); 6117f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 6118c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (0); 6119c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik} 6120c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 6121c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik/** 6122bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * xmlSchemaGetValType: 6123bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * @val: a schemas value 6124bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * 6125bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * Accessor for the type of a value 6126bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * 6127bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * Returns the xmlSchemaValType of the value 6128bda59576670f1cabea3c49520628d82e401702caDaniel Veillard */ 6129478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValType 6130478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaGetValType(xmlSchemaValPtr val) 6131478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{ 6132bda59576670f1cabea3c49520628d82e401702caDaniel Veillard if (val == NULL) 6133bda59576670f1cabea3c49520628d82e401702caDaniel Veillard return(XML_SCHEMAS_UNKNOWN); 6134478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (val->type); 61356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 61366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 61375d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#define bottom_xmlschemastypes 61385d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#include "elfgcchack.h" 61394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#endif /* LIBXML_SCHEMAS_ENABLED */ 6140