xmlschemastypes.c revision 14b5643947845df089376106517c4f7ba061e4b0
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 434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define TODO \ 444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard "Unimplemented block at %s:%d\n", \ 464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard __FILE__, __LINE__); 474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#define XML_SCHEMAS_NAMESPACE_NAME \ 494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard (const xmlChar *)"http://www.w3.org/2001/XMLSchema" 504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik#define IS_WSP_REPLACE_CH(c) ((((c) == 0x9) || ((c) == 0xa)) || \ 526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik ((c) == 0xd)) 536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik#define IS_WSP_SPACE_CH(c) ((c) == 0x20) 556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 56478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik#define IS_WSP_BLANK_CH(c) IS_BLANK_CH(c) 57478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik 58070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* Date value */ 59070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef struct _xmlSchemaValDate xmlSchemaValDate; 60070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef xmlSchemaValDate *xmlSchemaValDatePtr; 61070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstruct _xmlSchemaValDate { 62070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard long year; 63070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int mon :4; /* 1 <= mon <= 12 */ 64070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int day :5; /* 1 <= day <= 31 */ 65070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int hour :5; /* 0 <= hour <= 23 */ 66070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int min :6; /* 0 <= min <= 59 */ 67070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double sec; 68a77cf71f453249f224d609f2f20789a897c5bdebDaniel Veillard unsigned int tz_flag :1; /* is tzo explicitely set? */ 69285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik signed int tzo :12; /* -1440 <= tzo <= 1440; 70285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik currently only -840 to +840 are needed */ 71070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard}; 72070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 73070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* Duration value */ 74070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef struct _xmlSchemaValDuration xmlSchemaValDuration; 75070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardtypedef xmlSchemaValDuration *xmlSchemaValDurationPtr; 76070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstruct _xmlSchemaValDuration { 77070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard long mon; /* mon stores years also */ 78070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel 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 * * 192d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * Datatype error handlers * 193d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * * 194d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard ************************************************************************/ 195d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/** 196d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * xmlSchemaTypeErrMemory: 197d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * @extra: extra informations 198d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * 199d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * Handle an out of memory condition 200d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard */ 201d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillardstatic void 202d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel VeillardxmlSchemaTypeErrMemory(xmlNodePtr node, const char *extra) 203d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard{ 204d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard __xmlSimpleError(XML_FROM_DATATYPE, XML_ERR_NO_MEMORY, node, NULL, extra); 205d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard} 206d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard 207d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard/************************************************************************ 208d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * * 209d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * Base types support * 210d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard * * 211d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard ************************************************************************/ 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); 2454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->val->value.decimal.lo = value; 2464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (ret); 2474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik} 2484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 249c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard/* 2504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitBasicType: 2514255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name: the type name 2528bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard * @type: the value type associated 2534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 25401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Initialize one primitive built-in type 2554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 2564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr 25701fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaInitBasicType(const char *name, xmlSchemaValType type, 25801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypePtr baseType) { 2594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypePtr ret; 2604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 2614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType)); 2624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == NULL) { 263d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard xmlSchemaTypeErrMemory(NULL, "could not initialize basic types"); 2644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(NULL); 2654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 2664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard memset(ret, 0, sizeof(xmlSchemaType)); 267be9c6320d4ed8d5622322014310555bb88b02a85Daniel Veillard ret->name = (const xmlChar *)name; 2684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->targetNamespace = XML_SCHEMAS_NAMESPACE_NAME; 2694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret->type = XML_SCHEMA_TYPE_BASIC; 2704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->baseType = baseType; 2714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->contentType = XML_SCHEMA_CONTENT_BASIC; 27201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 2734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Primitive types. 27401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 2754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik switch (type) { 27601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_STRING: 27701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DECIMAL: 27801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATE: 27901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATETIME: 28001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_TIME: 28101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEAR: 28201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 28301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTH: 28401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 28501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GDAY: 28601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DURATION: 28701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_FLOAT: 28801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DOUBLE: 28901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BOOLEAN: 29001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 29101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_HEXBINARY: 29201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 29301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_QNAME: 29401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NOTATION: 29501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard ret->flags |= XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE; 2964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 29796d2effc735fb45cfa363b6a876ff23a862f87a5William M. Brack default: 2984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 2994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 3004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* 3014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Set variety. 3024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */ 3034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik switch (type) { 3044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYTYPE: 3054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 3064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 3074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREFS: 3084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKENS: 3094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITIES: 3104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST; 3114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->facets = xmlSchemaNewMinLengthFacet(1); 3124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->flags |= XML_SCHEMAS_TYPE_HAS_FACETS; 3134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 3144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik default: 3154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC; 3164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 31701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 3184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlHashAddEntry2(xmlSchemaTypesBank, ret->name, 3194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard XML_SCHEMAS_NAMESPACE_NAME, ret); 32001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard ret->builtInType = type; 3214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(ret); 3224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 3234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 3244255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/* 32511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* WARNING: Those type reside normally in xmlschemas.c but are 32611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* redefined here locally in oder of being able to use them for xs:anyType- 32711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* TODO: Remove those definition if we move the types to a header file. 32811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* TODO: Always keep those structs up-to-date with the originals. 32911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik*/ 33011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik#define UNBOUNDED (1 << 30) 33111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik 33211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef struct _xmlSchemaTreeItem xmlSchemaTreeItem; 33311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef xmlSchemaTreeItem *xmlSchemaTreeItemPtr; 33411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstruct _xmlSchemaTreeItem { 33511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeType type; 33611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaAnnotPtr annot; 33711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTreeItemPtr next; 33811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTreeItemPtr children; 33911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik}; 34011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik 34111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef struct _xmlSchemaParticle xmlSchemaParticle; 34211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef xmlSchemaParticle *xmlSchemaParticlePtr; 34311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstruct _xmlSchemaParticle { 34411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeType type; 34511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaAnnotPtr annot; 34611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTreeItemPtr next; 34711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTreeItemPtr children; 34811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik int minOccurs; 34911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik int maxOccurs; 35011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlNodePtr node; 35111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik}; 35211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik 35311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef struct _xmlSchemaModelGroup xmlSchemaModelGroup; 35411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef xmlSchemaModelGroup *xmlSchemaModelGroupPtr; 35511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstruct _xmlSchemaModelGroup { 35611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeType type; 35711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaAnnotPtr annot; 35811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTreeItemPtr next; 35911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTreeItemPtr children; 36011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlNodePtr node; 36111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik}; 36211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik 36311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstatic xmlSchemaParticlePtr 36411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. BuchcikxmlSchemaAddParticle(void) 36511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik{ 36611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaParticlePtr ret = NULL; 36711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik 36811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik ret = (xmlSchemaParticlePtr) 36911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlMalloc(sizeof(xmlSchemaParticle)); 37011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik if (ret == NULL) { 37111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeErrMemory(NULL, "allocating particle component"); 37211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik return (NULL); 37311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik } 37411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik memset(ret, 0, sizeof(xmlSchemaParticle)); 37511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik ret->type = XML_SCHEMA_TYPE_PARTICLE; 37611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik ret->minOccurs = 1; 37711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik ret->maxOccurs = 1; 37811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik return (ret); 37911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik} 38011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik 38111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik/* 3824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitTypes: 3834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 3844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Initialize the default XML Schemas type library 3854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 3864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid 3876560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel VeillardxmlSchemaInitTypes(void) 3886560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard{ 3894255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized != 0) 3906560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard return; 3914255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypesBank = xmlHashCreate(40); 3926560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard 39301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 394c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard /* 39501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 3.4.7 Built-in Complex Type Definition 39601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 3978bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeAnyTypeDef = xmlSchemaInitBasicType("anyType", 3982f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack XML_SCHEMAS_ANYTYPE, 39901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard NULL); 40001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef->baseType = xmlSchemaTypeAnyTypeDef; 40101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED; 40211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* 40311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik * Init the content type. 40411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik */ 40511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED; 40601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard { 40711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaParticlePtr particle; 40811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaModelGroupPtr sequence; 40901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaWildcardPtr wild; 41011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* First particle. */ 41111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle = xmlSchemaAddParticle(); 41211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik if (particle == NULL) 41311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik return; 41411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeAnyTypeDef->subtypes = (xmlSchemaTypePtr) particle; 41511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* Sequence model group. */ 41611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik sequence = (xmlSchemaModelGroupPtr) 41711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlMalloc(sizeof(xmlSchemaModelGroup)); 41811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik if (sequence == NULL) { 41911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeErrMemory(NULL, "allocating model group component"); 42011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik return; 42111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik } 42211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik memset(sequence, 0, sizeof(xmlSchemaModelGroup)); 42311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik sequence->type = XML_SCHEMA_TYPE_SEQUENCE; 42411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle->children = (xmlSchemaTreeItemPtr) sequence; 42511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* Second particle. */ 42611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle = xmlSchemaAddParticle(); 42711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik if (particle == NULL) 42811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik return; 42911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle->minOccurs = 0; 43011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle->maxOccurs = UNBOUNDED; 43111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik sequence->children = (xmlSchemaTreeItemPtr) particle; 43211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* The wildcard */ 43311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard)); 43411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik if (wild == NULL) { 43511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeErrMemory(NULL, "allocating wildcard component"); 43611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik return; 43711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik } 43811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik memset(wild, 0, sizeof(xmlSchemaWildcard)); 43911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik wild->type = XML_SCHEMA_TYPE_ANY; 44069dea3a0c01e8a952b1d2f07ab0a3aa450f0cdfeKasimier T. Buchcik wild->any = 1; 44111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik wild->processContents = XML_SCHEMAS_ANY_LAX; 44211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle->children = (xmlSchemaTreeItemPtr) wild; 44311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* 44411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik * Create the attribute wildcard. 44511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik */ 44601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard)); 44701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (wild == NULL) { 44811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeErrMemory(NULL, "could not create an attribute " 44911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik "wildcard on anyType"); 45001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return; 45101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 45201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard memset(wild, 0, sizeof(xmlSchemaWildcard)); 45301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard wild->any = 1; 45469dea3a0c01e8a952b1d2f07ab0a3aa450f0cdfeKasimier T. Buchcik wild->processContents = XML_SCHEMAS_ANY_LAX; 45501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef->attributeWildcard = wild; 45601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 45701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef = xmlSchemaInitBasicType("anySimpleType", 4582f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack XML_SCHEMAS_ANYSIMPLETYPE, 45901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef); 46001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 46101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * primitive datatypes 46201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 46301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeStringDef = xmlSchemaInitBasicType("string", 46401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_STRING, 46501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4668bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDecimalDef = xmlSchemaInitBasicType("decimal", 46701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DECIMAL, 46801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4698bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDateDef = xmlSchemaInitBasicType("date", 47001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DATE, 47101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4728bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDatetimeDef = xmlSchemaInitBasicType("dateTime", 47301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DATETIME, 47401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4758bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeTimeDef = xmlSchemaInitBasicType("time", 47601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_TIME, 47701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4788bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGYearDef = xmlSchemaInitBasicType("gYear", 47901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GYEAR, 48001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4818bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGYearMonthDef = xmlSchemaInitBasicType("gYearMonth", 48201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GYEARMONTH, 48301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4848bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGMonthDef = xmlSchemaInitBasicType("gMonth", 48501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GMONTH, 48601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4878bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGMonthDayDef = xmlSchemaInitBasicType("gMonthDay", 48801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GMONTHDAY, 48901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4908bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGDayDef = xmlSchemaInitBasicType("gDay", 49101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GDAY, 49201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4938bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDurationDef = xmlSchemaInitBasicType("duration", 49401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DURATION, 49501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4968bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float", 49701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_FLOAT, 49801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4998bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double", 50001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DOUBLE, 50101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 5028bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeBooleanDef = xmlSchemaInitBasicType("boolean", 50301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_BOOLEAN, 50401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 5058bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeAnyURIDef = xmlSchemaInitBasicType("anyURI", 50601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_ANYURI, 50701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 508560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard xmlSchemaTypeHexBinaryDef = xmlSchemaInitBasicType("hexBinary", 50901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_HEXBINARY, 51001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 5111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaTypeBase64BinaryDef 51201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard = xmlSchemaInitBasicType("base64Binary", XML_SCHEMAS_BASE64BINARY, 51301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 51401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNotationDef = xmlSchemaInitBasicType("NOTATION", 51501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NOTATION, 51601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 51701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeQNameDef = xmlSchemaInitBasicType("QName", 51801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_QNAME, 51901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 5204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 521c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard /* 522c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * derived datatypes 523c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */ 5248bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeIntegerDef = xmlSchemaInitBasicType("integer", 52501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_INTEGER, 52601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeDecimalDef); 5276560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeNonPositiveIntegerDef = 5286560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaInitBasicType("nonPositiveInteger", 52901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NPINTEGER, 53001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntegerDef); 5316560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeNegativeIntegerDef = 53201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("negativeInteger", XML_SCHEMAS_NINTEGER, 53301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNonPositiveIntegerDef); 5346560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeLongDef = 53501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("long", XML_SCHEMAS_LONG, 53601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntegerDef); 53701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntDef = xmlSchemaInitBasicType("int", XML_SCHEMAS_INT, 53801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeLongDef); 5398bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeShortDef = xmlSchemaInitBasicType("short", 54001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_SHORT, 54101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntDef); 5428bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeByteDef = xmlSchemaInitBasicType("byte", 54301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_BYTE, 54401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeShortDef); 5456560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeNonNegativeIntegerDef = 5466560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaInitBasicType("nonNegativeInteger", 54701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NNINTEGER, 54801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntegerDef); 5496560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedLongDef = 55001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedLong", XML_SCHEMAS_ULONG, 55101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNonNegativeIntegerDef); 5526560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedIntDef = 55301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedInt", XML_SCHEMAS_UINT, 55401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeUnsignedLongDef); 5556560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedShortDef = 55601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedShort", XML_SCHEMAS_USHORT, 55701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeUnsignedIntDef); 5586560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedByteDef = 55901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedByte", XML_SCHEMAS_UBYTE, 56001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeUnsignedShortDef); 5616560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypePositiveIntegerDef = 56201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("positiveInteger", XML_SCHEMAS_PINTEGER, 56301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNonNegativeIntegerDef); 5648bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeNormStringDef = xmlSchemaInitBasicType("normalizedString", 56501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NORMSTRING, 56601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeStringDef); 5678bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeTokenDef = xmlSchemaInitBasicType("token", 56801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_TOKEN, 56901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNormStringDef); 5708bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeLanguageDef = xmlSchemaInitBasicType("language", 57101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_LANGUAGE, 57201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeTokenDef); 57301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNameDef = xmlSchemaInitBasicType("Name", 57401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NAME, 57501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeTokenDef); 57601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNmtokenDef = xmlSchemaInitBasicType("NMTOKEN", 57701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NMTOKEN, 5784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeTokenDef); 57901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNCNameDef = xmlSchemaInitBasicType("NCName", 58001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NCNAME, 58101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNameDef); 58201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIdDef = xmlSchemaInitBasicType("ID", XML_SCHEMAS_ID, 5834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeNCNameDef); 5848bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeIdrefDef = xmlSchemaInitBasicType("IDREF", 58501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_IDREF, 5864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeNCNameDef); 587a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard xmlSchemaTypeEntityDef = xmlSchemaInitBasicType("ENTITY", 58801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_ENTITY, 58901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNCNameDef); 5904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* 5914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Derived list types. 5924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */ 5934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* ENTITIES */ 594a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard xmlSchemaTypeEntitiesDef = xmlSchemaInitBasicType("ENTITIES", 59501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_ENTITIES, 5964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeAnySimpleTypeDef); 5974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeEntitiesDef->subtypes = xmlSchemaTypeEntityDef; 5984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* IDREFS */ 5994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeIdrefsDef = xmlSchemaInitBasicType("IDREFS", 6004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik XML_SCHEMAS_IDREFS, 6014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeAnySimpleTypeDef); 6024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeIdrefsDef->subtypes = xmlSchemaTypeIdrefDef; 6034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 6044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* NMTOKENS */ 6054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeNmtokensDef = xmlSchemaInitBasicType("NMTOKENS", 6064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik XML_SCHEMAS_NMTOKENS, 6074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeAnySimpleTypeDef); 6084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeNmtokensDef->subtypes = xmlSchemaTypeNmtokenDef; 6094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 6104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypesInitialized = 1; 6114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 6124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 6134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 6144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCleanupTypes: 6154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 6164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library 6174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 6184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid 6194255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCleanupTypes(void) { 6204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 6214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return; 62211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* 62311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik * Free xs:anyType. 62411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik */ 62511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik { 62611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaParticlePtr particle; 62711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* Attribute wildcard. */ 62811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaFreeWildcard(xmlSchemaTypeAnyTypeDef->attributeWildcard); 62911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* Content type. */ 63011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle = (xmlSchemaParticlePtr) xmlSchemaTypeAnyTypeDef->subtypes; 63111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* Wildcard. */ 63211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaFreeWildcard((xmlSchemaWildcardPtr) 63311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle->children->children->children); 63411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlFree((xmlSchemaParticlePtr) particle->children->children); 63511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* Sequence model group. */ 63611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlFree((xmlSchemaModelGroupPtr) particle->children); 63711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlFree((xmlSchemaParticlePtr) particle); 63811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeAnyTypeDef->subtypes = NULL; 63911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik } 6404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlHashFree(xmlSchemaTypesBank, (xmlHashDeallocator) xmlSchemaFreeType); 6414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypesInitialized = 0; 6424255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 6434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 6444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 6456927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaIsBuiltInTypeFacet: 64601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in type 64701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facetType: the facet type 64801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 64901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Evaluates if a specific facet can be 65001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * used in conjunction with a type. 65101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 65201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 1 if the facet can be used with the given built-in type, 65301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 0 otherwise and -1 in case the type is not a built-in type. 65401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 65501fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint 65601fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaIsBuiltInTypeFacet(xmlSchemaTypePtr type, int facetType) 65701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 658ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard if (type == NULL) 659ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard return (-1); 66001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->type != XML_SCHEMA_TYPE_BASIC) 66101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (-1); 66201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type->builtInType) { 66301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BOOLEAN: 66401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_PATTERN) || 66501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE)) 66601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 66701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 66801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 66901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_STRING: 67001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NOTATION: 67101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_QNAME: 67201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 67301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 67401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_HEXBINARY: 67501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_LENGTH) || 67601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MINLENGTH) || 67701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXLENGTH) || 67801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_PATTERN) || 67901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_ENUMERATION) || 68001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE)) 68101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 68201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 68301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 68401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DECIMAL: 68501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_TOTALDIGITS) || 68601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) || 68701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_PATTERN) || 68801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE) || 68901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_ENUMERATION) || 69001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) || 69101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) || 69201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MININCLUSIVE) || 69301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE)) 69401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 69501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 69601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 69701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_TIME: 69801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GDAY: 69901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTH: 70001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 70101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEAR: 70201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 70301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATE: 70401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATETIME: 70501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DURATION: 70601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_FLOAT: 70701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DOUBLE: 70801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_PATTERN) || 70901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_ENUMERATION) || 71001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE) || 71101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) || 71201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) || 71301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MININCLUSIVE) || 71401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE)) 71501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 71601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 71701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 71801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard default: 719c7e3cc49bade82dba0cda4ae7c07ffcd1e32fe25Daniel Veillard break; 72001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 72101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 72201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 72301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 72401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 72501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInType: 72601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the type of the built in type 72701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 72801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Gives you the type struct for a built-in 72901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * type by its type id. 73001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 73101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns the type if found, NULL otherwise. 73201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 73301fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr 73401fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInType(xmlSchemaValType type) 73501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 73601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (xmlSchemaTypesInitialized == 0) 73701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitTypes(); 73801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type) { 73901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 74001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYSIMPLETYPE: 74101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeAnySimpleTypeDef); 74201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_STRING: 74301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeStringDef); 74401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NORMSTRING: 74501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNormStringDef); 74601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DECIMAL: 74701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDecimalDef); 74801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_TIME: 74901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeTimeDef); 75001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GDAY: 75101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGDayDef); 75201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTH: 75301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGMonthDef); 75401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 75501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGMonthDayDef); 75601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEAR: 75701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGYearDef); 75801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 75901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGYearMonthDef); 76001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATE: 76101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDateDef); 76201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATETIME: 76301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDatetimeDef); 76401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DURATION: 76501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDurationDef); 76601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_FLOAT: 76701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeFloatDef); 76801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DOUBLE: 76901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDoubleDef); 77001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BOOLEAN: 77101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeBooleanDef); 77201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_TOKEN: 77301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeTokenDef); 77401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_LANGUAGE: 77501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeLanguageDef); 77601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NMTOKEN: 77701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNmtokenDef); 77801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NMTOKENS: 77901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNmtokensDef); 78001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NAME: 78101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNameDef); 78201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_QNAME: 78301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeQNameDef); 78401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NCNAME: 78501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNCNameDef); 78601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ID: 78701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdDef); 78801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_IDREF: 78901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdrefDef); 79001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_IDREFS: 79101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdrefsDef); 79201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ENTITY: 79301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeEntityDef); 79401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ENTITIES: 79501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeEntitiesDef); 79601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NOTATION: 79701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNotationDef); 79801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 79901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeAnyURIDef); 80001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_INTEGER: 80101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIntegerDef); 80201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NPINTEGER: 80301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNonPositiveIntegerDef); 80401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NINTEGER: 80501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNegativeIntegerDef); 80601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NNINTEGER: 80701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNonNegativeIntegerDef); 80801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_PINTEGER: 80901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypePositiveIntegerDef); 81001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_INT: 81101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIntDef); 81201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_UINT: 81301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedIntDef); 81401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_LONG: 81501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeLongDef); 81601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ULONG: 81701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedLongDef); 81801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_SHORT: 81901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeShortDef); 82001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_USHORT: 82101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedShortDef); 82201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BYTE: 82301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeByteDef); 82401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_UBYTE: 82501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedByteDef); 82601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_HEXBINARY: 82701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeHexBinaryDef); 82801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 82901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeBase64BinaryDef); 83001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYTYPE: 83101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeAnyTypeDef); 83201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard default: 83301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (NULL); 83401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 83501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 83601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 8377f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/** 8387f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueAppend: 8397f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @prev: the value 8407f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @cur: the value to be appended 8417f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 8427f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Appends a next sibling to a list of computed values. 8437f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 8447f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns 0 if succeeded and -1 on API errors. 8457f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */ 8464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikint 8474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueAppend(xmlSchemaValPtr prev, xmlSchemaValPtr cur) { 8484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 8494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((prev == NULL) || (cur == NULL)) 8504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (-1); 8514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik prev->next = cur; 8524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (0); 8534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik} 8544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 8557f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/** 8567f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetNext: 8577f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @cur: the value 8587f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 8597f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the next sibling of a list of computed values. 8607f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 8617f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns the next value or NULL if there was none, or on 8627f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * API errors. 8637f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */ 8644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValPtr 8654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetNext(xmlSchemaValPtr cur) { 8664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 8674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (cur == NULL) 8684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (NULL); 8694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (cur->next); 8704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik} 8714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 8727f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/** 8737f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetAsString: 8747f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @val: the value 8757f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 8767f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the string value of a computed value. 8777f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 8787f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns the string value or NULL if there was none, or on 8797f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * API errors. 8807f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */ 8814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikconst xmlChar * 8824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetAsString(xmlSchemaValPtr val) 8834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{ 8844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val == NULL) 8854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (NULL); 8864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik switch (val->type) { 8874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_STRING: 8884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 8894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 8904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_TOKEN: 8914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_LANGUAGE: 8924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKEN: 8934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NAME: 8944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NCNAME: 8954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ID: 8964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 8974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITY: 8984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYURI: 8994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (BAD_CAST val->value.str); 9004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik default: 9014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 9024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 9034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (NULL); 9044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik} 9054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 9067f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/** 9077f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetAsBoolean: 9087f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @val: the value 9097f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 9107f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the boolean value of a computed value. 9117f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 9127f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns 1 if true and 0 if false, or in case of an error. Hmm. 9137f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */ 9144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikint 9154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetAsBoolean(xmlSchemaValPtr val) 9164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{ 9174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((val == NULL) || (val->type != XML_SCHEMAS_BOOLEAN)) 9184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (0); 9194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (val->value.b); 9204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 9214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 9224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 9236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaNewStringValue: 9246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @type: the value type 925b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @value: the value 9266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 9276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Allocate a new simple type value. The type can be 9282ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * of XML_SCHEMAS_STRING. 9292ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * WARNING: This one is intended to be expanded for other 9302ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * string based types. We need this for anySimpleType as well. 9314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given value is consumed and freed with the struct. 9326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 9336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error 9346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 9356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaValPtr 9366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaNewStringValue(xmlSchemaValType type, 9376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar *value) 9386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 9396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaValPtr val; 9406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 9416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (type != XML_SCHEMAS_STRING) 9426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(NULL); 9436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik val = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal)); 9446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (val == NULL) { 9456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(NULL); 9466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 9476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik memset(val, 0, sizeof(xmlSchemaVal)); 9486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik val->type = type; 9496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik val->value.str = (xmlChar *) value; 9506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(val); 9516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 9526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 953b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik/** 954b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * xmlSchemaNewNOTATIONValue: 955b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @name: the notation name 956b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @ns: the notation namespace name or NULL 957b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * 958b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * Allocate a new NOTATION value. 9594efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given values are consumed and freed with the struct. 960b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * 961b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error 962b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik */ 963b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. BuchcikxmlSchemaValPtr 964b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. BuchcikxmlSchemaNewNOTATIONValue(const xmlChar *name, 965b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik const xmlChar *ns) 966b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik{ 967b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik xmlSchemaValPtr val; 968b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik 969b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik val = xmlSchemaNewValue(XML_SCHEMAS_NOTATION); 970b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik if (val == NULL) 971b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik return (NULL); 972b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik 97312d37ab63441baf9e03db70168cc1d0d6f1c2373William M. Brack val->value.qname.name = (xmlChar *)name; 974b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik if (ns != NULL) 97512d37ab63441baf9e03db70168cc1d0d6f1c2373William M. Brack val->value.qname.uri = (xmlChar *)ns; 976b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik return(val); 977b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik} 9786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 9796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 9804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * xmlSchemaNewQNameValue: 9814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * @namespaceName: the namespace name 9824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * @localName: the local name 9834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * 9844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Allocate a new QName value. 9854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given values are consumed and freed with the struct. 9864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * 9874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of an error. 9884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */ 9894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValPtr 9904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaNewQNameValue(const xmlChar *namespaceName, 9914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *localName) 9924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{ 9934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaValPtr val; 9944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 9954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik val = xmlSchemaNewValue(XML_SCHEMAS_QNAME); 9964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val == NULL) 9974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (NULL); 9984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 9994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik val->value.qname.name = (xmlChar *) localName; 10004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik val->value.qname.uri = (xmlChar *) namespaceName; 10014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return(val); 10024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik} 10034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 10044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik/** 10054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaFreeValue: 10064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to free 10074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 10084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library 10094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 10104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid 10114255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaFreeValue(xmlSchemaValPtr value) { 10124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaValPtr prev; 10134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 10144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (value != NULL) { 10154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik switch (value->type) { 10164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_STRING: 10174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 10184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_TOKEN: 10194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_LANGUAGE: 10204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKEN: 10214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKENS: 10224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NAME: 10234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NCNAME: 10244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ID: 10254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 10264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREFS: 10274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITY: 10284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITIES: 10294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYURI: 10304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 10314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (value->value.str != NULL) 10324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(value->value.str); 10334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 10344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NOTATION: 10354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_QNAME: 10364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (value->value.qname.uri != NULL) 10374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(value->value.qname.uri); 10384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (value->value.qname.name != NULL) 10394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(value->value.qname.name); 10404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 10414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_HEXBINARY: 10424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (value->value.hex.str != NULL) 10434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(value->value.hex.str); 10444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 10454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_BASE64BINARY: 10464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (value->value.base64.str != NULL) 10474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(value->value.base64.str); 10484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 10494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik default: 10504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 10514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 10524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik prev = value; 10534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = value->next; 10544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(prev); 10554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 10564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 10574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 10584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 10594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaGetPredefinedType: 10604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name: the type name 10614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @ns: the URI of the namespace usually "http://www.w3.org/2001/XMLSchema" 10624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 10634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Lookup a type in the default XML Schemas type library 10644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 10654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns the type if found, NULL otherwise 10664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 10674255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaTypePtr 10684255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaGetPredefinedType(const xmlChar *name, const xmlChar *ns) { 10694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 10704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaInitTypes(); 10714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (name == NULL) 10724255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(NULL); 10734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return((xmlSchemaTypePtr) xmlHashLookup2(xmlSchemaTypesBank, name, ns)); 10744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 1075070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 107601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 107701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInListSimpleTypeItemType: 107801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in simple type. 107901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 10806927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Lookup function 10816927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * 1082c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns the item type of @type as defined by the built-in datatype 1083c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * hierarchy of XML Schema Part 2: Datatypes, or NULL in case of an error. 108401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 108501fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr 108601fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInListSimpleTypeItemType(xmlSchemaTypePtr type) 108701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 10884259532303e96e089a185c6f55056cb7c4902d71Daniel Veillard if ((type == NULL) || (type->type != XML_SCHEMA_TYPE_BASIC)) 108901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (NULL); 109001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type->builtInType) { 109101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NMTOKENS: 109201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNmtokenDef ); 109301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_IDREFS: 109401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdrefDef); 109501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ENTITIES: 109601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeEntityDef); 109701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard default: 109801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (NULL); 109901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 110001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 110101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 1102070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**************************************************************** 1103070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 1104070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Convenience macros and functions * 1105070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 1106070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/ 1107070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1108070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_TZO_CHAR(c) \ 1109070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ((c == 0) || (c == 'Z') || (c == '+') || (c == '-')) 1110070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1111070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_YEAR(yr) (yr != 0) 1112070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MONTH(mon) ((mon >= 1) && (mon <= 12)) 1113070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* VALID_DAY should only be used when month is unknown */ 1114070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DAY(day) ((day >= 1) && (day <= 31)) 1115070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_HOUR(hr) ((hr >= 0) && (hr <= 23)) 1116070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MIN(min) ((min >= 0) && (min <= 59)) 1117070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_SEC(sec) ((sec >= 0) && (sec < 60)) 1118690a68095f589248c9e962c6b5468aacb6d3aabaKasimier T. Buchcik#define VALID_TZO(tzo) ((tzo > -840) && (tzo < 840)) 1119070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_LEAP(y) \ 1120070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) 1121070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1122ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonth[12] = 1123070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 1124ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonthLeap[12] = 1125070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 1126070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 11275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MAX_DAYINMONTH(yr,mon) \ 11285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1]) 11295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 1130070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MDAY(dt) \ 1131070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (IS_LEAP(dt->year) ? \ 1132070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (dt->day <= daysInMonthLeap[dt->mon - 1]) : \ 1133070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (dt->day <= daysInMonth[dt->mon - 1])) 1134070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1135070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATE(dt) \ 1136070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_YEAR(dt->year) && VALID_MONTH(dt->mon) && VALID_MDAY(dt)) 1137070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1138070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TIME(dt) \ 1139070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_HOUR(dt->hour) && VALID_MIN(dt->min) && \ 1140070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard VALID_SEC(dt->sec) && VALID_TZO(dt->tzo)) 1141070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1142070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATETIME(dt) \ 1143070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_DATE(dt) && VALID_TIME(dt)) 1144070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1145070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_MIN (60) 1146070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_HOUR (60 * SECS_PER_MIN) 1147070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_DAY (24 * SECS_PER_HOUR) 1148070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 11495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInYearByMonth[12] = 11505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; 11515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInLeapYearByMonth[12] = 11525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 }; 11535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 11545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DAY_IN_YEAR(day, month, year) \ 11555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((IS_LEAP(year) ? \ 11565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dayInLeapYearByMonth[month - 1] : \ 11575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dayInYearByMonth[month - 1]) + day) 11585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 11595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#ifdef DEBUG 11605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt) \ 11615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 11625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard "type=%o %04ld-%02u-%02uT%02u:%02u:%03f", \ 11635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->type,dt->value.date.year,dt->value.date.mon, \ 11645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->value.date.day,dt->value.date.hour,dt->value.date.min, \ 11655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->value.date.sec); \ 11665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt->value.date.tz_flag) \ 11675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt->value.date.tzo != 0) \ 11685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 11695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard "%+05d\n",dt->value.date.tzo); \ 11705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else \ 11715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, "Z\n"); \ 11725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else \ 11735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext,"\n") 11745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#else 11755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt) 11765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#endif 11775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 1178070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1179070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGYear: 1180070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1181070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1182070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1183070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gYear without time zone and fills in the appropriate 1184070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1185070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gYear. It is supposed that @dt->year is big enough to contain 1186070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * the year. 1187070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1188070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1189070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1190070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1191070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) { 1192070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str, *firstChar; 1193070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0, digcnt = 0; 1194070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1195070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (((*cur < '0') || (*cur > '9')) && 1196070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (*cur != '-') && (*cur != '+')) 1197070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1198070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1199070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 1200070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = 1; 1201070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1202070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1203070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1204070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard firstChar = cur; 1205070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1206070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 1207070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->year = dt->year * 10 + (*cur - '0'); 1208070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1209070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard digcnt++; 1210070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1211070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1212070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* year must be at least 4 digits (CCYY); over 4 1213070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * digits cannot have a leading zero. */ 1214070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0'))) 1215070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1216070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1217070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) 1218070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->year = - dt->year; 1219070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1220070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_YEAR(dt->year)) 1221070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1222070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1223070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1224070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1225070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1226070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1227070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1228070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_2_DIGITS: 1229070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the integer to fill in 1230070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1231070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer 1232070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1233070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a 2-digits integer and updates @num with the value. @cur is 1234070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer. 1235070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and 1236070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1237070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1238070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_2_DIGITS(num, cur, invalid) \ 1239070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((cur[0] < '0') || (cur[0] > '9') || \ 1240070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (cur[1] < '0') || (cur[1] > '9')) \ 1241070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard invalid = 1; \ 1242070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 1243070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = (cur[0] - '0') * 10 + (cur[1] - '0'); \ 1244070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur += 2; 1245070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1246070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1247070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_FLOAT: 1248070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the double to fill in 1249070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1250070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer 1251070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1252070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float and updates @num with the value. @cur is 1253070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the float. The float must have a 1254070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2-digits integer part and may or may not have a decimal part. 1255070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and 1256070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1257070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1258070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_FLOAT(num, cur, invalid) \ 1259070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(num, cur, invalid); \ 1260070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!invalid && (*cur == '.')) { \ 1261070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double mult = 1; \ 1262070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1263070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 1264070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard invalid = 1; \ 1265070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 1266070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mult /= 10; \ 1267070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num += (*cur - '0') * mult; \ 1268070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1269070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 1270070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1271070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1272070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1273070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGMonth: 1274070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1275070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1276070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1277070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gMonth without time zone and fills in the appropriate 1278070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1279070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gMonth. 1280070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1281070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1282070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1283070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1284070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) { 1285070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 1286070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 128764dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik unsigned int value = 0; 1288070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 128964dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik PARSE_2_DIGITS(value, cur, ret); 1290070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1291070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1292070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 129364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if (!VALID_MONTH(value)) 1294070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1295070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 129664dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik dt->mon = value; 129764dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik 1298070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1299070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1300070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1301070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1302070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1303070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGDay: 1304070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1305070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1306070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1307070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gDay without time zone and fills in the appropriate 1308070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1309070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay. 1310070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1311070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1312070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1313070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1314070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) { 1315070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 1316070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 131764dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik unsigned int value = 0; 1318070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 131964dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik PARSE_2_DIGITS(value, cur, ret); 1320070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1321070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1322070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 132364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if (!VALID_DAY(value)) 1324070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1325070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 132664dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik dt->day = value; 1327070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1328070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1329070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1330070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1331070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1332070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTime: 1333070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1334070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1335070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1336070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:time without time zone and fills in the appropriate 1337070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * fields of the @dt structure. @str is updated to point just after the 1338070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:time. 1339070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, values of @dt fields are undefined. 1340070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1341070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1342070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1343070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1344070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) { 1345285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik const xmlChar *cur = *str; 1346070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 1347285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik int value = 0; 1348070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 134964dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik PARSE_2_DIGITS(value, cur, ret); 1350070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 135164dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik return ret; 1352070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1353070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 135464dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if (!VALID_HOUR(value)) 135564dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik return 2; 1356070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1357070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1358070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* the ':' insures this string is xs:time */ 135964dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik dt->hour = value; 1360070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 136164dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik PARSE_2_DIGITS(value, cur, ret); 1362070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1363070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 136464dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if (!VALID_MIN(value)) 136564dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik return 2; 136664dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik dt->min = value; 1367070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1368070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1369070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1370070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1371070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1372070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_FLOAT(dt->sec, cur, ret); 1373070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1374070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1375070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 137664dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if ((!VALID_SEC(dt->sec)) || (!VALID_TZO(dt->tzo))) 1377070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1378070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1379070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1380070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1381070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1382070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1383070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1384070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTimeZone: 1385070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1386070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1387070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1388070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a time zone without time zone and fills in the appropriate 1389070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1390070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * time zone. 1391070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1392070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1393070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1394070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1395070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) { 139614b5643947845df089376106517c4f7ba061e4b0Daniel Veillard const xmlChar *cur; 1397070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 1398070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1399070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (str == NULL) 1400070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 140114b5643947845df089376106517c4f7ba061e4b0Daniel Veillard cur = *str; 1402070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1403070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard switch (*cur) { 1404070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 0: 1405070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tz_flag = 0; 1406070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = 0; 1407070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1408070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1409070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 'Z': 1410070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tz_flag = 1; 1411070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = 0; 1412070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1413070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1414070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1415070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case '+': 1416070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case '-': { 1417070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0, tmp = 0; 1418070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = (*cur == '-'); 1419070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1420070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1421070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1422070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(tmp, cur, ret); 1423070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1424070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1425070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_HOUR(tmp)) 1426070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1427070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1428070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1429070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1430070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1431070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1432070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = tmp * 60; 1433070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1434070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(tmp, cur, ret); 1435070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1436070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1437070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_MIN(tmp)) 1438070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1439070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1440070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo += tmp; 1441070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) 1442070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = - dt->tzo; 1443070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1444070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_TZO(dt->tzo)) 1445070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1446070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 14475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->tz_flag = 1; 1448070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1449070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1450070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard default: 1451070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1452070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1453070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1454070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1455070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1456070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1457070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 14581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard/** 14591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * _xmlSchemaBase64Decode: 14601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * @ch: a character 14611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 14621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Converts a base64 encoded character to its base 64 value. 14631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 14641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Returns 0-63 (value), 64 (pad), or -1 (not recognized) 14651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */ 14661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic int 14671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard_xmlSchemaBase64Decode (const xmlChar ch) { 14681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('A' <= ch) && (ch <= 'Z')) return ch - 'A'; 14691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('a' <= ch) && (ch <= 'z')) return ch - 'a' + 26; 14701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('0' <= ch) && (ch <= '9')) return ch - '0' + 52; 14711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('+' == ch) return 62; 14721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('/' == ch) return 63; 14731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('=' == ch) return 64; 14741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return -1; 14751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard} 14761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 1477070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**************************************************************** 1478070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 1479070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * XML Schema Dates/Times Datatypes Handling * 1480070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 1481070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/ 1482070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1483070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1484070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_DIGITS: 1485070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the integer to fill in 1486070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1487070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag 1488070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1489070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a digits integer and updates @num with the value. @cur is 1490070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer. 1491070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and 1492070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1493070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1494070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_DIGITS(num, cur, num_type) \ 1495070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 1496070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = -1; \ 1497070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 1498070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 1499070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = num * 10 + (*cur - '0'); \ 1500070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1501070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1502070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1503070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1504070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_NUM: 1505070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the double to fill in 1506070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1507070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag 1508070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1509070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float or integer and updates @num with the value. @cur is 1510070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the number. If the number is a float, 1511070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * then it must have an integer part and a decimal part; @num_type will 1512070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * be set to 1. If there is no decimal part, @num_type is set to zero. 1513070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and 1514070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1515070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1516070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_NUM(num, cur, num_type) \ 1517070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = 0; \ 1518070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_DIGITS(num, cur, num_type); \ 1519070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!num_type && (*cur == '.')) { \ 1520070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double mult = 1; \ 1521070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1522070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 1523070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = -1; \ 1524070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 1525070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = 1; \ 1526070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 1527070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mult /= 10; \ 1528070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num += (*cur - '0') * mult; \ 1529070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1530070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 1531070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1532070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1533070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 15345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDates: 1535455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard * @type: the expected type or XML_SCHEMAS_UNKNOWN 1536070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dateTime: string to analyze 1537070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val: the return computed value 1538070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1539070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @dateTime conforms to the lexical space of one of the date types. 1540070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val. 1541070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1542070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 1543070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * and -1 in case of internal or API error. 1544070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1545070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1546455cc07308c673b6714e2f5670c2091a1dab95dcDaniel VeillardxmlSchemaValidateDates (xmlSchemaValType type, 15474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *dateTime, xmlSchemaValPtr *val, 15484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik int collapse) { 1549070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValPtr dt; 1550070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret; 1551070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = dateTime; 1552070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1553070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define RETURN_TYPE_IF_VALID(t) \ 1554070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (IS_TZO_CHAR(*cur)) { \ 1555070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); \ 1556070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 0) { \ 1557070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != 0) \ 1558070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; \ 1559070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->type = t; \ 1560455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard goto done; \ 1561070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 1562070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1563070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1564070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dateTime == NULL) 1565070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1566070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 15674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (collapse) 15684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 15694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 1570070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur != '-') && (*cur < '0') && (*cur > '9')) 1571070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1572070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1573070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN); 1574070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dt == NULL) 1575070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1576070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1577070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((cur[0] == '-') && (cur[1] == '-')) { 1578070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1579070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * It's an incomplete date (xs:gMonthDay, xs:gMonth or 1580070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay) 1581070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1582070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur += 2; 1583070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1584070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gDay? */ 1585070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 1586455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard if (type == XML_SCHEMAS_GMONTH) 1587455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard goto error; 1588070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ++cur; 1589070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1590070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1591070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1592070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1593070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY); 1594070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1595070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1596070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1597070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1598070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1599070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * it should be an xs:gMonthDay or xs:gMonth 1600070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1601070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); 1602070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1603070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1604070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1605d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1606d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a '-' char could indicate this type is xs:gMonthDay or 1607d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a negative time zone offset. Check for xs:gMonthDay first. 1608d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * Also the first three char's of a negative tzo (-MM:SS) can 1609d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * appear to be a valid day; so even if the day portion 1610d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * of the xs:gMonthDay verifies, we must insure it was not 1611d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a tzo. 1612d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1613d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if (*cur == '-') { 1614d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const xmlChar *rewnd = cur; 1615d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard cur++; 1616d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1617d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1618d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((ret == 0) && ((*cur == 0) || (*cur != ':'))) { 1619d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1620d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1621d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * we can use the VALID_MDAY macro to validate the month 1622d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * and day because the leap year test will flag year zero 1623d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * as a leap year (even though zero is an invalid year). 16244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * FUTURE TODO: Zero will become valid in XML Schema 1.1 16254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * probably. 1626d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1627d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if (VALID_MDAY((&(dt->value.date)))) { 1628d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1629d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY); 1630070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1631d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1632d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1633d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1634d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1635d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1636d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * not xs:gMonthDay so rewind and check if just xs:gMonth 1637d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * with an optional time zone. 1638d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1639d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard cur = rewnd; 1640d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1641d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1642d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH); 1643070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1644070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1645070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1646070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1647070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1648070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * It's a right-truncated date or an xs:time. 1649070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Try to parse an xs:time then fallback on right-truncated dates. 1650070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1651070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur >= '0') && (*cur <= '9')) { 1652070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTime(&(dt->value.date), &cur); 1653070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 0) { 1654070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* it's an xs:time */ 1655070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_TIME); 1656070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1657070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1658070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1659070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* fallback on date parsing */ 1660070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur = dateTime; 1661070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1662070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGYear(&(dt->value.date), &cur); 1663070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1664070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1665070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1666070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gYear? */ 1667070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEAR); 1668070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1669070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != '-') 1670070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1671070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1672070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1673070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); 1674070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1675070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1676070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1677070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gYearMonth? */ 1678070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEARMONTH); 1679070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1680070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != '-') 1681070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1682070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1683070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1684070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1685070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret != 0) || !VALID_DATE((&(dt->value.date)))) 1686070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1687070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1688070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:date? */ 1689070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_DATE); 1690070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1691070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != 'T') 1692070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1693070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1694070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1695070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* it should be an xs:dateTime */ 1696070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTime(&(dt->value.date), &cur); 1697070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1698070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1699070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1700070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); 17014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (collapse) 17024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 17036a0baa0cd89b402cdfbb63e9c40f291ebd191f1dDaniel Veillard if ((ret != 0) || (*cur != 0) || (!(VALID_DATETIME((&(dt->value.date)))))) 1704070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1705070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1706455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard 1707070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->type = XML_SCHEMAS_DATETIME; 1708070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1709455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillarddone: 1710d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#if 1 1711d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) 1712d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1713d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#else 1714d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1715d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * insure the parsed type is equal to or less significant (right 1716d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * truncated) than the desired type. 1717d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1718d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) { 1719d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1720d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* time only matches time */ 1721d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_TIME) && (dt->type == XML_SCHEMAS_TIME)) 1722d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1723d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1724d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_DATETIME) && 1725d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard ((dt->type != XML_SCHEMAS_DATE) || 1726d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEARMONTH) || 1727d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEAR))) 1728d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1729d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1730d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_DATE) && 1731d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard ((dt->type != XML_SCHEMAS_GYEAR) || 1732d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEARMONTH))) 1733d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1734d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1735d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_GYEARMONTH) && (dt->type != XML_SCHEMAS_GYEAR)) 1736d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1737d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1738d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_GMONTHDAY) && (dt->type != XML_SCHEMAS_GMONTH)) 1739d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1740d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1741455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard#endif 1742455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard 1743070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (val != NULL) 1744070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *val = dt; 174580b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 174680b19092f24410a6b869abf519227686e8f207caDaniel Veillard xmlSchemaFreeValue(dt); 1747070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1748070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1749070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1750070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror: 1751070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dt != NULL) 1752070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaFreeValue(dt); 1753070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1754070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1755070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1756070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 17575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDuration: 1758070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @type: the predefined type 1759070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @duration: string to analyze 1760070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val: the return computed value 1761070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1762070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @duration conforms to the lexical space of the duration type. 1763070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val. 1764070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1765070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 1766070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * and -1 in case of internal or API error. 1767070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1768070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1769dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED, 17704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *duration, xmlSchemaValPtr *val, 17714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik int collapse) { 1772070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = duration; 1773070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValPtr dur; 1774070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0; 1775070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int seq = 0; 1776d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard double num; 1777d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard int num_type = 0; /* -1 = invalid, 0 = int, 1 = floating */ 1778d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const xmlChar desig[] = {'Y', 'M', 'D', 'H', 'M', 'S'}; 1779d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const double multi[] = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0}; 1780070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1781070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (duration == NULL) 1782070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1783070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 17844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (collapse) 17854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 17864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 1787070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 1788070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = 1; 1789070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1790070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1791070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1792070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* duration must start with 'P' (after sign) */ 1793070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur++ != 'P') 1794070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1795070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 179680b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (*cur == 0) 179780b19092f24410a6b869abf519227686e8f207caDaniel Veillard return 1; 179880b19092f24410a6b869abf519227686e8f207caDaniel Veillard 1799070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); 1800070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dur == NULL) 1801070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1802070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1803070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while (*cur != 0) { 1804070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1805070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* input string should be empty or invalid date/time item */ 1806070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (seq >= sizeof(desig)) 1807070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1808070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1809070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* T designator must be present for time items */ 1810070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == 'T') { 1811070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (seq <= 3) { 1812070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard seq = 3; 1813070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1814070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else 1815070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1816070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else if (seq == 3) 1817070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1818070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1819070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* parse the number portion of the item */ 1820070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_NUM(num, cur, num_type); 1821070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1822070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((num_type == -1) || (*cur == 0)) 1823070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1824070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1825070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* update duration based on item type */ 1826070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while (seq < sizeof(desig)) { 1827070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == desig[seq]) { 1828070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1829070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* verify numeric type; only seconds can be float */ 1830070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((num_type != 0) && (seq < (sizeof(desig)-1))) 1831070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1832070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1833070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard switch (seq) { 1834070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 0: 1835070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon = (long)num * 12; 1836070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1837070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 1: 1838070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon += (long)num; 1839070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1840070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard default: 1841070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* convert to seconds using multiplier */ 1842070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.sec += num * multi[seq]; 1843070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard seq++; 1844070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1845070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1846070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1847070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; /* exit loop */ 1848070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1849070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* no date designators found? */ 1850c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((++seq == 3) || (seq == 6)) 1851070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1852070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 18534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 18544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (collapse) 18554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 1856070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1857070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1858070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) { 1859070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon = -dur->value.dur.mon; 1860070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.day = -dur->value.dur.day; 1861070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.sec = -dur->value.dur.sec; 1862070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1863070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1864070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (val != NULL) 1865070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *val = dur; 186680b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 186780b19092f24410a6b869abf519227686e8f207caDaniel Veillard xmlSchemaFreeValue(dur); 1868070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1869070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1870070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1871070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror: 1872070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dur != NULL) 1873070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaFreeValue(dur); 1874070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1875070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1876070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1877a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard/** 1878a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * xmlSchemaStrip: 1879a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * @value: a value 1880a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * 1881a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Removes the leading and ending spaces of a string 1882a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * 1883a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the new string or NULL if no change was required. 1884a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard */ 1885a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlChar * 1886a1a9d0410000cc69874e53e438b250037d3e14cdDaniel VeillardxmlSchemaStrip(const xmlChar *value) { 1887a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard const xmlChar *start = value, *end, *f; 1888a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard 1889a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if (value == NULL) return(NULL); 189076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*start != 0) && (IS_BLANK_CH(*start))) start++; 1891a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end = start; 1892a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard while (*end != 0) end++; 1893a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard f = end; 1894a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end--; 189576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((end > start) && (IS_BLANK_CH(*end))) end--; 1896a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end++; 1897a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if ((start == value) && (f == end)) return(NULL); 1898a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(xmlStrndup(start, end - start)); 1899a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard} 190096a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard 190196a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard/** 190291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * xmlSchemaWhiteSpaceReplace: 190391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * @value: a value 190491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * 190591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Replaces 0xd, 0x9 and 0xa with a space. 190691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * 190791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Returns the new string or NULL if no change was required. 190891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik */ 190991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlChar * 191091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlSchemaWhiteSpaceReplace(const xmlChar *value) { 191191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik const xmlChar *cur = value; 191291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik xmlChar *ret = NULL, *mcur; 191391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 191491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if (value == NULL) 191591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik return(NULL); 191691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 191791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik while ((*cur != 0) && 191891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik (((*cur) != 0xd) && ((*cur) != 0x9) && ((*cur) != 0xa))) { 191991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik cur++; 192091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik } 192191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if (*cur == 0) 192291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik return (NULL); 192391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik ret = xmlStrdup(value); 192491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik /* TODO FIXME: I guess gcc will bark at this. */ 192591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik mcur = (xmlChar *) (ret + (cur - value)); 192691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik do { 192791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if ( ((*mcur) == 0xd) || ((*mcur) == 0x9) || ((*mcur) == 0xa) ) 192891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik *mcur = ' '; 192991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik mcur++; 193091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik } while (*mcur != 0); 193191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik return(ret); 193291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik} 193391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 193491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik/** 1935b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCollapseString: 1936b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: a value 1937b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 1938b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Removes and normalize white spaces in the string 1939b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 1940b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns the new string or NULL if no change was required. 1941b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 194201fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlChar * 1943b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCollapseString(const xmlChar *value) { 1944b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard const xmlChar *start = value, *end, *f; 1945b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlChar *g; 1946b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard int col = 0; 1947b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1948b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (value == NULL) return(NULL); 194976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*start != 0) && (IS_BLANK_CH(*start))) start++; 1950b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end = start; 1951b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while (*end != 0) { 195276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if ((*end == ' ') && (IS_BLANK_CH(end[1]))) { 1953b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard col = end - start; 1954b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard break; 1955b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) { 1956b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard col = end - start; 1957b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard break; 1958b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1959b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 1960b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1961b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (col == 0) { 1962b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard f = end; 1963b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end--; 196476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((end > start) && (IS_BLANK_CH(*end))) end--; 1965b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 1966b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((start == value) && (f == end)) return(NULL); 1967b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(xmlStrndup(start, end - start)); 1968b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1969b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard start = xmlStrdup(start); 1970b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (start == NULL) return(NULL); 1971b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard g = (xmlChar *) (start + col); 1972b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end = g; 1973b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while (*end != 0) { 197476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (IS_BLANK_CH(*end)) { 1975b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 197676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*end)) end++; 1977b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*end != 0) 1978b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g++ = ' '; 1979b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else 1980b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g++ = *end++; 1981b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1982b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g = 0; 1983b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return((xmlChar *) start); 1984b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 1985b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1986b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 198728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * xmlSchemaValAtomicListNode: 198828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @type: the predefined atomic type for a token in the list 198928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @value: the list value to check 199028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @ret: the return computed value 199128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @node: the node containing the value 199228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * 199328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Check that a value conforms to the lexical space of the predefined 199428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * list type. if true a value is computed and returned in @ret. 199528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * 1996a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the number of items if this validates, a negative error code 1997a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * number otherwise 199828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */ 199928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillardstatic int 200028c52ab518d34a36fd8da6870a5850088f129a6aDaniel VeillardxmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value, 200128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlSchemaValPtr *ret, xmlNodePtr node) { 200228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlChar *val, *cur, *endval; 200328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard int nb_values = 0; 2004580ced8ee28ecd99374da9383897678e4ba6c358Daniel Veillard int tmp = 0; 200528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard 200628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (value == NULL) { 200728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard return(-1); 200828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 200928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard val = xmlStrdup(value); 201028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (val == NULL) { 201128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard return(-1); 201228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 20136fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard if (ret != NULL) { 20146fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard *ret = NULL; 20156fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard } 201628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur = val; 201728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard /* 201828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Split the list 201928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */ 202076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*cur)) *cur++ = 0; 202128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (*cur != 0) { 202276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (IS_BLANK_CH(*cur)) { 202328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *cur = 0; 202428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur++; 202576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*cur)) *cur++ = 0; 202628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } else { 202728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard nb_values++; 202828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur++; 202976e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++; 203028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 203128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 203228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (nb_values == 0) { 203328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlFree(val); 2034a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(nb_values); 203528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 203628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard endval = cur; 203728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur = val; 203828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while ((*cur == 0) && (cur != endval)) cur++; 203928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (cur != endval) { 204028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node); 204128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (tmp != 0) 204228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard break; 204328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (*cur != 0) cur++; 204428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while ((*cur == 0) && (cur != endval)) cur++; 204528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 20466fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard /* TODO what return value ? c.f. bug #158628 204728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (ret != NULL) { 204828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard TODO 20496fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard } */ 20506fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard xmlFree(val); 2051a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if (tmp == 0) 2052a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(nb_values); 2053a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(-1); 205428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard} 205528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard 205628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard/** 2057e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * xmlSchemaParseUInt: 2058e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @str: pointer to the string R/W 2059e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @llo: pointer to the low result 2060e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lmi: pointer to the mid result 2061e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lhi: pointer to the high result 2062e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * 2063e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Parse an unsigned long into 3 fields. 2064e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * 2065ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack * Returns the number of significant digits in the number or 2066ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack * -1 if overflow of the capacity 2067e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard */ 2068e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic int 2069e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel VeillardxmlSchemaParseUInt(const xmlChar **str, unsigned long *llo, 2070478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik unsigned long *lmi, unsigned long *lhi) { 2071e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long lo = 0, mi = 0, hi = 0; 2072e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard const xmlChar *tmp, *cur = *str; 2073e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard int ret = 0, i = 0; 2074e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 2075478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (*cur == '0') { /* ignore leading zeroes */ 2076478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik cur++; 2077e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2078e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard tmp = cur; 2079e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) { 2080478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik i++;tmp++;ret++; 2081e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2082e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (i > 24) { 2083478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *str = tmp; 2084478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return(-1); 2085e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2086e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 16) { 2087478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik hi = hi * 10 + (*cur++ - '0'); 2088478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik i--; 2089e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2090e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 8) { 2091478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik mi = mi * 10 + (*cur++ - '0'); 2092478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik i--; 2093e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2094e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 0) { 2095478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik lo = lo * 10 + (*cur++ - '0'); 2096478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik i--; 2097e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2098e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 2099e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *str = cur; 2100e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *llo = lo; 2101e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *lmi = mi; 2102e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *lhi = hi; 2103e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(ret); 2104e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard} 2105e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 2106e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard/** 2107b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValAtomicType: 21084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type: the predefined type 21094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to check 21104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val: the return computed value 2111c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @node: the node containing the value 2112b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * flags: flags to control the vlidation 21134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 2114b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the atomic type. 21154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * if true a value is computed and returned in @val. 211601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * This checks the value space for list types as well (IDREFS, NMTOKENS). 21174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 21184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 21194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * and -1 in case of internal or API error. 21204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 2121b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int 21221ac24d36b12487995b659a8fc23a02b9460edb36Daniel VeillardxmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, 21234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaValPtr * val, xmlNodePtr node, int flags, 21244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws, 21254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik int normOnTheFly, int applyNorm, int createStringValue) 21261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard{ 21274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValPtr v; 2128b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlChar *norm = NULL; 2129d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard int ret = 0; 21304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 21314255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 213201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitTypes(); 21334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (type == NULL) 21341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (-1); 21355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 2136eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard /* 2137eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard * validating a non existant text node is similar to validating 2138eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard * an empty one. 2139eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard */ 2140eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard if (value == NULL) 2141eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard value = BAD_CAST ""; 2142eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard 21434255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (val != NULL) 21441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = NULL; 2145b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((flags == 0) && (value != NULL)) { 214691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 214701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((type->builtInType != XML_SCHEMAS_STRING) && 214891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik (type->builtInType != XML_SCHEMAS_ANYTYPE) && 214991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik (type->builtInType != XML_SCHEMAS_ANYSIMPLETYPE)) { 215091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if (type->builtInType == XML_SCHEMAS_NORMSTRING) 215191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik norm = xmlSchemaWhiteSpaceReplace(value); 215291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik else 215391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 21541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 21551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value = norm; 21561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2157b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 2158b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 215901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type->builtInType) { 21602f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_UNKNOWN: 21611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 21622f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_ANYTYPE: 21632f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_ANYSIMPLETYPE: 21644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((createStringValue) && (val != NULL)) { 21654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik v = xmlSchemaNewValue(XML_SCHEMAS_ANYSIMPLETYPE); 21664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (v != NULL) { 21674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik v->value.str = xmlStrdup(value); 21684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *val = v; 21694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 21704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto error; 21714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21732f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack goto return0; 21744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_STRING: 21754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (! normOnTheFly) { 21764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *cur = value; 21774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 21784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_REPLACE) { 21794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (*cur != 0) { 21804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 21814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 21824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 21834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 21844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) { 21874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (*cur != 0) { 21884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 21894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 21904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if IS_WSP_SPACE_CH(*cur) { 21914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 21924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if IS_WSP_SPACE_CH(*cur) 21934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 21944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 21954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 21964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (createStringValue && (val != NULL)) { 22014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (applyNorm) { 22024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 22034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 22044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else if (ws == XML_SCHEMA_WHITESPACE_REPLACE) 22054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaWhiteSpaceReplace(value); 22064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (norm != NULL) 22074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = norm; 22084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik v = xmlSchemaNewValue(XML_SCHEMAS_STRING); 22104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (v != NULL) { 22114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik v->value.str = xmlStrdup(value); 22124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *val = v; 22134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 22144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto error; 22154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 22181516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard case XML_SCHEMAS_NORMSTRING:{ 22194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) { 22204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (applyNorm) { 22214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 22224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 22234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else 22244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaWhiteSpaceReplace(value); 22254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (norm != NULL) 22264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = norm; 22274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 22294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *cur = value; 22304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (*cur != 0) { 22314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 22324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 22334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 22344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 22354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22381516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard if (val != NULL) { 22391516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NORMSTRING); 22401516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard if (v != NULL) { 22411516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard v->value.str = xmlStrdup(value); 22421516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard *val = v; 22431516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } else { 22441516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard goto error; 22451516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 22461516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 22471516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard goto return0; 22481516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 22491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_DECIMAL:{ 2250273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack const xmlChar *cur = value; 225172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik unsigned int len, neg, integ, hasLeadingZeroes; 2252273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack xmlChar cval[25]; 225372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik xmlChar *cptr = cval; 22541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 225572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if ((cur == NULL) || (*cur == 0)) 22561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 22574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 225872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* 225972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * xs:decimal has a whitespace-facet value of 'collapse'. 226072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik */ 22614efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 22624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 22634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 226472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* 226572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * First we handle an optional sign. 226672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik */ 226772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik neg = 0; 226872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (*cur == '-') { 226972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik neg = 1; 22701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 227172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } else if (*cur == '+') 22721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 227372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* 227472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * Disallow: "", "-", "- " 227572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik */ 227672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (*cur == 0) 227772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik goto return1; 2278273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 2279273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * Next we "pre-parse" the number, in preparation for calling 2280273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * the common routine xmlSchemaParseUInt. We get rid of any 2281273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * leading zeroes (because we have reserved only 25 chars), 228272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * and note the position of a decimal point. 2283273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 2284273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack len = 0; 228572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik integ = ~0u; 228672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik hasLeadingZeroes = 0; 2287c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 2288c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Skip leading zeroes. 2289c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 229072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik while (*cur == '0') { 2291273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack cur++; 229272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik hasLeadingZeroes = 1; 229372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } 2294c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (*cur != 0) { 229572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik do { 2296c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((*cur >= '0') && (*cur <= '9')) { 2297c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *cptr++ = *cur++; 2298c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik len++; 2299c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else if (*cur == '.') { 2300c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik cur++; 230172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik integ = len; 230272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik do { 230372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if ((*cur >= '0') && (*cur <= '9')) { 230472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik *cptr++ = *cur++; 230572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik len++; 230672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } else 230772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik break; 230872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } while (len < 24); 230972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* 231072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * Disallow "." but allow "00." 231172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik */ 231272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if ((len == 0) && (!hasLeadingZeroes)) 2313c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik goto return1; 2314c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 2315c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else 2316c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 231772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } while (len < 24); 2318273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 23194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 23204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 2321273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (*cur != 0) 232272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik goto return1; /* error if any extraneous chars */ 23231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 23241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL); 23251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 2326273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 232772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * Now evaluate the significant digits of the number 2328273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 232972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (len != 0) { 233072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik 233172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (integ != ~0u) { 233272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* 233372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * Get rid of trailing zeroes in the 233472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * fractional part. 233572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik */ 233672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik while ((len != integ) && (*(cptr-1) == '0')) { 233772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik cptr--; 233872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik len--; 233972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } 234072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } 234172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* 234272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * Terminate the (preparsed) string. 234372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik */ 234472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (len != 0) { 234572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik *cptr = 0; 234672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik cptr = cval; 234772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik 234872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik xmlSchemaParseUInt((const xmlChar **)&cptr, 234972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik &v->value.decimal.lo, 235072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik &v->value.decimal.mi, 235172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik &v->value.decimal.hi); 2352273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 2353273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 2354c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 2355c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Set the total digits to 1 if a zero value. 2356c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 23571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = neg; 235872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (len == 0) { 235972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* Speedup for zero values. */ 236072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik v->value.decimal.total = 1; 2361273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else { 2362c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik v->value.decimal.total = len; 236372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (integ == ~0u) 236472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik v->value.decimal.frac = 0; 236572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik else 236672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik v->value.decimal.frac = len - integ; 2367273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 23681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 23691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 23721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2373b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_TIME: 2374b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GDAY: 2375b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GMONTH: 2376b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GMONTHDAY: 2377b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GYEAR: 2378b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GYEARMONTH: 2379b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DATE: 2380b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DATETIME: 23814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = xmlSchemaValidateDates(type->builtInType, value, val, 23824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik normOnTheFly); 23831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 2384b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DURATION: 23854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = xmlSchemaValidateDuration(type, value, val, 23864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik normOnTheFly); 23871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 2388b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_FLOAT: 23891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_DOUBLE:{ 23901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 23911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int neg = 0; 23921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 23944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 23954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 23961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) { 23971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur += 3; 23981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 23991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 24011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 24021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 24031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 24041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathNAN; 24051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 24071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 24111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 24121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathNAN; 24131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 24151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 24191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 24211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 24231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard neg = 1; 24241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) { 24271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur += 3; 24281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 24291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 24311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 24321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 24331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 24341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (neg) 24351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathNINF; 24361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 24371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathPINF; 24381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 24401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 24441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 24451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (neg) 24461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathNINF; 24471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 24481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathPINF; 24491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 24511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 24551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 24571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((neg == 0) && (*cur == '+')) 24591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-')) 24611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 24631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '.') { 24661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) 24681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((*cur == 'e') || (*cur == 'E')) { 24711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((*cur == '-') || (*cur == '+')) 24731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) 24751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 24784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 24794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 24801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 24811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 24831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 24841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 24851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 24866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik /* 24876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * TODO: sscanf seems not to give the correct 24886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * value for extremely high/low values. 24896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * E.g. "1E-149" results in zero. 24906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 2491d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard if (sscanf((const char *) value, "%f", 24921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard &(v->value.f)) == 1) { 24936c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *val = v; 24941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 24961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 25001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 25021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 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 */ 2508d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard if (sscanf((const char *) value, "%lf", 25091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard &(v->value.d)) == 1) { 25101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 25111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 25121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 25131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 25141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 25161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 25171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 25211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BOOLEAN:{ 25231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 25241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 25254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) { 25264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 25274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur == '0') { 25284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 0; 25294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 25304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (*cur == '1') { 25314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 1; 25324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 25334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (*cur == 't') { 25344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 25354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur++ == 'r') && (*cur++ == 'u') && 25364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik (*cur++ == 'e')) { 25374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 1; 25384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else 25394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 25404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (*cur == 'f') { 25414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 25424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur++ == 'a') && (*cur++ == 'l') && 25434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik (*cur++ == 's') && (*cur++ == 'e')) { 25444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 0; 25454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else 25464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 25471869be56906ed5488b7db6d7c16f1c473af1485dKasimier T. Buchcik } else 25481869be56906ed5488b7db6d7c16f1c473af1485dKasimier T. Buchcik goto return1; 25494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur != 0) { 25504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 25514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur != 0) 25524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 25534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 25544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 25554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((cur[0] == '0') && (cur[1] == 0)) 25564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 0; 25574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else if ((cur[0] == '1') && (cur[1] == 0)) 25584efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 1; 25594efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else if ((cur[0] == 't') && (cur[1] == 'r') 25604efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik && (cur[2] == 'u') && (cur[3] == 'e') 25614efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik && (cur[4] == 0)) 25624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 1; 25634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else if ((cur[0] == 'f') && (cur[1] == 'a') 25644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik && (cur[2] == 'l') && (cur[3] == 's') 25654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik && (cur[4] == 'e') && (cur[5] == 0)) 25664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 0; 25674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else 25684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 25694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 25701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 25711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN); 25721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 25731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.b = ret; 25741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 25751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 25761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 25771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 25801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_TOKEN:{ 25821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 25831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 25844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (! normOnTheFly) { 25854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (*cur != 0) { 25864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 25874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 25884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (*cur == ' ') { 25894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 25904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur == 0) 25914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 25924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur == ' ') 25934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 25944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 25954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 25964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 25974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 25984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 25991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 26001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN); 26011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 26021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 26031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 26041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 26051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 26061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 26091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2610b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_LANGUAGE: 26114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) { 26124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 26134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (norm != NULL) 26144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = norm; 26154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 26161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (xmlCheckLanguageID(value) == 1) { 26171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 26181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE); 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 } 26281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2629b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NMTOKEN: 26301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (xmlValidateNMToken(value, 1) == 0) { 26311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 26321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN); 26331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 26341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 26351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 26361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 26371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 26381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 26411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2643b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NMTOKENS: 26441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef, 26451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 26461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret > 0) 26471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 26481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 26491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 26501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2651b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NAME: 26521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateName(value, 1); 2653df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard if ((ret == 0) && (val != NULL) && (value != NULL)) { 2654df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NAME); 2655df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard if (v != NULL) { 2656df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard const xmlChar *start = value, *end; 2657df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard while (IS_BLANK_CH(*start)) start++; 2658df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard end = start; 2659df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard while ((*end != 0) && (!IS_BLANK_CH(*end))) end++; 2660df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard v->value.str = xmlStrndup(start, end - start); 2661df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard *val = v; 2662df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard } else { 2663df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard goto error; 2664df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard } 26651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 26671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_QNAME:{ 26681c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik const xmlChar *uri = NULL; 26691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *local = NULL; 26701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 26711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateQName(value, 1); 26721c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (ret != 0) 26731c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik goto done; 26741c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (node != NULL) { 26751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *prefix; 26761c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlNsPtr ns; 26771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 26781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard local = xmlSplitQName2(value, &prefix); 26791c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik ns = xmlSearchNs(node->doc, node, prefix); 26801c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if ((ns == NULL) && (prefix != NULL)) { 26811c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlFree(prefix); 26821c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (local != NULL) 26831c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlFree(local); 26841c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik goto return1; 26851c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik } 26861c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (ns != NULL) 26871c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik uri = ns->href; 26881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) 26891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(prefix); 26901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26911c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (val != NULL) { 26921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_QNAME); 26931c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (v == NULL) { 26941c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (local != NULL) 26951c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlFree(local); 26961c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik goto error; 26971c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik } 26981c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (local != NULL) 26991c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik v->value.qname.name = local; 27001c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik else 27011c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik v->value.qname.name = xmlStrdup(value); 27021c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (uri != NULL) 27031c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik v->value.qname.uri = xmlStrdup(uri); 27041c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik *val = v; 27051c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik } else 27061c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (local != NULL) 27071c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlFree(local); 27081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 27091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2710b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NCNAME: 27111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 27121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 27131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME); 27141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 27151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 27161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 27171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 27181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 27191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2722b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_ID: 27231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 27241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 27251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_ID); 27261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 27271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 27281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 27291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 27301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 27311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 27341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 27351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 27361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 27371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 27381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * NOTE: the IDness might have already be declared in the DTD 27391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */ 27401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (attr->atype != XML_ATTRIBUTE_ID) { 27411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlIDPtr res; 27421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 27431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 27441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 27451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 27461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard res = xmlAddID(NULL, node->doc, strip, attr); 27471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 27481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 27491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard res = xmlAddID(NULL, node->doc, value, attr); 27501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (res == NULL) { 27511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 2; 27521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 27531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ID; 27541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2758b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_IDREF: 27591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 27601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 27616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik v = xmlSchemaNewValue(XML_SCHEMAS_IDREF); 27626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (v == NULL) 27636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik goto error; 27646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik v->value.str = xmlStrdup(value); 27656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *val = v; 27661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 27681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 27691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 27701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 27711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 27721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 27731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 27741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAddRef(NULL, node->doc, strip, attr); 27751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 27761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 27771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAddRef(NULL, node->doc, value, attr); 27781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_IDREF; 27791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2781b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_IDREFS: 27821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef, 27831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 27841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret < 0) 27851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 2; 27861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 27871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 27881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 27891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 27901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 2791249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard 27921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_IDREFS; 27931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 27951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_ENTITY:{ 27961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 27971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 27981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 27991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 28001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 3; 28011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 0) { 28021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlEntityPtr ent; 28031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 28051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 28061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ent = xmlGetDocEntity(node->doc, strip); 28071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 28081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 28091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ent = xmlGetDocEntity(node->doc, value); 28101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ent == NULL) || 28121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (ent->etype != 28131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard XML_EXTERNAL_GENERAL_UNPARSED_ENTITY)) 28141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 4; 28151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 28171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard TODO; 28181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 28201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 28211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 2822a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard 28231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ENTITY; 28241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 28261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2827b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_ENTITIES: 28281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 28291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return3; 28301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef, 28311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 28321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret <= 0) 28331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 28341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 28351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 28361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 28371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 28381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 28391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ENTITIES; 28411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 28431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_NOTATION:{ 28441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *uri = NULL; 28451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *local = NULL; 28461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateQName(value, 1); 28481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL)) { 28491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *prefix; 28501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard local = xmlSplitQName2(value, &prefix); 28521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) { 28531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlNsPtr ns; 28541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ns = xmlSearchNs(node->doc, node, prefix); 28561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ns == NULL) 28571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 28581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (val != NULL) 28591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard uri = xmlStrdup(ns->href); 28601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((local != NULL) && ((val == NULL) || (ret != 0))) 28621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(local); 28631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) 28641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(prefix); 28651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 28671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 3; 28681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 0) { 28691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNotationUse(NULL, node->doc, value); 28701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 1) 28711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 28721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 28731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 28741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 28761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION); 28771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 28781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (local != NULL) 28791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.name = local; 28801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 28811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.name = xmlStrdup(value); 28821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (uri != NULL) 28831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.uri = uri; 28841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 28861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 28871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (local != NULL) 28881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(local); 28891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (uri != NULL) 28901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(uri); 28911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 28921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2895560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 28964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYURI:{ 289711c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (*value != 0) { 28984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlURIPtr uri; 28994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) { 29004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 29014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (norm != NULL) 29024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = norm; 29034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 29044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik uri = xmlParseURI((const char *) value); 290511c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (uri == NULL) 290611c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard goto return1; 290711c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard xmlFreeURI(uri); 290811c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard } 2909560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 29101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 291111c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_ANYURI); 291211c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (v == NULL) 291311c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard goto error; 291411c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard v->value.str = xmlStrdup(value); 291511c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard *val = v; 29161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 29181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_HEXBINARY:{ 29208dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik const xmlChar *cur = value, *start; 29211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *base; 29221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int total, i = 0; 2923560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 2924f34a20e69dc675cd23d3eb558cad135ea280f472Daniel Veillard if (cur == NULL) 29251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2926560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 29274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 29284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 29294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 29308dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik start = cur; 29311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while (((*cur >= '0') && (*cur <= '9')) || 29321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((*cur >= 'A') && (*cur <= 'F')) || 29331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((*cur >= 'a') && (*cur <= 'f'))) { 29341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard i++; 29351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 29361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 29384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 2939560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 29401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 29411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 29421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((i % 2) != 0) 294370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard goto return1; 2944560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 29451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 29461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 29471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY); 29481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v == NULL) 29491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 29504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* 29514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Copy only the normalized piece. 29524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * CRITICAL TODO: Check this. 29534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */ 29548dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik cur = xmlStrndup(start, i); 29551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) { 2956d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard xmlSchemaTypeErrMemory(node, "allocating hexbin data"); 29571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(v); 29581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 29591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 29611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total = i / 2; /* number of octets */ 296270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 29631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base = (xmlChar *) cur; 29641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while (i-- > 0) { 29651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*base >= 'a') 29661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = *base - ('a' - 'A'); 29671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base++; 29681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 296970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 29701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.hex.str = (xmlChar *) cur; 29711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.hex.total = total; 29721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 29731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 29751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BASE64BINARY:{ 29771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* ISSUE: 29781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 29791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Ignore all stray characters? (yes, currently) 29801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Worry about long lines? (no, currently) 29811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 29821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * rfc2045.txt: 29831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 29841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * "The encoded output stream must be represented in lines of 29851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * no more than 76 characters each. All line breaks or other 29861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * characters not found in Table 1 must be ignored by decoding 29871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * software. In base64 data, characters other than those in 29881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Table 1, line breaks, and other white space probably 29891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * indicate a transmission error, about which a warning 29901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * message or even a message rejection might be appropriate 29911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * under some circumstances." */ 29921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 29931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *base; 29941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int total, i = 0, pad = 0; 29951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 29961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 29971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 29981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 29991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (; *cur; ++cur) { 30001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 30011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur); 30031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc < 0) ; 30041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (decc < 64) 30051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard i++; 30061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 30071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 30081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 30091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (; *cur; ++cur) { 30101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 30111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur); 30131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc < 0) ; 30141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (decc < 64) 30151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc == 64) 30171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard pad++; 30181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 30191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* rfc2045.txt: "Special processing is performed if fewer than 30211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 24 bits are available at the end of the data being encoded. 30221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * A full encoding quantum is always completed at the end of a 30231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * body. When fewer than 24 input bits are available in an 30241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * input group, zero bits are added (on the right) to form an 30251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * integral number of 6-bit groups. Padding at the end of the 30261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * data is performed using the "=" character. Since all 30271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * base64 input is an integral number of octets, only the 30281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * following cases can arise: (1) the final quantum of 30291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * encoding input is an integral multiple of 24 bits; here, 30301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * the final unit of encoded output will be an integral 30311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * multiple ofindent: Standard input:701: Warning:old style 30321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * assignment ambiguity in "=*". Assuming "= *" 4 characters 30331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * with no "=" padding, (2) the final 30341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * quantum of encoding input is exactly 8 bits; here, the 30351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * final unit of encoded output will be two characters 30361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * followed by two "=" padding characters, or (3) the final 30371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * quantum of encoding input is exactly 16 bits; here, the 30381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * final unit of encoded output will be three characters 30391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * followed by one "=" padding character." */ 30401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total = 3 * (i / 4); 30421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (pad == 0) { 30431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 0) 30441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (pad == 1) { 30461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 30471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 3) 30491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (decc = _xmlSchemaBase64Decode(*cur); 30511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (decc < 0) || (decc > 63); 30521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur)) 30531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard --cur; 30541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 16bits in 24bits means 2 pad bits: nnnnnn nnmmmm mmmm00*/ 30551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 00111100 -> 0x3c */ 30561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc & ~0x3c) 30571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total += 2; 30591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (pad == 2) { 30601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 30611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 2) 30631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (decc = _xmlSchemaBase64Decode(*cur); 30651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (decc < 0) || (decc > 63); 30661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur)) 30671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard --cur; 30681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 8bits in 12bits means 4 pad bits: nnnnnn nn0000 */ 30691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 00110000 -> 0x30 */ 30701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc & ~0x30) 30711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total += 1; 30731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 30741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 30771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_BASE64BINARY); 30781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v == NULL) 30791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 30801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base = 30811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (xmlChar *) xmlMallocAtomic((i + pad + 1) * 30821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sizeof(xmlChar)); 30831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (base == NULL) { 3084d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard xmlSchemaTypeErrMemory(node, "allocating base64 data"); 30851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(v); 30861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 30881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.base64.str = base; 30891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (cur = value; *cur; ++cur) 30901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (_xmlSchemaBase64Decode(*cur) >= 0) { 30911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = *cur; 30921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ++base; 30931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 30941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = 0; 30951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.base64.total = total; 30961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 30971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 30981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 309970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 3100e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_INTEGER: 3101e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_PINTEGER: 3102e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_NPINTEGER: 3103e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_NINTEGER: 31041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_NNINTEGER:{ 31051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 31061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 3107ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack int sign = 0; 31081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 31091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 31101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 31124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 31131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 31141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sign = 1; 31151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 31161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (*cur == '+') 31171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 3118ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 3119ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (ret == -1) 3120ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 31214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 31224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 3123ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (*cur != 0) 3124ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 312501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_NPINTEGER) { 31261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && 31271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((hi != 0) || (mi != 0) || (lo != 0))) 31281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 312901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_PINTEGER) { 31301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (sign == 1) 31311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((hi == 0) && (mi == 0) && (lo == 0)) 31331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 313401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_NINTEGER) { 31351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (sign == 0) 31361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((hi == 0) && (mi == 0) && (lo == 0)) 31381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 313901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_NNINTEGER) { 31401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && 31411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((hi != 0) || (mi != 0) || (lo != 0))) 31421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31446c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (val != NULL) { 314501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 31461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 3147c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (ret == 0) 3148c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik ret++; 31491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 31506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik v->value.decimal.mi = mi; 31516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik v->value.decimal.hi = hi; 31521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = sign; 31531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 3154ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack v->value.decimal.total = ret; 31551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 31561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 31591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 3160e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_LONG: 3161e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_BYTE: 3162e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_SHORT: 31631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_INT:{ 3164478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *cur = value; 31651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 31661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int sign = 0; 31671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 31681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 31691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 31711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sign = 1; 31721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 31731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (*cur == '+') 31741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 3175ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 3176ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (ret < 0) 3177ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 3178ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (*cur != 0) 3179ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 318001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_LONG) { 31811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi >= 922) { 31821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi > 922) 31831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 33720368) { 31851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 33720368) 31861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 54775807)) 31881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 54775808)) 31901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 319301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_INT) { 31941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi != 0) 31951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 21) { 31971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 21) 31981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 47483647)) 32001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 47483648)) 32021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 320401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_SHORT) { 32051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 32061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 32768)) 32081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 32767)) 32101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 321101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_BYTE) { 32121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 32131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 128)) 32151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 127)) 32171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 322001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 32211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 32221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 32236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik v->value.decimal.mi = mi; 32246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik v->value.decimal.hi = hi; 32251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = sign; 32261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 3227ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack v->value.decimal.total = ret; 32281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 32291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 32321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 3233e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_UINT: 3234e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_ULONG: 3235e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_USHORT: 32361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_UBYTE:{ 32371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 32381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 32391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 32401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 32411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 3242ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 3243ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (ret < 0) 3244ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 3245ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (*cur != 0) 3246ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 324701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_ULONG) { 32481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi >= 1844) { 32491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi > 1844) 32501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 67440737) { 32521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 67440737) 32531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 9551615) 32551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 325801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_UINT) { 32591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi != 0) 32601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 42) { 32621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 42) 32631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 94967295) 32651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 326701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_USHORT) { 32681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 32691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 65535) 32711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 327201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_UBYTE) { 32731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 32741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 255) 32761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 327901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 32801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 32811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 32821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.mi = mi; 32831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.hi = hi; 32841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = 0; 32851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 3286ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack v->value.decimal.total = ret; 32871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 32881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 32911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 3293b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 32941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard done: 32951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 32961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 32971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (ret); 32981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return3: 32991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 33001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 33011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (3); 33021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return1: 33031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 33041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 33051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (1); 33061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return0: 33071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 33081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 33091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (0); 33101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard error: 33111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 33121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 33131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (-1); 3314b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 3315b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 3316b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 3317b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValPredefTypeNode: 3318b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @type: the predefined type 3319b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: the value to check 3320b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @val: the return computed value 3321b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @node: the node containing the value 3322b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 3323b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the predefined type. 3324b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * if true a value is computed and returned in @val. 3325b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 3326b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns 0 if this validates, a positive error code number otherwise 3327b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * and -1 in case of internal or API error. 3328b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 3329b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardint 3330b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value, 3331b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlSchemaValPtr *val, xmlNodePtr node) { 33324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return(xmlSchemaValAtomicType(type, value, val, node, 0, 33334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 1, 0)); 33344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 33354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 33364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 3337c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaValPredefTypeNodeNoNorm: 3338c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the predefined type 3339c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the value to check 3340c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val: the return computed value 3341c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @node: the node containing the value 3342c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 3343c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Check that a value conforms to the lexical space of the predefined type. 3344c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * if true a value is computed and returned in @val. 3345c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * This one does apply any normalization to the value. 3346c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 3347c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 3348c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * and -1 in case of internal or API error. 3349c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 3350c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardint 3351c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, const xmlChar *value, 3352c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard xmlSchemaValPtr *val, xmlNodePtr node) { 33534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return(xmlSchemaValAtomicType(type, value, val, node, 1, 33544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 0, 1)); 3355c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 3356c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 3357c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/** 3358c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * xmlSchemaValidatePredefinedType: 3359c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @type: the predefined type 3360c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @value: the value to check 3361c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @val: the return computed value 3362c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * 3363c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Check that a value conforms to the lexical space of the predefined type. 3364c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * if true a value is computed and returned in @val. 3365c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * 3366c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 3367c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * and -1 in case of internal or API error. 3368c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard */ 3369c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillardint 3370c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel VeillardxmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value, 3371c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard xmlSchemaValPtr *val) { 3372c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard return(xmlSchemaValPredefTypeNode(type, value, val, NULL)); 3373c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard} 3374c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard 3375c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard/** 33764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareDecimals: 33774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x: a first decimal value 33784255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y: a second decimal value 33794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 33804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 decimals 33814255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 33824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error 33834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 33844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int 33854255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y) 33864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{ 33874255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValPtr swp; 3388273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack int order = 1, integx, integy, dlen; 3389273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack unsigned long hi, mi, lo; 33904255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 3391273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3392273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * First test: If x is -ve and not zero 3393273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3394e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((x->value.decimal.sign) && 3395e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((x->value.decimal.lo != 0) || 3396e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (x->value.decimal.mi != 0) || 3397e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (x->value.decimal.hi != 0))) { 3398273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3399273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * Then if y is -ve and not zero reverse the compare 3400273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3401e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((y->value.decimal.sign) && 3402e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((y->value.decimal.lo != 0) || 3403e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.mi != 0) || 3404e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.hi != 0))) 340580b19092f24410a6b869abf519227686e8f207caDaniel Veillard order = -1; 3406273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3407273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * Otherwise (y >= 0) we have the answer 3408273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 340980b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 341080b19092f24410a6b869abf519227686e8f207caDaniel Veillard return (-1); 3411273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3412273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * If x is not -ve and y is -ve we have the answer 3413273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3414e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } else if ((y->value.decimal.sign) && 3415e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((y->value.decimal.lo != 0) || 3416e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.mi != 0) || 3417e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.hi != 0))) { 34184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (1); 341980b19092f24410a6b869abf519227686e8f207caDaniel Veillard } 3420273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3421273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * If it's not simply determined by a difference in sign, 3422273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * then we need to compare the actual values of the two nums. 3423273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * To do this, we start by looking at the integral parts. 3424273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * If the number of integral digits differ, then we have our 3425273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * answer. 3426273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3427273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack integx = x->value.decimal.total - x->value.decimal.frac; 3428273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack integy = y->value.decimal.total - y->value.decimal.frac; 342972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik /* 343072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * NOTE: We changed the "total" for values like "0.1" 343172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * (or "-0.1" or ".1") to be 1, which was 2 previously. 343272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * Therefore the special case, when such values are 343372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * compared with 0, needs to be handled separately; 343472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * otherwise a zero would be recognized incorrectly as 343572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * greater than those values. This has the nice side effect 343672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * that we gain an overall optimized comparison with zeroes. 343772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik * Note that a "0" has a "total" of 1 already. 343872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik */ 343972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (integx == 1) { 344072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (x->value.decimal.lo == 0) { 344172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (integy != 1) 344272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik return -order; 344372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik else if (y->value.decimal.lo != 0) 344472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik return -order; 344572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik else 344672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik return(0); 344772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } 344872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } 344972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (integy == 1) { 345072f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (y->value.decimal.lo == 0) { 345172f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik if (integx != 1) 345272f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik return order; 345372f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik else if (x->value.decimal.lo != 0) 345472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik return order; 345572f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik else 345672f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik return(0); 345772f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } 345872f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik } 345972f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik 3460273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (integx > integy) 3461273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3462273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack else if (integy > integx) 3463273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return -order; 346472f50c18d917b50664bc0770cebe83de0bcae831Kasimier T. Buchcik 3465273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3466273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * If the number of integral digits is the same for both numbers, 3467273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * then things get a little more complicated. We need to "normalize" 3468273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * the numbers in order to properly compare them. To do this, we 3469273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * look at the total length of each number (length => number of 3470273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * significant digits), and divide the "shorter" by 10 (decreasing 3471273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * the length) until they are of equal length. 3472273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3473273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack dlen = x->value.decimal.total - y->value.decimal.total; 3474273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (dlen < 0) { /* y has more digits than x */ 3475273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack swp = x; 3476273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack hi = y->value.decimal.hi; 3477273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack mi = y->value.decimal.mi; 3478273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack lo = y->value.decimal.lo; 3479273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack dlen = -dlen; 3480273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack order = -order; 3481273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else { /* x has more digits than y */ 3482273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack swp = y; 3483273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack hi = x->value.decimal.hi; 3484273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack mi = x->value.decimal.mi; 3485273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack lo = x->value.decimal.lo; 3486273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 3487273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack while (dlen > 8) { /* in effect, right shift by 10**8 */ 3488273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack lo = mi; 3489273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack mi = hi; 3490273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack hi = 0; 3491273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack dlen -= 8; 34924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 3493273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack while (dlen > 0) { 3494273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack unsigned long rem1, rem2; 3495273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack rem1 = (hi % 10) * 100000000L; 3496273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack hi = hi / 10; 3497273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack rem2 = (mi % 10) * 100000000L; 3498273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack mi = (mi + rem1) / 10; 3499273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack lo = (lo + rem2) / 10; 3500273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack dlen--; 3501273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 3502273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (hi > swp->value.decimal.hi) { 3503273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3504273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else if (hi == swp->value.decimal.hi) { 3505273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (mi > swp->value.decimal.mi) { 3506273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3507273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else if (mi == swp->value.decimal.mi) { 3508273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (lo > swp->value.decimal.lo) { 3509273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3510273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else if (lo == swp->value.decimal.lo) { 3511273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (x->value.decimal.total == y->value.decimal.total) { 3512273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return 0; 3513273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else { 3514273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3515273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 3516273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 3517273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 35184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 3519273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return -order; 35204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 35214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 35224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 3523070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xmlSchemaCompareDurations: 3524070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @x: a first duration value 3525070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @y: a second duration value 3526070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 3527070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Compare 2 durations 3528070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 3529070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 3530070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * case of error 3531070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 3532070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 3533070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel VeillardxmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y) 3534070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard{ 3535070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard long carry, mon, day; 3536070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double sec; 353780b19092f24410a6b869abf519227686e8f207caDaniel Veillard int invert = 1; 353880b19092f24410a6b869abf519227686e8f207caDaniel Veillard long xmon, xday, myear, minday, maxday; 3539070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard static const long dayRange [2][12] = { 3540070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, }, 3541070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} }; 3542070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3543070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((x == NULL) || (y == NULL)) 35445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 3545070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3546070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* months */ 3547070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mon = x->value.dur.mon - y->value.dur.mon; 3548070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3549070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* seconds */ 3550070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard sec = x->value.dur.sec - y->value.dur.sec; 3551070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard carry = (long)sec / SECS_PER_DAY; 3552070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard sec -= (double)(carry * SECS_PER_DAY); 3553070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3554070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* days */ 3555070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard day = x->value.dur.day - y->value.dur.day + carry; 3556070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3557070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* easy test */ 3558070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (mon == 0) { 3559070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (day == 0) 3560070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (sec == 0.0) 3561070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 3562070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else if (sec < 0.0) 3563070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 3564070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else 3565070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 3566070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else if (day < 0) 3567070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 3568070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else 3569070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 3570070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 3571070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3572070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (mon > 0) { 3573070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((day >= 0) && (sec >= 0.0)) 3574070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 3575070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else { 3576070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = mon; 3577070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xday = -day; 3578070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 3579070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else if ((day <= 0) && (sec <= 0.0)) { 3580070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 3581070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else { 358280b19092f24410a6b869abf519227686e8f207caDaniel Veillard invert = -1; 3583070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = -mon; 3584070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xday = day; 3585070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 3586070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3587070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard myear = xmon / 12; 358880b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (myear == 0) { 358980b19092f24410a6b869abf519227686e8f207caDaniel Veillard minday = 0; 359080b19092f24410a6b869abf519227686e8f207caDaniel Veillard maxday = 0; 359180b19092f24410a6b869abf519227686e8f207caDaniel Veillard } else { 359280b19092f24410a6b869abf519227686e8f207caDaniel Veillard maxday = 366 * ((myear + 3) / 4) + 359380b19092f24410a6b869abf519227686e8f207caDaniel Veillard 365 * ((myear - 1) % 4); 359480b19092f24410a6b869abf519227686e8f207caDaniel Veillard minday = maxday - 1; 359580b19092f24410a6b869abf519227686e8f207caDaniel Veillard } 359680b19092f24410a6b869abf519227686e8f207caDaniel Veillard 3597070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = xmon % 12; 3598070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard minday += dayRange[0][xmon]; 3599070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard maxday += dayRange[1][xmon]; 3600070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 360180b19092f24410a6b869abf519227686e8f207caDaniel Veillard if ((maxday == minday) && (maxday == xday)) 360280b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(0); /* can this really happen ? */ 3603070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (maxday < xday) 360480b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(-invert); 360580b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (minday > xday) 360680b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(invert); 3607070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3608070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* indeterminate */ 36095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; 36105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 36115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 36125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/* 36135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * macros for adding date/times and durations 36145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 36155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT(a,b) (floor(((double)a/(double)b))) 36165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO(a,b) (a - FQUOTIENT(a,b) * b) 36175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT_RANGE(a,low,high) (FQUOTIENT((a-low),(high-low))) 36185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO_RANGE(a,low,high) ((MODULO((a-low),(high-low)))+low) 36195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 36205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 3621669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * xmlSchemaDupVal: 3622669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @v: the #xmlSchemaValPtr value to duplicate 3623669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * 3624669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Makes a copy of @v. The calling program is responsible for freeing 3625669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the returned value. 3626669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * 3627669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * returns a pointer to a duplicated #xmlSchemaValPtr or NULL if error. 3628669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard */ 3629669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillardstatic xmlSchemaValPtr 3630669adfcd3af5dfda873b10119d44202a7450bb20Daniel VeillardxmlSchemaDupVal (xmlSchemaValPtr v) 3631669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard{ 3632669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaValPtr ret = xmlSchemaNewValue(v->type); 3633669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard if (ret == NULL) 3634669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return NULL; 3635669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard 3636669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard memcpy(ret, v, sizeof(xmlSchemaVal)); 36374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->next = NULL; 3638669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return ret; 3639669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard} 3640669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard 3641669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard/** 3642285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * xmlSchemaCopyValue: 3643285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * @val: the precomputed value to be copied 3644285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * 3645285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Copies the precomputed value. This duplicates any string within. 3646285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * 3647285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Returns the copy or NULL if a copy for a data-type is not implemented. 3648285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik */ 3649285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaValPtr 3650285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaCopyValue(xmlSchemaValPtr val) 3651285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik{ 36524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaValPtr ret = NULL, prev = NULL, cur; 3653285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik 3654285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik /* 3655285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Copy the string values. 3656285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik */ 36574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (val != NULL) { 36584efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik switch (val->type) { 36594efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYTYPE: 36604efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREFS: 36614efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITIES: 36624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKENS: 36634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaFreeValue(ret); 36644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (NULL); 36654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 36664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_STRING: 36674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 36684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_TOKEN: 36694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_LANGUAGE: 36704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NAME: 36714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NCNAME: 36724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ID: 36734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 36744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITY: 36754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKEN: 36764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYURI: 36774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 36784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.str != NULL) 36794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.str = xmlStrdup(BAD_CAST val->value.str); 36804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 36814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_QNAME: 36824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NOTATION: 36834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 36844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.qname.name != NULL) 36854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.qname.name = 3686285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik xmlStrdup(BAD_CAST val->value.qname.name); 36874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.qname.uri != NULL) 36884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.qname.uri = 3689285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik xmlStrdup(BAD_CAST val->value.qname.uri); 36904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 36914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_HEXBINARY: 36924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 36934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.hex.str != NULL) 36944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.hex.str = xmlStrdup(BAD_CAST val->value.hex.str); 36954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 36964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_BASE64BINARY: 36974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 36984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.base64.str != NULL) 36994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.base64.str = 3700285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik xmlStrdup(BAD_CAST val->value.base64.str); 37014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 37024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik default: 37034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 37044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 37054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 37064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (ret == NULL) 37074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = cur; 37084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else 37094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik prev->next = cur; 37104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik prev = cur; 37114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik val = val->next; 3712285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik } 37134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (ret); 3714285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik} 3715285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik 3716285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik/** 37175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateAdd: 37185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 37195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dur: an #xmlSchemaValPtr of type #XS_DURATION 37205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 37215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compute a new date/time from @dt and @dur. This function assumes @dt 37225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH, 3723669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * or #XML_SCHEMAS_GYEAR. The returned #xmlSchemaVal is the same type as 3724669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt. The calling program is responsible for freeing the returned value. 37255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3726669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a pointer to a new #xmlSchemaVal or NULL if error. 37275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 37285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr 37295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur) 37305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 3731669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaValPtr ret, tmp; 37325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long carry, tempdays, temp; 37335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValDatePtr r, d; 37345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValDurationPtr u; 37355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((dt == NULL) || (dur == NULL)) 37375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 37385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = xmlSchemaNewValue(dt->type); 37405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret == NULL) 37415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 37425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3743669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard /* make a copy so we don't alter the original value */ 3744669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard tmp = xmlSchemaDupVal(dt); 3745669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard if (tmp == NULL) { 3746669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaFreeValue(ret); 3747669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return NULL; 3748669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard } 3749669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard 37505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r = &(ret->value.date); 3751669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard d = &(tmp->value.date); 37525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard u = &(dur->value.dur); 37535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalization */ 37555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->mon == 0) 37565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->mon = 1; 37575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize for time zone offset */ 37595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard u->sec -= (d->tzo * 60); 37605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->tzo = 0; 37615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalization */ 37635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->day == 0) 37645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->day = 1; 37655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* month */ 37675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = d->mon + u->mon; 3768ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->mon = (unsigned int) MODULO_RANGE(carry, 1, 13); 3769ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT_RANGE(carry, 1, 13); 37705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* year (may be modified later) */ 37725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year = d->year + carry; 37735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->year == 0) { 37745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->year > 0) 37755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year--; 37765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 37775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year++; 37785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 37795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* time zone */ 37815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->tzo = d->tzo; 37825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->tz_flag = d->tz_flag; 37835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* seconds */ 37855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->sec = d->sec + u->sec; 3786ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT((long)r->sec, 60); 37875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->sec != 0.0) { 37885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->sec = MODULO(r->sec, 60.0); 37895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 37905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* minute */ 37925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry += d->min; 3793ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->min = (unsigned int) MODULO(carry, 60); 3794ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT(carry, 60); 37955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* hours */ 37975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry += d->hour; 3798ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->hour = (unsigned int) MODULO(carry, 24); 3799ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long)FQUOTIENT(carry, 24); 38005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 38025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * days 38035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Note we use tempdays because the temporary values may need more 38045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * than 5 bits 38055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 38065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) && 38075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (d->day > MAX_DAYINMONTH(r->year, r->mon))) 38085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = MAX_DAYINMONTH(r->year, r->mon); 38095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (d->day < 1) 38105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = 1; 38115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 38125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = d->day; 38135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays += u->day + carry; 38155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard while (1) { 38175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (tempdays < 1) { 38185e9576a492e4fb8c2d517ccd6056a139e801ec9fDaniel Veillard long tmon = (long) MODULO_RANGE((int)r->mon-1, 1, 13); 38195e9576a492e4fb8c2d517ccd6056a139e801ec9fDaniel Veillard long tyr = r->year + (long)FQUOTIENT_RANGE((int)r->mon-1, 1, 13); 38205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (tyr == 0) 38215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tyr--; 382214b5643947845df089376106517c4f7ba061e4b0Daniel Veillard /* 382314b5643947845df089376106517c4f7ba061e4b0Daniel Veillard * Coverity detected an overrun in daysInMonth 382414b5643947845df089376106517c4f7ba061e4b0Daniel Veillard * of size 12 at position 12 with index variable "((r)->mon - 1)" 382514b5643947845df089376106517c4f7ba061e4b0Daniel Veillard */ 382614b5643947845df089376106517c4f7ba061e4b0Daniel Veillard if (tmon < 0) 382714b5643947845df089376106517c4f7ba061e4b0Daniel Veillard tmon = 0; 382814b5643947845df089376106517c4f7ba061e4b0Daniel Veillard if (tmon > 12) 382914b5643947845df089376106517c4f7ba061e4b0Daniel Veillard tmon = 12; 38305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays += MAX_DAYINMONTH(tyr, tmon); 38315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = -1; 3832ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard } else if (tempdays > (long) MAX_DAYINMONTH(r->year, r->mon)) { 38335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon); 38345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = 1; 38355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } else 38365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 38375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard temp = r->mon + carry; 3839ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->mon = (unsigned int) MODULO_RANGE(temp, 1, 13); 3840ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->year = r->year + (unsigned int) FQUOTIENT_RANGE(temp, 1, 13); 38415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->year == 0) { 38425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (temp < 1) 38435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year--; 38445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 38455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year++; 38465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 38475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 38485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->day = tempdays; 38505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 38525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * adjust the date/time type to the date values 38535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 38545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret->type != XML_SCHEMAS_DATETIME) { 38555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((r->hour) || (r->min) || (r->sec)) 38565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_DATETIME; 38575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (ret->type != XML_SCHEMAS_DATE) { 38585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((r->mon != 1) && (r->day != 1)) 38595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_DATE; 38605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1)) 38615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_GYEARMONTH; 38625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 38635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 38645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3865669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaFreeValue(tmp); 38665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 38685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 38695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 38715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaDateNormalize: 3872669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt: an #xmlSchemaValPtr of a date/time type value. 3873669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @offset: number of seconds to adjust @dt by. 38745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3875669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Normalize @dt to GMT time. The @offset parameter is subtracted from 3876669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the return value is a time-zone offset is present on @dt. 38775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3878669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a normalized copy of @dt or NULL if error. 38795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 38805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr 38815a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset) 38825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 38835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValPtr dur, ret; 38845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt == NULL) 38865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 38875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (((dt->type != XML_SCHEMAS_TIME) && 3889c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (dt->type != XML_SCHEMAS_DATETIME) && 3890c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (dt->type != XML_SCHEMAS_DATE)) || (dt->value.date.tzo == 0)) 38915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return xmlSchemaDupVal(dt); 38925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); 38945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dur == NULL) 38955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 38965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dur->value.date.sec -= offset; 38985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = _xmlSchemaDateAdd(dt, dur); 39005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret == NULL) 39015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 39025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaFreeValue(dur); 39045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* ret->value.date.tzo = 0; */ 39065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 39075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 39085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 39105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateCastYMToDays: 39115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 39125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 39135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Convert mon and year of @dt to total number of days. Take the 39145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * number of years since (or before) 1 AD and add the number of leap 39155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years. This is a function because negative 39165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years must be handled a little differently and there is no zero year. 39175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 39185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns number of days. 39195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 39205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic long 39215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt) 39225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 39235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long ret; 392449e8963c640865343327c67d4755a1af705717d3Daniel Veillard int mon; 39255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 392649e8963c640865343327c67d4755a1af705717d3Daniel Veillard mon = dt->value.date.mon; 392749e8963c640865343327c67d4755a1af705717d3Daniel Veillard if (mon <= 0) mon = 1; /* normalization */ 392849e8963c640865343327c67d4755a1af705717d3Daniel Veillard 392949e8963c640865343327c67d4755a1af705717d3Daniel Veillard if (dt->value.date.year <= 0) 39305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = (dt->value.date.year * 365) + 39315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+ 39325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((dt->value.date.year+1)/400)) + 393349e8963c640865343327c67d4755a1af705717d3Daniel Veillard DAY_IN_YEAR(0, mon, dt->value.date.year); 39345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 39355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = ((dt->value.date.year-1) * 365) + 39365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+ 39375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((dt->value.date.year-1)/400)) + 393849e8963c640865343327c67d4755a1af705717d3Daniel Veillard DAY_IN_YEAR(0, mon, dt->value.date.year); 39395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 39415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 39425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 39445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * TIME_TO_NUMBER: 39455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 39465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 39475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Calculates the number of seconds in the time portion of @dt. 39485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 39495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns seconds. 39505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 39515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define TIME_TO_NUMBER(dt) \ 39525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((double)((dt->value.date.hour * SECS_PER_HOUR) + \ 3953b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard (dt->value.date.min * SECS_PER_MIN) + \ 3954b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard (dt->value.date.tzo * SECS_PER_MIN)) + \ 3955b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard dt->value.date.sec) 39565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 39585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaCompareDates: 39595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @x: a first date/time value 39605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @y: a second date/time value 39615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 39625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compare 2 date/times 39635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 39645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 39655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error 39665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 39675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic int 39685a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y) 39695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 39705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard unsigned char xmask, ymask, xor_mask, and_mask; 39715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValPtr p1, p2, q1, q2; 39725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long p1d, p2d, q1d, q2d; 39735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((x == NULL) || (y == NULL)) 39755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 39765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.tz_flag) { 39785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (!y->value.date.tz_flag) { 39805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, 0); 39815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 39825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize y + 14:00 */ 39835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR)); 39845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 3986fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 3987fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3988fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 39895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 3990fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d == q1d) { 39915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 39925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 3994fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (sec < 0.0) { 3995fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3996fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 39975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 3998fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 39994aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 40005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize y - 14:00 */ 40015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR)); 40025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day; 40035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (p1d > q2d) 40044aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 40055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (p1d == q2d) { 40065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2); 40075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec > 0.0) 40084aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 40095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 40104aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 2; /* indeterminate */ 40115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40124aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(p1); 40134aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q1); 40144aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q2); 40154aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard if (ret != 0) 40164aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 40175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 4018fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 4019fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 4020fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 4021fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } 40225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } else if (y->value.date.tz_flag) { 40245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, 0); 40255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 40265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize x - 14:00 */ 40285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR)); 40295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 40305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 4031fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 4032fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 4033fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 40345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 4035fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d == q1d) { 40365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 40375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 4039fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (sec < 0.0) { 4040fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 4041fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 40425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 4043fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 40444aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 40455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize x + 14:00 */ 40465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR)); 40475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day; 40485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40496560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard if (p2d > q1d) { 40504aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 40516560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard } else if (p2d == q1d) { 40525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1); 40535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec > 0.0) 40544aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 40555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 40564aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 2; /* indeterminate */ 40575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40586560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(p1); 40596560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(q1); 40606560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(p2); 40614aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard if (ret != 0) 40624aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 40635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 4064fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 4065fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 4066fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 40675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 40715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * if the same type then calculate the difference 40725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 40735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->type == y->type) { 40744aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 40755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, 0); 40765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 40775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, 0); 40795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 40805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 4081fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 40824aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = -1; 4083fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d > q1d) { 40844aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 4085fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 40865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 40875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 40895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec < 0.0) 40904aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = -1; 40915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (sec > 0.0) 40924aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 40935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40954aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(p1); 40964aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q1); 40974aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 40985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard switch (x->type) { 41015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 41025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0xf; 41035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 41055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x7; 41065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 41085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x1; 41095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 41115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x2; 41125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 41145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x3; 41155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 41175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x3; 41185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 41205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x6; 41215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 41235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x8; 41245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard default: 41265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0; 41275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 41295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard switch (y->type) { 41315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 41325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0xf; 41335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 41355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x7; 41365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 41385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x1; 41395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 41415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x2; 41425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 41445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x3; 41455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 41475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x3; 41485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 41505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x6; 41515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 41535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x8; 41545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard default: 41565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0; 41575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 41585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 41595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xor_mask = xmask ^ ymask; /* mark type differences */ 41615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard and_mask = xmask & ymask; /* mark field specification */ 41625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* year */ 41645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 1) 41655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 41665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 1) { 41675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.year < y->value.date.year) 41685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 41695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.year > y->value.date.year) 41705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 41715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 41725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* month */ 41745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 2) 41755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 41765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 2) { 41775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.mon < y->value.date.mon) 41785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 41795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.mon > y->value.date.mon) 41805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 41815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 41825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* day */ 41845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 4) 41855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 41865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 4) { 41875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.day < y->value.date.day) 41885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 41895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.day > y->value.date.day) 41905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 41915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 41925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* time */ 41945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 8) 41955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 41965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 8) { 41975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.hour < y->value.date.hour) 41985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 41995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.hour > y->value.date.hour) 42005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 42015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.min < y->value.date.min) 42025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 42035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.min > y->value.date.min) 42045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 42055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.sec < y->value.date.sec) 42065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 42075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.sec > y->value.date.sec) 42085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 42095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 42105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 4211070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 4212070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 4213070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 4214070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 42156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveReplaceStrings: 4216478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @x: a first string value 4217478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @y: a second string value 42186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @invert: inverts the result if x < y or x > y. 42196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 42206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 42216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is 42226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "replace". I.e. @x could 42236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString". 42246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 42256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 42266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 42276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 42286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 4229478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaComparePreserveReplaceStrings(const xmlChar *x, 4230478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y, 42316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int invert) 42326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 42336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 42346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 4235478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4236478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (IS_WSP_REPLACE_CH(*y)) { 4237478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (! IS_WSP_SPACE_CH(*x)) { 4238478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*x - 0x20) < 0) { 42396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 42446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 42496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 42506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 4251478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x - *y; 42526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) { 42536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 42586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) { 42596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 42646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4265478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik x++; 4266478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 42676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4268478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) { 42696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4274478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 42756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 42806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 42816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 42826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 42836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 42846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings: 42856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 42866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 42876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 42886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 42896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is 42906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could 42916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString". 42926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 42936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 42946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 42956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 42966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 4297478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaComparePreserveCollapseStrings(const xmlChar *x, 4298478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y, 42996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int invert) 43006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 43016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 43026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 43036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 43046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip leading blank chars of the collapsed string. 43056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4306478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4307478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 43086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 4309478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4310478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*y) { 4311478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (! IS_WSP_SPACE_CH(*x)) { 43126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 4313478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * The yv character would have been replaced to 0x20. 43146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4315478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*x - 0x20) < 0) { 43166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 43216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4327478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik x++; 4328478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 43296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 43306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip contiguous blank chars of the collapsed string. 43316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4332478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4333478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 43346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 4335478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x++ - *y++; 43366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) { 43376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) { 43436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4350478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) { 43516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4356478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 43576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 43586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip trailing blank chars of the collapsed string. 43596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4360478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4361478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 4362478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 43636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 43706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 43716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 43726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 43736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings: 43746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 43756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 43766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 43776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 43786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is 43796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could 43806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString". 43816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 43826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 43836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 43846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 43856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 4386478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareReplaceCollapseStrings(const xmlChar *x, 4387478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y, 43886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int invert) 43896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 43906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 43916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 43926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 43936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip leading blank chars of the collapsed string. 43946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4395478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4396478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 43976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 4398478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4399478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*y) { 4400478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (! IS_WSP_BLANK_CH(*x)) { 44016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 4402478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * The yv character would have been replaced to 0x20. 44036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4404478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*x - 0x20) < 0) { 44056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 44066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 44086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 44106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 44116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 44136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 44156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4416478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik x++; 4417478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 44186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 44196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip contiguous blank chars of the collapsed string. 44206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4421478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4422478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 44236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 4424478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*x) { 44256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 4426478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * The xv character would have been replaced to 0x20. 44276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4428478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((0x20 - *y) < 0) { 44296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 44306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 44326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 44346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 44356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 44376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 44396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4440478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x++ - *y++; 44416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) 44426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) 44446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 44466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4447478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) { 44486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 44496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 44516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4453478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 44546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 44556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip trailing blank chars of the collapsed string. 44566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4457478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4458478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 4459478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 44606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 44616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 44636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 44656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 44666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 44676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 44686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 44696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 44706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 44716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareReplacedStrings: 44726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 44736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 44746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 44756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 44766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 44776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 44786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 44796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 44806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 4481478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareReplacedStrings(const xmlChar *x, 4482478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y) 44836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 44846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 44856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 4486478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4487478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*y) { 4488478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (! IS_WSP_BLANK_CH(*x)) { 4489478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*x - 0x20) < 0) 44906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 44926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 44946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 4495478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*x) { 4496478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((0x20 - *y) < 0) 44976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 44996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 45006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4501478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x - *y; 45026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) 45036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 45046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) 45056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 45066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4507478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik x++; 4508478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 45096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4510478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) 45116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 4512478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) 45136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 45146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 45156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 45166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 45176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 4518c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaCompareNormStrings: 4519c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @x: a first string value 4520c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @y: a second string value 4521c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 4522c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Compare 2 string for their normalized values. 4523c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 4524c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 4525c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * case of error 4526c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */ 4527c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int 4528478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareNormStrings(const xmlChar *x, 4529478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y) { 4530c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard int tmp; 4531c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 4532478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*x)) x++; 4533478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*y)) y++; 4534478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4535478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (IS_BLANK_CH(*x)) { 4536478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (!IS_BLANK_CH(*y)) { 4537478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x - *y; 4538c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(tmp); 4539c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4540478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*x)) x++; 4541478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*y)) y++; 4542c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 4543478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x++ - *y++; 4544c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (tmp < 0) 4545c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4546c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (tmp > 0) 4547c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(1); 4548c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4549c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4550478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) { 4551478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*x)) x++; 4552478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) 4553c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(1); 4554c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4555478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 4556478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*y)) y++; 4557478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) 4558c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4559c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4560c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(0); 4561c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard} 4562c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 4563c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/** 4564b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCompareFloats: 4565b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @x: a first float or double value 4566b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @y: a second float or double value 4567b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 4568b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Compare 2 values 4569b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 4570b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 4571b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * case of error 4572b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4573b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int 4574b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) { 4575b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard double d1, d2; 4576b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4577b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((x == NULL) || (y == NULL)) 4578b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 4579b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4580b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 4581b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Cast everything to doubles. 4582b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4583b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->type == XML_SCHEMAS_DOUBLE) 4584b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d1 = x->value.d; 4585b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else if (x->type == XML_SCHEMAS_FLOAT) 4586b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d1 = x->value.f; 4587b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 4588b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 4589b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4590b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (y->type == XML_SCHEMAS_DOUBLE) 4591b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d2 = y->value.d; 4592b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else if (y->type == XML_SCHEMAS_FLOAT) 4593b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d2 = y->value.f; 4594b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 4595b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 4596b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4597b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 4598b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check for special cases. 4599b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4600b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d1)) { 4601b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d2)) 4602b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4603b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4604b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4605b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d2)) 4606b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4607b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == xmlXPathPINF) { 4608b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathPINF) 4609b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4610b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4611b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4612b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathPINF) 4613b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4614b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == xmlXPathNINF) { 4615b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathNINF) 4616b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4617b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4618b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4619b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathNINF) 4620b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4621b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4622b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 4623b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * basic tests, the last one we should have equality, but 4624b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * portability is more important than speed and handling 4625b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * NaN or Inf in a portable way is always a challenge, so ... 4626b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4627b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 < d2) 4628b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4629b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 > d2) 4630b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4631b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == d2) 4632b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4633b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(2); 4634b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 4635b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4636b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 46374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareValues: 46384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x: a first value 46396c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xvalue: the first value as a string (optional) 46406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xwtsp: the whitespace type 46414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y: a second value 46426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xvalue: the second value as a string (optional) 46436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @ywtsp: the whitespace type 46444255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 46454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 values 46464255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 46474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, 3 if not 46484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * comparable and -2 in case of error 46494255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 46506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 46516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaCompareValuesInternal(xmlSchemaValType xtype, 46526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr x, 46536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *xvalue, 46546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, 46556c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValType ytype, 46566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaValPtr y, 46576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *yvalue, 4658478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaWhitespaceValueType yws) 4659478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{ 46606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik switch (xtype) { 466180b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UNKNOWN: 46622f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_ANYTYPE: 466380b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(-2); 466480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_INTEGER: 466580b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NPINTEGER: 466680b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NINTEGER: 466780b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NNINTEGER: 466880b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_PINTEGER: 466980b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_INT: 467080b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UINT: 467180b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_LONG: 467280b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ULONG: 467380b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_SHORT: 467480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_USHORT: 467580b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_BYTE: 467680b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UBYTE: 46774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMAS_DECIMAL: 46786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 46796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 46806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == xtype) 468180b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(xmlSchemaCompareDecimals(x, y)); 46826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((ytype == XML_SCHEMAS_DECIMAL) || 46836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_INTEGER) || 46846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NPINTEGER) || 46856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NINTEGER) || 46866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NNINTEGER) || 46876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_PINTEGER) || 46886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_INT) || 46896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_UINT) || 46906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_LONG) || 46916c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_ULONG) || 46926c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_SHORT) || 46936c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_USHORT) || 46946c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_BYTE) || 46956c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_UBYTE)) 46964255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(xmlSchemaCompareDecimals(x, y)); 46975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return(-2); 4698070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMAS_DURATION: 46996c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 47006c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 4701478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_DURATION) 4702070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(xmlSchemaCompareDurations(x, y)); 47035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return(-2); 47045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 47055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 47065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 47075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 47085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 47095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 47105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 47115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 47126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 47136c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 47146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((ytype == XML_SCHEMAS_DATETIME) || 47156c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_TIME) || 47166c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GDAY) || 47176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GMONTH) || 47186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GMONTHDAY) || 47196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GYEAR) || 47206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_DATE) || 47216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GYEARMONTH)) 47225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return (xmlSchemaCompareDates(x, y)); 47235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return (-2); 47242ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik /* 47252ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * Note that we will support comparison of string types against 47262ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * anySimpleType as well. 47272ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik */ 47282ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 47296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_STRING: 47306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 473180b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_TOKEN: 473280b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_LANGUAGE: 473380b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NMTOKEN: 473480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NAME: 473580b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NCNAME: 473680b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ID: 473780b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_IDREF: 473880b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ENTITY: 473980b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ANYURI: 47406c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik { 47416c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *xv, *yv; 47426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 47436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (x == NULL) 47446c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xv = xvalue; 47456c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik else 47466c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xv = x->value.str; 47476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (y == NULL) 47486c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik yv = yvalue; 47496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik else 47506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik yv = y->value.str; 47516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 47526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * TODO: Compare those against QName. 47536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 47546c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_QNAME) { 47556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik TODO 47566c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (y == NULL) 47576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 47586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-2); 47596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 47606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((ytype == XML_SCHEMAS_ANYSIMPLETYPE) || 47616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_STRING) || 47626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NORMSTRING) || 47636c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_TOKEN) || 47646c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_LANGUAGE) || 47656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NMTOKEN) || 47666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NAME) || 47676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NCNAME) || 47686c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_ID) || 47696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_IDREF) || 47706c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_ENTITY) || 47716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_ANYURI)) { 47726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 47736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (xws == XML_SCHEMA_WHITESPACE_PRESERVE) { 47746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 47756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) { 47766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* TODO: What about x < y or x > y. */ 47776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (xmlStrEqual(xv, yv)) 47786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (0); 47796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 47806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (2); 47816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else if (yws == XML_SCHEMA_WHITESPACE_REPLACE) 47826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaComparePreserveReplaceStrings(xv, yv, 0)); 47836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) 47846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaComparePreserveCollapseStrings(xv, yv, 0)); 47856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 47866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else if (xws == XML_SCHEMA_WHITESPACE_REPLACE) { 47876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 47886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) 47896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaComparePreserveReplaceStrings(yv, xv, 1)); 47906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_REPLACE) 47916c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaCompareReplacedStrings(xv, yv)); 47926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) 47936c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaCompareReplaceCollapseStrings(xv, yv, 0)); 47946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 47956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else if (xws == XML_SCHEMA_WHITESPACE_COLLAPSE) { 47966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 47976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) 47986c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaComparePreserveCollapseStrings(yv, xv, 1)); 47996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_REPLACE) 48006c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaCompareReplaceCollapseStrings(yv, xv, 1)); 48016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) 48026c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaCompareNormStrings(xv, yv)); 48036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else 48046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-2); 48056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 48066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4807c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return (-2); 48086c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik } 4809e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_QNAME: 4810c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NOTATION: 48116c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 48126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 4813c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((ytype == XML_SCHEMAS_QNAME) || 4814c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (ytype == XML_SCHEMAS_NOTATION)) { 4815e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) && 4816e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (xmlStrEqual(x->value.qname.uri, y->value.qname.uri))) 4817e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(0); 4818e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(2); 4819e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 4820e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (-2); 4821c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_FLOAT: 4822c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_DOUBLE: 48236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 48246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 48256c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((ytype == XML_SCHEMAS_FLOAT) || 48266c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_DOUBLE)) 4827b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (xmlSchemaCompareFloats(x, y)); 4828b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (-2); 4829c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_BOOLEAN: 48306c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 48316c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 48326c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_BOOLEAN) { 4833b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->value.b == y->value.b) 4834b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4835b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->value.b == 0) 4836b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4837b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4838b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4839b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (-2); 4840560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_HEXBINARY: 48416c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 48426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 48436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_HEXBINARY) { 484470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard if (x->value.hex.total == y->value.hex.total) { 484570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard int ret = xmlStrcmp(x->value.hex.str, y->value.hex.str); 484670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard if (ret > 0) 484770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(1); 484870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard else if (ret == 0) 484970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(0); 485070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 485170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard else if (x->value.hex.total > y->value.hex.total) 485270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(1); 485370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 485470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(-1); 485570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 4856560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return (-2); 48571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 48586c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 48596c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 48606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_BASE64BINARY) { 48611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (x->value.base64.total == y->value.base64.total) { 48621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int ret = xmlStrcmp(x->value.base64.str, 48631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard y->value.base64.str); 48641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret > 0) 48651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(1); 48661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (ret == 0) 48671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(0); 4868d369b1387e592791049a41eb4cc16046fe52e985Daniel Veillard else 4869d369b1387e592791049a41eb4cc16046fe52e985Daniel Veillard return(-1); 48701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 48711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (x->value.base64.total > y->value.base64.total) 48721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(1); 48731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 48741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(-1); 48751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 48766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-2); 4877c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_IDREFS: 4878c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ENTITIES: 4879c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NMTOKENS: 4880c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard TODO 4881c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 48824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 48835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 48844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 48854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 48864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 48876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValues: 48886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first value 48896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second value 48906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 48916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values 48926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 48936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 48946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 48956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 48966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint 48976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) { 48986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, yws; 48996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 49005e094143e423c01739ac9221f371846fd290be4eDaniel Veillard if ((x == NULL) || (y == NULL)) 49015e094143e423c01739ac9221f371846fd290be4eDaniel Veillard return(-2); 49026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (x->type == XML_SCHEMAS_STRING) 49036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xws = XML_SCHEMA_WHITESPACE_PRESERVE; 49046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else if (x->type == XML_SCHEMAS_NORMSTRING) 49056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xws = XML_SCHEMA_WHITESPACE_REPLACE; 49066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 49076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xws = XML_SCHEMA_WHITESPACE_COLLAPSE; 49086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 49096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (y->type == XML_SCHEMAS_STRING) 49106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik yws = XML_SCHEMA_WHITESPACE_PRESERVE; 49116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else if (x->type == XML_SCHEMAS_NORMSTRING) 49126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik yws = XML_SCHEMA_WHITESPACE_REPLACE; 49136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 49146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik yws = XML_SCHEMA_WHITESPACE_COLLAPSE; 49156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 49166c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type, 49176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik y, NULL, yws)); 49186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 49196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 49206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 49216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValuesWhtsp: 49226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first value 49236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xws: the whitespace value of x 49246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second value 49256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @yws: the whitespace value of y 49266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 49276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values 49286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 49296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 49306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 49316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 49326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint 49336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValuesWhtsp(xmlSchemaValPtr x, 49346c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, 49356c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr y, 49366c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType yws) 49376c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{ 49389dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 49399dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik return(-2); 49406c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type, 49416c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik y, NULL, yws)); 49426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik} 49436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 49446c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/** 49456c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaCompareValuesWhtspExt: 49466c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @x: a first value 49476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xws: the whitespace value of x 49486c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @y: a second value 49496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @yws: the whitespace value of y 49506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 49516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Compare 2 values 49526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 49536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 49546c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * case of error 49556c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 49566c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikstatic int 49576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaCompareValuesWhtspExt(xmlSchemaValType xtype, 49586c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr x, 49596c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *xvalue, 49606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, 49616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValType ytype, 49626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr y, 49636c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *yvalue, 49646c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType yws) 49656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{ 49666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaCompareValuesInternal(xtype, x, xvalue, xws, ytype, y, 49676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik yvalue, yws)); 49686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 49696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 49706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 4971c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaNormLen: 4972c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @value: a string 4973c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 4974c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Computes the UTF8 length of the normalized value of the string 4975c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 4976c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns the length or -1 in case of error. 4977c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */ 4978c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int 4979c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaNormLen(const xmlChar *value) { 4980c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard const xmlChar *utf; 4981c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard int ret = 0; 4982c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 4983c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (value == NULL) 4984c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4985c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf = value; 498676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf)) utf++; 4987c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard while (*utf != 0) { 4988c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (utf[0] & 0x80) { 4989c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[1] & 0xc0) != 0x80) 4990c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4991c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xe0) == 0xe0) { 4992c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[2] & 0xc0) != 0x80) 4993c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4994c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xf0) == 0xf0) { 4995c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80) 4996c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4997c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 4; 4998c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 4999c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 3; 5000c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 5001c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 5002c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 2; 5003c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 500476e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack } else if (IS_BLANK_CH(*utf)) { 500576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf)) utf++; 5006c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf == 0) 5007c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 5008c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 5009c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf++; 5010c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 5011c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard ret++; 5012c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 5013c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(ret); 5014c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard} 5015c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 50166927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard/** 50176927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaGetFacetValueAsULong: 50186927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * @facet: an schemas type facet 50196927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * 50206927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Extract the value of a facet 50216927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * 50226927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Returns the value as a long 50236927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard */ 5024c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardunsigned long 5025c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaGetFacetValueAsULong(xmlSchemaFacetPtr facet) 5026c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{ 5027c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard /* 5028c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * TODO: Check if this is a decimal. 5029c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 5030094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack if (facet == NULL) 5031094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack return 0; 5032c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return ((unsigned long) facet->val->value.decimal.lo); 5033c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 5034c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 5035c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/** 503601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateListSimpleTypeFacet: 503701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facet: the facet to check 503801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @value: the lexical repr of the value to validate 503901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @actualLen: the number of list items 504001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @expectedLen: the resulting expected number of list items 504101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 504201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Checks the value of a list simple type against a facet. 504301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 504401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 0 if the value is valid, a positive error code 504501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * number otherwise and -1 in case of an internal error. 504601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 504701fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint 504801fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaValidateListSimpleTypeFacet(xmlSchemaFacetPtr facet, 504901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard const xmlChar *value, 505001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard unsigned long actualLen, 505101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard unsigned long *expectedLen) 505201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 5053ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard if (facet == NULL) 5054ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard return(-1); 505501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 505601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * TODO: Check if this will work with large numbers. 505701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * (compare value.decimal.mi and value.decimal.hi as well?). 505801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 505901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 506001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen != facet->val->value.decimal.lo) { 5061478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (expectedLen != NULL) 5062c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 506301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_LENGTH_VALID); 506401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 506501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 506601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen < facet->val->value.decimal.lo) { 5067478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (expectedLen != NULL) 5068c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 506901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_MINLENGTH_VALID); 507001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 507101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MAXLENGTH) { 507201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen > facet->val->value.decimal.lo) { 5073478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (expectedLen != NULL) 5074c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 507501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_MAXLENGTH_VALID); 507601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 507701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else 507801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 507901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * NOTE: That we can pass NULL as xmlSchemaValPtr to 508001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateFacet, since the remaining facet types 508101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * are: XML_SCHEMA_FACET_PATTERN, XML_SCHEMA_FACET_ENUMERATION. 508201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 508301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(xmlSchemaValidateFacet(NULL, facet, value, NULL)); 508401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 508501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 508601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 508701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 50886927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaValidateLengthFacet: 5089c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the built-in type 5090c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @facet: the facet to check 5091c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the lexical repr. of the value to be validated 5092c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val: the precomputed value 5093478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value 5094c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @length: the actual length of the value 5095c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 5096c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength" 5097c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * facet; sets @length to the computed length of @value. 5098c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 5099c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if the value is valid, a positive error code 5100c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * otherwise and -1 in case of an internal or API error. 5101c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 5102478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikstatic int 5103478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacetInternal(xmlSchemaFacetPtr facet, 5104478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaTypeType valType, 5105478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *value, 5106478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 5107478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik unsigned long *length, 5108478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 5109c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{ 5110c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard unsigned int len = 0; 5111c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 5112478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((length == NULL) || (facet == NULL)) 5113ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard return (-1); 5114c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *length = 0; 5115c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((facet->type != XML_SCHEMA_FACET_LENGTH) && 5116c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->type != XML_SCHEMA_FACET_MAXLENGTH) && 5117c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->type != XML_SCHEMA_FACET_MINLENGTH)) 5118c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return (-1); 5119c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 5120478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5121478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: length, maxLength and minLength must be of type 5122478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * nonNegativeInteger only. Check if decimal is used somehow. 5123478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5124c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((facet->val == NULL) || 5125c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard ((facet->val->type != XML_SCHEMAS_DECIMAL) && 5126c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 5127c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->val->value.decimal.frac != 0)) { 5128c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(-1); 5129c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 5130c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) 5131c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard len = val->value.hex.total; 5132c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY)) 5133c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard len = val->value.base64.total; 5134c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard else { 5135478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik switch (valType) { 5136478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_STRING: 5137c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NORMSTRING: 5138478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { 5139478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5140478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * This is to ensure API compatibility with the old 5141478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateLengthFacet(). Anyway, this was and 5142478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * is not the correct handling. 5143478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: Get rid of this case somehow. 5144478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5145478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (valType == XML_SCHEMAS_STRING) 5146478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlUTF8Strlen(value); 5147478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5148478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5149478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } else if (value != NULL) { 5150478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 5151478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5152478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5153478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5154478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Should be OK for "preserve" as well. 5155478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5156478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlUTF8Strlen(value); 5157478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } 5158478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 5159478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 5160c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_TOKEN: 5161c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_LANGUAGE: 5162c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NMTOKEN: 5163c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NAME: 5164c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NCNAME: 5165bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik case XML_SCHEMAS_ID: 5166bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik /* 5167bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik * FIXME: What exactly to do with anyURI? 5168478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5169c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_ANYURI: 5170c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (value != NULL) 5171478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5172c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard break; 5173bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik case XML_SCHEMAS_QNAME: 5174bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik case XML_SCHEMAS_NOTATION: 5175bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik /* 51764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * For QName and NOTATION, those facets are 51774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * deprecated and should be ignored. 5178bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik */ 5179bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik return (0); 5180c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard default: 5181c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard TODO 5182c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 5183c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 5184c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *length = (unsigned long) len; 5185478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5186478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: Return the whole expected value, i.e. "lo", "mi" and "hi". 5187478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5188c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 5189c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len != facet->val->value.decimal.lo) 5190c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_LENGTH_VALID); 5191c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 5192c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len < facet->val->value.decimal.lo) 5193c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_MINLENGTH_VALID); 5194c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } else { 5195c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len > facet->val->value.decimal.lo) 5196c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_MAXLENGTH_VALID); 5197c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 5198c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 5199c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return (0); 5200c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 5201c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 5202c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/** 5203478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateLengthFacet: 5204478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @type: the built-in type 5205478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @facet: the facet to check 5206478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @value: the lexical repr. of the value to be validated 5207478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @val: the precomputed value 5208478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @length: the actual length of the value 5209478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * 5210478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Checka a value against a "length", "minLength" and "maxLength" 5211478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * facet; sets @length to the computed length of @value. 5212478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * 5213478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Returns 0 if the value is valid, a positive error code 5214478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * otherwise and -1 in case of an internal or API error. 5215478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5216478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikint 5217478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacet(xmlSchemaTypePtr type, 5218478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaFacetPtr facet, 5219478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *value, 5220478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 5221478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik unsigned long *length) 5222478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{ 5223cc5e2330ef2432493afce6566d3651195366d822Daniel Veillard if (type == NULL) 5224cc5e2330ef2432493afce6566d3651195366d822Daniel Veillard return(-1); 5225478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (xmlSchemaValidateLengthFacetInternal(facet, 5226478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik type->builtInType, value, val, length, 5227478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN)); 5228478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik} 5229478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik 5230478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik/** 5231478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateLengthFacetWhtsp: 5232478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @facet: the facet to check 5233478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @valType: the built-in type 5234478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @value: the lexical repr. of the value to be validated 5235478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @val: the precomputed value 5236478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value 5237478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @length: the actual length of the value 5238478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * 5239478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Checka a value against a "length", "minLength" and "maxLength" 5240478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * facet; sets @length to the computed length of @value. 5241478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * 5242478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Returns 0 if the value is valid, a positive error code 5243478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * otherwise and -1 in case of an internal or API error. 5244478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5245478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikint 5246478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacetWhtsp(xmlSchemaFacetPtr facet, 5247478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValType valType, 5248478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *value, 5249478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 5250478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik unsigned long *length, 5251478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 5252478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{ 5253478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (xmlSchemaValidateLengthFacetInternal(facet, valType, value, val, 5254478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik length, ws)); 5255478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik} 5256478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik 5257478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik/** 52586c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetInternal: 52594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @facet: the facet to check 5260478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @fws: the whitespace type of the facet's value 5261478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @valType: the built-in type of the value 52624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the lexical repr of the value to validate 52634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val: the precomputed value 5264478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value 52654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 52664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Check a value against a facet condition 52674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 52684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if the element is schemas valid, a positive error code 52694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * number otherwise and -1 in case of internal or API error. 52704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 52716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikstatic int 52726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaValidateFacetInternal(xmlSchemaFacetPtr facet, 52736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType fws, 5274478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValType valType, 52756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *value, 5276478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 52776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 52784255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{ 52794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard int ret; 52804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 52816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (facet == NULL) 52826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-1); 52836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 52844255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard switch (facet->type) { 52854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMA_FACET_PATTERN: 52866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik /* 52876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * NOTE that for patterns, the @value needs to be the normalized 52886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * value, *not* the lexical initial value or the canonical value. 52896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 52906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (value == NULL) 52916c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-1); 52924255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = xmlRegexpExec(facet->regexp, value); 52934255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == 1) 52944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 52956c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == 0) 529601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_PATTERN_VALID); 52974255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(ret); 52984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMA_FACET_MAXEXCLUSIVE: 52994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 53006c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 53014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(-1); 53024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == -1) 53034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 530401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID); 5305070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MAXINCLUSIVE: 5306070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 53076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 5308070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 5309070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret == -1) || (ret == 0)) 5310070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 531101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID); 5312070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MINEXCLUSIVE: 5313070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 53146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 5315070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 5316070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 1) 5317070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 531801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID); 5319070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MININCLUSIVE: 5320070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 53216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 5322070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 5323070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret == 1) || (ret == 0)) 5324070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 532501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MININCLUSIVE_VALID); 53268651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard case XML_SCHEMA_FACET_WHITESPACE: 53278bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO whitespaces */ 532801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 532901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * NOTE: Whitespace should be handled to normalize 533001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * the value to be validated against a the facets; 533101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * not to normalize the value in-between. 533201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 53338651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard return(0); 53348bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_ENUMERATION: 5335478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { 5336478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5337478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * This is to ensure API compatibility with the old 5338478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateFacet(). 5339478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: Get rid of this case. 5340478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 53416c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((facet->value != NULL) && 53426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (xmlStrEqual(facet->value, value))) 53436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(0); 53446c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik } else { 53456c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik ret = xmlSchemaCompareValuesWhtspExt(facet->val->type, 53466c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik facet->val, facet->value, fws, valType, val, 53476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik value, ws); 53486c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 53496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-1); 53506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == 0) 53516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(0); 53526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik } 535301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_ENUMERATION_VALID); 53548bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_LENGTH: 5355aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik /* 5356aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik * SPEC (1.3) "if {primitive type definition} is QName or NOTATION, 5357aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik * then any {value} is facet-valid." 5358aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik */ 5359aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik if ((valType == XML_SCHEMAS_QNAME) || 5360aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik (valType == XML_SCHEMAS_NOTATION)) 5361aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik return (0); 5362aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik /* No break on purpose. */ 5363e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard case XML_SCHEMA_FACET_MAXLENGTH: 53648bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_MINLENGTH: { 53658bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard unsigned int len = 0; 5366e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard 53674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((valType == XML_SCHEMAS_QNAME) || 53684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik (valType == XML_SCHEMAS_NOTATION)) 53694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (0); 5370478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5371478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: length, maxLength and minLength must be of type 5372478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * nonNegativeInteger only. Check if decimal is used somehow. 5373478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 53748bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard if ((facet->val == NULL) || 5375e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((facet->val->type != XML_SCHEMAS_DECIMAL) && 5376e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 53778bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard (facet->val->value.decimal.frac != 0)) { 53788bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard return(-1); 53798bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 5380560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) 538170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard len = val->value.hex.total; 53821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY)) 53831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard len = val->value.base64.total; 53841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else { 53856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik switch (valType) { 5386478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_STRING: 5387478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 5388478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { 5389478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5390478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * This is to ensure API compatibility with the old 5391478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateFacet(). Anyway, this was and 5392478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * is not the correct handling. 5393478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: Get rid of this case somehow. 5394478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5395478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (valType == XML_SCHEMAS_STRING) 5396478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlUTF8Strlen(value); 5397478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5398478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5399478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } else if (value != NULL) { 5400478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 5401478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5402478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5403478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5404478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Should be OK for "preserve" as well. 5405478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5406478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlUTF8Strlen(value); 5407478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } 5408478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 5409478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 5410560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_TOKEN: 5411560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_LANGUAGE: 5412560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NMTOKEN: 5413560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NAME: 5414560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NCNAME: 5415560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_ID: 541601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 5417478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (value != NULL) 5418478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5419478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 5420560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard default: 5421560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard TODO 542270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 54238bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 54248bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 5425e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len != facet->val->value.decimal.lo) 542601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_LENGTH_VALID); 54278bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 5428e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len < facet->val->value.decimal.lo) 542901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MINLENGTH_VALID); 54308bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } else { 5431e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len > facet->val->value.decimal.lo) 543201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXLENGTH_VALID); 5433e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard } 54348bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard break; 54358bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 5436560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMA_FACET_TOTALDIGITS: 5437560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMA_FACET_FRACTIONDIGITS: 5438560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 5439560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((facet->val == NULL) || 544069dea3a0c01e8a952b1d2f07ab0a3aa450f0cdfeKasimier T. Buchcik ((facet->val->type != XML_SCHEMAS_PINTEGER) && 5441560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 5442560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (facet->val->value.decimal.frac != 0)) { 5443560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return(-1); 5444560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 5445560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((val == NULL) || 5446560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard ((val->type != XML_SCHEMAS_DECIMAL) && 5447560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_INTEGER) && 5448560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NPINTEGER) && 5449560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NINTEGER) && 5450560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NNINTEGER) && 5451560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_PINTEGER) && 5452560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_INT) && 5453560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_UINT) && 5454560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_LONG) && 5455560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_ULONG) && 5456560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_SHORT) && 5457560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_USHORT) && 5458560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_BYTE) && 5459560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_UBYTE))) { 5460560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return(-1); 5461560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 5462560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) { 5463560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (val->value.decimal.total > facet->val->value.decimal.lo) 546401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_TOTALDIGITS_VALID); 5465560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 5466560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) { 5467560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (val->value.decimal.frac > facet->val->value.decimal.lo) 546801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID); 5469560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 5470560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard break; 54714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard default: 54724255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard TODO 54734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 54744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 5475b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 54764255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 54774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 54786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 54796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacet: 54806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @base: the base type 54816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @facet: the facet to check 54826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @value: the lexical repr of the value to validate 54836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @val: the precomputed value 54846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 54856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Check a value against a facet condition 54866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 54876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns 0 if the element is schemas valid, a positive error code 54886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * number otherwise and -1 in case of internal or API error. 54896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 54906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikint 54919dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. BuchcikxmlSchemaValidateFacet(xmlSchemaTypePtr base, 54926c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaFacetPtr facet, 54936c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *value, 54946c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr val) 54956c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{ 54966c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik /* 54976c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * This tries to ensure API compatibility regarding the old 54986c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacet() and the new xmlSchemaValidateFacetInternal() and 54996c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetWhtsp(). 55006c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 55019dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik if (val != NULL) 55026c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaValidateFacetInternal(facet, 55039dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN, val->type, value, val, 55046c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN)); 55059dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik else if (base != NULL) 55066c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaValidateFacetInternal(facet, 55079dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN, base->builtInType, value, val, 5508478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN)); 55099dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik return(-1); 55106c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik} 55116c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 55126c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/** 55136c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetWhtsp: 55146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @facet: the facet to check 55156c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @fws: the whitespace type of the facet's value 55166c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @valType: the built-in type of the value 55176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @value: the lexical (or normalized for pattern) repr of the value to validate 55186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @val: the precomputed value 55196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @ws: the whitespace type of the value 55206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 55216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Check a value against a facet condition. This takes value normalization 55226c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * according to the specified whitespace types into account. 55236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Note that @value needs to be the *normalized* value if the facet 55246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * is of type "pattern". 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 55306c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaValidateFacetWhtsp(xmlSchemaFacetPtr facet, 55316c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType fws, 5532478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValType valType, 55336c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *value, 5534478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 55356c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 55366c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{ 55376c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaValidateFacetInternal(facet, fws, valType, 5538478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik value, val, ws)); 55396c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik} 55406c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 5541c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#if 0 5542c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifndef DBL_DIG 5543c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define DBL_DIG 16 5544c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif 5545c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifndef DBL_EPSILON 5546c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define DBL_EPSILON 1E-9 5547c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif 5548c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5549c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define INTEGER_DIGITS DBL_DIG 5550c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define FRACTION_DIGITS (DBL_DIG + 1) 5551c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define EXPONENT_DIGITS (3 + 2) 5552c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5553c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik/** 5554c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * xmlXPathFormatNumber: 5555c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @number: number to format 5556c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @buffer: output buffer 5557c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @buffersize: size of output buffer 5558c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 5559c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Convert the number into a string representation. 5560c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5561c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcikstatic void 5562c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. BuchcikxmlSchemaFormatFloat(double number, char buffer[], int buffersize) 5563c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik{ 5564c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik switch (xmlXPathIsInf(number)) { 5565c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case 1: 5566c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (buffersize > (int)sizeof("INF")) 5567c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buffer, buffersize, "INF"); 5568c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5569c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case -1: 5570c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (buffersize > (int)sizeof("-INF")) 5571c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buffer, buffersize, "-INF"); 5572c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5573c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik default: 5574c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (xmlXPathIsNaN(number)) { 5575c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (buffersize > (int)sizeof("NaN")) 5576c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buffer, buffersize, "NaN"); 5577c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else if (number == 0) { 5578c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buffer, buffersize, "0.0E0"); 5579c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5580c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 3 is sign, decimal point, and terminating zero */ 5581c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char work[DBL_DIG + EXPONENT_DIGITS + 3]; 5582c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int integer_place, fraction_place; 5583c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char *ptr; 5584c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char *after_fraction; 5585c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik double absolute_value; 5586c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int size; 5587c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5588c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik absolute_value = fabs(number); 5589c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5590c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5591c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Result is in work, and after_fraction points 5592c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * just past the fractional part. 5593c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Use scientific notation 5594c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5595c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik integer_place = DBL_DIG + EXPONENT_DIGITS + 1; 5596c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik fraction_place = DBL_DIG - 1; 5597c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(work, sizeof(work),"%*.*e", 5598c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik integer_place, fraction_place, number); 5599c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik after_fraction = strchr(work + DBL_DIG, 'e'); 5600c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Remove fractional trailing zeroes */ 5601c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik ptr = after_fraction; 5602c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik while (*(--ptr) == '0') 5603c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik ; 5604c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (*ptr != '.') 5605c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik ptr++; 5606c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik while ((*ptr++ = *after_fraction++) != 0); 5607c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5608c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Finally copy result back to caller */ 5609c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik size = strlen(work) + 1; 5610c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (size > buffersize) { 5611c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik work[buffersize - 1] = 0; 5612c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik size = buffersize; 5613c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5614c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik memmove(buffer, work, size); 5615c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5616c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5617c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5618c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik} 5619c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif 5620c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 56216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/** 56226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaGetCanonValue: 56236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @val: the precomputed value 56246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @retValue: the returned value 56256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 5626478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Get a the cononical lexical representation of the value. 5627c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * The caller has to FREE the returned retValue. 5628c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 5629478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * WARNING: Some value types are not supported yet, resulting 5630478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * in a @retValue of "???". 5631c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 5632c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: XML Schema 1.0 does not define canonical representations 5633c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * for: duration, gYearMonth, gYear, gMonthDay, gMonth, gDay, 5634c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * anyURI, QName, NOTATION. This will be fixed in XML Schema 1.1. 5635c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 56366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 5637c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Returns 0 if the value could be built, 1 if the value type is 5638c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * not supported yet and -1 in case of API errors. 56396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 56406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint 5641b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel VeillardxmlSchemaGetCanonValue(xmlSchemaValPtr val, const xmlChar **retValue) 56426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 5643b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard if ((retValue == NULL) || (val == NULL)) 56446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-1); 56456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *retValue = NULL; 56466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik switch (val->type) { 5647478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_STRING: 5648478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (val->value.str == NULL) 5649478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); 5650478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5651478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = 5652478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik BAD_CAST xmlStrdup((const xmlChar *) val->value.str); 5653478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 56546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 5655478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (val->value.str == NULL) 5656478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); 5657478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else { 5658478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = xmlSchemaWhiteSpaceReplace( 5659478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik (const xmlChar *) val->value.str); 5660478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*retValue) == NULL) 5661478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup( 5662478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik (const xmlChar *) val->value.str); 5663478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } 5664478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 56656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_TOKEN: 56666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_LANGUAGE: 56676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NMTOKEN: 5668478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_NAME: 56696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NCNAME: 56706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_ID: 56716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 56726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_ENTITY: 5673c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NOTATION: /* Unclear */ 5674c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_ANYURI: /* Unclear */ 56756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (val->value.str == NULL) 5676478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (-1); 5677aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik *retValue = 5678aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik BAD_CAST xmlSchemaCollapseString(BAD_CAST val->value.str); 5679aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik if (*retValue == NULL) 5680aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik *retValue = 5681aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik BAD_CAST xmlStrdup((const xmlChar *) val->value.str); 5682478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 5683478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_QNAME: 5684c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0. */ 5685478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (val->value.qname.uri == NULL) { 5686478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.qname.name); 5687478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (0); 5688478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } else { 5689478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST "{"); 5690478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), 5691478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik BAD_CAST val->value.qname.uri); 5692478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), 5693478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik BAD_CAST "}"); 5694478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), 5695478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik BAD_CAST val->value.qname.uri); 5696478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } 5697478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 5698c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DECIMAL: 5699c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5700c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Lookout for a more simple implementation. 5701c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5702c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((val->value.decimal.total == 1) && 5703c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (val->value.decimal.lo == 0)) { 5704c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlStrdup(BAD_CAST "0.0"); 5705c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5706c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValDecimal dec = val->value.decimal; 5707c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int bufsize; 5708c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char *buf = NULL, *offs; 5709c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5710c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Add room for the decimal point as well. */ 5711c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik bufsize = dec.total + 2; 5712c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5713c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik bufsize++; 5714c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Add room for leading/trailing zero. */ 5715c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((dec.frac == 0) || (dec.frac == dec.total)) 5716c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik bufsize++; 5717c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik buf = xmlMalloc(bufsize); 5718c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik offs = buf; 5719c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5720c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs++ = '-'; 5721c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.frac == dec.total) { 5722c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs++ = '0'; 5723c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs++ = '.'; 5724c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5725c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.hi != 0) 5726c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(offs, bufsize - (offs - buf), 5727c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu%lu%lu", dec.hi, dec.mi, dec.lo); 5728c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else if (dec.mi != 0) 5729c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(offs, bufsize - (offs - buf), 5730c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu%lu", dec.mi, dec.lo); 5731c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5732c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(offs, bufsize - (offs - buf), 5733c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu", dec.lo); 5734c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5735c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.frac != 0) { 5736c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.frac != dec.total) { 5737c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int diff = dec.total - dec.frac; 5738c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5739c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Insert the decimal point. 5740c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5741c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik memmove(offs + diff + 1, offs + diff, dec.frac +1); 5742c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik offs[diff] = '.'; 5743c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5744c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik unsigned int i = 0; 5745c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5746c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Insert missing zeroes behind the decimal point. 5747c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5748c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik while (*(offs + i) != 0) 5749c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik i++; 5750c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (i < dec.total) { 5751c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik memmove(offs + (dec.total - i), offs, i +1); 5752c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik memset(offs, '0', dec.total - i); 5753c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5754c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5755c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5756c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5757c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Append decimal point and zero. 5758c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5759c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik offs = buf + bufsize - 1; 5760c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs-- = 0; 5761c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs-- = '0'; 5762c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs-- = '.'; 5763c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5764c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST buf; 5765c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5766c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5767c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_INTEGER: 5768c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_PINTEGER: 5769c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NPINTEGER: 5770c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NINTEGER: 5771c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NNINTEGER: 5772c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_LONG: 5773c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_BYTE: 5774c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_SHORT: 5775c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_INT: 5776c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_UINT: 5777c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_ULONG: 5778c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_USHORT: 5779c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_UBYTE: 5780c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((val->value.decimal.total == 1) && 5781c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (val->value.decimal.lo == 0)) 5782c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlStrdup(BAD_CAST "0"); 5783c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else { 5784c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValDecimal dec = val->value.decimal; 5785c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int bufsize = dec.total + 1; 5786c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5787c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Add room for the decimal point as well. */ 5788c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5789c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik bufsize++; 5790c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlMalloc(bufsize); 5791c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.hi != 0) { 5792c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5793c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, 5794c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "-%lu%lu%lu", dec.hi, dec.mi, dec.lo); 5795c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5796c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, 5797c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu%lu%lu", dec.hi, dec.mi, dec.lo); 5798c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else if (dec.mi != 0) { 5799c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5800c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, 5801c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "-%lu%lu", dec.mi, dec.lo); 5802c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5803c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, 5804c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu%lu", dec.mi, dec.lo); 5805c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5806c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5807c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, "-%lu", dec.lo); 5808c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5809c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, "%lu", dec.lo); 5810c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5811c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5812c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5813c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_BOOLEAN: 5814c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.b) 5815c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST "true"); 5816c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5817c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST "false"); 5818c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5819c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DURATION: { 5820c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[100]; 5821c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik unsigned long year; 5822c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik unsigned long mon, day, hour = 0, min = 0; 5823c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik double sec = 0, left; 5824c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5825c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5826c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5827c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: This results in a normalized output of the value 5828c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * - which is NOT conformant to the spec - 5829c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * since the exact values of each property are not 5830c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * recoverable. Think about extending the structure to 5831c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * provide a field for every property. 5832c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5833c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik year = (unsigned long) FQUOTIENT(labs(val->value.dur.mon), 12); 5834c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik mon = labs(val->value.dur.mon) - 12 * year; 5835c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5836c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik day = (unsigned long) FQUOTIENT(fabs(val->value.dur.sec), 86400); 5837c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik left = fabs(val->value.dur.sec) - day * 86400; 5838c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (left > 0) { 5839c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik hour = (unsigned long) FQUOTIENT(left, 3600); 5840c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik left = left - (hour * 3600); 5841c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (left > 0) { 5842c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik min = (unsigned long) FQUOTIENT(left, 60); 5843c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik sec = left - (min * 60); 5844c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5845c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5846c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((val->value.dur.mon < 0) || (val->value.dur.sec < 0)) 5847c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 100, "P%luY%luM%luDT%luH%luM%.14gS", 5848c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik year, mon, day, hour, min, sec); 5849c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5850c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 100, "-P%luY%luM%luDT%luH%luM%.14gS", 5851c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik year, mon, day, hour, min, sec); 5852c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5853c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5854c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5855c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GYEAR: { 5856c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[30]; 5857c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5858c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5859c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, "%04ld", val->value.date.year); 5860c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5861c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5862c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5863c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GMONTH: { 5864c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5865c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5866c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlMalloc(5); 5867c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, 6, "--%02u", 5868c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.mon); 5869c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5870c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5871c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GDAY: { 5872c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5873c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5874c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlMalloc(6); 5875c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, 6, "---%02u", 5876c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.day); 5877c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5878c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5879c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GMONTHDAY: { 5880c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5881c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5882c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlMalloc(8); 5883c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, 8, "--%02u-%02u", 5884c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.mon, val->value.date.day); 5885c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5886c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5887c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GYEARMONTH: { 5888c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[35]; 5889c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5890c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5891c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.date.year < 0) 5892c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 35, "-%04ld-%02u", 5893c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik labs(val->value.date.year), 5894c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.mon); 5895c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5896c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 35, "%04ld-%02u", 5897c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.year, val->value.date.mon); 5898c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5899c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5900c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5901c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_TIME: 5902c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik { 5903c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[30]; 5904c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5905c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.date.tz_flag) { 5906c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValPtr norm; 5907c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5908c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm = xmlSchemaDateNormalize(val, 0); 5909c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (norm == NULL) 5910c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 5911c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5912c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Check if "%.14g" is portable. 5913c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5914c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, 5915c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%02u:%02u:%02.14gZ", 5916c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.hour, 5917c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.min, 5918c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.sec); 5919c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaFreeValue(norm); 5920c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5921c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, 5922c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%02u:%02u:%02.14g", 5923c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.hour, 5924c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.min, 5925c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.sec); 5926c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5927c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5928c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5929c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5930c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DATE: 5931c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik { 5932c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[30]; 5933c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5934c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.date.tz_flag) { 5935c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValPtr norm; 5936c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5937c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm = xmlSchemaDateNormalize(val, 0); 5938c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (norm == NULL) 5939c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 5940c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5941c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Append the canonical value of the 5942c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * recoverable timezone and not "Z". 5943c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5944c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, 5945c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%04ld:%02u:%02uZ", 5946c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.year, norm->value.date.mon, 5947c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.day); 5948c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaFreeValue(norm); 5949c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5950c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, 5951c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%04ld:%02u:%02u", 5952c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.year, val->value.date.mon, 5953c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.day); 5954c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5955c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5956c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5957c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5958c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DATETIME: 5959c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik { 5960c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[50]; 5961c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5962c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.date.tz_flag) { 5963c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValPtr norm; 5964c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5965c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm = xmlSchemaDateNormalize(val, 0); 5966c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (norm == NULL) 5967c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 5968c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5969c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Check if "%.14g" is portable. 5970c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5971c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 50, 5972c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%04ld:%02u:%02uT%02u:%02u:%02.14gZ", 5973c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.year, norm->value.date.mon, 5974c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.day, norm->value.date.hour, 5975c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.min, norm->value.date.sec); 5976c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaFreeValue(norm); 5977c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5978c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 50, 5979c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%04ld:%02u:%02uT%02u:%02u:%02.14g", 5980c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.year, val->value.date.mon, 5981c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.day, val->value.date.hour, 5982c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.min, val->value.date.sec); 5983c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5984c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5985c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5986c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5987c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_HEXBINARY: 5988c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.hex.str); 5989c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5990c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_BASE64BINARY: 5991c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5992c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Is the following spec piece implemented?: 5993c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * SPEC: "Note: For some values the canonical form defined 5994c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * above does not conform to [RFC 2045], which requires breaking 5995c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * with linefeeds at appropriate intervals." 5996c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5997c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.base64.str); 5998c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5999c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_FLOAT: { 6000c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[30]; 6001c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 6002c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * |m| < 16777216, -149 <= e <= 104. 6003c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Handle, NaN, INF, -INF. The format is not 6004c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * yet conformant. The c type float does not cover 6005c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * the whole range. 6006c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 6007c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, "%01.14e", val->value.f); 6008c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 6009c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 6010c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 6011c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DOUBLE: { 6012c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[40]; 6013c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* |m| < 9007199254740992, -1075 <= e <= 970 */ 6014c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 6015c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Handle, NaN, INF, -INF. The format is not 6016c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * yet conformant. The c type float does not cover 6017c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * the whole range. 6018c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 6019c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 40, "%01.14e", val->value.d); 6020c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 6021c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 6022c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 60236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik default: 6024478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST "???"); 6025c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (1); 60266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 6027478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (0); 6028478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik} 6029478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik 6030bda59576670f1cabea3c49520628d82e401702caDaniel Veillard/** 6031c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * xmlSchemaGetCanonValueWhtsp: 6032c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @val: the precomputed value 6033c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @retValue: the returned value 6034c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @ws: the whitespace type of the value 6035c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 6036c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Get a the cononical representation of the value. 6037c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * The caller has to free the returned @retValue. 6038c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 6039c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Returns 0 if the value could be built, 1 if the value type is 6040c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * not supported yet and -1 in case of API errors. 6041c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 6042c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcikint 6043c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. BuchcikxmlSchemaGetCanonValueWhtsp(xmlSchemaValPtr val, 6044c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik const xmlChar **retValue, 6045c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 6046c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik{ 6047c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((retValue == NULL) || (val == NULL)) 6048c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 6049c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((ws == XML_SCHEMA_WHITESPACE_UNKNOWN) || 6050c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (ws > XML_SCHEMA_WHITESPACE_COLLAPSE)) 6051c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 6052c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 6053c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = NULL; 6054c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik switch (val->type) { 6055c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_STRING: 6056c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.str == NULL) 6057c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); 6058c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 6059c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlSchemaCollapseString(val->value.str); 6060c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else if (ws == XML_SCHEMA_WHITESPACE_REPLACE) 6061c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlSchemaWhiteSpaceReplace(val->value.str); 6062c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((*retValue) == NULL) 6063c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(val->value.str); 6064c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 6065c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 6066c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.str == NULL) 6067c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); 6068c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else { 6069c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 6070c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlSchemaCollapseString(val->value.str); 6071c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 6072c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlSchemaWhiteSpaceReplace(val->value.str); 6073c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((*retValue) == NULL) 6074c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(val->value.str); 6075c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 6076c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 6077c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik default: 6078c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (xmlSchemaGetCanonValue(val, retValue)); 6079c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 6080c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (0); 6081c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik} 6082c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 6083c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik/** 6084bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * xmlSchemaGetValType: 6085bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * @val: a schemas value 6086bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * 6087bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * Accessor for the type of a value 6088bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * 6089bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * Returns the xmlSchemaValType of the value 6090bda59576670f1cabea3c49520628d82e401702caDaniel Veillard */ 6091478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValType 6092478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaGetValType(xmlSchemaValPtr val) 6093478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{ 6094bda59576670f1cabea3c49520628d82e401702caDaniel Veillard if (val == NULL) 6095bda59576670f1cabea3c49520628d82e401702caDaniel Veillard return(XML_SCHEMAS_UNKNOWN); 6096478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (val->type); 60976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 60986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 60995d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#define bottom_xmlschemastypes 61005d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#include "elfgcchack.h" 61014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#endif /* LIBXML_SCHEMAS_ENABLED */ 6102