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 */ 65a1dca81df7c352cd9a14ab678750b1623f8f8ed7Patrick Monnerat unsigned int hour :5; /* 0 <= hour <= 24 */ 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 1142a1dca81df7c352cd9a14ab678750b1623f8f8ed7Patrick Monnerat#define VALID_END_OF_DAY(dt) \ 1143a1dca81df7c352cd9a14ab678750b1623f8f8ed7Patrick Monnerat ((dt)->hour == 24 && (dt)->min == 0 && (dt)->sec == 0) 1144a1dca81df7c352cd9a14ab678750b1623f8f8ed7Patrick Monnerat 1145070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TIME(dt) \ 1146a1dca81df7c352cd9a14ab678750b1623f8f8ed7Patrick Monnerat (((VALID_HOUR(dt->hour) && VALID_MIN(dt->min) && \ 1147a1dca81df7c352cd9a14ab678750b1623f8f8ed7Patrick Monnerat VALID_SEC(dt->sec)) || VALID_END_OF_DAY(dt)) && \ 1148a1dca81df7c352cd9a14ab678750b1623f8f8ed7Patrick Monnerat VALID_TZO(dt->tzo)) 1149070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1150070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATETIME(dt) \ 1151070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_DATE(dt) && VALID_TIME(dt)) 1152070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1153070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_MIN (60) 1154070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_HOUR (60 * SECS_PER_MIN) 1155070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_DAY (24 * SECS_PER_HOUR) 1156070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 11575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInYearByMonth[12] = 11585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; 11595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInLeapYearByMonth[12] = 11605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 }; 11615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 11625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DAY_IN_YEAR(day, month, year) \ 11635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((IS_LEAP(year) ? \ 11645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dayInLeapYearByMonth[month - 1] : \ 11655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dayInYearByMonth[month - 1]) + day) 11665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 11675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#ifdef DEBUG 11685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt) \ 11695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 11705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard "type=%o %04ld-%02u-%02uT%02u:%02u:%03f", \ 11715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->type,dt->value.date.year,dt->value.date.mon, \ 11725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->value.date.day,dt->value.date.hour,dt->value.date.min, \ 11735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->value.date.sec); \ 11745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt->value.date.tz_flag) \ 11755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt->value.date.tzo != 0) \ 11765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 11775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard "%+05d\n",dt->value.date.tzo); \ 11785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else \ 11795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, "Z\n"); \ 11805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else \ 11815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext,"\n") 11825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#else 11835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt) 11845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#endif 11855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 1186070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1187070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGYear: 1188070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1189070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1190070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1191070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gYear without time zone and fills in the appropriate 1192070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1193070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gYear. It is supposed that @dt->year is big enough to contain 1194070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * the year. 1195070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1196070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1197070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1198070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1199070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) { 1200070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str, *firstChar; 1201070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0, digcnt = 0; 1202070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1203070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (((*cur < '0') || (*cur > '9')) && 1204070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (*cur != '-') && (*cur != '+')) 1205070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1206070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1207070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 1208070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = 1; 1209070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1210070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1211070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1212070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard firstChar = cur; 1213070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1214070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 1215070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->year = dt->year * 10 + (*cur - '0'); 1216070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1217070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard digcnt++; 1218070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1219070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1220070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* year must be at least 4 digits (CCYY); over 4 1221070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * digits cannot have a leading zero. */ 1222070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0'))) 1223070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1224070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1225070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) 1226070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->year = - dt->year; 1227070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1228070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_YEAR(dt->year)) 1229070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1230070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1231070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1232070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1233070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1234070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1235070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1236070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_2_DIGITS: 1237070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the integer to fill in 1238070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1239070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer 1240070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1241070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a 2-digits integer and updates @num with the value. @cur is 1242070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer. 1243070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and 1244070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1245070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1246070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_2_DIGITS(num, cur, invalid) \ 1247070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((cur[0] < '0') || (cur[0] > '9') || \ 1248070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (cur[1] < '0') || (cur[1] > '9')) \ 1249070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard invalid = 1; \ 1250070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 1251070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = (cur[0] - '0') * 10 + (cur[1] - '0'); \ 1252070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur += 2; 1253070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1254070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1255070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_FLOAT: 1256070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the double to fill in 1257070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1258070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer 1259070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1260070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float and updates @num with the value. @cur is 1261070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the float. The float must have a 1262070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2-digits integer part and may or may not have a decimal part. 1263070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and 1264070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1265070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1266070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_FLOAT(num, cur, invalid) \ 1267070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(num, cur, invalid); \ 1268070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!invalid && (*cur == '.')) { \ 1269070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double mult = 1; \ 1270070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1271070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 1272070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard invalid = 1; \ 1273070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 1274070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mult /= 10; \ 1275070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num += (*cur - '0') * mult; \ 1276070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1277070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 1278070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1279070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1280070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1281070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGMonth: 1282070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1283070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1284070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1285070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gMonth without time zone and fills in the appropriate 1286070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1287070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gMonth. 1288070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1289070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1290070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1291070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1292070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) { 1293070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 1294070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 129564dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik unsigned int value = 0; 1296070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 129764dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik PARSE_2_DIGITS(value, cur, ret); 1298070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1299070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1300070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 130164dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if (!VALID_MONTH(value)) 1302070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1303070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 130464dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik dt->mon = value; 130564dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik 1306070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1307070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1308070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1309070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1310070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1311070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGDay: 1312070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1313070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1314070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1315070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gDay without time zone and fills in the appropriate 1316070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1317070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay. 1318070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1319070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1320070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1321070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1322070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) { 1323070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 1324070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 132564dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik unsigned int value = 0; 1326070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 132764dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik PARSE_2_DIGITS(value, cur, ret); 1328070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1329070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1330070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 133164dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if (!VALID_DAY(value)) 1332070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1333070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 133464dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik dt->day = value; 1335070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1336070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1337070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1338070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1339070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1340070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTime: 1341070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1342070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1343070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1344070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:time without time zone and fills in the appropriate 1345070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * fields of the @dt structure. @str is updated to point just after the 1346070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:time. 1347070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, values of @dt fields are undefined. 1348070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1349070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1350070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1351070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1352070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) { 1353f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard const xmlChar *cur = *str; 1354070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 1355285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik int value = 0; 1356070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 135764dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik PARSE_2_DIGITS(value, cur, ret); 1358070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1359f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard return ret; 1360070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1361070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1362a1dca81df7c352cd9a14ab678750b1623f8f8ed7Patrick Monnerat if (!VALID_HOUR(value) && value != 24 /* Allow end-of-day hour */) 136364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik return 2; 1364070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1365070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1366070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* the ':' insures this string is xs:time */ 136764dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik dt->hour = value; 1368070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 136964dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik PARSE_2_DIGITS(value, cur, ret); 1370070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1371070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 137264dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if (!VALID_MIN(value)) 137364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik return 2; 137464dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik dt->min = value; 1375070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1376070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1377070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1378070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1379070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1380070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_FLOAT(dt->sec, cur, ret); 1381070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1382070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1383070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1384a1dca81df7c352cd9a14ab678750b1623f8f8ed7Patrick Monnerat if (!VALID_TIME(dt)) 1385070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1386070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1387070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1388070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1389070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1390070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1391070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1392070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTimeZone: 1393070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1394070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1395070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1396070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a time zone without time zone and fills in the appropriate 1397070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1398070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * time zone. 1399070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1400070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1401070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1402070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1403070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) { 140414b5643947845df089376106517c4f7ba061e4b0Daniel Veillard const xmlChar *cur; 1405070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 1406070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1407070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (str == NULL) 1408070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 140914b5643947845df089376106517c4f7ba061e4b0Daniel Veillard cur = *str; 1410070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1411070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard switch (*cur) { 1412070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 0: 1413070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tz_flag = 0; 1414070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = 0; 1415070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1416070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1417070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 'Z': 1418070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tz_flag = 1; 1419070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = 0; 1420070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1421070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1422070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1423070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case '+': 1424070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case '-': { 1425070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0, tmp = 0; 1426070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = (*cur == '-'); 1427070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1428070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1429070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1430070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(tmp, cur, ret); 1431070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1432070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1433070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_HOUR(tmp)) 1434070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1435070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1436070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1437070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1438070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1439070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1440070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = tmp * 60; 1441070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1442070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(tmp, cur, ret); 1443070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1444070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1445070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_MIN(tmp)) 1446070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1447070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1448070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo += tmp; 1449070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) 1450070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = - dt->tzo; 1451070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1452070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_TZO(dt->tzo)) 1453070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1454070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 14555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->tz_flag = 1; 1456070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1457070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1458070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard default: 1459070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1460070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1461070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1462070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1463070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1464070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1465070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 14661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard/** 14671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * _xmlSchemaBase64Decode: 14681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * @ch: a character 14691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 14701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Converts a base64 encoded character to its base 64 value. 14711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 14721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Returns 0-63 (value), 64 (pad), or -1 (not recognized) 14731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */ 14741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic int 14751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard_xmlSchemaBase64Decode (const xmlChar ch) { 14761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('A' <= ch) && (ch <= 'Z')) return ch - 'A'; 14771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('a' <= ch) && (ch <= 'z')) return ch - 'a' + 26; 14781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('0' <= ch) && (ch <= '9')) return ch - '0' + 52; 14791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('+' == ch) return 62; 14801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('/' == ch) return 63; 14811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('=' == ch) return 64; 14821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return -1; 14831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard} 14841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 1485070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**************************************************************** 1486070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 1487070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * XML Schema Dates/Times Datatypes Handling * 1488070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 1489070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/ 1490070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1491070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1492070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_DIGITS: 1493070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the integer to fill in 1494070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1495070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag 1496070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1497070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a digits integer and updates @num with the value. @cur is 1498070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer. 1499070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and 1500070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1501070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1502070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_DIGITS(num, cur, num_type) \ 1503070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 1504070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = -1; \ 1505070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 1506070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 1507070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = num * 10 + (*cur - '0'); \ 1508070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1509070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1510070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1511070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1512070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_NUM: 1513070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the double to fill in 1514070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1515070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag 1516070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1517070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float or integer and updates @num with the value. @cur is 1518070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the number. If the number is a float, 1519070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * then it must have an integer part and a decimal part; @num_type will 1520070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * be set to 1. If there is no decimal part, @num_type is set to zero. 1521070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and 1522070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1523070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1524070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_NUM(num, cur, num_type) \ 1525070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = 0; \ 1526070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_DIGITS(num, cur, num_type); \ 1527070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!num_type && (*cur == '.')) { \ 1528070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double mult = 1; \ 1529070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1530070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 1531070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = -1; \ 1532070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 1533070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = 1; \ 1534070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 1535070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mult /= 10; \ 1536070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num += (*cur - '0') * mult; \ 1537070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1538070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 1539070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1540070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1541070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 15425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDates: 1543455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard * @type: the expected type or XML_SCHEMAS_UNKNOWN 1544070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dateTime: string to analyze 1545070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val: the return computed value 1546070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1547070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @dateTime conforms to the lexical space of one of the date types. 1548070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val. 1549070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1550070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 1551070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * and -1 in case of internal or API error. 1552070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1553070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1554455cc07308c673b6714e2f5670c2091a1dab95dcDaniel VeillardxmlSchemaValidateDates (xmlSchemaValType type, 15554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *dateTime, xmlSchemaValPtr *val, 15564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik int collapse) { 1557070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValPtr dt; 1558070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret; 1559070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = dateTime; 1560070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1561070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define RETURN_TYPE_IF_VALID(t) \ 1562070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (IS_TZO_CHAR(*cur)) { \ 1563070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); \ 1564070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 0) { \ 1565070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != 0) \ 1566070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; \ 1567070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->type = t; \ 1568455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard goto done; \ 1569070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 1570070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1571070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1572070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dateTime == NULL) 1573070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1574070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 15754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (collapse) 15764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 15774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 1578070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur != '-') && (*cur < '0') && (*cur > '9')) 1579070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1580070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1581070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN); 1582070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dt == NULL) 1583070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1584070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1585070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((cur[0] == '-') && (cur[1] == '-')) { 1586070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1587070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * It's an incomplete date (xs:gMonthDay, xs:gMonth or 1588070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay) 1589070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1590070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur += 2; 1591070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1592070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gDay? */ 1593070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 1594455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard if (type == XML_SCHEMAS_GMONTH) 1595455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard goto error; 1596070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ++cur; 1597070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1598070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1599070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1600070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1601070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY); 1602070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1603070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1604070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1605070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1606070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1607070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * it should be an xs:gMonthDay or xs:gMonth 1608070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1609070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); 1610070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1611070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1612070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1613d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1614d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a '-' char could indicate this type is xs:gMonthDay or 1615d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a negative time zone offset. Check for xs:gMonthDay first. 1616d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * Also the first three char's of a negative tzo (-MM:SS) can 1617d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * appear to be a valid day; so even if the day portion 1618d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * of the xs:gMonthDay verifies, we must insure it was not 1619d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a tzo. 1620d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1621d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if (*cur == '-') { 1622d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const xmlChar *rewnd = cur; 1623d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard cur++; 1624d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1625f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1626d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((ret == 0) && ((*cur == 0) || (*cur != ':'))) { 1627d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1628d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1629d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * we can use the VALID_MDAY macro to validate the month 1630d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * and day because the leap year test will flag year zero 1631d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * as a leap year (even though zero is an invalid year). 16324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * FUTURE TODO: Zero will become valid in XML Schema 1.1 16334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * probably. 1634d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1635d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if (VALID_MDAY((&(dt->value.date)))) { 1636d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1637d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY); 1638070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1639d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1640d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1641d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1642d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1643d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1644d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * not xs:gMonthDay so rewind and check if just xs:gMonth 1645d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * with an optional time zone. 1646d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1647d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard cur = rewnd; 1648d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1649d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1650d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH); 1651070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1652070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1653070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1654070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1655070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1656070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * It's a right-truncated date or an xs:time. 1657070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Try to parse an xs:time then fallback on right-truncated dates. 1658070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1659070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur >= '0') && (*cur <= '9')) { 1660070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTime(&(dt->value.date), &cur); 1661070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 0) { 1662070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* it's an xs:time */ 1663070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_TIME); 1664070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1665070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1666070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1667070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* fallback on date parsing */ 1668070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur = dateTime; 1669070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1670070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGYear(&(dt->value.date), &cur); 1671070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1672070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1673070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1674070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gYear? */ 1675070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEAR); 1676070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1677070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != '-') 1678070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1679070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1680070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1681070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); 1682070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1683070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1684070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1685070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gYearMonth? */ 1686070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEARMONTH); 1687070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1688070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != '-') 1689070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1690070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1691070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1692070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1693070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret != 0) || !VALID_DATE((&(dt->value.date)))) 1694070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1695070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1696070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:date? */ 1697070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_DATE); 1698070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1699070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != 'T') 1700070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1701070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1702070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1703070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* it should be an xs:dateTime */ 1704070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTime(&(dt->value.date), &cur); 1705070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1706070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1707070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1708070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); 17094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (collapse) 17104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 17116a0baa0cd89b402cdfbb63e9c40f291ebd191f1dDaniel Veillard if ((ret != 0) || (*cur != 0) || (!(VALID_DATETIME((&(dt->value.date)))))) 1712070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1713070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1714455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard 1715070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->type = XML_SCHEMAS_DATETIME; 1716070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1717455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillarddone: 1718d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#if 1 1719d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) 1720d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1721d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#else 1722d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1723d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * insure the parsed type is equal to or less significant (right 1724d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * truncated) than the desired type. 1725d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1726d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) { 1727d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1728d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* time only matches time */ 1729d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_TIME) && (dt->type == XML_SCHEMAS_TIME)) 1730d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1731d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1732d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_DATETIME) && 1733d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard ((dt->type != XML_SCHEMAS_DATE) || 1734d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEARMONTH) || 1735d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEAR))) 1736d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1737d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1738d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_DATE) && 1739d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard ((dt->type != XML_SCHEMAS_GYEAR) || 1740d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEARMONTH))) 1741d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1742d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1743d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_GYEARMONTH) && (dt->type != XML_SCHEMAS_GYEAR)) 1744d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1745d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1746d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_GMONTHDAY) && (dt->type != XML_SCHEMAS_GMONTH)) 1747d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1748d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1749455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard#endif 1750455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard 1751070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (val != NULL) 1752070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *val = dt; 175380b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 175480b19092f24410a6b869abf519227686e8f207caDaniel Veillard xmlSchemaFreeValue(dt); 1755070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1756070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1757070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1758070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror: 1759070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dt != NULL) 1760070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaFreeValue(dt); 1761070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1762070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1763070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1764070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 17655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDuration: 1766070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @type: the predefined type 1767070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @duration: string to analyze 1768070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val: the return computed value 1769070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1770070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @duration conforms to the lexical space of the duration type. 1771070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val. 1772070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1773070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 1774070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * and -1 in case of internal or API error. 1775070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1776070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1777dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED, 17784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *duration, xmlSchemaValPtr *val, 17794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik int collapse) { 1780070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = duration; 1781070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValPtr dur; 1782070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0; 1783070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int seq = 0; 1784d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard double num; 1785d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard int num_type = 0; /* -1 = invalid, 0 = int, 1 = floating */ 1786d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const xmlChar desig[] = {'Y', 'M', 'D', 'H', 'M', 'S'}; 1787d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const double multi[] = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0}; 1788070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1789070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (duration == NULL) 1790070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1791070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 17924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (collapse) 17934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 17944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 1795070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 1796070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = 1; 1797070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1798070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1799070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1800070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* duration must start with 'P' (after sign) */ 1801070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur++ != 'P') 1802070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1803070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 180480b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (*cur == 0) 180580b19092f24410a6b869abf519227686e8f207caDaniel Veillard return 1; 180680b19092f24410a6b869abf519227686e8f207caDaniel Veillard 1807070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); 1808070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dur == NULL) 1809070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1810070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1811070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while (*cur != 0) { 1812070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1813070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* input string should be empty or invalid date/time item */ 1814070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (seq >= sizeof(desig)) 1815070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1816070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1817070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* T designator must be present for time items */ 1818070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == 'T') { 1819070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (seq <= 3) { 1820070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard seq = 3; 1821070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1822070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else 1823070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1824070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else if (seq == 3) 1825070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1826070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1827070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* parse the number portion of the item */ 1828070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_NUM(num, cur, num_type); 1829070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1830070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((num_type == -1) || (*cur == 0)) 1831070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1832070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1833070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* update duration based on item type */ 1834070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while (seq < sizeof(desig)) { 1835070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == desig[seq]) { 1836070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1837070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* verify numeric type; only seconds can be float */ 1838070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((num_type != 0) && (seq < (sizeof(desig)-1))) 1839070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1840070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1841070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard switch (seq) { 1842070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 0: 1843070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon = (long)num * 12; 1844070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1845070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 1: 1846070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon += (long)num; 1847070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1848070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard default: 1849070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* convert to seconds using multiplier */ 1850070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.sec += num * multi[seq]; 1851070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard seq++; 1852070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1853070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1854070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1855070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; /* exit loop */ 1856070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1857070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* no date designators found? */ 1858c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((++seq == 3) || (seq == 6)) 1859070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1860070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 18614efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 18624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (collapse) 1863f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard while IS_WSP_BLANK_CH(*cur) cur++; 1864070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1865070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1866070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) { 1867070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon = -dur->value.dur.mon; 1868070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.day = -dur->value.dur.day; 1869070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.sec = -dur->value.dur.sec; 1870070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1871070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1872070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (val != NULL) 1873070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *val = dur; 187480b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 187580b19092f24410a6b869abf519227686e8f207caDaniel Veillard xmlSchemaFreeValue(dur); 1876070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1877070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1878070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1879070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror: 1880070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dur != NULL) 1881070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaFreeValue(dur); 1882070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1883070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1884070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1885a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard/** 1886a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * xmlSchemaStrip: 1887a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * @value: a value 1888a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * 1889a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Removes the leading and ending spaces of a string 1890a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * 1891a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the new string or NULL if no change was required. 1892a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard */ 1893a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlChar * 1894a1a9d0410000cc69874e53e438b250037d3e14cdDaniel VeillardxmlSchemaStrip(const xmlChar *value) { 1895a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard const xmlChar *start = value, *end, *f; 1896a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard 1897a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if (value == NULL) return(NULL); 189876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*start != 0) && (IS_BLANK_CH(*start))) start++; 1899a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end = start; 1900a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard while (*end != 0) end++; 1901a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard f = end; 1902a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end--; 190376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((end > start) && (IS_BLANK_CH(*end))) end--; 1904a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end++; 1905a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if ((start == value) && (f == end)) return(NULL); 1906a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(xmlStrndup(start, end - start)); 1907a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard} 190896a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard 190996a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard/** 191091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * xmlSchemaWhiteSpaceReplace: 191191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * @value: a value 191291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * 191391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Replaces 0xd, 0x9 and 0xa with a space. 191491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * 191591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Returns the new string or NULL if no change was required. 191691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik */ 191791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlChar * 191891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlSchemaWhiteSpaceReplace(const xmlChar *value) { 1919f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard const xmlChar *cur = value; 1920f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard xmlChar *ret = NULL, *mcur; 192191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 1922f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard if (value == NULL) 192391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik return(NULL); 1924f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 1925f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard while ((*cur != 0) && 192691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik (((*cur) != 0xd) && ((*cur) != 0x9) && ((*cur) != 0xa))) { 192791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik cur++; 192891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik } 192991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if (*cur == 0) 193091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik return (NULL); 193191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik ret = xmlStrdup(value); 193291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik /* TODO FIXME: I guess gcc will bark at this. */ 193391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik mcur = (xmlChar *) (ret + (cur - value)); 193491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik do { 193591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if ( ((*mcur) == 0xd) || ((*mcur) == 0x9) || ((*mcur) == 0xa) ) 193691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik *mcur = ' '; 193791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik mcur++; 1938f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } while (*mcur != 0); 193991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik return(ret); 194091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik} 194191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 194291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik/** 1943b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCollapseString: 1944b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: a value 1945b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 1946b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Removes and normalize white spaces in the string 1947b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 1948b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns the new string or NULL if no change was required. 1949b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 195001fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlChar * 1951b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCollapseString(const xmlChar *value) { 1952b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard const xmlChar *start = value, *end, *f; 1953b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlChar *g; 1954b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard int col = 0; 1955b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1956b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (value == NULL) return(NULL); 195776e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*start != 0) && (IS_BLANK_CH(*start))) start++; 1958b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end = start; 1959b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while (*end != 0) { 196076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if ((*end == ' ') && (IS_BLANK_CH(end[1]))) { 1961b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard col = end - start; 1962b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard break; 1963b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) { 1964b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard col = end - start; 1965b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard break; 1966b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1967b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 1968b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1969b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (col == 0) { 1970b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard f = end; 1971b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end--; 197276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((end > start) && (IS_BLANK_CH(*end))) end--; 1973b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 1974b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((start == value) && (f == end)) return(NULL); 1975b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(xmlStrndup(start, end - start)); 1976b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1977b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard start = xmlStrdup(start); 1978b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (start == NULL) return(NULL); 1979b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard g = (xmlChar *) (start + col); 1980b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end = g; 1981b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while (*end != 0) { 198276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (IS_BLANK_CH(*end)) { 1983b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 198476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*end)) end++; 1985b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*end != 0) 1986b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g++ = ' '; 1987b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else 1988b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g++ = *end++; 1989b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1990b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g = 0; 1991b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return((xmlChar *) start); 1992b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 1993b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1994b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 199528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * xmlSchemaValAtomicListNode: 199628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @type: the predefined atomic type for a token in the list 199728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @value: the list value to check 199828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @ret: the return computed value 199928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @node: the node containing the value 200028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * 200128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Check that a value conforms to the lexical space of the predefined 200228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * list type. if true a value is computed and returned in @ret. 200328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * 2004a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the number of items if this validates, a negative error code 2005a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * number otherwise 200628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */ 200728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillardstatic int 200828c52ab518d34a36fd8da6870a5850088f129a6aDaniel VeillardxmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value, 200928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlSchemaValPtr *ret, xmlNodePtr node) { 201028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlChar *val, *cur, *endval; 201128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard int nb_values = 0; 2012580ced8ee28ecd99374da9383897678e4ba6c358Daniel Veillard int tmp = 0; 201328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard 201428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (value == NULL) { 201528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard return(-1); 201628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 201728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard val = xmlStrdup(value); 201828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (val == NULL) { 201928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard return(-1); 202028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 20216fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard if (ret != NULL) { 20226fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard *ret = NULL; 20236fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard } 202428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur = val; 202528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard /* 202628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Split the list 202728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */ 202876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*cur)) *cur++ = 0; 202928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (*cur != 0) { 203076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (IS_BLANK_CH(*cur)) { 203128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *cur = 0; 203228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur++; 203376e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*cur)) *cur++ = 0; 203428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } else { 203528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard nb_values++; 203628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur++; 203776e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++; 203828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 203928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 204028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (nb_values == 0) { 204128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlFree(val); 2042a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(nb_values); 204328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 204428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard endval = cur; 204528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur = val; 204628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while ((*cur == 0) && (cur != endval)) cur++; 204728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (cur != endval) { 204828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node); 204928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (tmp != 0) 205028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard break; 205128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (*cur != 0) cur++; 205228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while ((*cur == 0) && (cur != endval)) cur++; 205328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 20546fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard /* TODO what return value ? c.f. bug #158628 205528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (ret != NULL) { 205628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard TODO 20576fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard } */ 20586fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard xmlFree(val); 2059a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if (tmp == 0) 2060a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(nb_values); 2061a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(-1); 206228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard} 206328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard 206428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard/** 2065e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * xmlSchemaParseUInt: 2066e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @str: pointer to the string R/W 2067e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @llo: pointer to the low result 2068e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lmi: pointer to the mid result 2069e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lhi: pointer to the high result 2070e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * 2071e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Parse an unsigned long into 3 fields. 2072e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * 2073ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack * Returns the number of significant digits in the number or 2074bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard * -1 if overflow of the capacity and -2 if it's not a number. 2075e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard */ 2076e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic int 2077e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel VeillardxmlSchemaParseUInt(const xmlChar **str, unsigned long *llo, 2078478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik unsigned long *lmi, unsigned long *lhi) { 2079e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long lo = 0, mi = 0, hi = 0; 2080e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard const xmlChar *tmp, *cur = *str; 2081e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard int ret = 0, i = 0; 2082e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 2083f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard if (!((*cur >= '0') && (*cur <= '9'))) 2084bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard return(-2); 2085bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard 2086478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (*cur == '0') { /* ignore leading zeroes */ 2087478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik cur++; 2088e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2089e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard tmp = cur; 2090e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) { 2091478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik i++;tmp++;ret++; 2092e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2093e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (i > 24) { 2094478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *str = tmp; 2095478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return(-1); 2096e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2097e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 16) { 2098478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik hi = hi * 10 + (*cur++ - '0'); 2099478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik i--; 2100e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2101e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 8) { 2102478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik mi = mi * 10 + (*cur++ - '0'); 2103478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik i--; 2104e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2105e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 0) { 2106478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik lo = lo * 10 + (*cur++ - '0'); 2107478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik i--; 2108e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2109e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 2110e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *str = cur; 2111e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *llo = lo; 2112e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *lmi = mi; 2113e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *lhi = hi; 2114e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(ret); 2115e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard} 2116e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 2117e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard/** 2118b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValAtomicType: 21194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type: the predefined type 21204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to check 21214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val: the return computed value 2122c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @node: the node containing the value 2123b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * flags: flags to control the vlidation 21244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 2125b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the atomic type. 21264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * if true a value is computed and returned in @val. 212701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * This checks the value space for list types as well (IDREFS, NMTOKENS). 21284255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 21294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 21304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * and -1 in case of internal or API error. 21314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 2132b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int 21331ac24d36b12487995b659a8fc23a02b9460edb36Daniel VeillardxmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, 21344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaValPtr * val, xmlNodePtr node, int flags, 21354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws, 21364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik int normOnTheFly, int applyNorm, int createStringValue) 21371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard{ 21384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValPtr v; 2139b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlChar *norm = NULL; 2140d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard int ret = 0; 21414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 21424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 214301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitTypes(); 21444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (type == NULL) 21451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (-1); 21465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 2147eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard /* 2148eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard * validating a non existant text node is similar to validating 2149eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard * an empty one. 2150eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard */ 2151eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard if (value == NULL) 2152eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard value = BAD_CAST ""; 2153eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard 21544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (val != NULL) 21551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = NULL; 2156b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((flags == 0) && (value != NULL)) { 215791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 215801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((type->builtInType != XML_SCHEMAS_STRING) && 2159f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard (type->builtInType != XML_SCHEMAS_ANYTYPE) && 216091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik (type->builtInType != XML_SCHEMAS_ANYSIMPLETYPE)) { 216191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if (type->builtInType == XML_SCHEMAS_NORMSTRING) 216291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik norm = xmlSchemaWhiteSpaceReplace(value); 216391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik else 216491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 21651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 21661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value = norm; 21671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2168b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 2169b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 217001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type->builtInType) { 2171f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_UNKNOWN: 21721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 21732f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_ANYTYPE: 21742f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_ANYSIMPLETYPE: 21754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((createStringValue) && (val != NULL)) { 21764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik v = xmlSchemaNewValue(XML_SCHEMAS_ANYSIMPLETYPE); 21774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (v != NULL) { 21784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik v->value.str = xmlStrdup(value); 21794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *val = v; 21804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 21814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto error; 2182f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 21834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21842f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack goto return0; 2185f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_STRING: 21864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (! normOnTheFly) { 21874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *cur = value; 21884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 21894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_REPLACE) { 21904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (*cur != 0) { 21914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 21924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 21934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 21944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 21954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) { 21984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (*cur != 0) { 21994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 22004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 22014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if IS_WSP_SPACE_CH(*cur) { 22024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 22034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if IS_WSP_SPACE_CH(*cur) 22044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 22054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 22064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 22074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (createStringValue && (val != NULL)) { 22124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (applyNorm) { 22134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 22144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 22154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else if (ws == XML_SCHEMA_WHITESPACE_REPLACE) 22164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaWhiteSpaceReplace(value); 22174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (norm != NULL) 22184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = norm; 22194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik v = xmlSchemaNewValue(XML_SCHEMAS_STRING); 22214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (v != NULL) { 22224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik v->value.str = xmlStrdup(value); 22234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *val = v; 22244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 22254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto error; 22264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 22291516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard case XML_SCHEMAS_NORMSTRING:{ 22304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) { 22314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (applyNorm) { 22324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 22334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 22344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else 22354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaWhiteSpaceReplace(value); 22364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (norm != NULL) 22374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = norm; 22384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 22404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *cur = value; 22414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (*cur != 0) { 22424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 22434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 22444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 22454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 22464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22491516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard if (val != NULL) { 22501516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NORMSTRING); 22511516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard if (v != NULL) { 22521516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard v->value.str = xmlStrdup(value); 22531516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard *val = v; 22541516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } else { 22551516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard goto error; 22561516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 22571516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 22581516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard goto return0; 22591516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 22601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_DECIMAL:{ 2261273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack const xmlChar *cur = value; 226272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik unsigned int len, neg, integ, hasLeadingZeroes; 2263273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack xmlChar cval[25]; 2264f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard xmlChar *cptr = cval; 22651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 226672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if ((cur == NULL) || (*cur == 0)) 22671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 22684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 226972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* 227072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * xs:decimal has a whitespace-facet value of 'collapse'. 227172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik */ 22724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 22734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 22744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 227572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* 227672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * First we handle an optional sign. 227772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik */ 227872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik neg = 0; 227972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (*cur == '-') { 228072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik neg = 1; 22811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 228272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } else if (*cur == '+') 22831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 228472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* 228572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * Disallow: "", "-", "- " 228672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik */ 228772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (*cur == 0) 228872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik goto return1; 2289273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 2290273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * Next we "pre-parse" the number, in preparation for calling 2291273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * the common routine xmlSchemaParseUInt. We get rid of any 2292273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * leading zeroes (because we have reserved only 25 chars), 229372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * and note the position of a decimal point. 2294273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 2295273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack len = 0; 229672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik integ = ~0u; 229772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik hasLeadingZeroes = 0; 2298c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 2299c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Skip leading zeroes. 2300c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 230172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik while (*cur == '0') { 2302273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack cur++; 230372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik hasLeadingZeroes = 1; 230472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } 2305c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (*cur != 0) { 230672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik do { 2307c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((*cur >= '0') && (*cur <= '9')) { 2308c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *cptr++ = *cur++; 2309c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik len++; 2310c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else if (*cur == '.') { 2311c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik cur++; 231272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik integ = len; 231372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik do { 231472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if ((*cur >= '0') && (*cur <= '9')) { 231572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik *cptr++ = *cur++; 231672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik len++; 231772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } else 231872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik break; 231972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } while (len < 24); 232072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* 232172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * Disallow "." but allow "00." 232272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik */ 232372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if ((len == 0) && (!hasLeadingZeroes)) 2324c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik goto return1; 2325c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 2326c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else 2327c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 232872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } while (len < 24); 2329273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 23304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 23314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 2332273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (*cur != 0) 233372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik goto return1; /* error if any extraneous chars */ 23341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 23351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL); 23361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 2337273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 2338f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Now evaluate the significant digits of the number 2339f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard */ 234072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (len != 0) { 2341f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 234272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (integ != ~0u) { 234372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* 234472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * Get rid of trailing zeroes in the 234572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * fractional part. 234672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik */ 234772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik while ((len != integ) && (*(cptr-1) == '0')) { 234872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik cptr--; 234972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik len--; 235072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } 235172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } 235272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* 235372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * Terminate the (preparsed) string. 235472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik */ 235572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (len != 0) { 2356bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard *cptr = 0; 235772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik cptr = cval; 2358bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard 235972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik xmlSchemaParseUInt((const xmlChar **)&cptr, 236072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik &v->value.decimal.lo, 236172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik &v->value.decimal.mi, 236272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik &v->value.decimal.hi); 2363273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 2364273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 2365c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 2366c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Set the total digits to 1 if a zero value. 2367c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 23681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = neg; 236972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (len == 0) { 237072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* Speedup for zero values. */ 237172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik v->value.decimal.total = 1; 2372273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else { 2373c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik v->value.decimal.total = len; 237472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (integ == ~0u) 237572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik v->value.decimal.frac = 0; 237672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik else 237772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik v->value.decimal.frac = len - integ; 2378273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 23791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 23801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 23831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2384b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_TIME: 2385b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GDAY: 2386b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GMONTH: 2387b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GMONTHDAY: 2388b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GYEAR: 2389b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GYEARMONTH: 2390b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DATE: 2391b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DATETIME: 23924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = xmlSchemaValidateDates(type->builtInType, value, val, 23934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik normOnTheFly); 23941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 2395b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DURATION: 23964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = xmlSchemaValidateDuration(type, value, val, 23974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik normOnTheFly); 23981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 2399b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_FLOAT: 24005f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly case XML_SCHEMAS_DOUBLE: { 24011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 24021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int neg = 0; 24035f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly int digits_before = 0; 24045f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly int digits_after = 0; 24051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 24064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 24074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 24084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 24091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) { 24101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur += 3; 24111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 24121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 24141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 24151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 24161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 24171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathNAN; 24181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 24201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 24241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 24251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathNAN; 24261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 24281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 24321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 24341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 24361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard neg = 1; 24371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) { 24401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur += 3; 24411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 24421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 24441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 24451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 24461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 24471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (neg) 24481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathNINF; 24491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 24501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathPINF; 24511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 24531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 24571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 24581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (neg) 24591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathNINF; 24601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 24611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathPINF; 24621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 24641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 24681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 24701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((neg == 0) && (*cur == '+')) 24721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-')) 24741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 24761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24775f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly digits_before++; 24781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '.') { 24801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24815f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly while ((*cur >= '0') && (*cur <= '9')) { 24821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24835f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly digits_after++; 24845f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly } 24851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24861ea95900468ec45c251dd44093830569af28e657Daniel Veillard if ((digits_before == 0) && (digits_after == 0)) 24875f8f5e7add065dc569b999179ff25e475376a901Csaba Raduly goto return1; 24881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((*cur == 'e') || (*cur == 'E')) { 24891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((*cur == '-') || (*cur == '+')) 24911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) 24931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 24964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 24974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 24981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 24991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 25011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 25021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 25031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 25046c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik /* 25056c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * TODO: sscanf seems not to give the correct 25066c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * value for extremely high/low values. 25076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * E.g. "1E-149" results in zero. 25086c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 2509d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard if (sscanf((const char *) value, "%f", 25101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard &(v->value.f)) == 1) { 25116c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *val = v; 25121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 25131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 25141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 25171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 25181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 25201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 25211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 25226c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik /* 25236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * TODO: sscanf seems not to give the correct 25246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * value for extremely high/low values. 25256c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 2526d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard if (sscanf((const char *) value, "%lf", 25271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard &(v->value.d)) == 1) { 25281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 25291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 25301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 25311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 25341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 25351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 25391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BOOLEAN:{ 25411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 25421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 25434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) { 25444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 25454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur == '0') { 25464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 0; 25474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 25484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (*cur == '1') { 25494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 1; 25504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 25514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (*cur == 't') { 25524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 25534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur++ == 'r') && (*cur++ == 'u') && 25544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik (*cur++ == 'e')) { 25554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 1; 25564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else 25574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 25584efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (*cur == 'f') { 25594efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 25604efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur++ == 'a') && (*cur++ == 'l') && 25614efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik (*cur++ == 's') && (*cur++ == 'e')) { 25624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 0; 25634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else 25644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 25651869be56906ed5488b7db6d7c16f1c473af1485dKasimier T. Buchcik } else 25661869be56906ed5488b7db6d7c16f1c473af1485dKasimier T. Buchcik goto return1; 25674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur != 0) { 25684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 25694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur != 0) 25704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 25714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 25724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 25734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((cur[0] == '0') && (cur[1] == 0)) 25744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 0; 25754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else if ((cur[0] == '1') && (cur[1] == 0)) 25764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 1; 25774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else if ((cur[0] == 't') && (cur[1] == 'r') 25784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik && (cur[2] == 'u') && (cur[3] == 'e') 25794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik && (cur[4] == 0)) 25804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 1; 25814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else if ((cur[0] == 'f') && (cur[1] == 'a') 25824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik && (cur[2] == 'l') && (cur[3] == 's') 25834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik && (cur[4] == 'e') && (cur[5] == 0)) 25844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 0; 25854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else 25864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 25874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 25881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 25891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN); 25901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 25911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.b = ret; 25921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 25931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 25941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 25951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 25981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_TOKEN:{ 26001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 26011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 26024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (! normOnTheFly) { 26034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (*cur != 0) { 26044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 26054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 26064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (*cur == ' ') { 26074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 26084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur == 0) 26094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 26104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur == ' ') 26114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 26124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 26134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 26144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 2615f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 2616f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 26171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 26181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN); 26191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 26201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 26211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 26221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 26231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 26241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 26271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2628b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_LANGUAGE: 2629f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard if (normOnTheFly) { 26304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 26314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (norm != NULL) 26324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = norm; 26334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 26341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (xmlCheckLanguageID(value) == 1) { 26351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 26361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE); 26371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 26381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 26391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 26401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 26411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 26421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 26451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2647b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NMTOKEN: 26481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (xmlValidateNMToken(value, 1) == 0) { 26491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 26501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN); 26511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 26521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 26531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 26541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 26551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 26561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 26591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2661b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NMTOKENS: 26621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef, 26631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 26641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret > 0) 26651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 26661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 26671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 26681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2669b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NAME: 26701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateName(value, 1); 2671df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard if ((ret == 0) && (val != NULL) && (value != NULL)) { 2672df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NAME); 2673df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard if (v != NULL) { 2674df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard const xmlChar *start = value, *end; 2675df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard while (IS_BLANK_CH(*start)) start++; 2676df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard end = start; 2677df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard while ((*end != 0) && (!IS_BLANK_CH(*end))) end++; 2678df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard v->value.str = xmlStrndup(start, end - start); 2679df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard *val = v; 2680df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard } else { 2681df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard goto error; 2682df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard } 26831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 26851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_QNAME:{ 26861c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik const xmlChar *uri = NULL; 26871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *local = NULL; 26881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 26891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateQName(value, 1); 26901c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (ret != 0) 26911c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik goto done; 26921c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (node != NULL) { 26931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *prefix; 26941c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlNsPtr ns; 26951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 26961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard local = xmlSplitQName2(value, &prefix); 26971c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik ns = xmlSearchNs(node->doc, node, prefix); 26981c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if ((ns == NULL) && (prefix != NULL)) { 26991c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlFree(prefix); 27001c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (local != NULL) 27011c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlFree(local); 27021c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik goto return1; 27031c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik } 27041c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (ns != NULL) 27051c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik uri = ns->href; 27061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) 27071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(prefix); 27081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27091c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (val != NULL) { 27101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_QNAME); 27111c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (v == NULL) { 27121c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (local != NULL) 27131c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlFree(local); 27141c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik goto error; 27151c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik } 27161c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (local != NULL) 27171c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik v->value.qname.name = local; 27181c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik else 27191c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik v->value.qname.name = xmlStrdup(value); 27201c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (uri != NULL) 27211c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik v->value.qname.uri = xmlStrdup(uri); 27221c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik *val = v; 27231c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik } else 27241c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (local != NULL) 27251c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlFree(local); 27261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 27271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2728b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NCNAME: 27291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 27301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 27311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME); 27321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 27331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 27341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 27351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 27361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 27371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2740b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_ID: 27411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 27421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 27431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_ID); 27441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 27451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 27461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 27471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 27481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 27491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 27521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 27531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 27541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 27551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 27561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * NOTE: the IDness might have already be declared in the DTD 27571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */ 27581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (attr->atype != XML_ATTRIBUTE_ID) { 27591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlIDPtr res; 27601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 27611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 27621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 27631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 27641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard res = xmlAddID(NULL, node->doc, strip, attr); 27651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 27661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 27671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard res = xmlAddID(NULL, node->doc, value, attr); 27681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (res == NULL) { 27691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 2; 27701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 27711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ID; 27721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2776b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_IDREF: 27771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 27781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 27796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik v = xmlSchemaNewValue(XML_SCHEMAS_IDREF); 27806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (v == NULL) 27816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik goto error; 27826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik v->value.str = xmlStrdup(value); 27836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *val = v; 27841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 27861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 27871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 27881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 27891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 27901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 27911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 27921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAddRef(NULL, node->doc, strip, attr); 27931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 27941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 27951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAddRef(NULL, node->doc, value, attr); 27961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_IDREF; 27971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2799b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_IDREFS: 28001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef, 28011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 28021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret < 0) 28031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 2; 28041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 28051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 28061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 28071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 28081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 2809249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard 28101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_IDREFS; 28111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 28131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_ENTITY:{ 28141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 28151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 28171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 28181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 3; 28191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 0) { 28201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlEntityPtr ent; 28211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 28231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 28241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ent = xmlGetDocEntity(node->doc, strip); 28251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 28261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 28271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ent = xmlGetDocEntity(node->doc, value); 28281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ent == NULL) || 28301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (ent->etype != 28311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard XML_EXTERNAL_GENERAL_UNPARSED_ENTITY)) 28321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 4; 28331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 28351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard TODO; 28361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 28381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 28391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 2840a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard 28411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ENTITY; 28421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 28441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2845b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_ENTITIES: 28461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 28471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return3; 28481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef, 28491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 28501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret <= 0) 28511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 28521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 28531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 28541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 28551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 28561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 28571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ENTITIES; 28591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 28611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_NOTATION:{ 28621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *uri = NULL; 28631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *local = NULL; 28641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateQName(value, 1); 28661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL)) { 28671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *prefix; 28681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard local = xmlSplitQName2(value, &prefix); 28701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) { 28711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlNsPtr ns; 28721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ns = xmlSearchNs(node->doc, node, prefix); 28741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ns == NULL) 28751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 28761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (val != NULL) 28771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard uri = xmlStrdup(ns->href); 28781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((local != NULL) && ((val == NULL) || (ret != 0))) 28801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(local); 28811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) 28821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(prefix); 28831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 28851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 3; 28861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 0) { 28871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNotationUse(NULL, node->doc, value); 28881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 1) 28891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 28901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 28911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 28921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 28941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION); 28951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 28961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (local != NULL) 28971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.name = local; 28981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 28991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.name = xmlStrdup(value); 29001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (uri != NULL) 29011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.uri = uri; 29021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 29031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 29041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 29051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (local != NULL) 29061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(local); 29071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (uri != NULL) 29081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(uri); 29091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 29101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2913560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 2914f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_ANYURI:{ 291511c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (*value != 0) { 29164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlURIPtr uri; 2917933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre xmlChar *tmpval, *cur; 2918f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard if (normOnTheFly) { 29194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 29204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (norm != NULL) 29214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = norm; 29224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 2923933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre tmpval = xmlStrdup(value); 2924933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre for (cur = tmpval; *cur; ++cur) { 2925933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre if (*cur < 32 || *cur >= 127 || *cur == ' ' || 2926933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre *cur == '<' || *cur == '>' || *cur == '"' || 2927933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre *cur == '{' || *cur == '}' || *cur == '|' || 2928933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre *cur == '\\' || *cur == '^' || *cur == '`' || 2929933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre *cur == '\'') 2930933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre *cur = '_'; 2931933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre } 2932933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre uri = xmlParseURI((const char *) tmpval); 2933933e5de96c406e669f8859557c960929e8f20741Vincent Lefevre xmlFree(tmpval); 293411c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (uri == NULL) 293511c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard goto return1; 293611c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard xmlFreeURI(uri); 293711c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard } 2938560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 29391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 294011c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_ANYURI); 294111c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (v == NULL) 294211c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard goto error; 294311c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard v->value.str = xmlStrdup(value); 294411c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard *val = v; 29451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 29471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_HEXBINARY:{ 29498dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik const xmlChar *cur = value, *start; 29501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *base; 29511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int total, i = 0; 2952560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 2953f34a20e69dc675cd23d3eb558cad135ea280f472Daniel Veillard if (cur == NULL) 29541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2955560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 29564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 29574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 29584efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 29598dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik start = cur; 29601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while (((*cur >= '0') && (*cur <= '9')) || 29611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((*cur >= 'A') && (*cur <= 'F')) || 29621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((*cur >= 'a') && (*cur <= 'f'))) { 29631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard i++; 29641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 29651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 29674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 2968560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 29691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 29701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 29711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((i % 2) != 0) 297270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard goto return1; 2973560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 29741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 29751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 29761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY); 29771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v == NULL) 29781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 29794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* 29804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Copy only the normalized piece. 29814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * CRITICAL TODO: Check this. 29824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */ 29838dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik cur = xmlStrndup(start, i); 29841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) { 2985d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard xmlSchemaTypeErrMemory(node, "allocating hexbin data"); 29861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(v); 29871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 29881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 29901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total = i / 2; /* number of octets */ 299170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 29921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base = (xmlChar *) cur; 29931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while (i-- > 0) { 29941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*base >= 'a') 29951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = *base - ('a' - 'A'); 29961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base++; 29971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 299870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 29991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.hex.str = (xmlChar *) cur; 30001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.hex.total = total; 30011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 30021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 30031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 30041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 30051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BASE64BINARY:{ 30061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* ISSUE: 3007f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * 30081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Ignore all stray characters? (yes, currently) 30091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Worry about long lines? (no, currently) 3010f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * 30111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * rfc2045.txt: 3012f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * 30131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * "The encoded output stream must be represented in lines of 30141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * no more than 76 characters each. All line breaks or other 30151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * characters not found in Table 1 must be ignored by decoding 30161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * software. In base64 data, characters other than those in 30171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Table 1, line breaks, and other white space probably 30181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * indicate a transmission error, about which a warning 30191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * message or even a message rejection might be appropriate 30201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * under some circumstances." */ 30211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 30221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *base; 30231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int total, i = 0, pad = 0; 30241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 30261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (; *cur; ++cur) { 30291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 30301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur); 30321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc < 0) ; 30331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (decc < 64) 30341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard i++; 30351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 30361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 30371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 30381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (; *cur; ++cur) { 30391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 30401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur); 30421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc < 0) ; 30431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (decc < 64) 30441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc == 64) 30461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard pad++; 30471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 30481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* rfc2045.txt: "Special processing is performed if fewer than 30501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 24 bits are available at the end of the data being encoded. 30511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * A full encoding quantum is always completed at the end of a 30521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * body. When fewer than 24 input bits are available in an 30531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * input group, zero bits are added (on the right) to form an 30541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * integral number of 6-bit groups. Padding at the end of the 30551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * data is performed using the "=" character. Since all 30561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * base64 input is an integral number of octets, only the 30571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * following cases can arise: (1) the final quantum of 30581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * encoding input is an integral multiple of 24 bits; here, 30591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * the final unit of encoded output will be an integral 30601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * multiple ofindent: Standard input:701: Warning:old style 30611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * assignment ambiguity in "=*". Assuming "= *" 4 characters 30621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * with no "=" padding, (2) the final 30631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * quantum of encoding input is exactly 8 bits; here, the 30641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * final unit of encoded output will be two characters 30651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * followed by two "=" padding characters, or (3) the final 30661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * quantum of encoding input is exactly 16 bits; here, the 30671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * final unit of encoded output will be three characters 30681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * followed by one "=" padding character." */ 30691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total = 3 * (i / 4); 30711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (pad == 0) { 30721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 0) 30731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (pad == 1) { 30751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 30761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 3) 30781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (decc = _xmlSchemaBase64Decode(*cur); 30801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (decc < 0) || (decc > 63); 30811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur)) 30821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard --cur; 30831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 16bits in 24bits means 2 pad bits: nnnnnn nnmmmm mmmm00*/ 30841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 00111100 -> 0x3c */ 30851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc & ~0x3c) 30861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total += 2; 30881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (pad == 2) { 30891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 30901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 2) 30921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (decc = _xmlSchemaBase64Decode(*cur); 30941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (decc < 0) || (decc > 63); 30951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur)) 30961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard --cur; 30971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 8bits in 12bits means 4 pad bits: nnnnnn nn0000 */ 30981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 00110000 -> 0x30 */ 30991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc & ~0x30) 31001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total += 1; 31021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 31031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 31051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 31061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_BASE64BINARY); 31071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v == NULL) 31081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 31091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base = 31101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (xmlChar *) xmlMallocAtomic((i + pad + 1) * 31111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sizeof(xmlChar)); 31121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (base == NULL) { 3113d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard xmlSchemaTypeErrMemory(node, "allocating base64 data"); 31141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(v); 31151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.base64.str = base; 31181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (cur = value; *cur; ++cur) 31191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (_xmlSchemaBase64Decode(*cur) >= 0) { 31201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = *cur; 31211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ++base; 31221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = 0; 31241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.base64.total = total; 31251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 31261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 312870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 3129e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_INTEGER: 3130e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_PINTEGER: 3131e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_NPINTEGER: 3132e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_NINTEGER: 31331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_NNINTEGER:{ 31341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 31351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 3136ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack int sign = 0; 31371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 31381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 31391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 31414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 31421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 31431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sign = 1; 31441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 31451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (*cur == '+') 31461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 3147ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 3148bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard if (ret < 0) 3149ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 31504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 31514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 3152ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (*cur != 0) 3153ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 315401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_NPINTEGER) { 31551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && 31561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((hi != 0) || (mi != 0) || (lo != 0))) 31571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 315801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_PINTEGER) { 31591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (sign == 1) 31601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((hi == 0) && (mi == 0) && (lo == 0)) 31621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 316301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_NINTEGER) { 31641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (sign == 0) 31651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((hi == 0) && (mi == 0) && (lo == 0)) 31671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 316801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_NNINTEGER) { 31691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && 31701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((hi != 0) || (mi != 0) || (lo != 0))) 31711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (val != NULL) { 317401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 31751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 3176c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (ret == 0) 3177c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik ret++; 31781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 31796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik v->value.decimal.mi = mi; 31806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik v->value.decimal.hi = hi; 31811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = sign; 31821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 3183ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack v->value.decimal.total = ret; 31841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 31851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 31881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 3189e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_LONG: 3190e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_BYTE: 3191e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_SHORT: 31921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_INT:{ 3193bfc42632b70ed24deacc04152c880bcc82f60a96Daniel Veillard const xmlChar *cur = value; 31941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 31951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int sign = 0; 31961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 31971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 31981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 32001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sign = 1; 32011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 32021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (*cur == '+') 32031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 3204ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 3205ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (ret < 0) 3206ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 3207ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (*cur != 0) 3208ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 320901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_LONG) { 32101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi >= 922) { 32111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi > 922) 32121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 33720368) { 32141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 33720368) 32151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 54775807)) 32171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 54775808)) 32191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 322201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_INT) { 32231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi != 0) 32241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 21) { 32261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 21) 32271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 47483647)) 32291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 47483648)) 32311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 323301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_SHORT) { 32341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 32351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 32768)) 32371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 32767)) 32391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 324001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_BYTE) { 32411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 32421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 128)) 32441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 127)) 32461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 324901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 32501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 32511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 32526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik v->value.decimal.mi = mi; 32536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik v->value.decimal.hi = hi; 32541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = sign; 32551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 3256ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack v->value.decimal.total = ret; 32571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 32581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 32611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 3262e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_UINT: 3263e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_ULONG: 3264e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_USHORT: 32651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_UBYTE:{ 32661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 32671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 32681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 32691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 32701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 3271ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 3272ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (ret < 0) 3273ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 3274ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (*cur != 0) 3275ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 327601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_ULONG) { 32771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi >= 1844) { 32781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi > 1844) 32791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 67440737) { 32811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 67440737) 32821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 9551615) 32841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 328701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_UINT) { 32881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi != 0) 32891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 42) { 32911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 42) 32921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 94967295) 32941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 329601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_USHORT) { 32971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 32981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 65535) 33001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 330101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_UBYTE) { 33021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 33031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 33041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 255) 33051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 33061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 33071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 330801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 33091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 33101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 33111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.mi = mi; 33121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.hi = hi; 33131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = 0; 33141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 3315ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack v->value.decimal.total = ret; 33161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 33171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 33181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 33191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 33201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 33214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 3322b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 33231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard done: 33241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 33251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 33261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (ret); 33271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return3: 33281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 33291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 33301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (3); 33311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return1: 33321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 33331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 33341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (1); 33351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return0: 33361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 33371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 33381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (0); 33391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard error: 33401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 33411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 33421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (-1); 3343b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 3344b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 3345b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 3346b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValPredefTypeNode: 3347b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @type: the predefined type 3348b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: the value to check 3349b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @val: the return computed value 3350b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @node: the node containing the value 3351b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 3352b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the predefined type. 3353b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * if true a value is computed and returned in @val. 3354b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 3355b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns 0 if this validates, a positive error code number otherwise 3356b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * and -1 in case of internal or API error. 3357b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 3358b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardint 3359b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value, 3360b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlSchemaValPtr *val, xmlNodePtr node) { 33614efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return(xmlSchemaValAtomicType(type, value, val, node, 0, 33624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 1, 0)); 33634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 33644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 33654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 3366c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaValPredefTypeNodeNoNorm: 3367c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the predefined type 3368c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the value to check 3369c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val: the return computed value 3370c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @node: the node containing the value 3371c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 3372c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Check that a value conforms to the lexical space of the predefined type. 3373c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * if true a value is computed and returned in @val. 3374c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * This one does apply any normalization to the value. 3375c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 3376c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 3377c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * and -1 in case of internal or API error. 3378c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 3379c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardint 3380c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, const xmlChar *value, 3381c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard xmlSchemaValPtr *val, xmlNodePtr node) { 33824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return(xmlSchemaValAtomicType(type, value, val, node, 1, 33834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 0, 1)); 3384c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 3385c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 3386c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/** 3387c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * xmlSchemaValidatePredefinedType: 3388c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @type: the predefined type 3389c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @value: the value to check 3390c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @val: the return computed value 3391c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * 3392c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Check that a value conforms to the lexical space of the predefined type. 3393c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * if true a value is computed and returned in @val. 3394c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * 3395c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 3396c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * and -1 in case of internal or API error. 3397c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard */ 3398c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillardint 3399c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel VeillardxmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value, 3400c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard xmlSchemaValPtr *val) { 3401c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard return(xmlSchemaValPredefTypeNode(type, value, val, NULL)); 3402c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard} 3403c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard 3404c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard/** 34054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareDecimals: 34064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x: a first decimal value 34074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y: a second decimal value 34084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 34094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 decimals 34104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 34114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error 34124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 34134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int 34144255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y) 34154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{ 34164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValPtr swp; 3417273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack int order = 1, integx, integy, dlen; 3418273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack unsigned long hi, mi, lo; 34194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 3420273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3421273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * First test: If x is -ve and not zero 3422273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3423f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard if ((x->value.decimal.sign) && 3424e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((x->value.decimal.lo != 0) || 3425e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (x->value.decimal.mi != 0) || 3426e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (x->value.decimal.hi != 0))) { 3427273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3428273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * Then if y is -ve and not zero reverse the compare 3429273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3430e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((y->value.decimal.sign) && 3431e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((y->value.decimal.lo != 0) || 3432e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.mi != 0) || 3433e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.hi != 0))) 343480b19092f24410a6b869abf519227686e8f207caDaniel Veillard order = -1; 3435273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3436273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * Otherwise (y >= 0) we have the answer 3437273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 343880b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 343980b19092f24410a6b869abf519227686e8f207caDaniel Veillard return (-1); 3440273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3441273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * If x is not -ve and y is -ve we have the answer 3442273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3443e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } else if ((y->value.decimal.sign) && 3444e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((y->value.decimal.lo != 0) || 3445e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.mi != 0) || 3446e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.hi != 0))) { 34474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (1); 344880b19092f24410a6b869abf519227686e8f207caDaniel Veillard } 3449273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3450273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * If it's not simply determined by a difference in sign, 3451273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * then we need to compare the actual values of the two nums. 3452273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * To do this, we start by looking at the integral parts. 3453273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * If the number of integral digits differ, then we have our 3454273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * answer. 3455273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3456273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack integx = x->value.decimal.total - x->value.decimal.frac; 3457273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack integy = y->value.decimal.total - y->value.decimal.frac; 345872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* 345972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * NOTE: We changed the "total" for values like "0.1" 346072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * (or "-0.1" or ".1") to be 1, which was 2 previously. 346172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * Therefore the special case, when such values are 346272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * compared with 0, needs to be handled separately; 346372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * otherwise a zero would be recognized incorrectly as 346472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * greater than those values. This has the nice side effect 346572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * that we gain an overall optimized comparison with zeroes. 346672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * Note that a "0" has a "total" of 1 already. 346772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik */ 346872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (integx == 1) { 346972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (x->value.decimal.lo == 0) { 347072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (integy != 1) 347172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik return -order; 347272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik else if (y->value.decimal.lo != 0) 347372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik return -order; 347472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik else 347572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik return(0); 347672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } 347772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } 347872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (integy == 1) { 347972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (y->value.decimal.lo == 0) { 348072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (integx != 1) 348172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik return order; 348272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik else if (x->value.decimal.lo != 0) 348372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik return order; 348472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik else 348572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik return(0); 348672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } 348772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } 348872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik 3489273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (integx > integy) 3490273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3491273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack else if (integy > integx) 3492273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return -order; 349372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik 3494273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3495273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * If the number of integral digits is the same for both numbers, 3496273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * then things get a little more complicated. We need to "normalize" 3497273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * the numbers in order to properly compare them. To do this, we 3498273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * look at the total length of each number (length => number of 3499273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * significant digits), and divide the "shorter" by 10 (decreasing 3500273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * the length) until they are of equal length. 3501273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3502273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack dlen = x->value.decimal.total - y->value.decimal.total; 3503273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (dlen < 0) { /* y has more digits than x */ 3504273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack swp = x; 3505273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack hi = y->value.decimal.hi; 3506273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack mi = y->value.decimal.mi; 3507273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack lo = y->value.decimal.lo; 3508273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack dlen = -dlen; 3509273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack order = -order; 3510273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else { /* x has more digits than y */ 3511273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack swp = y; 3512273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack hi = x->value.decimal.hi; 3513273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack mi = x->value.decimal.mi; 3514273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack lo = x->value.decimal.lo; 3515273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 3516273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack while (dlen > 8) { /* in effect, right shift by 10**8 */ 3517273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack lo = mi; 3518273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack mi = hi; 3519273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack hi = 0; 3520273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack dlen -= 8; 35214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 3522273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack while (dlen > 0) { 3523273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack unsigned long rem1, rem2; 3524273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack rem1 = (hi % 10) * 100000000L; 3525273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack hi = hi / 10; 3526273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack rem2 = (mi % 10) * 100000000L; 3527273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack mi = (mi + rem1) / 10; 3528273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack lo = (lo + rem2) / 10; 3529273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack dlen--; 3530273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 3531273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (hi > swp->value.decimal.hi) { 3532273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3533273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else if (hi == swp->value.decimal.hi) { 3534273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (mi > swp->value.decimal.mi) { 3535273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3536273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else if (mi == swp->value.decimal.mi) { 3537273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (lo > swp->value.decimal.lo) { 3538273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3539273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else if (lo == swp->value.decimal.lo) { 3540273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (x->value.decimal.total == y->value.decimal.total) { 3541273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return 0; 3542273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else { 3543273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3544273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 3545273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 3546273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 35474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 3548273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return -order; 35494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 35504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 35514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 3552070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xmlSchemaCompareDurations: 3553070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @x: a first duration value 3554070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @y: a second duration value 3555070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 3556070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Compare 2 durations 3557070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 3558070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 3559070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * case of error 3560070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 3561070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 3562070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel VeillardxmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y) 3563070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard{ 3564070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard long carry, mon, day; 3565070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double sec; 356680b19092f24410a6b869abf519227686e8f207caDaniel Veillard int invert = 1; 356780b19092f24410a6b869abf519227686e8f207caDaniel Veillard long xmon, xday, myear, minday, maxday; 3568070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard static const long dayRange [2][12] = { 3569070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, }, 3570070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} }; 3571070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3572070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((x == NULL) || (y == NULL)) 35735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 3574070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3575070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* months */ 3576070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mon = x->value.dur.mon - y->value.dur.mon; 3577070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3578070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* seconds */ 3579070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard sec = x->value.dur.sec - y->value.dur.sec; 3580bbcf1275fec28915b170db31fa9ea9bed0ea39a4Daniel Veillard carry = (long)(sec / SECS_PER_DAY); 3581bbcf1275fec28915b170db31fa9ea9bed0ea39a4Daniel Veillard sec -= ((double)carry) * SECS_PER_DAY; 3582070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3583070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* days */ 3584070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard day = x->value.dur.day - y->value.dur.day + carry; 3585070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3586070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* easy test */ 3587070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (mon == 0) { 3588070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (day == 0) 3589070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (sec == 0.0) 3590070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 3591070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else if (sec < 0.0) 3592070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 3593070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else 3594070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 3595070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else if (day < 0) 3596070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 3597070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else 3598070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 3599070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 3600070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3601070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (mon > 0) { 3602070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((day >= 0) && (sec >= 0.0)) 3603070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 3604070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else { 3605070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = mon; 3606070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xday = -day; 3607070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 3608070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else if ((day <= 0) && (sec <= 0.0)) { 3609070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 3610070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else { 361180b19092f24410a6b869abf519227686e8f207caDaniel Veillard invert = -1; 3612070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = -mon; 3613070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xday = day; 3614070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 3615070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3616070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard myear = xmon / 12; 361780b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (myear == 0) { 361880b19092f24410a6b869abf519227686e8f207caDaniel Veillard minday = 0; 361980b19092f24410a6b869abf519227686e8f207caDaniel Veillard maxday = 0; 362080b19092f24410a6b869abf519227686e8f207caDaniel Veillard } else { 362180b19092f24410a6b869abf519227686e8f207caDaniel Veillard maxday = 366 * ((myear + 3) / 4) + 362280b19092f24410a6b869abf519227686e8f207caDaniel Veillard 365 * ((myear - 1) % 4); 362380b19092f24410a6b869abf519227686e8f207caDaniel Veillard minday = maxday - 1; 362480b19092f24410a6b869abf519227686e8f207caDaniel Veillard } 362580b19092f24410a6b869abf519227686e8f207caDaniel Veillard 3626070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = xmon % 12; 3627070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard minday += dayRange[0][xmon]; 3628070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard maxday += dayRange[1][xmon]; 3629070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 363080b19092f24410a6b869abf519227686e8f207caDaniel Veillard if ((maxday == minday) && (maxday == xday)) 363180b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(0); /* can this really happen ? */ 3632070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (maxday < xday) 363380b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(-invert); 363480b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (minday > xday) 363580b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(invert); 3636070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3637070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* indeterminate */ 36385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; 36395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 36405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 36415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/* 36425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * macros for adding date/times and durations 36435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 36445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT(a,b) (floor(((double)a/(double)b))) 36455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO(a,b) (a - FQUOTIENT(a,b) * b) 36465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT_RANGE(a,low,high) (FQUOTIENT((a-low),(high-low))) 36475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO_RANGE(a,low,high) ((MODULO((a-low),(high-low)))+low) 36485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 36495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 3650669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * xmlSchemaDupVal: 3651669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @v: the #xmlSchemaValPtr value to duplicate 3652669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * 3653669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Makes a copy of @v. The calling program is responsible for freeing 3654669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the returned value. 3655669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * 3656669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * returns a pointer to a duplicated #xmlSchemaValPtr or NULL if error. 3657669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard */ 3658669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillardstatic xmlSchemaValPtr 3659669adfcd3af5dfda873b10119d44202a7450bb20Daniel VeillardxmlSchemaDupVal (xmlSchemaValPtr v) 3660669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard{ 3661669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaValPtr ret = xmlSchemaNewValue(v->type); 3662669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard if (ret == NULL) 3663669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return NULL; 3664f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 3665669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard memcpy(ret, v, sizeof(xmlSchemaVal)); 36664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->next = NULL; 3667669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return ret; 3668669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard} 3669669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard 3670669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard/** 3671285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * xmlSchemaCopyValue: 3672285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * @val: the precomputed value to be copied 3673285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * 3674285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Copies the precomputed value. This duplicates any string within. 3675285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * 3676285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Returns the copy or NULL if a copy for a data-type is not implemented. 3677285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik */ 3678285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaValPtr 3679285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaCopyValue(xmlSchemaValPtr val) 3680285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik{ 36814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaValPtr ret = NULL, prev = NULL, cur; 3682285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik 3683285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik /* 3684285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Copy the string values. 3685285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik */ 36864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (val != NULL) { 36874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik switch (val->type) { 36884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYTYPE: 36894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREFS: 36904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITIES: 36914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKENS: 36924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaFreeValue(ret); 36934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (NULL); 36944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 36954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_STRING: 36964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 36974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_TOKEN: 36984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_LANGUAGE: 36994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NAME: 37004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NCNAME: 37014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ID: 37024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 37034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITY: 37044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKEN: 37054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYURI: 37064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 37074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.str != NULL) 37084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.str = xmlStrdup(BAD_CAST val->value.str); 37094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 3710f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_QNAME: 37114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NOTATION: 37124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 37134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.qname.name != NULL) 37144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.qname.name = 3715285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik xmlStrdup(BAD_CAST val->value.qname.name); 37164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.qname.uri != NULL) 37174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.qname.uri = 3718285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik xmlStrdup(BAD_CAST val->value.qname.uri); 37194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 37204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_HEXBINARY: 37214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 37224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.hex.str != NULL) 37234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.hex.str = xmlStrdup(BAD_CAST val->value.hex.str); 37244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 37254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_BASE64BINARY: 37264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 37274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.base64.str != NULL) 37284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.base64.str = 3729285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik xmlStrdup(BAD_CAST val->value.base64.str); 37304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 37314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik default: 37324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 37334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 37344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 37354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (ret == NULL) 37364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = cur; 37374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else 37384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik prev->next = cur; 37394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik prev = cur; 37404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik val = val->next; 3741285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik } 37424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (ret); 3743285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik} 3744285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik 3745285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik/** 37465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateAdd: 37475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 37485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dur: an #xmlSchemaValPtr of type #XS_DURATION 37495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 37505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compute a new date/time from @dt and @dur. This function assumes @dt 37515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH, 3752669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * or #XML_SCHEMAS_GYEAR. The returned #xmlSchemaVal is the same type as 3753669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt. The calling program is responsible for freeing the returned value. 37545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3755669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a pointer to a new #xmlSchemaVal or NULL if error. 37565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 37575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr 37585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur) 37595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 3760669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaValPtr ret, tmp; 37615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long carry, tempdays, temp; 37625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValDatePtr r, d; 37635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValDurationPtr u; 37645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((dt == NULL) || (dur == NULL)) 37665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 37675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = xmlSchemaNewValue(dt->type); 37695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret == NULL) 37705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 37715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3772669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard /* make a copy so we don't alter the original value */ 3773669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard tmp = xmlSchemaDupVal(dt); 3774669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard if (tmp == NULL) { 3775669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaFreeValue(ret); 3776669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return NULL; 3777669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard } 3778669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard 37795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r = &(ret->value.date); 3780669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard d = &(tmp->value.date); 37815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard u = &(dur->value.dur); 37825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalization */ 37845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->mon == 0) 37855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->mon = 1; 37865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize for time zone offset */ 37885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard u->sec -= (d->tzo * 60); 37895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->tzo = 0; 37905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalization */ 37925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->day == 0) 37935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->day = 1; 37945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* month */ 37965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = d->mon + u->mon; 3797ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->mon = (unsigned int) MODULO_RANGE(carry, 1, 13); 3798ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT_RANGE(carry, 1, 13); 37995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* year (may be modified later) */ 38015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year = d->year + carry; 38025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->year == 0) { 38035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->year > 0) 38045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year--; 38055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 38065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year++; 38075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 38085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* time zone */ 38105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->tzo = d->tzo; 38115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->tz_flag = d->tz_flag; 38125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* seconds */ 38145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->sec = d->sec + u->sec; 3815ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT((long)r->sec, 60); 38165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->sec != 0.0) { 38175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->sec = MODULO(r->sec, 60.0); 38185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 38195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* minute */ 38215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry += d->min; 3822ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->min = (unsigned int) MODULO(carry, 60); 3823ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT(carry, 60); 38245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* hours */ 38265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry += d->hour; 3827ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->hour = (unsigned int) MODULO(carry, 24); 3828ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long)FQUOTIENT(carry, 24); 38295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 38315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * days 38325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Note we use tempdays because the temporary values may need more 38335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * than 5 bits 38345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 38355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) && 38365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (d->day > MAX_DAYINMONTH(r->year, r->mon))) 38375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = MAX_DAYINMONTH(r->year, r->mon); 38385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (d->day < 1) 38395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = 1; 38405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 38415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = d->day; 38425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays += u->day + carry; 38445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard while (1) { 38465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (tempdays < 1) { 38475e9576a492e4fb8c2d517ccd6056a139e801ec9fDaniel Veillard long tmon = (long) MODULO_RANGE((int)r->mon-1, 1, 13); 38485e9576a492e4fb8c2d517ccd6056a139e801ec9fDaniel Veillard long tyr = r->year + (long)FQUOTIENT_RANGE((int)r->mon-1, 1, 13); 38495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (tyr == 0) 38505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tyr--; 385114b5643947845df089376106517c4f7ba061e4b0Daniel Veillard /* 3852f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Coverity detected an overrun in daysInMonth 385314b5643947845df089376106517c4f7ba061e4b0Daniel Veillard * of size 12 at position 12 with index variable "((r)->mon - 1)" 385414b5643947845df089376106517c4f7ba061e4b0Daniel Veillard */ 385530cf439efcea9732d0ecd33b7955666ce264129bDavid Kilzer if (tmon < 1) 385630cf439efcea9732d0ecd33b7955666ce264129bDavid Kilzer tmon = 1; 385714b5643947845df089376106517c4f7ba061e4b0Daniel Veillard if (tmon > 12) 385814b5643947845df089376106517c4f7ba061e4b0Daniel Veillard tmon = 12; 38595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays += MAX_DAYINMONTH(tyr, tmon); 38605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = -1; 38614ba5d3176938d3435ddc7347cdc904658e2999eePhilip Withnall } else if (VALID_YEAR(r->year) && VALID_MONTH(r->mon) && 38624ba5d3176938d3435ddc7347cdc904658e2999eePhilip Withnall tempdays > (long) MAX_DAYINMONTH(r->year, r->mon)) { 38635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon); 38645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = 1; 38655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } else 38665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 38675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard temp = r->mon + carry; 3869ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->mon = (unsigned int) MODULO_RANGE(temp, 1, 13); 3870ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->year = r->year + (unsigned int) FQUOTIENT_RANGE(temp, 1, 13); 38715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->year == 0) { 38725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (temp < 1) 38735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year--; 38745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 38755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year++; 38765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 38775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 3878f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 38795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->day = tempdays; 38805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 38825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * adjust the date/time type to the date values 38835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 38845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret->type != XML_SCHEMAS_DATETIME) { 38855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((r->hour) || (r->min) || (r->sec)) 38865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_DATETIME; 38875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (ret->type != XML_SCHEMAS_DATE) { 38885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((r->mon != 1) && (r->day != 1)) 38895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_DATE; 38905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1)) 38915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_GYEARMONTH; 38925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 38935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 38945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3895669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaFreeValue(tmp); 38965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 38985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 38995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 39015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaDateNormalize: 3902669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt: an #xmlSchemaValPtr of a date/time type value. 3903669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @offset: number of seconds to adjust @dt by. 39045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3905669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Normalize @dt to GMT time. The @offset parameter is subtracted from 3906669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the return value is a time-zone offset is present on @dt. 39075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3908669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a normalized copy of @dt or NULL if error. 39095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 39105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr 39115a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset) 39125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 39135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValPtr dur, ret; 39145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt == NULL) 39165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 39175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (((dt->type != XML_SCHEMAS_TIME) && 3919c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (dt->type != XML_SCHEMAS_DATETIME) && 3920c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (dt->type != XML_SCHEMAS_DATE)) || (dt->value.date.tzo == 0)) 39215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return xmlSchemaDupVal(dt); 39225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); 39245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dur == NULL) 39255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 39265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dur->value.date.sec -= offset; 39285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = _xmlSchemaDateAdd(dt, dur); 39305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret == NULL) 39315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 39325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaFreeValue(dur); 39345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* ret->value.date.tzo = 0; */ 39365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 39375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 39385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 39405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateCastYMToDays: 39415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 39425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3943f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Convert mon and year of @dt to total number of days. Take the 39445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * number of years since (or before) 1 AD and add the number of leap 39455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years. This is a function because negative 39465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years must be handled a little differently and there is no zero year. 39475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 39485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns number of days. 39495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 39505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic long 39515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt) 39525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 39535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long ret; 395449e8963c640865343327c67d4755a1af705717d3Daniel Veillard int mon; 39555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 395649e8963c640865343327c67d4755a1af705717d3Daniel Veillard mon = dt->value.date.mon; 395749e8963c640865343327c67d4755a1af705717d3Daniel Veillard if (mon <= 0) mon = 1; /* normalization */ 395849e8963c640865343327c67d4755a1af705717d3Daniel Veillard 395949e8963c640865343327c67d4755a1af705717d3Daniel Veillard if (dt->value.date.year <= 0) 39605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = (dt->value.date.year * 365) + 39615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+ 39625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((dt->value.date.year+1)/400)) + 396349e8963c640865343327c67d4755a1af705717d3Daniel Veillard DAY_IN_YEAR(0, mon, dt->value.date.year); 39645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 39655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = ((dt->value.date.year-1) * 365) + 39665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+ 39675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((dt->value.date.year-1)/400)) + 396849e8963c640865343327c67d4755a1af705717d3Daniel Veillard DAY_IN_YEAR(0, mon, dt->value.date.year); 39695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 39715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 39725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 39745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * TIME_TO_NUMBER: 39755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 39765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 39775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Calculates the number of seconds in the time portion of @dt. 39785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 39795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns seconds. 39805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 39815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define TIME_TO_NUMBER(dt) \ 39825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((double)((dt->value.date.hour * SECS_PER_HOUR) + \ 3983b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard (dt->value.date.min * SECS_PER_MIN) + \ 3984b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard (dt->value.date.tzo * SECS_PER_MIN)) + \ 3985b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard dt->value.date.sec) 39865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 39885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaCompareDates: 39895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @x: a first date/time value 39905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @y: a second date/time value 39915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 39925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compare 2 date/times 39935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 39945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 39955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error 39965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 39975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic int 39985a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y) 39995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 40005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard unsigned char xmask, ymask, xor_mask, and_mask; 40015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValPtr p1, p2, q1, q2; 40025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long p1d, p2d, q1d, q2d; 40035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((x == NULL) || (y == NULL)) 40055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 40065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.tz_flag) { 40085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (!y->value.date.tz_flag) { 40105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, 0); 40115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 40125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize y + 14:00 */ 40135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR)); 40145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 4016fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 4017fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 4018fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 40195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 4020fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d == q1d) { 40215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 40225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 4024fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (sec < 0.0) { 4025fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 4026fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 40275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 4028fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 40294aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 40305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize y - 14:00 */ 40315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR)); 40325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day; 40335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (p1d > q2d) 40344aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 40355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (p1d == q2d) { 40365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2); 40375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec > 0.0) 40384aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 40395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 40404aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 2; /* indeterminate */ 40415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40424aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(p1); 40434aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q1); 40444aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q2); 40454aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard if (ret != 0) 40464aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 40475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 4048fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 4049fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 4050fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 4051fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } 40525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } else if (y->value.date.tz_flag) { 40545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, 0); 40555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 40565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize x - 14:00 */ 40585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR)); 40595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 40605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 4061fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 4062fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 4063fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 40645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 4065fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d == q1d) { 40665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 40675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 4069fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (sec < 0.0) { 4070fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 4071fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 40725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 4073fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 40744aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 40755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize x + 14:00 */ 40765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR)); 40775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day; 40785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40796560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard if (p2d > q1d) { 40804aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 40816560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard } else if (p2d == q1d) { 40825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1); 40835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec > 0.0) 40844aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 40855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 40864aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 2; /* indeterminate */ 40875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40886560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(p1); 40896560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(q1); 40906560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(p2); 40914aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard if (ret != 0) 40924aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 40935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 4094fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 4095fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 4096fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 40975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 41015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * if the same type then calculate the difference 41025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 41035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->type == y->type) { 41044aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 41055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, 0); 41065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 41075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, 0); 41095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 41105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 4111fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 41124aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = -1; 4113fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d > q1d) { 41144aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 4115fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 41165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 41175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 41195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec < 0.0) 41204aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = -1; 41215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (sec > 0.0) 41224aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 4123f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 41245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 41254aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(p1); 41264aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q1); 41274aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 41285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 41295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard switch (x->type) { 41315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 41325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0xf; 41335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 41355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x7; 41365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 41385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x1; 41395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 41415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x2; 41425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 41445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x3; 41455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 41475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x3; 41485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 41505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x6; 41515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 41535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x8; 41545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard default: 41565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0; 41575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 41595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard switch (y->type) { 41615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 41625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0xf; 41635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 41655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x7; 41665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 41685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x1; 41695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 41715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x2; 41725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 41745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x3; 41755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 41775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x3; 41785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 41805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x6; 41815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 41835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x8; 41845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard default: 41865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0; 41875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 41895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xor_mask = xmask ^ ymask; /* mark type differences */ 41915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard and_mask = xmask & ymask; /* mark field specification */ 41925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* year */ 41945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 1) 41955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 41965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 1) { 41975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.year < y->value.date.year) 41985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 41995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.year > y->value.date.year) 42005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 42015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 42025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 42035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* month */ 42045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 2) 42055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 42065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 2) { 42075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.mon < y->value.date.mon) 42085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 42095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.mon > y->value.date.mon) 42105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 42115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 42125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 42135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* day */ 42145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 4) 42155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 42165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 4) { 42175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.day < y->value.date.day) 42185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 42195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.day > y->value.date.day) 42205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 42215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 42225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 42235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* time */ 42245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 8) 42255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 42265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 8) { 42275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.hour < y->value.date.hour) 42285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 42295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.hour > y->value.date.hour) 42305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 42315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.min < y->value.date.min) 42325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 42335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.min > y->value.date.min) 42345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 42355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.sec < y->value.date.sec) 42365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 42375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.sec > y->value.date.sec) 42385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 42395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 42405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 4241070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 4242070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 4243070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 4244070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 42456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveReplaceStrings: 4246478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @x: a first string value 4247478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @y: a second string value 42486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @invert: inverts the result if x < y or x > y. 42496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 42506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 42516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is 42526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "replace". I.e. @x could 42536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString". 42546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 42556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 42566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 42576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 42586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 4259478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaComparePreserveReplaceStrings(const xmlChar *x, 4260478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y, 42616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int invert) 42626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 42636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 4264f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 4265478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4266478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (IS_WSP_REPLACE_CH(*y)) { 4267478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (! IS_WSP_SPACE_CH(*x)) { 4268478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*x - 0x20) < 0) { 42696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 42746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4279f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 42806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 4281478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x - *y; 42826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) { 42836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 42886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) { 42896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 42946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4295478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik x++; 4296478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 42976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4298478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) { 42996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4304478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 43056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 43116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 43126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 43136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 43146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings: 43156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 43166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 43176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 43186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 43196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is 43206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could 43216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString". 43226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 43236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 43246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 43256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 43266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 4327478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaComparePreserveCollapseStrings(const xmlChar *x, 4328478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y, 43296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int invert) 43306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 43316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 43326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 4333f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard /* 43346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip leading blank chars of the collapsed string. 43356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4336478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4337478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 43386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 4339478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4340478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*y) { 4341478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (! IS_WSP_SPACE_CH(*x)) { 43426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 4343478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * The yv character would have been replaced to 0x20. 43446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4345478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*x - 0x20) < 0) { 43466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 43516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4357478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik x++; 4358478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 43596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 43606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip contiguous blank chars of the collapsed string. 43616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4362478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4363478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 43646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 4365478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x++ - *y++; 43666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) { 43676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) { 43736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4380478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) { 43816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4386478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 43876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 43886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip trailing blank chars of the collapsed string. 43896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4390478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4391478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 4392478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 43936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 44006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 44016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 44026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 44036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings: 44046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 44056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 44066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 44076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 44086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is 44096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could 44106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString". 44116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 44126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 44136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 44146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 44156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 4416478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareReplaceCollapseStrings(const xmlChar *x, 4417478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y, 44186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int invert) 44196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 44206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 44216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 4422f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard /* 44236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip leading blank chars of the collapsed string. 44246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4425478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4426478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 4427f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 4428478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4429478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*y) { 4430478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (! IS_WSP_BLANK_CH(*x)) { 44316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 4432478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * The yv character would have been replaced to 0x20. 44336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4434478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*x - 0x20) < 0) { 44356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 44366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 44386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 44406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 44416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 44436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 44456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4446478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik x++; 4447f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard y++; 4448f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard /* 44496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip contiguous blank chars of the collapsed string. 44506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4451478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4452478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 44536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 4454478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*x) { 44556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 4456478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * The xv character would have been replaced to 0x20. 44576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4458478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((0x20 - *y) < 0) { 44596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 44606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 44626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 44646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 44656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 44676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 44696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4470478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x++ - *y++; 44716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) 44726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) 44746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 44766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4477478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) { 44786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 44796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 44816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 4482f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 4483478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 44846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 44856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip trailing blank chars of the collapsed string. 44866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4487478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4488478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 4489478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 44906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 44916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 44936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 44956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 44966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 44976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 44986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 44996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 45006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 45016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareReplacedStrings: 45026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 45036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 45046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 45056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 45066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 45076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 45086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 45096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 45106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 4511478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareReplacedStrings(const xmlChar *x, 4512478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y) 45136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 45146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 4515f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 4516478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4517478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*y) { 4518478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (! IS_WSP_BLANK_CH(*x)) { 4519478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*x - 0x20) < 0) 4520f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard return(-1); 45216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 45226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 4523f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 45246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 4525478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*x) { 4526478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((0x20 - *y) < 0) 4527f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard return(-1); 45286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 45296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 45306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4531478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x - *y; 45326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) 4533f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard return(-1); 45346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) 4535f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard return(1); 45366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4537478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik x++; 4538478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 45396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4540478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) 45416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 4542478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) 45436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 45446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 45456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 45466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 45476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 4548c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaCompareNormStrings: 4549c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @x: a first string value 4550c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @y: a second string value 4551c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 4552c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Compare 2 string for their normalized values. 4553c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 4554c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 4555c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * case of error 4556c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */ 4557c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int 4558478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareNormStrings(const xmlChar *x, 4559478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y) { 4560c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard int tmp; 4561f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 4562478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*x)) x++; 4563478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*y)) y++; 4564478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4565478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (IS_BLANK_CH(*x)) { 4566478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (!IS_BLANK_CH(*y)) { 4567478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x - *y; 4568c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(tmp); 4569c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4570478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*x)) x++; 4571478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*y)) y++; 4572c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 4573478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x++ - *y++; 4574c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (tmp < 0) 4575c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4576c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (tmp > 0) 4577c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(1); 4578c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4579c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4580478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) { 4581478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*x)) x++; 4582478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) 4583c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(1); 4584c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4585478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 4586478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*y)) y++; 4587478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) 4588c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4589c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4590c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(0); 4591c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard} 4592c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 4593c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/** 4594b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCompareFloats: 4595b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @x: a first float or double value 4596b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @y: a second float or double value 4597b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 4598b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Compare 2 values 4599b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 4600b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 4601b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * case of error 4602b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4603b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int 4604b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) { 4605b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard double d1, d2; 4606b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4607b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((x == NULL) || (y == NULL)) 4608b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 4609b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4610b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 4611b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Cast everything to doubles. 4612b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4613b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->type == XML_SCHEMAS_DOUBLE) 4614b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d1 = x->value.d; 4615b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else if (x->type == XML_SCHEMAS_FLOAT) 4616b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d1 = x->value.f; 4617b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 4618b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 4619b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4620b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (y->type == XML_SCHEMAS_DOUBLE) 4621b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d2 = y->value.d; 4622b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else if (y->type == XML_SCHEMAS_FLOAT) 4623b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d2 = y->value.f; 4624b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 4625b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 4626b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4627b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 4628b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check for special cases. 4629b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4630b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d1)) { 4631b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d2)) 4632b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4633b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4634b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4635b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d2)) 4636b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4637b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == xmlXPathPINF) { 4638b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathPINF) 4639b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4640b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4641b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4642b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathPINF) 4643b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4644b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == xmlXPathNINF) { 4645b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathNINF) 4646b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4647b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4648b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4649b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathNINF) 4650b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4651b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4652b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 4653b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * basic tests, the last one we should have equality, but 4654b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * portability is more important than speed and handling 4655b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * NaN or Inf in a portable way is always a challenge, so ... 4656b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4657b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 < d2) 4658b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4659b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 > d2) 4660b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4661b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == d2) 4662b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4663b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(2); 4664b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 4665b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4666b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 46674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareValues: 46684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x: a first value 46696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xvalue: the first value as a string (optional) 46706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xwtsp: the whitespace type 46714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y: a second value 46726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xvalue: the second value as a string (optional) 46736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @ywtsp: the whitespace type 46744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 46754255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 values 46764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 46774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, 3 if not 46784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * comparable and -2 in case of error 46794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 46806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 46816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaCompareValuesInternal(xmlSchemaValType xtype, 46826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr x, 46836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *xvalue, 46846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, 46856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValType ytype, 46866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaValPtr y, 46876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *yvalue, 4688478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaWhitespaceValueType yws) 4689478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{ 46906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik switch (xtype) { 469180b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UNKNOWN: 46922f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_ANYTYPE: 469380b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(-2); 469480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_INTEGER: 469580b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NPINTEGER: 469680b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NINTEGER: 469780b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NNINTEGER: 469880b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_PINTEGER: 469980b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_INT: 470080b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UINT: 470180b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_LONG: 470280b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ULONG: 470380b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_SHORT: 470480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_USHORT: 470580b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_BYTE: 470680b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UBYTE: 47074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMAS_DECIMAL: 47086c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 47096c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 47106c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == xtype) 471180b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(xmlSchemaCompareDecimals(x, y)); 47126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((ytype == XML_SCHEMAS_DECIMAL) || 47136c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_INTEGER) || 47146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NPINTEGER) || 47156c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NINTEGER) || 47166c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NNINTEGER) || 47176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_PINTEGER) || 47186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_INT) || 47196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_UINT) || 47206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_LONG) || 47216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_ULONG) || 47226c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_SHORT) || 47236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_USHORT) || 47246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_BYTE) || 47256c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_UBYTE)) 47264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(xmlSchemaCompareDecimals(x, y)); 47275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return(-2); 4728070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMAS_DURATION: 47296c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 47306c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 4731478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_DURATION) 4732070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(xmlSchemaCompareDurations(x, y)); 47335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return(-2); 47345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 47355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 47365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 47375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 47385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 47395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 47405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 47415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 47426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 47436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 47446c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((ytype == XML_SCHEMAS_DATETIME) || 47456c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_TIME) || 47466c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GDAY) || 47476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GMONTH) || 47486c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GMONTHDAY) || 47496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GYEAR) || 47506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_DATE) || 47516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GYEARMONTH)) 47525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return (xmlSchemaCompareDates(x, y)); 47535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return (-2); 4754f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard /* 47552ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * Note that we will support comparison of string types against 47562ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * anySimpleType as well. 47572ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik */ 47582ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 47596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_STRING: 4760f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_NORMSTRING: 476180b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_TOKEN: 476280b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_LANGUAGE: 476380b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NMTOKEN: 476480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NAME: 476580b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NCNAME: 476680b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ID: 476780b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_IDREF: 476880b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ENTITY: 476980b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ANYURI: 47706c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik { 47716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *xv, *yv; 47726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 47736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (x == NULL) 47746c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xv = xvalue; 47756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik else 47766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xv = x->value.str; 47776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (y == NULL) 47786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik yv = yvalue; 47796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik else 47806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik yv = y->value.str; 47816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 47826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * TODO: Compare those against QName. 47836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4784f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard if (ytype == XML_SCHEMAS_QNAME) { 47856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik TODO 47866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (y == NULL) 4787f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard return(-2); 47886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-2); 47896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 47906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((ytype == XML_SCHEMAS_ANYSIMPLETYPE) || 47916c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_STRING) || 47926c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NORMSTRING) || 47936c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_TOKEN) || 47946c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_LANGUAGE) || 47956c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NMTOKEN) || 47966c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NAME) || 47976c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NCNAME) || 47986c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_ID) || 47996c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_IDREF) || 48006c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_ENTITY) || 48016c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_ANYURI)) { 48026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 48036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (xws == XML_SCHEMA_WHITESPACE_PRESERVE) { 48046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 48056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) { 48066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* TODO: What about x < y or x > y. */ 48076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (xmlStrEqual(xv, yv)) 48086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (0); 4809f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard else 48106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (2); 48116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else if (yws == XML_SCHEMA_WHITESPACE_REPLACE) 48126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaComparePreserveReplaceStrings(xv, yv, 0)); 48136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) 48146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaComparePreserveCollapseStrings(xv, yv, 0)); 48156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 48166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else if (xws == XML_SCHEMA_WHITESPACE_REPLACE) { 48176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 48186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) 48196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaComparePreserveReplaceStrings(yv, xv, 1)); 48206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_REPLACE) 48216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaCompareReplacedStrings(xv, yv)); 48226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) 48236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaCompareReplaceCollapseStrings(xv, yv, 0)); 48246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 48256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else if (xws == XML_SCHEMA_WHITESPACE_COLLAPSE) { 48266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 48276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) 48286c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaComparePreserveCollapseStrings(yv, xv, 1)); 48296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_REPLACE) 48306c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaCompareReplaceCollapseStrings(yv, xv, 1)); 48316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) 48326c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaCompareNormStrings(xv, yv)); 48336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else 48346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-2); 4835f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 48366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4837c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return (-2); 48386c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik } 4839e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_QNAME: 4840c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NOTATION: 48416c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 48426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 4843c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((ytype == XML_SCHEMAS_QNAME) || 4844c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (ytype == XML_SCHEMAS_NOTATION)) { 4845e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) && 4846e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (xmlStrEqual(x->value.qname.uri, y->value.qname.uri))) 4847e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(0); 4848e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(2); 4849e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 4850e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (-2); 4851c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_FLOAT: 4852c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_DOUBLE: 48536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 48546c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 48556c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((ytype == XML_SCHEMAS_FLOAT) || 48566c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_DOUBLE)) 4857b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (xmlSchemaCompareFloats(x, y)); 4858b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (-2); 4859c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_BOOLEAN: 48606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 48616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 48626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_BOOLEAN) { 4863b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->value.b == y->value.b) 4864b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4865b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->value.b == 0) 4866b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4867b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4868b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4869b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (-2); 4870560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_HEXBINARY: 48716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 48726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 48736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_HEXBINARY) { 487470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard if (x->value.hex.total == y->value.hex.total) { 487570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard int ret = xmlStrcmp(x->value.hex.str, y->value.hex.str); 487670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard if (ret > 0) 487770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(1); 487870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard else if (ret == 0) 487970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(0); 488070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 488170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard else if (x->value.hex.total > y->value.hex.total) 488270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(1); 488370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 488470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(-1); 488570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 4886560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return (-2); 48871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 48886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 48896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 48906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_BASE64BINARY) { 48911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (x->value.base64.total == y->value.base64.total) { 48921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int ret = xmlStrcmp(x->value.base64.str, 48931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard y->value.base64.str); 48941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret > 0) 48951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(1); 48961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (ret == 0) 48971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(0); 4898d369b1387e592791049a41eb4cc16046fe52e985Daniel Veillard else 4899d369b1387e592791049a41eb4cc16046fe52e985Daniel Veillard return(-1); 49001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 49011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (x->value.base64.total > y->value.base64.total) 49021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(1); 49031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 49041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(-1); 49051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 4906f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard return (-2); 4907c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_IDREFS: 4908c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ENTITIES: 4909c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NMTOKENS: 4910c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard TODO 4911c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 49124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 49135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 49144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 49154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 49164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 49176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValues: 49186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first value 49196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second value 49206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 49216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values 49226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 49236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 49246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 49256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 49266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint 49276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) { 49286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, yws; 49296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 49305e094143e423c01739ac9221f371846fd290be4eDaniel Veillard if ((x == NULL) || (y == NULL)) 49315e094143e423c01739ac9221f371846fd290be4eDaniel Veillard return(-2); 49326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (x->type == XML_SCHEMAS_STRING) 49336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xws = XML_SCHEMA_WHITESPACE_PRESERVE; 49346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else if (x->type == XML_SCHEMAS_NORMSTRING) 49356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xws = XML_SCHEMA_WHITESPACE_REPLACE; 49366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 49376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xws = XML_SCHEMA_WHITESPACE_COLLAPSE; 49386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 49396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (y->type == XML_SCHEMAS_STRING) 49406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik yws = XML_SCHEMA_WHITESPACE_PRESERVE; 4941e79226ccdb377cb61fdee69aaf366bb9c5838de9Gaurav else if (y->type == XML_SCHEMAS_NORMSTRING) 49426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik yws = XML_SCHEMA_WHITESPACE_REPLACE; 49436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 49446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik yws = XML_SCHEMA_WHITESPACE_COLLAPSE; 49456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 49466c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type, 49476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik y, NULL, yws)); 49486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 49496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 49506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 49516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValuesWhtsp: 49526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first value 49536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xws: the whitespace value of x 49546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second value 49556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @yws: the whitespace value of y 49566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 49576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values 49586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 49596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 49606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 49616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 49626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint 49636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValuesWhtsp(xmlSchemaValPtr x, 49646c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, 49656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr y, 49666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType yws) 49676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{ 49689dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 49699dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik return(-2); 49706c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type, 49716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik y, NULL, yws)); 49726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik} 49736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 49746c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/** 49756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaCompareValuesWhtspExt: 49766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @x: a first value 49776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xws: the whitespace value of x 49786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @y: a second value 49796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @yws: the whitespace value of y 49806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 49816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Compare 2 values 49826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 49836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 49846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * case of error 49856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 49866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikstatic int 49876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaCompareValuesWhtspExt(xmlSchemaValType xtype, 49886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr x, 49896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *xvalue, 49906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, 49916c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValType ytype, 49926c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr y, 49936c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *yvalue, 49946c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType yws) 49956c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{ 49966c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaCompareValuesInternal(xtype, x, xvalue, xws, ytype, y, 49976c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik yvalue, yws)); 49986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 49996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 50006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 5001c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaNormLen: 5002c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @value: a string 5003c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 5004c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Computes the UTF8 length of the normalized value of the string 5005c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 5006c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns the length or -1 in case of error. 5007c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */ 5008c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int 5009c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaNormLen(const xmlChar *value) { 5010c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard const xmlChar *utf; 5011c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard int ret = 0; 5012c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 5013c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (value == NULL) 5014c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 5015c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf = value; 501676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf)) utf++; 5017c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard while (*utf != 0) { 5018c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (utf[0] & 0x80) { 5019c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[1] & 0xc0) != 0x80) 5020c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 5021c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xe0) == 0xe0) { 5022c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[2] & 0xc0) != 0x80) 5023c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 5024c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xf0) == 0xf0) { 5025c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80) 5026c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 5027c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 4; 5028c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 5029c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 3; 5030c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 5031c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 5032c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 2; 5033c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 503476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack } else if (IS_BLANK_CH(*utf)) { 503576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf)) utf++; 5036c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf == 0) 5037c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 5038c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 5039c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf++; 5040c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 5041c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard ret++; 5042c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 5043c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(ret); 5044c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard} 5045c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 50466927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard/** 50476927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaGetFacetValueAsULong: 50486927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * @facet: an schemas type facet 50496927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * 50506927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Extract the value of a facet 50516927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * 50526927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Returns the value as a long 50536927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard */ 5054c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardunsigned long 5055c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaGetFacetValueAsULong(xmlSchemaFacetPtr facet) 5056c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{ 5057c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard /* 5058c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * TODO: Check if this is a decimal. 5059c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 5060094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack if (facet == NULL) 5061094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack return 0; 5062c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return ((unsigned long) facet->val->value.decimal.lo); 5063c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 5064c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 5065c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/** 506601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateListSimpleTypeFacet: 506701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facet: the facet to check 506801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @value: the lexical repr of the value to validate 506901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @actualLen: the number of list items 507001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @expectedLen: the resulting expected number of list items 507101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 507201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Checks the value of a list simple type against a facet. 507301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 507401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 0 if the value is valid, a positive error code 507501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * number otherwise and -1 in case of an internal error. 507601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 507701fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint 507801fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaValidateListSimpleTypeFacet(xmlSchemaFacetPtr facet, 507901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard const xmlChar *value, 508001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard unsigned long actualLen, 508101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard unsigned long *expectedLen) 508201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 5083ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard if (facet == NULL) 5084ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard return(-1); 508501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 508601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * TODO: Check if this will work with large numbers. 508701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * (compare value.decimal.mi and value.decimal.hi as well?). 508801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 508901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 509001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen != facet->val->value.decimal.lo) { 5091478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (expectedLen != NULL) 5092c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 509301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_LENGTH_VALID); 5094f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 509501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 509601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen < facet->val->value.decimal.lo) { 5097478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (expectedLen != NULL) 5098c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 509901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_MINLENGTH_VALID); 510001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 510101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MAXLENGTH) { 510201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen > facet->val->value.decimal.lo) { 5103478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (expectedLen != NULL) 5104c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 510501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_MAXLENGTH_VALID); 510601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 510701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else 5108f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard /* 5109f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * NOTE: That we can pass NULL as xmlSchemaValPtr to 511001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateFacet, since the remaining facet types 5111f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * are: XML_SCHEMA_FACET_PATTERN, XML_SCHEMA_FACET_ENUMERATION. 511201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 5113f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard return(xmlSchemaValidateFacet(NULL, facet, value, NULL)); 511401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 511501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 511601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 511701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 51186927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaValidateLengthFacet: 5119c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the built-in type 5120c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @facet: the facet to check 5121c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the lexical repr. of the value to be validated 5122c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val: the precomputed value 5123478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value 5124c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @length: the actual length of the value 5125c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 5126f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength" 5127c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * facet; sets @length to the computed length of @value. 5128c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 5129c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if the value is valid, a positive error code 5130c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * otherwise and -1 in case of an internal or API error. 5131c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 5132478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikstatic int 5133478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacetInternal(xmlSchemaFacetPtr facet, 5134aae48e64dfbf2b46b157a4c1857e30645116388fNico Weber xmlSchemaValType valType, 5135478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *value, 5136aae48e64dfbf2b46b157a4c1857e30645116388fNico Weber xmlSchemaValPtr val, 5137478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik unsigned long *length, 5138f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard xmlSchemaWhitespaceValueType ws) 5139c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{ 5140c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard unsigned int len = 0; 5141c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 5142478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((length == NULL) || (facet == NULL)) 5143ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard return (-1); 5144c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *length = 0; 5145c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((facet->type != XML_SCHEMA_FACET_LENGTH) && 5146c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->type != XML_SCHEMA_FACET_MAXLENGTH) && 5147c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->type != XML_SCHEMA_FACET_MINLENGTH)) 5148c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return (-1); 5149f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 5150478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5151478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: length, maxLength and minLength must be of type 5152478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * nonNegativeInteger only. Check if decimal is used somehow. 5153478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5154c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((facet->val == NULL) || 5155c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard ((facet->val->type != XML_SCHEMAS_DECIMAL) && 5156c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 5157c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->val->value.decimal.frac != 0)) { 5158c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(-1); 5159c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 5160c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) 5161c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard len = val->value.hex.total; 5162c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY)) 5163c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard len = val->value.base64.total; 5164c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard else { 5165478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik switch (valType) { 5166478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_STRING: 5167c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NORMSTRING: 5168478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { 5169478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5170478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * This is to ensure API compatibility with the old 5171478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateLengthFacet(). Anyway, this was and 5172478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * is not the correct handling. 5173478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: Get rid of this case somehow. 5174478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5175478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (valType == XML_SCHEMAS_STRING) 5176478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlUTF8Strlen(value); 5177478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5178478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5179478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } else if (value != NULL) { 5180478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 5181478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5182478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5183f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard /* 5184478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Should be OK for "preserve" as well. 5185478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5186478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlUTF8Strlen(value); 5187478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } 5188478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 5189478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 5190c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_TOKEN: 5191c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_LANGUAGE: 5192c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NMTOKEN: 5193c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NAME: 5194c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NCNAME: 5195f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_ID: 5196bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik /* 5197bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik * FIXME: What exactly to do with anyURI? 5198478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5199c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_ANYURI: 5200c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (value != NULL) 5201478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5202c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard break; 5203bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik case XML_SCHEMAS_QNAME: 5204f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_NOTATION: 5205f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard /* 52064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * For QName and NOTATION, those facets are 52074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * deprecated and should be ignored. 5208f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard */ 5209bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik return (0); 5210c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard default: 5211c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard TODO 5212c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 5213c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 5214c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *length = (unsigned long) len; 5215478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5216478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: Return the whole expected value, i.e. "lo", "mi" and "hi". 5217478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5218c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 5219c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len != facet->val->value.decimal.lo) 5220c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_LENGTH_VALID); 5221c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 5222c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len < facet->val->value.decimal.lo) 5223c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_MINLENGTH_VALID); 5224c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } else { 5225c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len > facet->val->value.decimal.lo) 5226c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_MAXLENGTH_VALID); 5227c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 5228f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 5229c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return (0); 5230c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 5231c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 5232c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/** 5233478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateLengthFacet: 5234478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @type: the built-in type 5235478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @facet: the facet to check 5236478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @value: the lexical repr. of the value to be validated 5237478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @val: the precomputed value 5238478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @length: the actual length of the value 5239478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * 5240f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength" 5241478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * facet; sets @length to the computed length of @value. 5242478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * 5243478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Returns 0 if the value is valid, a positive error code 5244478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * otherwise and -1 in case of an internal or API error. 5245478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5246478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikint 5247f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel VeillardxmlSchemaValidateLengthFacet(xmlSchemaTypePtr type, 5248478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaFacetPtr facet, 5249478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *value, 5250478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 5251f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard unsigned long *length) 5252478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{ 5253cc5e2330ef2432493afce6566d3651195366d822Daniel Veillard if (type == NULL) 5254cc5e2330ef2432493afce6566d3651195366d822Daniel Veillard return(-1); 5255478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (xmlSchemaValidateLengthFacetInternal(facet, 5256478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik type->builtInType, value, val, length, 5257478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN)); 5258478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik} 5259478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik 5260478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik/** 5261f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * xmlSchemaValidateLengthFacetWhtsp: 5262478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @facet: the facet to check 5263478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @valType: the built-in type 5264478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @value: the lexical repr. of the value to be validated 5265478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @val: the precomputed value 5266478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value 5267478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @length: the actual length of the value 5268478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * 5269f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength" 5270478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * facet; sets @length to the computed length of @value. 5271478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * 5272478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Returns 0 if the value is valid, a positive error code 5273478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * otherwise and -1 in case of an internal or API error. 5274478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5275478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikint 5276478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacetWhtsp(xmlSchemaFacetPtr facet, 5277478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValType valType, 5278478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *value, 5279478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 5280478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik unsigned long *length, 5281478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 5282478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{ 5283478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (xmlSchemaValidateLengthFacetInternal(facet, valType, value, val, 5284478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik length, ws)); 5285478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik} 5286478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik 5287478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik/** 52886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetInternal: 52894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @facet: the facet to check 5290478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @fws: the whitespace type of the facet's value 5291478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @valType: the built-in type of the value 52924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the lexical repr of the value to validate 52934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val: the precomputed value 5294478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value 52954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 52964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Check a value against a facet condition 52974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 52984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if the element is schemas valid, a positive error code 52994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * number otherwise and -1 in case of internal or API error. 53004255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 53016c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikstatic int 53026c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaValidateFacetInternal(xmlSchemaFacetPtr facet, 53036c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType fws, 5304f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard xmlSchemaValType valType, 53056c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *value, 5306478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 53076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 53084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{ 53094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard int ret; 531090da33cebeba87ae3b49a270c8182142dd7cb48ePatrick Monnerat int stringType; 53114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 53126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (facet == NULL) 53136c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-1); 53146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 53154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard switch (facet->type) { 53164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMA_FACET_PATTERN: 5317f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard /* 53186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * NOTE that for patterns, the @value needs to be the normalized 53196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * value, *not* the lexical initial value or the canonical value. 53206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 53216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (value == NULL) 53226c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-1); 5323cad102b861f74d56e3f6e710c466cf1a38a5db56Audric Schiltknecht /* 5324cad102b861f74d56e3f6e710c466cf1a38a5db56Audric Schiltknecht * If string-derived type, regexp must be tested on the value space of 5325cad102b861f74d56e3f6e710c466cf1a38a5db56Audric Schiltknecht * the datatype. 5326cad102b861f74d56e3f6e710c466cf1a38a5db56Audric Schiltknecht * See https://www.w3.org/TR/xmlschema-2/#rf-pattern 5327cad102b861f74d56e3f6e710c466cf1a38a5db56Audric Schiltknecht */ 532890da33cebeba87ae3b49a270c8182142dd7cb48ePatrick Monnerat stringType = val && ((val->type >= XML_SCHEMAS_STRING && val->type <= XML_SCHEMAS_NORMSTRING) 532990da33cebeba87ae3b49a270c8182142dd7cb48ePatrick Monnerat || (val->type >= XML_SCHEMAS_TOKEN && val->type <= XML_SCHEMAS_NCNAME)); 5330cad102b861f74d56e3f6e710c466cf1a38a5db56Audric Schiltknecht ret = xmlRegexpExec(facet->regexp, 5331cad102b861f74d56e3f6e710c466cf1a38a5db56Audric Schiltknecht (stringType && val->value.str) ? val->value.str : value); 53324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == 1) 53334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 53346c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == 0) 533501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_PATTERN_VALID); 53364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(ret); 53374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMA_FACET_MAXEXCLUSIVE: 53384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 53396c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 53404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(-1); 53414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == -1) 53424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 534301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID); 5344070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MAXINCLUSIVE: 5345070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 53466c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 5347070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 5348070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret == -1) || (ret == 0)) 5349070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 535001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID); 5351070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MINEXCLUSIVE: 5352070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 53536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 5354070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 5355070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 1) 5356070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 535701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID); 5358070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MININCLUSIVE: 5359070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 53606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 5361070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 5362070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret == 1) || (ret == 0)) 5363070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 536401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MININCLUSIVE_VALID); 53658651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard case XML_SCHEMA_FACET_WHITESPACE: 53668bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO whitespaces */ 536701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 536801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * NOTE: Whitespace should be handled to normalize 536901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * the value to be validated against a the facets; 537001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * not to normalize the value in-between. 537101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 53728651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard return(0); 53738bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_ENUMERATION: 5374478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { 5375478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5376478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * This is to ensure API compatibility with the old 5377478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateFacet(). 5378478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: Get rid of this case. 5379478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 53806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((facet->value != NULL) && 53816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (xmlStrEqual(facet->value, value))) 53826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(0); 53836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik } else { 53846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik ret = xmlSchemaCompareValuesWhtspExt(facet->val->type, 53856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik facet->val, facet->value, fws, valType, val, 53866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik value, ws); 53876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 53886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-1); 53896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == 0) 53906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(0); 53916c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik } 539201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_ENUMERATION_VALID); 53938bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_LENGTH: 5394aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik /* 5395aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik * SPEC (1.3) "if {primitive type definition} is QName or NOTATION, 5396aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik * then any {value} is facet-valid." 5397aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik */ 5398aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik if ((valType == XML_SCHEMAS_QNAME) || 5399aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik (valType == XML_SCHEMAS_NOTATION)) 5400aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik return (0); 5401aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik /* No break on purpose. */ 5402e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard case XML_SCHEMA_FACET_MAXLENGTH: 54038bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_MINLENGTH: { 54048bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard unsigned int len = 0; 5405e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard 54064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((valType == XML_SCHEMAS_QNAME) || 54074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik (valType == XML_SCHEMAS_NOTATION)) 54084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (0); 5409478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5410478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: length, maxLength and minLength must be of type 5411478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * nonNegativeInteger only. Check if decimal is used somehow. 5412478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 54138bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard if ((facet->val == NULL) || 5414e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((facet->val->type != XML_SCHEMAS_DECIMAL) && 5415e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 54168bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard (facet->val->value.decimal.frac != 0)) { 54178bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard return(-1); 54188bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 5419560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) 542070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard len = val->value.hex.total; 54211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY)) 54221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard len = val->value.base64.total; 54231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else { 54246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik switch (valType) { 5425478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_STRING: 5426f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_NORMSTRING: 5427478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { 5428478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5429478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * This is to ensure API compatibility with the old 5430478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateFacet(). Anyway, this was and 5431478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * is not the correct handling. 5432478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: Get rid of this case somehow. 5433478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5434478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (valType == XML_SCHEMAS_STRING) 5435478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlUTF8Strlen(value); 5436478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5437478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5438478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } else if (value != NULL) { 5439478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 5440478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5441478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5442f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard /* 5443478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Should be OK for "preserve" as well. 5444478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5445478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlUTF8Strlen(value); 5446478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } 5447478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 5448f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_IDREF: 5449560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_TOKEN: 5450560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_LANGUAGE: 5451560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NMTOKEN: 5452560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NAME: 5453560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NCNAME: 5454560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_ID: 545501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 5456478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (value != NULL) 5457f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard len = xmlSchemaNormLen(value); 5458f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard break; 5459560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard default: 5460560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard TODO 5461f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 54628bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 54638bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 5464e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len != facet->val->value.decimal.lo) 546501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_LENGTH_VALID); 54668bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 5467e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len < facet->val->value.decimal.lo) 546801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MINLENGTH_VALID); 54698bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } else { 5470e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len > facet->val->value.decimal.lo) 547101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXLENGTH_VALID); 5472e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard } 54738bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard break; 54748bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 5475560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMA_FACET_TOTALDIGITS: 5476560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMA_FACET_FRACTIONDIGITS: 5477560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 5478560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((facet->val == NULL) || 547969dea3a0c01e8a952b1d2f07ab0a3aa450f0cdfeKasimier T. Buchcik ((facet->val->type != XML_SCHEMAS_PINTEGER) && 5480560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 5481560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (facet->val->value.decimal.frac != 0)) { 5482560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return(-1); 5483560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 5484560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((val == NULL) || 5485560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard ((val->type != XML_SCHEMAS_DECIMAL) && 5486560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_INTEGER) && 5487560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NPINTEGER) && 5488560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NINTEGER) && 5489560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NNINTEGER) && 5490560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_PINTEGER) && 5491560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_INT) && 5492560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_UINT) && 5493560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_LONG) && 5494560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_ULONG) && 5495560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_SHORT) && 5496560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_USHORT) && 5497560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_BYTE) && 5498560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_UBYTE))) { 5499560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return(-1); 5500560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 5501560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) { 5502560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (val->value.decimal.total > facet->val->value.decimal.lo) 550301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_TOTALDIGITS_VALID); 5504560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 5505560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) { 5506560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (val->value.decimal.frac > facet->val->value.decimal.lo) 550701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID); 5508560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 5509560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard break; 55104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard default: 55114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard TODO 55124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 55134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 5514b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 55154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 55164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 55176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 55186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacet: 55196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @base: the base type 55206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @facet: the facet to check 55216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @value: the lexical repr of the value to validate 55226c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @val: the precomputed value 55236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 55246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Check a value against a facet condition 55256c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 55266c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns 0 if the element is schemas valid, a positive error code 55276c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * number otherwise and -1 in case of internal or API error. 55286c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 55296c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikint 55309dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. BuchcikxmlSchemaValidateFacet(xmlSchemaTypePtr base, 55316c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaFacetPtr facet, 55326c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *value, 55336c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr val) 55346c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{ 55356c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik /* 55366c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * This tries to ensure API compatibility regarding the old 55376c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacet() and the new xmlSchemaValidateFacetInternal() and 55386c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetWhtsp(). 55396c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 55409dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik if (val != NULL) 55416c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaValidateFacetInternal(facet, 55429dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN, val->type, value, val, 55436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN)); 55449dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik else if (base != NULL) 55456c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaValidateFacetInternal(facet, 55469dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN, base->builtInType, value, val, 5547478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN)); 55489dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik return(-1); 55496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik} 55506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 55516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/** 55526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetWhtsp: 55536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @facet: the facet to check 55546c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @fws: the whitespace type of the facet's value 55556c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @valType: the built-in type of the value 55566c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @value: the lexical (or normalized for pattern) repr of the value to validate 55576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @val: the precomputed value 55586c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @ws: the whitespace type of the value 55596c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 55606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Check a value against a facet condition. This takes value normalization 55616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * according to the specified whitespace types into account. 55626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Note that @value needs to be the *normalized* value if the facet 55636c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * is of type "pattern". 55646c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 55656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns 0 if the element is schemas valid, a positive error code 55666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * number otherwise and -1 in case of internal or API error. 55676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 55686c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikint 55696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaValidateFacetWhtsp(xmlSchemaFacetPtr facet, 55706c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType fws, 5571f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard xmlSchemaValType valType, 55726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *value, 5573478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 55746c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 55756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{ 55766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaValidateFacetInternal(facet, fws, valType, 5577478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik value, val, ws)); 55786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik} 55796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 5580c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#if 0 5581c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifndef DBL_DIG 5582c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define DBL_DIG 16 5583c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif 5584c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifndef DBL_EPSILON 5585c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define DBL_EPSILON 1E-9 5586c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif 5587c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5588c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define INTEGER_DIGITS DBL_DIG 5589c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define FRACTION_DIGITS (DBL_DIG + 1) 5590c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define EXPONENT_DIGITS (3 + 2) 5591c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5592c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik/** 5593c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * xmlXPathFormatNumber: 5594c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @number: number to format 5595c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @buffer: output buffer 5596c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @buffersize: size of output buffer 5597c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 5598c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Convert the number into a string representation. 5599c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5600c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcikstatic void 5601c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. BuchcikxmlSchemaFormatFloat(double number, char buffer[], int buffersize) 5602c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik{ 5603c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik switch (xmlXPathIsInf(number)) { 5604c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case 1: 5605c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (buffersize > (int)sizeof("INF")) 5606c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buffer, buffersize, "INF"); 5607c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5608c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case -1: 5609c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (buffersize > (int)sizeof("-INF")) 5610c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buffer, buffersize, "-INF"); 5611c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5612c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik default: 5613c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (xmlXPathIsNaN(number)) { 5614c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (buffersize > (int)sizeof("NaN")) 5615c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buffer, buffersize, "NaN"); 5616c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else if (number == 0) { 5617c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buffer, buffersize, "0.0E0"); 5618c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5619c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 3 is sign, decimal point, and terminating zero */ 5620c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char work[DBL_DIG + EXPONENT_DIGITS + 3]; 5621c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int integer_place, fraction_place; 5622c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char *ptr; 5623c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char *after_fraction; 5624c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik double absolute_value; 5625c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int size; 5626c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5627c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik absolute_value = fabs(number); 5628c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5629c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5630c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Result is in work, and after_fraction points 5631c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * just past the fractional part. 5632f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * Use scientific notation 5633c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5634c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik integer_place = DBL_DIG + EXPONENT_DIGITS + 1; 5635c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik fraction_place = DBL_DIG - 1; 5636c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(work, sizeof(work),"%*.*e", 5637c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik integer_place, fraction_place, number); 5638f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard after_fraction = strchr(work + DBL_DIG, 'e'); 5639c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Remove fractional trailing zeroes */ 5640c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik ptr = after_fraction; 5641c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik while (*(--ptr) == '0') 5642c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik ; 5643c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (*ptr != '.') 5644c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik ptr++; 5645c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik while ((*ptr++ = *after_fraction++) != 0); 5646c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5647c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Finally copy result back to caller */ 5648c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik size = strlen(work) + 1; 5649c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (size > buffersize) { 5650c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik work[buffersize - 1] = 0; 5651c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik size = buffersize; 5652c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5653c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik memmove(buffer, work, size); 5654c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5655c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5656c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5657c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik} 5658c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif 5659c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 56606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/** 56616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaGetCanonValue: 56626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @val: the precomputed value 56636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @retValue: the returned value 56646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 56657a7cad6ed40dff815fd26416192bfbae1b44923fJan Pokorný * Get the canonical lexical representation of the value. 5666c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * The caller has to FREE the returned retValue. 5667c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 5668478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * WARNING: Some value types are not supported yet, resulting 5669478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * in a @retValue of "???". 5670f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * 5671c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: XML Schema 1.0 does not define canonical representations 5672c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * for: duration, gYearMonth, gYear, gMonthDay, gMonth, gDay, 5673c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * anyURI, QName, NOTATION. This will be fixed in XML Schema 1.1. 5674c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 56756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 5676c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Returns 0 if the value could be built, 1 if the value type is 5677c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * not supported yet and -1 in case of API errors. 56786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 56796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint 5680b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel VeillardxmlSchemaGetCanonValue(xmlSchemaValPtr val, const xmlChar **retValue) 56816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 5682b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard if ((retValue == NULL) || (val == NULL)) 56836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-1); 56846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *retValue = NULL; 56856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik switch (val->type) { 5686478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_STRING: 5687478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (val->value.str == NULL) 5688478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); 5689478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5690f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard *retValue = 5691478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik BAD_CAST xmlStrdup((const xmlChar *) val->value.str); 5692478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 56936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 5694478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (val->value.str == NULL) 5695478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); 5696478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else { 5697478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = xmlSchemaWhiteSpaceReplace( 5698478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik (const xmlChar *) val->value.str); 5699478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*retValue) == NULL) 5700478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup( 5701478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik (const xmlChar *) val->value.str); 5702478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } 5703478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 57046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_TOKEN: 57056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_LANGUAGE: 57066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NMTOKEN: 5707f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard case XML_SCHEMAS_NAME: 57086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NCNAME: 57096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_ID: 57106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 57116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_ENTITY: 5712c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NOTATION: /* Unclear */ 5713c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_ANYURI: /* Unclear */ 57146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (val->value.str == NULL) 5715478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (-1); 5716f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard *retValue = 5717aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik BAD_CAST xmlSchemaCollapseString(BAD_CAST val->value.str); 5718aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik if (*retValue == NULL) 5719f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard *retValue = 5720aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik BAD_CAST xmlStrdup((const xmlChar *) val->value.str); 5721478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 5722478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_QNAME: 5723c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0. */ 5724478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (val->value.qname.uri == NULL) { 5725478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.qname.name); 5726478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (0); 5727478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } else { 5728478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST "{"); 5729478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), 5730478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik BAD_CAST val->value.qname.uri); 5731478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), 5732478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik BAD_CAST "}"); 5733478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), 5734478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik BAD_CAST val->value.qname.uri); 5735478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } 5736478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 5737c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DECIMAL: 5738c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5739c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Lookout for a more simple implementation. 5740c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5741f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard if ((val->value.decimal.total == 1) && 5742c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (val->value.decimal.lo == 0)) { 5743c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlStrdup(BAD_CAST "0.0"); 5744c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5745c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValDecimal dec = val->value.decimal; 5746c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int bufsize; 5747c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char *buf = NULL, *offs; 5748c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5749c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Add room for the decimal point as well. */ 5750c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik bufsize = dec.total + 2; 5751c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5752c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik bufsize++; 5753c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Add room for leading/trailing zero. */ 5754c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((dec.frac == 0) || (dec.frac == dec.total)) 5755c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik bufsize++; 5756c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik buf = xmlMalloc(bufsize); 575726ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard if (buf == NULL) 575826ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard return(-1); 5759c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik offs = buf; 5760c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5761c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs++ = '-'; 5762c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.frac == dec.total) { 5763c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs++ = '0'; 5764c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs++ = '.'; 5765c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5766c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.hi != 0) 5767c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(offs, bufsize - (offs - buf), 5768c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu%lu%lu", dec.hi, dec.mi, dec.lo); 5769c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else if (dec.mi != 0) 5770c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(offs, bufsize - (offs - buf), 5771c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu%lu", dec.mi, dec.lo); 5772c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5773c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(offs, bufsize - (offs - buf), 5774c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu", dec.lo); 5775f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard 5776c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.frac != 0) { 5777c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.frac != dec.total) { 5778c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int diff = dec.total - dec.frac; 5779c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5780c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Insert the decimal point. 5781c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5782c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik memmove(offs + diff + 1, offs + diff, dec.frac +1); 5783c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik offs[diff] = '.'; 5784c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5785c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik unsigned int i = 0; 5786c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5787c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Insert missing zeroes behind the decimal point. 5788f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard */ 5789c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik while (*(offs + i) != 0) 5790c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik i++; 5791c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (i < dec.total) { 5792c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik memmove(offs + (dec.total - i), offs, i +1); 5793c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik memset(offs, '0', dec.total - i); 5794c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5795c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5796c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5797c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5798c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Append decimal point and zero. 5799c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5800c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik offs = buf + bufsize - 1; 5801c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs-- = 0; 5802c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs-- = '0'; 5803c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs-- = '.'; 5804c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5805c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST buf; 5806c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5807c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5808c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_INTEGER: 5809c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_PINTEGER: 5810c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NPINTEGER: 5811c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NINTEGER: 5812c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NNINTEGER: 5813c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_LONG: 5814c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_BYTE: 5815c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_SHORT: 5816c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_INT: 5817c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_UINT: 5818c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_ULONG: 5819c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_USHORT: 5820c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_UBYTE: 5821c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((val->value.decimal.total == 1) && 5822c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (val->value.decimal.lo == 0)) 5823c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlStrdup(BAD_CAST "0"); 5824c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else { 5825c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValDecimal dec = val->value.decimal; 5826c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int bufsize = dec.total + 1; 5827c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5828c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Add room for the decimal point as well. */ 5829c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5830c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik bufsize++; 5831c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlMalloc(bufsize); 583226ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard if (*retValue == NULL) 583326ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard return(-1); 5834c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.hi != 0) { 5835c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5836c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, 5837c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "-%lu%lu%lu", dec.hi, dec.mi, dec.lo); 5838c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5839c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, 5840c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu%lu%lu", dec.hi, dec.mi, dec.lo); 5841c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else if (dec.mi != 0) { 5842c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5843c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, 5844c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "-%lu%lu", dec.mi, dec.lo); 5845c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5846c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, 5847c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu%lu", dec.mi, dec.lo); 5848c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5849c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5850c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, "-%lu", dec.lo); 5851c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5852c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, "%lu", dec.lo); 5853c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5854c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5855c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5856c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_BOOLEAN: 5857c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.b) 5858c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST "true"); 5859c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5860c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST "false"); 5861c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5862c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DURATION: { 5863c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[100]; 5864c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik unsigned long year; 5865c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik unsigned long mon, day, hour = 0, min = 0; 5866c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik double sec = 0, left; 5867c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5868c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5869c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5870c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: This results in a normalized output of the value 5871c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * - which is NOT conformant to the spec - 5872c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * since the exact values of each property are not 5873c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * recoverable. Think about extending the structure to 5874c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * provide a field for every property. 5875c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5876c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik year = (unsigned long) FQUOTIENT(labs(val->value.dur.mon), 12); 5877c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik mon = labs(val->value.dur.mon) - 12 * year; 5878c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5879c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik day = (unsigned long) FQUOTIENT(fabs(val->value.dur.sec), 86400); 5880c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik left = fabs(val->value.dur.sec) - day * 86400; 5881c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (left > 0) { 5882c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik hour = (unsigned long) FQUOTIENT(left, 3600); 5883c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik left = left - (hour * 3600); 5884c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (left > 0) { 5885c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik min = (unsigned long) FQUOTIENT(left, 60); 5886c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik sec = left - (min * 60); 5887c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5888c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5889c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((val->value.dur.mon < 0) || (val->value.dur.sec < 0)) 5890c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 100, "P%luY%luM%luDT%luH%luM%.14gS", 5891c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik year, mon, day, hour, min, sec); 5892c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5893c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 100, "-P%luY%luM%luDT%luH%luM%.14gS", 5894c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik year, mon, day, hour, min, sec); 5895c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5896c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5897c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5898c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GYEAR: { 5899c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[30]; 5900c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5901c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5902c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, "%04ld", val->value.date.year); 5903c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5904c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5905c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5906c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GMONTH: { 5907c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5908c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 590926ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard *retValue = xmlMalloc(6); 591026ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard if (*retValue == NULL) 591126ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard return(-1); 5912c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, 6, "--%02u", 5913c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.mon); 5914c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5915c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5916c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GDAY: { 5917c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5918c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5919c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlMalloc(6); 592026ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard if (*retValue == NULL) 592126ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard return(-1); 5922c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, 6, "---%02u", 5923c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.day); 5924c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5925f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard break; 5926c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GMONTHDAY: { 5927c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5928c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5929c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlMalloc(8); 593026ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard if (*retValue == NULL) 593126ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard return(-1); 5932c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, 8, "--%02u-%02u", 5933c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.mon, val->value.date.day); 5934c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5935c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5936c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GYEARMONTH: { 5937c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[35]; 5938c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5939c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5940c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.date.year < 0) 5941c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 35, "-%04ld-%02u", 5942f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard labs(val->value.date.year), 5943c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.mon); 5944c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5945c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 35, "%04ld-%02u", 5946c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.year, val->value.date.mon); 5947c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5948c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5949f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard break; 5950c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_TIME: 5951c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik { 5952c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[30]; 5953c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5954c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.date.tz_flag) { 5955c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValPtr norm; 5956c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5957c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm = xmlSchemaDateNormalize(val, 0); 5958c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (norm == NULL) 5959c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 5960f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard /* 5961f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard * TODO: Check if "%.14g" is portable. 5962c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5963c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, 5964c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%02u:%02u:%02.14gZ", 5965c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.hour, 5966c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.min, 5967c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.sec); 5968c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaFreeValue(norm); 5969c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5970c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, 5971c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%02u:%02u:%02.14g", 5972c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.hour, 5973c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.min, 5974c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.sec); 5975c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5976c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5977f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 5978c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5979c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DATE: 5980c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik { 5981c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[30]; 5982c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5983c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.date.tz_flag) { 5984c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValPtr norm; 5985c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5986c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm = xmlSchemaDateNormalize(val, 0); 5987c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (norm == NULL) 5988c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 5989c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5990c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Append the canonical value of the 5991c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * recoverable timezone and not "Z". 5992c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5993c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, 5994c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%04ld:%02u:%02uZ", 5995c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.year, norm->value.date.mon, 5996c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.day); 5997c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaFreeValue(norm); 5998c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5999c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, 6000c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%04ld:%02u:%02u", 6001c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.year, val->value.date.mon, 6002c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.day); 6003c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 6004c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 6005f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 6006c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 6007c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DATETIME: 6008c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik { 6009c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[50]; 6010c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 6011c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.date.tz_flag) { 6012c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValPtr norm; 6013c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 6014c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm = xmlSchemaDateNormalize(val, 0); 6015c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (norm == NULL) 6016c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 6017c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 6018c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Check if "%.14g" is portable. 6019c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 6020c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 50, 6021c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%04ld:%02u:%02uT%02u:%02u:%02.14gZ", 6022c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.year, norm->value.date.mon, 6023c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.day, norm->value.date.hour, 6024c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.min, norm->value.date.sec); 6025c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaFreeValue(norm); 6026c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 6027c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 50, 6028c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%04ld:%02u:%02uT%02u:%02u:%02.14g", 6029c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.year, val->value.date.mon, 6030c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.day, val->value.date.hour, 6031c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.min, val->value.date.sec); 6032c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 6033c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 6034c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 6035c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 6036c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_HEXBINARY: 6037c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.hex.str); 6038c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 6039c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_BASE64BINARY: 6040c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 6041c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Is the following spec piece implemented?: 6042c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * SPEC: "Note: For some values the canonical form defined 6043c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * above does not conform to [RFC 2045], which requires breaking 6044c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * with linefeeds at appropriate intervals." 6045c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 6046c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.base64.str); 6047c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 6048c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_FLOAT: { 6049f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard char buf[30]; 6050f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard /* 6051c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * |m| < 16777216, -149 <= e <= 104. 6052c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Handle, NaN, INF, -INF. The format is not 6053c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * yet conformant. The c type float does not cover 6054c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * the whole range. 6055c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 6056c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, "%01.14e", val->value.f); 6057c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 6058c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 6059c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 6060c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DOUBLE: { 6061c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[40]; 6062c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* |m| < 9007199254740992, -1075 <= e <= 970 */ 6063c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 6064c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Handle, NaN, INF, -INF. The format is not 6065c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * yet conformant. The c type float does not cover 6066c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * the whole range. 6067c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 6068c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 40, "%01.14e", val->value.d); 6069c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 6070c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 6071f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard break; 60726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik default: 6073478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST "???"); 6074c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (1); 60756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 607626ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard if (*retValue == NULL) 607726ab0e6c73ee2a80695bed9e6530417dea49cb15Daniel Veillard return(-1); 6078478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (0); 6079478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik} 6080478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik 6081bda59576670f1cabea3c49520628d82e401702caDaniel Veillard/** 6082c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * xmlSchemaGetCanonValueWhtsp: 6083c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @val: the precomputed value 6084c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @retValue: the returned value 6085c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @ws: the whitespace type of the value 6086c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 60877a7cad6ed40dff815fd26416192bfbae1b44923fJan Pokorný * Get the canonical representation of the value. 6088c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * The caller has to free the returned @retValue. 6089c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 6090c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Returns 0 if the value could be built, 1 if the value type is 6091c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * not supported yet and -1 in case of API errors. 6092c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 6093c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcikint 6094c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. BuchcikxmlSchemaGetCanonValueWhtsp(xmlSchemaValPtr val, 6095c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik const xmlChar **retValue, 6096c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 6097c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik{ 6098c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((retValue == NULL) || (val == NULL)) 6099c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 6100c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((ws == XML_SCHEMA_WHITESPACE_UNKNOWN) || 6101c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (ws > XML_SCHEMA_WHITESPACE_COLLAPSE)) 6102c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 6103c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 6104c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = NULL; 6105c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik switch (val->type) { 6106c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_STRING: 6107c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.str == NULL) 6108c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); 6109c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 6110c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlSchemaCollapseString(val->value.str); 6111c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else if (ws == XML_SCHEMA_WHITESPACE_REPLACE) 6112c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlSchemaWhiteSpaceReplace(val->value.str); 6113c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((*retValue) == NULL) 6114c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(val->value.str); 6115c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 6116c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 6117c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.str == NULL) 6118c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); 6119c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else { 6120c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 6121c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlSchemaCollapseString(val->value.str); 6122c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 6123c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlSchemaWhiteSpaceReplace(val->value.str); 6124c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((*retValue) == NULL) 6125c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(val->value.str); 6126c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 6127c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 6128c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik default: 6129c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (xmlSchemaGetCanonValue(val, retValue)); 6130f8e3db0445a1bc8cfe3f77326b07ec161482caa2Daniel Veillard } 6131c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (0); 6132c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik} 6133c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 6134c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik/** 6135bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * xmlSchemaGetValType: 6136bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * @val: a schemas value 6137bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * 6138bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * Accessor for the type of a value 6139bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * 6140bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * Returns the xmlSchemaValType of the value 6141bda59576670f1cabea3c49520628d82e401702caDaniel Veillard */ 6142478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValType 6143478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaGetValType(xmlSchemaValPtr val) 6144478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{ 6145bda59576670f1cabea3c49520628d82e401702caDaniel Veillard if (val == NULL) 6146bda59576670f1cabea3c49520628d82e401702caDaniel Veillard return(XML_SCHEMAS_UNKNOWN); 6147478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (val->type); 61486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 61496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 61505d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#define bottom_xmlschemastypes 61515d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#include "elfgcchack.h" 61524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#endif /* LIBXML_SCHEMAS_ENABLED */ 6153