xmlschemastypes.c revision 5e9576a492e4fb8c2d517ccd6056a139e801ec9f
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(); 2404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->type = XML_SCHEMA_FACET_MINLENGTH; 2414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->val = xmlSchemaNewValue(XML_SCHEMAS_NNINTEGER); 2424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->val->value.decimal.lo = value; 2434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (ret); 2444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik} 2454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 246c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard/* 2474255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitBasicType: 2484255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name: the type name 2498bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard * @type: the value type associated 2504255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 25101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Initialize one primitive built-in type 2524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 2534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic xmlSchemaTypePtr 25401fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaInitBasicType(const char *name, xmlSchemaValType type, 25501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypePtr baseType) { 2564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypePtr ret; 2574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 2584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = (xmlSchemaTypePtr) xmlMalloc(sizeof(xmlSchemaType)); 2594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == NULL) { 260d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard xmlSchemaTypeErrMemory(NULL, "could not initialize basic types"); 2614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(NULL); 2624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 2634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard memset(ret, 0, sizeof(xmlSchemaType)); 264be9c6320d4ed8d5622322014310555bb88b02a85Daniel Veillard ret->name = (const xmlChar *)name; 2654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->targetNamespace = XML_SCHEMAS_NAMESPACE_NAME; 2664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret->type = XML_SCHEMA_TYPE_BASIC; 2674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->baseType = baseType; 2684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->contentType = XML_SCHEMA_CONTENT_BASIC; 26901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 2704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Primitive types. 27101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 2724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik switch (type) { 27301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_STRING: 27401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DECIMAL: 27501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATE: 27601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATETIME: 27701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_TIME: 27801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEAR: 27901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 28001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTH: 28101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 28201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GDAY: 28301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DURATION: 28401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_FLOAT: 28501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DOUBLE: 28601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BOOLEAN: 28701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 28801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_HEXBINARY: 28901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 29001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_QNAME: 29101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NOTATION: 29201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard ret->flags |= XML_SCHEMAS_TYPE_BUILTIN_PRIMITIVE; 2934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 29496d2effc735fb45cfa363b6a876ff23a862f87a5William M. Brack default: 2954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 2964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 2974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* 2984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Set variety. 2994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */ 3004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik switch (type) { 3014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYTYPE: 3024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 3034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 3044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREFS: 3054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKENS: 3064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITIES: 3074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->flags |= XML_SCHEMAS_TYPE_VARIETY_LIST; 3084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->facets = xmlSchemaNewMinLengthFacet(1); 3094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->flags |= XML_SCHEMAS_TYPE_HAS_FACETS; 3104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 3114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik default: 3124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->flags |= XML_SCHEMAS_TYPE_VARIETY_ATOMIC; 3134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 31401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 3154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlHashAddEntry2(xmlSchemaTypesBank, ret->name, 3164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard XML_SCHEMAS_NAMESPACE_NAME, ret); 31701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard ret->builtInType = type; 3184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(ret); 3194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 3204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 3214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/* 32211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* WARNING: Those type reside normally in xmlschemas.c but are 32311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* redefined here locally in oder of being able to use them for xs:anyType- 32411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* TODO: Remove those definition if we move the types to a header file. 32511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik* TODO: Always keep those structs up-to-date with the originals. 32611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik*/ 32711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik#define UNBOUNDED (1 << 30) 32811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik 32911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef struct _xmlSchemaTreeItem xmlSchemaTreeItem; 33011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef xmlSchemaTreeItem *xmlSchemaTreeItemPtr; 33111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstruct _xmlSchemaTreeItem { 33211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeType type; 33311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaAnnotPtr annot; 33411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTreeItemPtr next; 33511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTreeItemPtr children; 33611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik}; 33711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik 33811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef struct _xmlSchemaParticle xmlSchemaParticle; 33911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef xmlSchemaParticle *xmlSchemaParticlePtr; 34011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstruct _xmlSchemaParticle { 34111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeType type; 34211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaAnnotPtr annot; 34311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTreeItemPtr next; 34411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTreeItemPtr children; 34511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik int minOccurs; 34611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik int maxOccurs; 34711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlNodePtr node; 34811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik}; 34911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik 35011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef struct _xmlSchemaModelGroup xmlSchemaModelGroup; 35111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchciktypedef xmlSchemaModelGroup *xmlSchemaModelGroupPtr; 35211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstruct _xmlSchemaModelGroup { 35311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeType type; 35411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaAnnotPtr annot; 35511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTreeItemPtr next; 35611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTreeItemPtr children; 35711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlNodePtr node; 35811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik}; 35911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik 36011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcikstatic xmlSchemaParticlePtr 36111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. BuchcikxmlSchemaAddParticle(void) 36211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik{ 36311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaParticlePtr ret = NULL; 36411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik 36511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik ret = (xmlSchemaParticlePtr) 36611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlMalloc(sizeof(xmlSchemaParticle)); 36711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik if (ret == NULL) { 36811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeErrMemory(NULL, "allocating particle component"); 36911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik return (NULL); 37011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik } 37111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik memset(ret, 0, sizeof(xmlSchemaParticle)); 37211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik ret->type = XML_SCHEMA_TYPE_PARTICLE; 37311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik ret->minOccurs = 1; 37411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik ret->maxOccurs = 1; 37511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik return (ret); 37611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik} 37711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik 37811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik/* 3794255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaInitTypes: 3804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 3814255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Initialize the default XML Schemas type library 3824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 3834255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid 3846560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel VeillardxmlSchemaInitTypes(void) 3856560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard{ 3864255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized != 0) 3876560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard return; 3884255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypesBank = xmlHashCreate(40); 3896560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard 39001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 391c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard /* 39201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 3.4.7 Built-in Complex Type Definition 39301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 3948bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeAnyTypeDef = xmlSchemaInitBasicType("anyType", 3952f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack XML_SCHEMAS_ANYTYPE, 39601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard NULL); 39701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef->baseType = xmlSchemaTypeAnyTypeDef; 39801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED; 39911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* 40011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik * Init the content type. 40111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik */ 40211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeAnyTypeDef->contentType = XML_SCHEMA_CONTENT_MIXED; 40301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard { 40411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaParticlePtr particle; 40511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaModelGroupPtr sequence; 40601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaWildcardPtr wild; 40711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* First particle. */ 40811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle = xmlSchemaAddParticle(); 40911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik if (particle == NULL) 41011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik return; 41111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeAnyTypeDef->subtypes = (xmlSchemaTypePtr) particle; 41211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* Sequence model group. */ 41311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik sequence = (xmlSchemaModelGroupPtr) 41411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlMalloc(sizeof(xmlSchemaModelGroup)); 41511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik if (sequence == NULL) { 41611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeErrMemory(NULL, "allocating model group component"); 41711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik return; 41811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik } 41911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik memset(sequence, 0, sizeof(xmlSchemaModelGroup)); 42011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik sequence->type = XML_SCHEMA_TYPE_SEQUENCE; 42111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle->children = (xmlSchemaTreeItemPtr) sequence; 42211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* Second particle. */ 42311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle = xmlSchemaAddParticle(); 42411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik if (particle == NULL) 42511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik return; 42611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle->minOccurs = 0; 42711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle->maxOccurs = UNBOUNDED; 42811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik sequence->children = (xmlSchemaTreeItemPtr) particle; 42911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* The wildcard */ 43011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard)); 43111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik if (wild == NULL) { 43211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeErrMemory(NULL, "allocating wildcard component"); 43311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik return; 43411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik } 43511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik memset(wild, 0, sizeof(xmlSchemaWildcard)); 43611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik wild->type = XML_SCHEMA_TYPE_ANY; 43769dea3a0c01e8a952b1d2f07ab0a3aa450f0cdfeKasimier T. Buchcik wild->any = 1; 43811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik wild->processContents = XML_SCHEMAS_ANY_LAX; 43911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle->children = (xmlSchemaTreeItemPtr) wild; 44011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* 44111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik * Create the attribute wildcard. 44211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik */ 44301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard wild = (xmlSchemaWildcardPtr) xmlMalloc(sizeof(xmlSchemaWildcard)); 44401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (wild == NULL) { 44511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeErrMemory(NULL, "could not create an attribute " 44611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik "wildcard on anyType"); 44701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return; 44801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 44901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard memset(wild, 0, sizeof(xmlSchemaWildcard)); 45001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard wild->any = 1; 45169dea3a0c01e8a952b1d2f07ab0a3aa450f0cdfeKasimier T. Buchcik wild->processContents = XML_SCHEMAS_ANY_LAX; 45201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef->attributeWildcard = wild; 45301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 45401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef = xmlSchemaInitBasicType("anySimpleType", 4552f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack XML_SCHEMAS_ANYSIMPLETYPE, 45601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnyTypeDef); 45701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 45801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * primitive datatypes 45901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 46001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeStringDef = xmlSchemaInitBasicType("string", 46101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_STRING, 46201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4638bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDecimalDef = xmlSchemaInitBasicType("decimal", 46401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DECIMAL, 46501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4668bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDateDef = xmlSchemaInitBasicType("date", 46701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DATE, 46801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4698bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDatetimeDef = xmlSchemaInitBasicType("dateTime", 47001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DATETIME, 47101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4728bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeTimeDef = xmlSchemaInitBasicType("time", 47301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_TIME, 47401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4758bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGYearDef = xmlSchemaInitBasicType("gYear", 47601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GYEAR, 47701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4788bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGYearMonthDef = xmlSchemaInitBasicType("gYearMonth", 47901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GYEARMONTH, 48001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4818bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGMonthDef = xmlSchemaInitBasicType("gMonth", 48201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GMONTH, 48301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4848bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGMonthDayDef = xmlSchemaInitBasicType("gMonthDay", 48501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GMONTHDAY, 48601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4878bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeGDayDef = xmlSchemaInitBasicType("gDay", 48801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_GDAY, 48901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4908bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDurationDef = xmlSchemaInitBasicType("duration", 49101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DURATION, 49201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4938bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeFloatDef = xmlSchemaInitBasicType("float", 49401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_FLOAT, 49501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4968bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeDoubleDef = xmlSchemaInitBasicType("double", 49701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_DOUBLE, 49801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 4998bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeBooleanDef = xmlSchemaInitBasicType("boolean", 50001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_BOOLEAN, 50101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 5028bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeAnyURIDef = xmlSchemaInitBasicType("anyURI", 50301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_ANYURI, 50401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 505560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard xmlSchemaTypeHexBinaryDef = xmlSchemaInitBasicType("hexBinary", 50601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_HEXBINARY, 50701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 5081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaTypeBase64BinaryDef 50901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard = xmlSchemaInitBasicType("base64Binary", XML_SCHEMAS_BASE64BINARY, 51001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 51101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNotationDef = xmlSchemaInitBasicType("NOTATION", 51201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NOTATION, 51301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 51401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeQNameDef = xmlSchemaInitBasicType("QName", 51501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_QNAME, 51601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeAnySimpleTypeDef); 5174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 518c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard /* 519c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard * derived datatypes 520c6e997c9a8521f331b7d354b32cf7373f76cb548Daniel Veillard */ 5218bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeIntegerDef = xmlSchemaInitBasicType("integer", 52201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_INTEGER, 52301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeDecimalDef); 5246560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeNonPositiveIntegerDef = 5256560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaInitBasicType("nonPositiveInteger", 52601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NPINTEGER, 52701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntegerDef); 5286560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeNegativeIntegerDef = 52901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("negativeInteger", XML_SCHEMAS_NINTEGER, 53001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNonPositiveIntegerDef); 5316560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeLongDef = 53201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("long", XML_SCHEMAS_LONG, 53301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntegerDef); 53401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntDef = xmlSchemaInitBasicType("int", XML_SCHEMAS_INT, 53501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeLongDef); 5368bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeShortDef = xmlSchemaInitBasicType("short", 53701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_SHORT, 53801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntDef); 5398bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeByteDef = xmlSchemaInitBasicType("byte", 54001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_BYTE, 54101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeShortDef); 5426560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeNonNegativeIntegerDef = 5436560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaInitBasicType("nonNegativeInteger", 54401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NNINTEGER, 54501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIntegerDef); 5466560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedLongDef = 54701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedLong", XML_SCHEMAS_ULONG, 54801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNonNegativeIntegerDef); 5496560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedIntDef = 55001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedInt", XML_SCHEMAS_UINT, 55101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeUnsignedLongDef); 5526560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedShortDef = 55301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedShort", XML_SCHEMAS_USHORT, 55401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeUnsignedIntDef); 5556560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypeUnsignedByteDef = 55601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("unsignedByte", XML_SCHEMAS_UBYTE, 55701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeUnsignedShortDef); 5586560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaTypePositiveIntegerDef = 55901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitBasicType("positiveInteger", XML_SCHEMAS_PINTEGER, 56001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNonNegativeIntegerDef); 5618bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeNormStringDef = xmlSchemaInitBasicType("normalizedString", 56201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NORMSTRING, 56301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeStringDef); 5648bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeTokenDef = xmlSchemaInitBasicType("token", 56501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_TOKEN, 56601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNormStringDef); 5678bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeLanguageDef = xmlSchemaInitBasicType("language", 56801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_LANGUAGE, 56901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeTokenDef); 57001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNameDef = xmlSchemaInitBasicType("Name", 57101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NAME, 57201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeTokenDef); 57301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNmtokenDef = xmlSchemaInitBasicType("NMTOKEN", 57401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NMTOKEN, 5754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeTokenDef); 57601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNCNameDef = xmlSchemaInitBasicType("NCName", 57701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_NCNAME, 57801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNameDef); 57901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeIdDef = xmlSchemaInitBasicType("ID", XML_SCHEMAS_ID, 5804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeNCNameDef); 5818bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard xmlSchemaTypeIdrefDef = xmlSchemaInitBasicType("IDREF", 58201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_IDREF, 5834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeNCNameDef); 584a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard xmlSchemaTypeEntityDef = xmlSchemaInitBasicType("ENTITY", 58501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_ENTITY, 58601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaTypeNCNameDef); 5874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* 5884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Derived list types. 5894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */ 5904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* ENTITIES */ 591a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard xmlSchemaTypeEntitiesDef = xmlSchemaInitBasicType("ENTITIES", 59201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard XML_SCHEMAS_ENTITIES, 5934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeAnySimpleTypeDef); 5944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeEntitiesDef->subtypes = xmlSchemaTypeEntityDef; 5954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* IDREFS */ 5964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeIdrefsDef = xmlSchemaInitBasicType("IDREFS", 5974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik XML_SCHEMAS_IDREFS, 5984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeAnySimpleTypeDef); 5994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeIdrefsDef->subtypes = xmlSchemaTypeIdrefDef; 6004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 6014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* NMTOKENS */ 6024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeNmtokensDef = xmlSchemaInitBasicType("NMTOKENS", 6034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik XML_SCHEMAS_NMTOKENS, 6044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeAnySimpleTypeDef); 6054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaTypeNmtokensDef->subtypes = xmlSchemaTypeNmtokenDef; 6064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 6074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypesInitialized = 1; 6084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 6094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 6104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 6114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCleanupTypes: 6124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 6134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library 6144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 6154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid 6164255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCleanupTypes(void) { 6174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 6184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return; 61911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* 62011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik * Free xs:anyType. 62111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik */ 62211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik { 62311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaParticlePtr particle; 62411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* Attribute wildcard. */ 62511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaFreeWildcard(xmlSchemaTypeAnyTypeDef->attributeWildcard); 62611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* Content type. */ 62711162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle = (xmlSchemaParticlePtr) xmlSchemaTypeAnyTypeDef->subtypes; 62811162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* Wildcard. */ 62911162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaFreeWildcard((xmlSchemaWildcardPtr) 63011162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik particle->children->children->children); 63111162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlFree((xmlSchemaParticlePtr) particle->children->children); 63211162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik /* Sequence model group. */ 63311162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlFree((xmlSchemaModelGroupPtr) particle->children); 63411162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlFree((xmlSchemaParticlePtr) particle); 63511162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik xmlSchemaTypeAnyTypeDef->subtypes = NULL; 63611162b7ce7068f3e7b0476154bd90119337be815Kasimier T. Buchcik } 6374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlHashFree(xmlSchemaTypesBank, (xmlHashDeallocator) xmlSchemaFreeType); 6384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaTypesInitialized = 0; 6394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 6404255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 6414255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 6426927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaIsBuiltInTypeFacet: 64301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in type 64401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facetType: the facet type 64501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 64601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Evaluates if a specific facet can be 64701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * used in conjunction with a type. 64801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 64901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 1 if the facet can be used with the given built-in type, 65001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 0 otherwise and -1 in case the type is not a built-in type. 65101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 65201fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint 65301fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaIsBuiltInTypeFacet(xmlSchemaTypePtr type, int facetType) 65401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 655ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard if (type == NULL) 656ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard return (-1); 65701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->type != XML_SCHEMA_TYPE_BASIC) 65801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (-1); 65901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type->builtInType) { 66001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BOOLEAN: 66101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_PATTERN) || 66201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE)) 66301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 66401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 66501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 66601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_STRING: 66701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NOTATION: 66801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_QNAME: 66901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 67001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 67101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_HEXBINARY: 67201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_LENGTH) || 67301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MINLENGTH) || 67401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXLENGTH) || 67501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_PATTERN) || 67601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_ENUMERATION) || 67701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE)) 67801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 67901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 68001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 68101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DECIMAL: 68201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_TOTALDIGITS) || 68301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_FRACTIONDIGITS) || 68401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_PATTERN) || 68501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE) || 68601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_ENUMERATION) || 68701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) || 68801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) || 68901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MININCLUSIVE) || 69001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE)) 69101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 69201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 69301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 69401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_TIME: 69501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GDAY: 69601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTH: 69701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 69801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEAR: 69901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 70001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATE: 70101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATETIME: 70201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DURATION: 70301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_FLOAT: 70401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DOUBLE: 70501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((facetType == XML_SCHEMA_FACET_PATTERN) || 70601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_ENUMERATION) || 70701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_WHITESPACE) || 70801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXINCLUSIVE) || 70901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MAXEXCLUSIVE) || 71001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MININCLUSIVE) || 71101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard (facetType == XML_SCHEMA_FACET_MINEXCLUSIVE)) 71201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (1); 71301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard else 71401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 71501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard default: 716c7e3cc49bade82dba0cda4ae7c07ffcd1e32fe25Daniel Veillard break; 71701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 71801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 71901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 72001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 72101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 72201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInType: 72301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the type of the built in type 72401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 72501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Gives you the type struct for a built-in 72601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * type by its type id. 72701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 72801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns the type if found, NULL otherwise. 72901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 73001fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr 73101fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInType(xmlSchemaValType type) 73201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 73301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (xmlSchemaTypesInitialized == 0) 73401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitTypes(); 73501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type) { 73601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 73701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYSIMPLETYPE: 73801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeAnySimpleTypeDef); 73901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_STRING: 74001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeStringDef); 74101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NORMSTRING: 74201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNormStringDef); 74301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DECIMAL: 74401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDecimalDef); 74501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_TIME: 74601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeTimeDef); 74701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GDAY: 74801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGDayDef); 74901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTH: 75001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGMonthDef); 75101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 75201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGMonthDayDef); 75301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEAR: 75401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGYearDef); 75501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 75601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeGYearMonthDef); 75701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATE: 75801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDateDef); 75901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DATETIME: 76001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDatetimeDef); 76101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DURATION: 76201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDurationDef); 76301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_FLOAT: 76401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeFloatDef); 76501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_DOUBLE: 76601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeDoubleDef); 76701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BOOLEAN: 76801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeBooleanDef); 76901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_TOKEN: 77001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeTokenDef); 77101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_LANGUAGE: 77201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeLanguageDef); 77301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NMTOKEN: 77401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNmtokenDef); 77501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NMTOKENS: 77601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNmtokensDef); 77701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NAME: 77801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNameDef); 77901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_QNAME: 78001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeQNameDef); 78101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NCNAME: 78201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNCNameDef); 78301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ID: 78401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdDef); 78501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_IDREF: 78601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdrefDef); 78701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_IDREFS: 78801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdrefsDef); 78901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ENTITY: 79001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeEntityDef); 79101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ENTITIES: 79201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeEntitiesDef); 79301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NOTATION: 79401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNotationDef); 79501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 79601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeAnyURIDef); 79701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_INTEGER: 79801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIntegerDef); 79901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NPINTEGER: 80001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNonPositiveIntegerDef); 80101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NINTEGER: 80201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNegativeIntegerDef); 80301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NNINTEGER: 80401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNonNegativeIntegerDef); 80501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_PINTEGER: 80601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypePositiveIntegerDef); 80701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_INT: 80801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIntDef); 80901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_UINT: 81001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedIntDef); 81101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_LONG: 81201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeLongDef); 81301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ULONG: 81401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedLongDef); 81501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_SHORT: 81601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeShortDef); 81701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_USHORT: 81801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedShortDef); 81901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BYTE: 82001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeByteDef); 82101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_UBYTE: 82201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeUnsignedByteDef); 82301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_HEXBINARY: 82401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeHexBinaryDef); 82501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 82601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeBase64BinaryDef); 82701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYTYPE: 82801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeAnyTypeDef); 82901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard default: 83001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (NULL); 83101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 83201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 83301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 8347f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/** 8357f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueAppend: 8367f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @prev: the value 8377f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @cur: the value to be appended 8387f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 8397f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Appends a next sibling to a list of computed values. 8407f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 8417f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns 0 if succeeded and -1 on API errors. 8427f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */ 8434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikint 8444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueAppend(xmlSchemaValPtr prev, xmlSchemaValPtr cur) { 8454255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 8464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((prev == NULL) || (cur == NULL)) 8474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (-1); 8484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik prev->next = cur; 8494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (0); 8504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik} 8514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 8527f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/** 8537f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetNext: 8547f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @cur: the value 8557f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 8567f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the next sibling of a list of computed values. 8577f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 8587f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns the next value or NULL if there was none, or on 8597f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * API errors. 8607f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */ 8614efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValPtr 8624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetNext(xmlSchemaValPtr cur) { 8634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 8644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (cur == NULL) 8654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (NULL); 8664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (cur->next); 8674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik} 8684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 8697f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/** 8707f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetAsString: 8717f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @val: the value 8727f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 8737f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the string value of a computed value. 8747f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 8757f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns the string value or NULL if there was none, or on 8767f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * API errors. 8777f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */ 8784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikconst xmlChar * 8794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetAsString(xmlSchemaValPtr val) 8804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{ 8814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val == NULL) 8824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (NULL); 8834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik switch (val->type) { 8844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_STRING: 8854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 8864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 8874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_TOKEN: 8884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_LANGUAGE: 8894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKEN: 8904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NAME: 8914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NCNAME: 8924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ID: 8934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 8944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITY: 8954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYURI: 8964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (BAD_CAST val->value.str); 8974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik default: 8984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 8994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 9004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (NULL); 9014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik} 9024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 9037f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik/** 9047f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * xmlSchemaValueGetAsBoolean: 9057f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * @val: the value 9067f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 9077f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Accessor for the boolean value of a computed value. 9087f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * 9097f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik * Returns 1 if true and 0 if false, or in case of an error. Hmm. 9107f6e02432dbe40f0d6ab3efa82e488420db68b4cKasimier T. Buchcik */ 9114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcikint 9124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValueGetAsBoolean(xmlSchemaValPtr val) 9134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{ 9144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((val == NULL) || (val->type != XML_SCHEMAS_BOOLEAN)) 9154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (0); 9164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (val->value.b); 9174255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 9184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 9194255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 9206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaNewStringValue: 9216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @type: the value type 922b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @value: the value 9236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 9246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Allocate a new simple type value. The type can be 9252ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * of XML_SCHEMAS_STRING. 9262ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * WARNING: This one is intended to be expanded for other 9272ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * string based types. We need this for anySimpleType as well. 9284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given value is consumed and freed with the struct. 9296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 9306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error 9316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 9326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaValPtr 9336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaNewStringValue(xmlSchemaValType type, 9346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik const xmlChar *value) 9356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 9366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaValPtr val; 9376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 9386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (type != XML_SCHEMAS_STRING) 9396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(NULL); 9406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik val = (xmlSchemaValPtr) xmlMalloc(sizeof(xmlSchemaVal)); 9416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (val == NULL) { 9426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(NULL); 9436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 9446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik memset(val, 0, sizeof(xmlSchemaVal)); 9456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik val->type = type; 9466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik val->value.str = (xmlChar *) value; 9476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(val); 9486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 9496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 950b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik/** 951b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * xmlSchemaNewNOTATIONValue: 952b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @name: the notation name 953b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard * @ns: the notation namespace name or NULL 954b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * 955b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * Allocate a new NOTATION value. 9564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given values are consumed and freed with the struct. 957b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * 958b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik * Returns a pointer to the new value or NULL in case of error 959b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik */ 960b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. BuchcikxmlSchemaValPtr 961b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. BuchcikxmlSchemaNewNOTATIONValue(const xmlChar *name, 962b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik const xmlChar *ns) 963b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik{ 964b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik xmlSchemaValPtr val; 965b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik 966b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik val = xmlSchemaNewValue(XML_SCHEMAS_NOTATION); 967b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik if (val == NULL) 968b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik return (NULL); 969b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik 97012d37ab63441baf9e03db70168cc1d0d6f1c2373William M. Brack val->value.qname.name = (xmlChar *)name; 971b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik if (ns != NULL) 97212d37ab63441baf9e03db70168cc1d0d6f1c2373William M. Brack val->value.qname.uri = (xmlChar *)ns; 973b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik return(val); 974b06b4dede2fda1ffdf362d85af5d77fd78e8e71bKasimier T. Buchcik} 9756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 9766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 9774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * xmlSchemaNewQNameValue: 9784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * @namespaceName: the namespace name 9794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * @localName: the local name 9804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * 9814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Allocate a new QName value. 9824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * The given values are consumed and freed with the struct. 9834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * 9844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Returns a pointer to the new value or NULL in case of an error. 9854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */ 9864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaValPtr 9874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. BuchcikxmlSchemaNewQNameValue(const xmlChar *namespaceName, 9884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *localName) 9894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik{ 9904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaValPtr val; 9914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 9924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik val = xmlSchemaNewValue(XML_SCHEMAS_QNAME); 9934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val == NULL) 9944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (NULL); 9954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 9964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik val->value.qname.name = (xmlChar *) localName; 9974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik val->value.qname.uri = (xmlChar *) namespaceName; 9984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return(val); 9994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik} 10004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 10014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik/** 10024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaFreeValue: 10034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to free 10044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 10054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Cleanup the default XML Schemas type library 10064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 10074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardvoid 10084255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaFreeValue(xmlSchemaValPtr value) { 10094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaValPtr prev; 10104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 10114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (value != NULL) { 10124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik switch (value->type) { 10134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_STRING: 10144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 10154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_TOKEN: 10164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_LANGUAGE: 10174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKEN: 10184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKENS: 10194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NAME: 10204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NCNAME: 10214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ID: 10224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 10234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREFS: 10244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITY: 10254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITIES: 10264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYURI: 10274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 10284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (value->value.str != NULL) 10294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(value->value.str); 10304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 10314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NOTATION: 10324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_QNAME: 10334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (value->value.qname.uri != NULL) 10344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(value->value.qname.uri); 10354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (value->value.qname.name != NULL) 10364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(value->value.qname.name); 10374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 10384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_HEXBINARY: 10394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (value->value.hex.str != NULL) 10404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(value->value.hex.str); 10414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 10424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_BASE64BINARY: 10434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (value->value.base64.str != NULL) 10444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(value->value.base64.str); 10454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 10464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik default: 10474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 10484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 10494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik prev = value; 10504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = value->next; 10514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlFree(prev); 10524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 10534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 10544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 10554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 10564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaGetPredefinedType: 10574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @name: the type name 10584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @ns: the URI of the namespace usually "http://www.w3.org/2001/XMLSchema" 10594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 10604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Lookup a type in the default XML Schemas type library 10614255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 10624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns the type if found, NULL otherwise 10634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 10644255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaTypePtr 10654255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaGetPredefinedType(const xmlChar *name, const xmlChar *ns) { 10664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 10674255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaInitTypes(); 10684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (name == NULL) 10694255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(NULL); 10704255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return((xmlSchemaTypePtr) xmlHashLookup2(xmlSchemaTypesBank, name, ns)); 10714255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 1072070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 107301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 107401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaGetBuiltInListSimpleTypeItemType: 107501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @type: the built-in simple type. 107601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 10776927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Lookup function 10786927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * 1079c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns the item type of @type as defined by the built-in datatype 1080c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * hierarchy of XML Schema Part 2: Datatypes, or NULL in case of an error. 108101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 108201fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaTypePtr 108301fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaGetBuiltInListSimpleTypeItemType(xmlSchemaTypePtr type) 108401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 10854259532303e96e089a185c6f55056cb7c4902d71Daniel Veillard if ((type == NULL) || (type->type != XML_SCHEMA_TYPE_BASIC)) 108601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (NULL); 108701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type->builtInType) { 108801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_NMTOKENS: 108901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeNmtokenDef ); 109001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_IDREFS: 109101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeIdrefDef); 109201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ENTITIES: 109301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (xmlSchemaTypeEntityDef); 109401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard default: 109501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (NULL); 109601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 109701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 109801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 1099070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**************************************************************** 1100070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 1101070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Convenience macros and functions * 1102070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 1103070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/ 1104070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1105070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_TZO_CHAR(c) \ 1106070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ((c == 0) || (c == 'Z') || (c == '+') || (c == '-')) 1107070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1108070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_YEAR(yr) (yr != 0) 1109070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MONTH(mon) ((mon >= 1) && (mon <= 12)) 1110070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/* VALID_DAY should only be used when month is unknown */ 1111070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DAY(day) ((day >= 1) && (day <= 31)) 1112070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_HOUR(hr) ((hr >= 0) && (hr <= 23)) 1113070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MIN(min) ((min >= 0) && (min <= 59)) 1114070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_SEC(sec) ((sec >= 0) && (sec < 60)) 1115690a68095f589248c9e962c6b5468aacb6d3aabaKasimier T. Buchcik#define VALID_TZO(tzo) ((tzo > -840) && (tzo < 840)) 1116070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define IS_LEAP(y) \ 1117070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) 1118070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1119ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonth[12] = 1120070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 1121ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillardstatic const unsigned int daysInMonthLeap[12] = 1122070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 1123070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 11245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MAX_DAYINMONTH(yr,mon) \ 11255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1]) 11265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 1127070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_MDAY(dt) \ 1128070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (IS_LEAP(dt->year) ? \ 1129070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (dt->day <= daysInMonthLeap[dt->mon - 1]) : \ 1130070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (dt->day <= daysInMonth[dt->mon - 1])) 1131070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1132070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATE(dt) \ 1133070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_YEAR(dt->year) && VALID_MONTH(dt->mon) && VALID_MDAY(dt)) 1134070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1135070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_TIME(dt) \ 1136070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_HOUR(dt->hour) && VALID_MIN(dt->min) && \ 1137070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard VALID_SEC(dt->sec) && VALID_TZO(dt->tzo)) 1138070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1139070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define VALID_DATETIME(dt) \ 1140070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (VALID_DATE(dt) && VALID_TIME(dt)) 1141070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1142070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_MIN (60) 1143070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_HOUR (60 * SECS_PER_MIN) 1144070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define SECS_PER_DAY (24 * SECS_PER_HOUR) 1145070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 11465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInYearByMonth[12] = 11475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; 11485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic const long dayInLeapYearByMonth[12] = 11495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 }; 11505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 11515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DAY_IN_YEAR(day, month, year) \ 11525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((IS_LEAP(year) ? \ 11535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dayInLeapYearByMonth[month - 1] : \ 11545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dayInYearByMonth[month - 1]) + day) 11555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 11565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#ifdef DEBUG 11575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt) \ 11585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 11595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard "type=%o %04ld-%02u-%02uT%02u:%02u:%03f", \ 11605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->type,dt->value.date.year,dt->value.date.mon, \ 11615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->value.date.day,dt->value.date.hour,dt->value.date.min, \ 11625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->value.date.sec); \ 11635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt->value.date.tz_flag) \ 11645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt->value.date.tzo != 0) \ 11655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 11665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard "%+05d\n",dt->value.date.tzo); \ 11675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else \ 11685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext, "Z\n"); \ 11695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else \ 11705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlGenericError(xmlGenericErrorContext,"\n") 11715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#else 11725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define DEBUG_DATE(dt) 11735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#endif 11745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 1175070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1176070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGYear: 1177070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1178070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1179070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1180070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gYear without time zone and fills in the appropriate 1181070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1182070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gYear. It is supposed that @dt->year is big enough to contain 1183070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * the year. 1184070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1185070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1186070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1187070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1188070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGYear (xmlSchemaValDatePtr dt, const xmlChar **str) { 1189070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str, *firstChar; 1190070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0, digcnt = 0; 1191070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1192070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (((*cur < '0') || (*cur > '9')) && 1193070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (*cur != '-') && (*cur != '+')) 1194070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1195070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1196070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 1197070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = 1; 1198070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1199070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1200070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1201070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard firstChar = cur; 1202070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1203070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 1204070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->year = dt->year * 10 + (*cur - '0'); 1205070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1206070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard digcnt++; 1207070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1208070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1209070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* year must be at least 4 digits (CCYY); over 4 1210070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * digits cannot have a leading zero. */ 1211070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0'))) 1212070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1213070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1214070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) 1215070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->year = - dt->year; 1216070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1217070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_YEAR(dt->year)) 1218070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1219070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1220070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1221070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1222070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1223070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1224070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1225070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_2_DIGITS: 1226070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the integer to fill in 1227070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1228070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer 1229070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1230070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a 2-digits integer and updates @num with the value. @cur is 1231070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer. 1232070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and 1233070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1234070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1235070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_2_DIGITS(num, cur, invalid) \ 1236070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((cur[0] < '0') || (cur[0] > '9') || \ 1237070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard (cur[1] < '0') || (cur[1] > '9')) \ 1238070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard invalid = 1; \ 1239070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 1240070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = (cur[0] - '0') * 10 + (cur[1] - '0'); \ 1241070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur += 2; 1242070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1243070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1244070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_FLOAT: 1245070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the double to fill in 1246070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1247070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @invalid: an integer 1248070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1249070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float and updates @num with the value. @cur is 1250070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the float. The float must have a 1251070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 2-digits integer part and may or may not have a decimal part. 1252070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @invalid is set to %TRUE, values of @num and 1253070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1254070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1255070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_FLOAT(num, cur, invalid) \ 1256070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(num, cur, invalid); \ 1257070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!invalid && (*cur == '.')) { \ 1258070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double mult = 1; \ 1259070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1260070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 1261070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard invalid = 1; \ 1262070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 1263070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mult /= 10; \ 1264070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num += (*cur - '0') * mult; \ 1265070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1266070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 1267070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1268070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1269070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1270070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGMonth: 1271070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1272070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1273070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1274070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gMonth without time zone and fills in the appropriate 1275070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1276070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gMonth. 1277070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1278070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1279070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1280070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1281070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGMonth (xmlSchemaValDatePtr dt, const xmlChar **str) { 1282070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 1283070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 128464dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik unsigned int value = 0; 1285070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 128664dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik PARSE_2_DIGITS(value, cur, ret); 1287070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1288070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1289070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 129064dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if (!VALID_MONTH(value)) 1291070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1292070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 129364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik dt->mon = value; 129464dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik 1295070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1296070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1297070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1298070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1299070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1300070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseGDay: 1301070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1302070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1303070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1304070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:gDay without time zone and fills in the appropriate 1305070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1306070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay. 1307070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1308070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1309070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1310070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1311070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseGDay (xmlSchemaValDatePtr dt, const xmlChar **str) { 1312070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 1313070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 131464dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik unsigned int value = 0; 1315070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 131664dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik PARSE_2_DIGITS(value, cur, ret); 1317070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1318070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1319070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 132064dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if (!VALID_DAY(value)) 1321070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1322070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 132364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik dt->day = value; 1324070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1325070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1326070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1327070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1328070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1329070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTime: 1330070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1331070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1332070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1333070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a xs:time without time zone and fills in the appropriate 1334070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * fields of the @dt structure. @str is updated to point just after the 1335070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:time. 1336070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, values of @dt fields are undefined. 1337070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1338070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1339070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1340070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1341070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTime (xmlSchemaValDatePtr dt, const xmlChar **str) { 1342285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik const xmlChar *cur = *str; 1343070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 1344285b36722a9044d261028168cb74601c989a110cKasimier T. Buchcik int value = 0; 1345070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 134664dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik PARSE_2_DIGITS(value, cur, ret); 1347070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 134864dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik return ret; 1349070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1350070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 135164dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if (!VALID_HOUR(value)) 135264dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik return 2; 1353070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1354070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1355070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* the ':' insures this string is xs:time */ 135664dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik dt->hour = value; 1357070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 135864dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik PARSE_2_DIGITS(value, cur, ret); 1359070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1360070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 136164dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if (!VALID_MIN(value)) 136264dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik return 2; 136364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik dt->min = value; 1364070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1365070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1366070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1367070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1368070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1369070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_FLOAT(dt->sec, cur, ret); 1370070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1371070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1372070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 137364dc4d2c5bda20b97856850e2488b8b591df7509Kasimier T. Buchcik if ((!VALID_SEC(dt->sec)) || (!VALID_TZO(dt->tzo))) 1374070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1375070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1376070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1377070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1378070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1379070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1380070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1381070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * _xmlSchemaParseTimeZone: 1382070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dt: pointer to a date structure 1383070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @str: pointer to the string to analyze 1384070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1385070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a time zone without time zone and fills in the appropriate 1386070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * field of the @dt structure. @str is updated to point just after the 1387070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * time zone. 1388070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1389070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 or the error code 1390070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1391070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1392070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard_xmlSchemaParseTimeZone (xmlSchemaValDatePtr dt, const xmlChar **str) { 1393070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = *str; 1394070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret = 0; 1395070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1396070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (str == NULL) 1397070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1398070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1399070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard switch (*cur) { 1400070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 0: 1401070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tz_flag = 0; 1402070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = 0; 1403070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1404070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1405070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 'Z': 1406070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tz_flag = 1; 1407070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = 0; 1408070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1409070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1410070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1411070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case '+': 1412070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case '-': { 1413070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0, tmp = 0; 1414070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = (*cur == '-'); 1415070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1416070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1417070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1418070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(tmp, cur, ret); 1419070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1420070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1421070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_HOUR(tmp)) 1422070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1423070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1424070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != ':') 1425070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1426070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1427070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1428070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = tmp * 60; 1429070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1430070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_2_DIGITS(tmp, cur, ret); 1431070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1432070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return ret; 1433070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_MIN(tmp)) 1434070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1435070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1436070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo += tmp; 1437070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) 1438070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->tzo = - dt->tzo; 1439070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1440070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!VALID_TZO(dt->tzo)) 1441070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 2; 1442070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 14435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dt->tz_flag = 1; 1444070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1445070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1446070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard default: 1447070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1448070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1449070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1450070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *str = cur; 1451070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1452070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1453070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 14541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard/** 14551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * _xmlSchemaBase64Decode: 14561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * @ch: a character 14571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 14581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Converts a base64 encoded character to its base 64 value. 14591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 14601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Returns 0-63 (value), 64 (pad), or -1 (not recognized) 14611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */ 14621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillardstatic int 14631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard_xmlSchemaBase64Decode (const xmlChar ch) { 14641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('A' <= ch) && (ch <= 'Z')) return ch - 'A'; 14651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('a' <= ch) && (ch <= 'z')) return ch - 'a' + 26; 14661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (('0' <= ch) && (ch <= '9')) return ch - '0' + 52; 14671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('+' == ch) return 62; 14681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('/' == ch) return 63; 14691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ('=' == ch) return 64; 14701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return -1; 14711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard} 14721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 1473070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/**************************************************************** 1474070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 1475070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * XML Schema Dates/Times Datatypes Handling * 1476070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * * 1477070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ****************************************************************/ 1478070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1479070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1480070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_DIGITS: 1481070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the integer to fill in 1482070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1483070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag 1484070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1485070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a digits integer and updates @num with the value. @cur is 1486070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the integer. 1487070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and 1488070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1489070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1490070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_DIGITS(num, cur, num_type) \ 1491070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 1492070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = -1; \ 1493070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 1494070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 1495070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = num * 10 + (*cur - '0'); \ 1496070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1497070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1498070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1499070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 1500070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * PARSE_NUM: 1501070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num: the double to fill in 1502070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur: an #xmlChar * 1503070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @num_type: an integer flag 1504070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1505070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Parses a float or integer and updates @num with the value. @cur is 1506070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * updated to point just after the number. If the number is a float, 1507070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * then it must have an integer part and a decimal part; @num_type will 1508070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * be set to 1. If there is no decimal part, @num_type is set to zero. 1509070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * In case of error, @num_type is set to -1, values of @num and 1510070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @cur are undefined. 1511070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1512070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define PARSE_NUM(num, cur, num_type) \ 1513070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num = 0; \ 1514070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_DIGITS(num, cur, num_type); \ 1515070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (!num_type && (*cur == '.')) { \ 1516070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double mult = 1; \ 1517070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1518070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur < '0') || (*cur > '9')) \ 1519070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = -1; \ 1520070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else \ 1521070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num_type = 1; \ 1522070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { \ 1523070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mult /= 10; \ 1524070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard num += (*cur - '0') * mult; \ 1525070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; \ 1526070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 1527070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1528070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1529070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 15305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDates: 1531455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard * @type: the expected type or XML_SCHEMAS_UNKNOWN 1532070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @dateTime: string to analyze 1533070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val: the return computed value 1534070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1535070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @dateTime conforms to the lexical space of one of the date types. 1536070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val. 1537070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1538070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 1539070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * and -1 in case of internal or API error. 1540070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1541070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1542455cc07308c673b6714e2f5670c2091a1dab95dcDaniel VeillardxmlSchemaValidateDates (xmlSchemaValType type, 15434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *dateTime, xmlSchemaValPtr *val, 15444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik int collapse) { 1545070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValPtr dt; 1546070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int ret; 1547070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = dateTime; 1548070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1549070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard#define RETURN_TYPE_IF_VALID(t) \ 1550070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (IS_TZO_CHAR(*cur)) { \ 1551070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); \ 1552070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 0) { \ 1553070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != 0) \ 1554070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; \ 1555070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->type = t; \ 1556455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard goto done; \ 1557070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } \ 1558070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1559070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1560070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dateTime == NULL) 1561070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1562070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 15634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (collapse) 15644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 15654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 1566070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur != '-') && (*cur < '0') && (*cur > '9')) 1567070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1568070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1569070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt = xmlSchemaNewValue(XML_SCHEMAS_UNKNOWN); 1570070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dt == NULL) 1571070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1572070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1573070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((cur[0] == '-') && (cur[1] == '-')) { 1574070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1575070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * It's an incomplete date (xs:gMonthDay, xs:gMonth or 1576070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xs:gDay) 1577070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1578070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur += 2; 1579070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1580070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gDay? */ 1581070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 1582455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard if (type == XML_SCHEMAS_GMONTH) 1583455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard goto error; 1584070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ++cur; 1585070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1586070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1587070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1588070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1589070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GDAY); 1590070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1591070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1592070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1593070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1594070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1595070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * it should be an xs:gMonthDay or xs:gMonth 1596070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1597070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); 1598070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1599070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1600070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1601d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1602d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a '-' char could indicate this type is xs:gMonthDay or 1603d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a negative time zone offset. Check for xs:gMonthDay first. 1604d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * Also the first three char's of a negative tzo (-MM:SS) can 1605d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * appear to be a valid day; so even if the day portion 1606d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * of the xs:gMonthDay verifies, we must insure it was not 1607d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * a tzo. 1608d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1609d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if (*cur == '-') { 1610d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const xmlChar *rewnd = cur; 1611d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard cur++; 1612d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1613d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1614d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((ret == 0) && ((*cur == 0) || (*cur != ':'))) { 1615d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1616d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1617d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * we can use the VALID_MDAY macro to validate the month 1618d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * and day because the leap year test will flag year zero 1619d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * as a leap year (even though zero is an invalid year). 16204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * FUTURE TODO: Zero will become valid in XML Schema 1.1 16214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * probably. 1622d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1623d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if (VALID_MDAY((&(dt->value.date)))) { 1624d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1625d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTHDAY); 1626070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1627d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1628d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1629d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1630d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1631d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1632d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * not xs:gMonthDay so rewind and check if just xs:gMonth 1633d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * with an optional time zone. 1634d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1635d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard cur = rewnd; 1636d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1637d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1638d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GMONTH); 1639070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1640070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1641070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1642070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1643070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* 1644070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * It's a right-truncated date or an xs:time. 1645070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Try to parse an xs:time then fallback on right-truncated dates. 1646070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1647070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((*cur >= '0') && (*cur <= '9')) { 1648070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTime(&(dt->value.date), &cur); 1649070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 0) { 1650070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* it's an xs:time */ 1651070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_TIME); 1652070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1653070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1654070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1655070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* fallback on date parsing */ 1656070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur = dateTime; 1657070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1658070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGYear(&(dt->value.date), &cur); 1659070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1660070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1661070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1662070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gYear? */ 1663070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEAR); 1664070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1665070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != '-') 1666070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1667070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1668070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1669070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGMonth(&(dt->value.date), &cur); 1670070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1671070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1672070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1673070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:gYearMonth? */ 1674070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_GYEARMONTH); 1675070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1676070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != '-') 1677070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1678070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1679070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1680070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseGDay(&(dt->value.date), &cur); 1681070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret != 0) || !VALID_DATE((&(dt->value.date)))) 1682070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1683070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1684070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* is it an xs:date? */ 1685070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard RETURN_TYPE_IF_VALID(XML_SCHEMAS_DATE); 1686070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1687070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur != 'T') 1688070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1689070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1690070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1691070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* it should be an xs:dateTime */ 1692070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTime(&(dt->value.date), &cur); 1693070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret != 0) 1694070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1695070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1696070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = _xmlSchemaParseTimeZone(&(dt->value.date), &cur); 16974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (collapse) 16984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 1699070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret != 0) || (*cur != 0) || !VALID_DATETIME((&(dt->value.date)))) 1700070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1701070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1702455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard 1703070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dt->type = XML_SCHEMAS_DATETIME; 1704070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1705455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillarddone: 1706d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#if 1 1707d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) 1708d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1709d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard#else 1710d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* 1711d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * insure the parsed type is equal to or less significant (right 1712d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard * truncated) than the desired type. 1713d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard */ 1714d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type != XML_SCHEMAS_UNKNOWN) && (type != dt->type)) { 1715d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1716d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard /* time only matches time */ 1717d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_TIME) && (dt->type == XML_SCHEMAS_TIME)) 1718d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1719d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1720d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_DATETIME) && 1721d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard ((dt->type != XML_SCHEMAS_DATE) || 1722d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEARMONTH) || 1723d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEAR))) 1724d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1725d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1726d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_DATE) && 1727d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard ((dt->type != XML_SCHEMAS_GYEAR) || 1728d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard (dt->type != XML_SCHEMAS_GYEARMONTH))) 1729d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1730d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1731d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_GYEARMONTH) && (dt->type != XML_SCHEMAS_GYEAR)) 1732d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1733d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard 1734d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard if ((type == XML_SCHEMAS_GMONTHDAY) && (dt->type != XML_SCHEMAS_GMONTH)) 1735d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard goto error; 1736d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard } 1737455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard#endif 1738455cc07308c673b6714e2f5670c2091a1dab95dcDaniel Veillard 1739070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (val != NULL) 1740070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *val = dt; 174180b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 174280b19092f24410a6b869abf519227686e8f207caDaniel Veillard xmlSchemaFreeValue(dt); 1743070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1744070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1745070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1746070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror: 1747070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dt != NULL) 1748070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaFreeValue(dt); 1749070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1750070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1751070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1752070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 17535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaValidateDuration: 1754070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @type: the predefined type 1755070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @duration: string to analyze 1756070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @val: the return computed value 1757070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1758070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Check that @duration conforms to the lexical space of the duration type. 1759070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * if true a value is computed and returned in @val. 1760070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 1761070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 1762070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * and -1 in case of internal or API error. 1763070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 1764070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 1765dda8f1ba9fb2e731e2dd6aa325ed07add7905ec3Daniel VeillardxmlSchemaValidateDuration (xmlSchemaTypePtr type ATTRIBUTE_UNUSED, 17664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *duration, xmlSchemaValPtr *val, 17674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik int collapse) { 1768070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard const xmlChar *cur = duration; 1769070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaValPtr dur; 1770070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard int isneg = 0; 1771070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard unsigned int seq = 0; 1772d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard double num; 1773d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard int num_type = 0; /* -1 = invalid, 0 = int, 1 = floating */ 1774d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const xmlChar desig[] = {'Y', 'M', 'D', 'H', 'M', 'S'}; 1775d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard const double multi[] = { 0.0, 0.0, 86400.0, 3600.0, 60.0, 1.0, 0.0}; 1776070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1777070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (duration == NULL) 1778070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1779070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 17804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (collapse) 17814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 17824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 1783070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == '-') { 1784070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard isneg = 1; 1785070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1786070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1787070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1788070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* duration must start with 'P' (after sign) */ 1789070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur++ != 'P') 1790070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1791070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 179280b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (*cur == 0) 179380b19092f24410a6b869abf519227686e8f207caDaniel Veillard return 1; 179480b19092f24410a6b869abf519227686e8f207caDaniel Veillard 1795070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); 1796070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dur == NULL) 1797070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 1798070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1799070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while (*cur != 0) { 1800070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1801070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* input string should be empty or invalid date/time item */ 1802070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (seq >= sizeof(desig)) 1803070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1804070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1805070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* T designator must be present for time items */ 1806070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == 'T') { 1807070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (seq <= 3) { 1808070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard seq = 3; 1809070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard cur++; 1810070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else 1811070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1812070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else if (seq == 3) 1813070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1814070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1815070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* parse the number portion of the item */ 1816070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard PARSE_NUM(num, cur, num_type); 1817070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1818070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((num_type == -1) || (*cur == 0)) 1819070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1820070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1821070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* update duration based on item type */ 1822070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard while (seq < sizeof(desig)) { 1823070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (*cur == desig[seq]) { 1824070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1825070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* verify numeric type; only seconds can be float */ 1826070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((num_type != 0) && (seq < (sizeof(desig)-1))) 1827070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1828070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1829070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard switch (seq) { 1830070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 0: 1831070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon = (long)num * 12; 1832070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1833070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case 1: 1834070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon += (long)num; 1835070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1836070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard default: 1837070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* convert to seconds using multiplier */ 1838070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.sec += num * multi[seq]; 1839070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard seq++; 1840070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; 1841070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1842070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1843070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard break; /* exit loop */ 1844070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1845070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* no date designators found? */ 1846c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((++seq == 3) || (seq == 6)) 1847070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard goto error; 1848070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 18494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 18504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (collapse) 18514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 1852070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1853070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1854070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (isneg) { 1855070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.mon = -dur->value.dur.mon; 1856070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.day = -dur->value.dur.day; 1857070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard dur->value.dur.sec = -dur->value.dur.sec; 1858070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 1859070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1860070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (val != NULL) 1861070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard *val = dur; 186280b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 186380b19092f24410a6b869abf519227686e8f207caDaniel Veillard xmlSchemaFreeValue(dur); 1864070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1865070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 1866070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1867070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillarderror: 1868070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (dur != NULL) 1869070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmlSchemaFreeValue(dur); 1870070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 1871070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 1872070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 1873a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard/** 1874a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * xmlSchemaStrip: 1875a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * @value: a value 1876a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * 1877a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Removes the leading and ending spaces of a string 1878a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * 1879a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the new string or NULL if no change was required. 1880a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard */ 1881a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillardstatic xmlChar * 1882a1a9d0410000cc69874e53e438b250037d3e14cdDaniel VeillardxmlSchemaStrip(const xmlChar *value) { 1883a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard const xmlChar *start = value, *end, *f; 1884a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard 1885a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if (value == NULL) return(NULL); 188676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*start != 0) && (IS_BLANK_CH(*start))) start++; 1887a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end = start; 1888a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard while (*end != 0) end++; 1889a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard f = end; 1890a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end--; 189176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((end > start) && (IS_BLANK_CH(*end))) end--; 1892a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard end++; 1893a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if ((start == value) && (f == end)) return(NULL); 1894a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(xmlStrndup(start, end - start)); 1895a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard} 189696a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard 189796a4b2524590c4c8fe776dfcbf4574737f6206b6Daniel Veillard/** 189891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * xmlSchemaWhiteSpaceReplace: 189991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * @value: a value 190091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * 190191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Replaces 0xd, 0x9 and 0xa with a space. 190291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * 190391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik * Returns the new string or NULL if no change was required. 190491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik */ 190591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlChar * 190691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. BuchcikxmlSchemaWhiteSpaceReplace(const xmlChar *value) { 190791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik const xmlChar *cur = value; 190891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik xmlChar *ret = NULL, *mcur; 190991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 191091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if (value == NULL) 191191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik return(NULL); 191291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 191391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik while ((*cur != 0) && 191491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik (((*cur) != 0xd) && ((*cur) != 0x9) && ((*cur) != 0xa))) { 191591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik cur++; 191691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik } 191791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if (*cur == 0) 191891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik return (NULL); 191991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik ret = xmlStrdup(value); 192091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik /* TODO FIXME: I guess gcc will bark at this. */ 192191feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik mcur = (xmlChar *) (ret + (cur - value)); 192291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik do { 192391feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if ( ((*mcur) == 0xd) || ((*mcur) == 0x9) || ((*mcur) == 0xa) ) 192491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik *mcur = ' '; 192591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik mcur++; 192691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik } while (*mcur != 0); 192791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik return(ret); 192891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik} 192991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 193091feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik/** 1931b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCollapseString: 1932b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: a value 1933b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 1934b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Removes and normalize white spaces in the string 1935b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 1936b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns the new string or NULL if no change was required. 1937b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 193801fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlChar * 1939b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCollapseString(const xmlChar *value) { 1940b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard const xmlChar *start = value, *end, *f; 1941b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlChar *g; 1942b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard int col = 0; 1943b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1944b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (value == NULL) return(NULL); 194576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*start != 0) && (IS_BLANK_CH(*start))) start++; 1946b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end = start; 1947b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while (*end != 0) { 194876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if ((*end == ' ') && (IS_BLANK_CH(end[1]))) { 1949b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard col = end - start; 1950b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard break; 1951b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else if ((*end == 0xa) || (*end == 0x9) || (*end == 0xd)) { 1952b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard col = end - start; 1953b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard break; 1954b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1955b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 1956b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1957b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (col == 0) { 1958b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard f = end; 1959b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end--; 196076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((end > start) && (IS_BLANK_CH(*end))) end--; 1961b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 1962b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((start == value) && (f == end)) return(NULL); 1963b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(xmlStrndup(start, end - start)); 1964b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1965b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard start = xmlStrdup(start); 1966b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (start == NULL) return(NULL); 1967b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard g = (xmlChar *) (start + col); 1968b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end = g; 1969b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard while (*end != 0) { 197076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (IS_BLANK_CH(*end)) { 1971b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard end++; 197276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*end)) end++; 1973b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (*end != 0) 1974b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g++ = ' '; 1975b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } else 1976b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g++ = *end++; 1977b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 1978b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard *g = 0; 1979b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return((xmlChar *) start); 1980b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 1981b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 1982b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 198328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * xmlSchemaValAtomicListNode: 198428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @type: the predefined atomic type for a token in the list 198528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @value: the list value to check 198628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @ret: the return computed value 198728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * @node: the node containing the value 198828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * 198928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Check that a value conforms to the lexical space of the predefined 199028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * list type. if true a value is computed and returned in @ret. 199128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * 1992a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * Returns the number of items if this validates, a negative error code 1993a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard * number otherwise 199428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */ 199528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillardstatic int 199628c52ab518d34a36fd8da6870a5850088f129a6aDaniel VeillardxmlSchemaValAtomicListNode(xmlSchemaTypePtr type, const xmlChar *value, 199728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlSchemaValPtr *ret, xmlNodePtr node) { 199828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlChar *val, *cur, *endval; 199928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard int nb_values = 0; 2000580ced8ee28ecd99374da9383897678e4ba6c358Daniel Veillard int tmp = 0; 200128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard 200228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (value == NULL) { 200328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard return(-1); 200428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 200528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard val = xmlStrdup(value); 200628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (val == NULL) { 200728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard return(-1); 200828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 20096fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard if (ret != NULL) { 20106fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard *ret = NULL; 20116fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard } 201228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur = val; 201328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard /* 201428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard * Split the list 201528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard */ 201676e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*cur)) *cur++ = 0; 201728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (*cur != 0) { 201876e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack if (IS_BLANK_CH(*cur)) { 201928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard *cur = 0; 202028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur++; 202176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*cur)) *cur++ = 0; 202228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } else { 202328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard nb_values++; 202428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur++; 202576e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while ((*cur != 0) && (!IS_BLANK_CH(*cur))) cur++; 202628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 202728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 202828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (nb_values == 0) { 202928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard xmlFree(val); 2030a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(nb_values); 203128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 203228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard endval = cur; 203328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard cur = val; 203428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while ((*cur == 0) && (cur != endval)) cur++; 203528c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (cur != endval) { 203628c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard tmp = xmlSchemaValPredefTypeNode(type, cur, NULL, node); 203728c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (tmp != 0) 203828c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard break; 203928c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while (*cur != 0) cur++; 204028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard while ((*cur == 0) && (cur != endval)) cur++; 204128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard } 20426fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard /* TODO what return value ? c.f. bug #158628 204328c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard if (ret != NULL) { 204428c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard TODO 20456fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard } */ 20466fc5db0090e7639a78cedee824cd4af8670b7210Daniel Veillard xmlFree(val); 2047a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard if (tmp == 0) 2048a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(nb_values); 2049a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard return(-1); 205028c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard} 205128c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard 205228c52ab518d34a36fd8da6870a5850088f129a6aDaniel Veillard/** 2053e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * xmlSchemaParseUInt: 2054e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @str: pointer to the string R/W 2055e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @llo: pointer to the low result 2056e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lmi: pointer to the mid result 2057e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * @lhi: pointer to the high result 2058e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * 2059e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * Parse an unsigned long into 3 fields. 2060e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard * 2061ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack * Returns the number of significant digits in the number or 2062ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack * -1 if overflow of the capacity 2063e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard */ 2064e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillardstatic int 2065e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel VeillardxmlSchemaParseUInt(const xmlChar **str, unsigned long *llo, 2066478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik unsigned long *lmi, unsigned long *lhi) { 2067e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard unsigned long lo = 0, mi = 0, hi = 0; 2068e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard const xmlChar *tmp, *cur = *str; 2069e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard int ret = 0, i = 0; 2070e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 2071478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (*cur == '0') { /* ignore leading zeroes */ 2072478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik cur++; 2073e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2074e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard tmp = cur; 2075e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while ((*tmp != 0) && (*tmp >= '0') && (*tmp <= '9')) { 2076478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik i++;tmp++;ret++; 2077e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2078e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (i > 24) { 2079478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *str = tmp; 2080478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return(-1); 2081e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2082e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 16) { 2083478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik hi = hi * 10 + (*cur++ - '0'); 2084478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik i--; 2085e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2086e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 8) { 2087478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik mi = mi * 10 + (*cur++ - '0'); 2088478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik i--; 2089e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2090e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard while (i > 0) { 2091478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik lo = lo * 10 + (*cur++ - '0'); 2092478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik i--; 2093e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 2094e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 2095e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *str = cur; 2096e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *llo = lo; 2097e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *lmi = mi; 2098e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard *lhi = hi; 2099e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(ret); 2100e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard} 2101e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard 2102e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard/** 2103b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValAtomicType: 21044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @type: the predefined type 21054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the value to check 21064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val: the return computed value 2107c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @node: the node containing the value 2108b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * flags: flags to control the vlidation 21094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 2110b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the atomic type. 21114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * if true a value is computed and returned in @val. 211201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * This checks the value space for list types as well (IDREFS, NMTOKENS). 21134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 21144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 21154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * and -1 in case of internal or API error. 21164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 2117b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int 21181ac24d36b12487995b659a8fc23a02b9460edb36Daniel VeillardxmlSchemaValAtomicType(xmlSchemaTypePtr type, const xmlChar * value, 21194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaValPtr * val, xmlNodePtr node, int flags, 21204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws, 21214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik int normOnTheFly, int applyNorm, int createStringValue) 21221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard{ 21234255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValPtr v; 2124b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlChar *norm = NULL; 2125d3b9cd88d5d76e44ca54965d651d486485fced0dDaniel Veillard int ret = 0; 21264255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 21274255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (xmlSchemaTypesInitialized == 0) 212801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard xmlSchemaInitTypes(); 21294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (type == NULL) 21301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (-1); 21315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 2132eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard /* 2133eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard * validating a non existant text node is similar to validating 2134eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard * an empty one. 2135eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard */ 2136eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard if (value == NULL) 2137eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard value = BAD_CAST ""; 2138eebd633b916b99bd1f0e6e038afdc1d933eeef60Daniel Veillard 21394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (val != NULL) 21401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = NULL; 2141b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((flags == 0) && (value != NULL)) { 214291feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik 214301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if ((type->builtInType != XML_SCHEMAS_STRING) && 214491feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik (type->builtInType != XML_SCHEMAS_ANYTYPE) && 214591feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik (type->builtInType != XML_SCHEMAS_ANYSIMPLETYPE)) { 214691feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik if (type->builtInType == XML_SCHEMAS_NORMSTRING) 214791feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik norm = xmlSchemaWhiteSpaceReplace(value); 214891feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik else 214991feaf847728bed1b1d2c3cee37e9b88fe1a8da3Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 21501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 21511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value = norm; 21521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2153b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 2154b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 215501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard switch (type->builtInType) { 21562f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_UNKNOWN: 21571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 21582f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_ANYTYPE: 21592f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_ANYSIMPLETYPE: 21604efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((createStringValue) && (val != NULL)) { 21614efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik v = xmlSchemaNewValue(XML_SCHEMAS_ANYSIMPLETYPE); 21624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (v != NULL) { 21634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik v->value.str = xmlStrdup(value); 21644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *val = v; 21654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 21664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto error; 21674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21692f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack goto return0; 21704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_STRING: 21714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (! normOnTheFly) { 21724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *cur = value; 21734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 21744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_REPLACE) { 21754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (*cur != 0) { 21764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 21774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 21784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 21794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 21804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21824efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) { 21834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (*cur != 0) { 21844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 21854efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 21864efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if IS_WSP_SPACE_CH(*cur) { 21874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 21884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if IS_WSP_SPACE_CH(*cur) 21894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 21904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 21914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 21924efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21934efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21944efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21954efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 21964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (createStringValue && (val != NULL)) { 21974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (applyNorm) { 21984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 21994efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 22004efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else if (ws == XML_SCHEMA_WHITESPACE_REPLACE) 22014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaWhiteSpaceReplace(value); 22024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (norm != NULL) 22034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = norm; 22044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik v = xmlSchemaNewValue(XML_SCHEMAS_STRING); 22064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (v != NULL) { 22074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik v->value.str = xmlStrdup(value); 22084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik *val = v; 22094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 22104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto error; 22114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 22141516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard case XML_SCHEMAS_NORMSTRING:{ 22154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) { 22164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (applyNorm) { 22174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 22184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 22194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else 22204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaWhiteSpaceReplace(value); 22214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (norm != NULL) 22224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = norm; 22234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 22254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik const xmlChar *cur = value; 22264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (*cur != 0) { 22274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 22284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 22294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 22304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 22314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 22341516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard if (val != NULL) { 22351516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NORMSTRING); 22361516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard if (v != NULL) { 22371516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard v->value.str = xmlStrdup(value); 22381516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard *val = v; 22391516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } else { 22401516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard goto error; 22411516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 22421516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 22431516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard goto return0; 22441516d5b3478e90e35ac7e94fea9b2ab5156dfb0bDaniel Veillard } 22451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_DECIMAL:{ 2246273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack const xmlChar *cur = value; 2247273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack unsigned int len, neg = 0; 2248273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack xmlChar cval[25]; 2249273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack xmlChar *cptr = cval; 22509e2110bbff362d12466bfa38cde2842b2a6297ffDaniel Veillard unsigned int dec = ~0u; 22511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 22521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 22531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 22544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 22554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 22564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 22574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 2258273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* First we handle an optional sign */ 22591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '+') 22601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 22611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (*cur == '-') { 22621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard neg = 1; 22631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 22641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2265273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 2266273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * Next we "pre-parse" the number, in preparation for calling 2267273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * the common routine xmlSchemaParseUInt. We get rid of any 2268273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * leading zeroes (because we have reserved only 25 chars), 2269273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * and note the position of any decimal point. 2270273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 2271273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack len = 0; 2272c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 2273c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Skip leading zeroes. 2274c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 2275c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik while (*cur == '0') 2276273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack cur++; 2277c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (*cur != 0) { 2278c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik while (len < 24) { 2279c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((*cur >= '0') && (*cur <= '9')) { 2280c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *cptr++ = *cur++; 2281c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik len++; 2282c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else if (*cur == '.') { 22834f917e241656d7471bcf7b3185a110bf24df1647Daniel Veillard if (len == 0) 22844f917e241656d7471bcf7b3185a110bf24df1647Daniel Veillard len++; 22859e2110bbff362d12466bfa38cde2842b2a6297ffDaniel Veillard if (dec != ~0u) 2286c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik goto return1; /* multiple decimal points */ 2287c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik cur++; 2288c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((*cur == 0) && (cur -1 == value)) 2289c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik goto return1; 2290c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 2291c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik dec = len; 2292c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik while ((len < 24) && (*cur >= '0') && 2293c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (*cur <= '9')) { 2294c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *cptr++ = *cur++; 2295c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik len++; 2296c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 2297c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 2298c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else 2299c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 2300c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 2301273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 23024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 23034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 2304273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (*cur != 0) 2305273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack goto return1; /* error if any extraneous chars */ 23061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 23071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DECIMAL); 23081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 2309273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 2310273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * If a mixed decimal, get rid of trailing zeroes 2311273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 23129e2110bbff362d12466bfa38cde2842b2a6297ffDaniel Veillard if (dec != ~0u) { 23139e2110bbff362d12466bfa38cde2842b2a6297ffDaniel Veillard while ((len > dec) && (cptr > cval) && 23146d30ff2c08b381cff003eead71bf1321a0c0feeaKasimier T. Buchcik (*(cptr-1) == '0')) { 2315273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack cptr--; 2316273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack len--; 2317273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 2318273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 2319273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack *cptr = 0; /* Terminate our (preparsed) string */ 2320273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack cptr = cval; 2321273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 2322273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * Now evaluate the significant digits of the number 2323273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 2324c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (*cptr != 0) 2325c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaParseUInt((const xmlChar **)&cptr, 2326273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack &v->value.decimal.lo, 2327273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack &v->value.decimal.mi, 2328273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack &v->value.decimal.hi); 2329c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 2330c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Set the total digits to 1 if a zero value. 2331c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 2332c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (len == 0) 2333c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik len++; 23341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = neg; 23359e2110bbff362d12466bfa38cde2842b2a6297ffDaniel Veillard if (dec == ~0u) { 2336273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack v->value.decimal.frac = 0; 2337273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack v->value.decimal.total = len; 2338273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else { 2339c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik v->value.decimal.frac = len - dec; 2340c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik v->value.decimal.total = len; 2341273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 23421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 23431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 23461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2347b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_TIME: 2348b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GDAY: 2349b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GMONTH: 2350b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GMONTHDAY: 2351b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GYEAR: 2352b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_GYEARMONTH: 2353b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DATE: 2354b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DATETIME: 23554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = xmlSchemaValidateDates(type->builtInType, value, val, 23564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik normOnTheFly); 23571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 2358b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_DURATION: 23594efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = xmlSchemaValidateDuration(type, value, val, 23604efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik normOnTheFly); 23611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 2362b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_FLOAT: 23631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_DOUBLE:{ 23641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 23651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int neg = 0; 23661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 23671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 23681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 23694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 23704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 23714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 23724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 23731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 'N') && (cur[1] == 'a') && (cur[2] == 'N')) { 23741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur += 3; 23751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 23761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 23771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 23781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 23791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 23801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 23811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathNAN; 23821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 23831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 23841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 23851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 23871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 23881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 23891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathNAN; 23901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 23911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 23921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 23931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 23961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 23981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 23991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 24001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard neg = 1; 24011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 'I') && (cur[1] == 'N') && (cur[2] == 'F')) { 24041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur += 3; 24051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 24061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 24081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 24091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 24101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 24111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (neg) 24121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathNINF; 24131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 24141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.f = (float) xmlXPathPINF; 24151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 24171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 24211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 24221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (neg) 24231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathNINF; 24241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 24251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.d = xmlXPathPINF; 24261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 24281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 24321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 24341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((neg == 0) && (*cur == '+')) 24361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((cur[0] == 0) || (cur[0] == '+') || (cur[0] == '-')) 24381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) { 24401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '.') { 24431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) 24451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((*cur == 'e') || (*cur == 'E')) { 24481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((*cur == '-') || (*cur == '+')) 24501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while ((*cur >= '0') && (*cur <= '9')) 24521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 24531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 24554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 24564efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 24571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 24581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 24601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (type == xmlSchemaTypeFloatDef) { 24611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_FLOAT); 24621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 24636c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik /* 24646c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * TODO: sscanf seems not to give the correct 24656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * value for extremely high/low values. 24666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * E.g. "1E-149" results in zero. 24676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 2468d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard if (sscanf((const char *) value, "%f", 24691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard &(v->value.f)) == 1) { 24706c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik *val = v; 24711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 24731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_DOUBLE); 24801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 24816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik /* 24826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * TODO: sscanf seems not to give the correct 24836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * value for extremely high/low values. 24846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 2485d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard if (sscanf((const char *) value, "%lf", 24861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard &(v->value.d)) == 1) { 24871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 24881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlSchemaFreeValue(v); 24901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 24911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 24931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 24941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 24981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 24991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BOOLEAN:{ 25001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 25011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 25024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) { 25034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 25044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur == '0') { 25054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 0; 25064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 25074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (*cur == '1') { 25084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 1; 25094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 25104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (*cur == 't') { 25114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 25124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur++ == 'r') && (*cur++ == 'u') && 25134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik (*cur++ == 'e')) { 25144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 1; 25154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else 25164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 25174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (*cur == 'f') { 25184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 25194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur++ == 'a') && (*cur++ == 'l') && 25204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik (*cur++ == 's') && (*cur++ == 'e')) { 25214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 0; 25224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else 25234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 25244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 25254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur != 0) { 25264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 25274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur != 0) 25284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 25294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 25304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 25314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((cur[0] == '0') && (cur[1] == 0)) 25324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 0; 25334efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else if ((cur[0] == '1') && (cur[1] == 0)) 25344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 1; 25354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else if ((cur[0] == 't') && (cur[1] == 'r') 25364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik && (cur[2] == 'u') && (cur[3] == 'e') 25374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik && (cur[4] == 0)) 25384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 1; 25394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else if ((cur[0] == 'f') && (cur[1] == 'a') 25404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik && (cur[2] == 'l') && (cur[3] == 's') 25414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik && (cur[4] == 'e') && (cur[5] == 0)) 25424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = 0; 25434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else 25444efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 25454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 25461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 25471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_BOOLEAN); 25481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 25491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.b = ret; 25501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 25511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 25521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 25531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 25561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_TOKEN:{ 25581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 25591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 25604efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (! normOnTheFly) { 25614efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (*cur != 0) { 25624efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((*cur == 0xd) || (*cur == 0xa) || (*cur == 0x9)) { 25634efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 25644efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else if (*cur == ' ') { 25654efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 25664efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur == 0) 25674efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 25684efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (*cur == ' ') 25694efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik goto return1; 25704efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } else { 25714efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur++; 25724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 25734efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 25744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 25751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 25761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_TOKEN); 25771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 25781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 25791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 25801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 25811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 25821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 25841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 25851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2586b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_LANGUAGE: 25874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) { 25884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 25894efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (norm != NULL) 25904efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = norm; 25914efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 25921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (xmlCheckLanguageID(value) == 1) { 25931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 25941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_LANGUAGE); 25951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 25961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 25971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 25981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 25991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 26001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 26031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2605b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NMTOKEN: 26061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (xmlValidateNMToken(value, 1) == 0) { 26071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 26081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NMTOKEN); 26091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 26101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 26111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 26121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 26131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 26141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 26171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2619b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NMTOKENS: 26201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeNmtokenDef, 26211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 26221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret > 0) 26231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 26241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 26251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 26261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2627b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NAME: 26281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateName(value, 1); 2629df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard if ((ret == 0) && (val != NULL) && (value != NULL)) { 2630df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NAME); 2631df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard if (v != NULL) { 2632df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard const xmlChar *start = value, *end; 2633df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard while (IS_BLANK_CH(*start)) start++; 2634df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard end = start; 2635df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard while ((*end != 0) && (!IS_BLANK_CH(*end))) end++; 2636df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard v->value.str = xmlStrndup(start, end - start); 2637df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard *val = v; 2638df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard } else { 2639df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard goto error; 2640df292f7aa9fe80ce61109871df002aa2a64e2939Daniel Veillard } 26411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 26431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_QNAME:{ 26441c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik const xmlChar *uri = NULL; 26451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *local = NULL; 26461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 26471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateQName(value, 1); 26481c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (ret != 0) 26491c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik goto done; 26501c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (node != NULL) { 26511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *prefix; 26521c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlNsPtr ns; 26531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 26541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard local = xmlSplitQName2(value, &prefix); 26551c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik ns = xmlSearchNs(node->doc, node, prefix); 26561c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if ((ns == NULL) && (prefix != NULL)) { 26571c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlFree(prefix); 26581c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (local != NULL) 26591c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlFree(local); 26601c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik goto return1; 26611c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik } 26621c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (ns != NULL) 26631c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik uri = ns->href; 26641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) 26651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(prefix); 26661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26671c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (val != NULL) { 26681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_QNAME); 26691c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (v == NULL) { 26701c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (local != NULL) 26711c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlFree(local); 26721c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik goto error; 26731c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik } 26741c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (local != NULL) 26751c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik v->value.qname.name = local; 26761c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik else 26771c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik v->value.qname.name = xmlStrdup(value); 26781c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (uri != NULL) 26791c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik v->value.qname.uri = xmlStrdup(uri); 26801c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik *val = v; 26811c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik } else 26821c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik if (local != NULL) 26831c720df4e5597bc60311a80550da9f97b0f281acKasimier T. Buchcik xmlFree(local); 26841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 26851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2686b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_NCNAME: 26871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 26881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 26891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NCNAME); 26901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 26911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 26921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 26931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 26941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 26951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 26971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2698b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_ID: 26991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 27001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 27011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_ID); 27021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 27031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.str = xmlStrdup(value); 27041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 27051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 27061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 27071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 27101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 27111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 27121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 27131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 27141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * NOTE: the IDness might have already be declared in the DTD 27151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard */ 27161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (attr->atype != XML_ATTRIBUTE_ID) { 27171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlIDPtr res; 27181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 27191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 27201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 27211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 27221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard res = xmlAddID(NULL, node->doc, strip, attr); 27231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 27241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 27251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard res = xmlAddID(NULL, node->doc, value, attr); 27261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (res == NULL) { 27271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 2; 27281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 27291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ID; 27301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2734b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_IDREF: 27351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 27361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 27376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik v = xmlSchemaNewValue(XML_SCHEMAS_IDREF); 27386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (v == NULL) 27396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik goto error; 27406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik v->value.str = xmlStrdup(value); 27416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *val = v; 27421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 27441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 27451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 27461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 27471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 27481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 27491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 27501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAddRef(NULL, node->doc, strip, attr); 27511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 27521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 27531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAddRef(NULL, node->doc, value, attr); 27541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_IDREF; 27551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2757b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_IDREFS: 27581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeIdrefDef, 27591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 27601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret < 0) 27611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 2; 27621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 27631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 27641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 27651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 27661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 2767249d7bbee28570177a8573a99eab4aa9e27384d9Daniel Veillard 27681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_IDREFS; 27691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 27711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_ENTITY:{ 27721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *strip; 27731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 27741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNCName(value, 1); 27751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 27761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 3; 27771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 0) { 27781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlEntityPtr ent; 27791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 27801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard strip = xmlSchemaStrip(value); 27811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (strip != NULL) { 27821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ent = xmlGetDocEntity(node->doc, strip); 27831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(strip); 27841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 27851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ent = xmlGetDocEntity(node->doc, value); 27861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ent == NULL) || 27881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (ent->etype != 27891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard XML_EXTERNAL_GENERAL_UNPARSED_ENTITY)) 27901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 4; 27911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 27931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard TODO; 27941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 27951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 27961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 27971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 2798a1a9d0410000cc69874e53e438b250037d3e14cdDaniel Veillard 27991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ENTITY; 28001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 28021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 2803b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard case XML_SCHEMAS_ENTITIES: 28041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 28051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return3; 28061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlSchemaValAtomicListNode(xmlSchemaTypeEntityDef, 28071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard value, val, node); 28081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret <= 0) 28091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 28101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 28111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 28121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL) && 28131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (node->type == XML_ATTRIBUTE_NODE)) { 28141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) node; 28151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard attr->atype = XML_ATTRIBUTE_ENTITIES; 28171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 28191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_NOTATION:{ 28201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *uri = NULL; 28211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *local = NULL; 28221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateQName(value, 1); 28241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (node != NULL)) { 28251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *prefix; 28261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard local = xmlSplitQName2(value, &prefix); 28281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) { 28291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlNsPtr ns; 28301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ns = xmlSearchNs(node->doc, node, prefix); 28321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ns == NULL) 28331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 28341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (val != NULL) 28351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard uri = xmlStrdup(ns->href); 28361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((local != NULL) && ((val == NULL) || (ret != 0))) 28381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(local); 28391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (prefix != NULL) 28401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(prefix); 28411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((node == NULL) || (node->doc == NULL)) 28431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 3; 28441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 0) { 28451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = xmlValidateNotationUse(NULL, node->doc, value); 28461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret == 1) 28471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 0; 28481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 28491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ret = 1; 28501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((ret == 0) && (val != NULL)) { 28521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_NOTATION); 28531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 28541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (local != NULL) 28551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.name = local; 28561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 28571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.name = xmlStrdup(value); 28581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (uri != NULL) 28591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.qname.uri = uri; 28601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 28611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 28621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else { 28631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (local != NULL) 28641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(local); 28651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (uri != NULL) 28661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(uri); 28671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 28681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto done; 2871560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 28724efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYURI:{ 287311c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (*value != 0) { 28744efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlURIPtr uri; 28754efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) { 28764efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik norm = xmlSchemaCollapseString(value); 28774efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (norm != NULL) 28784efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik value = norm; 28794efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 28804efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik uri = xmlParseURI((const char *) value); 288111c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (uri == NULL) 288211c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard goto return1; 288311c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard xmlFreeURI(uri); 288411c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard } 2885560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 28861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 288711c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_ANYURI); 288811c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard if (v == NULL) 288911c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard goto error; 289011c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard v->value.str = xmlStrdup(value); 289111c466abe481325aac9572cae8ca0b9040c58820Daniel Veillard *val = v; 28921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 28941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 28951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_HEXBINARY:{ 28968dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik const xmlChar *cur = value, *start; 28971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *base; 28981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int total, i = 0; 2899560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 2900f34a20e69dc675cd23d3eb558cad135ea280f472Daniel Veillard if (cur == NULL) 29011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 2902560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 29034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 29044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 29054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik 29068dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik start = cur; 29071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while (((*cur >= '0') && (*cur <= '9')) || 29081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((*cur >= 'A') && (*cur <= 'F')) || 29091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((*cur >= 'a') && (*cur <= 'f'))) { 29101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard i++; 29111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 29121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 29144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 2915560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 29161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur != 0) 29171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 29181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((i % 2) != 0) 291970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard goto return1; 2920560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 29211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 29221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 29231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_HEXBINARY); 29241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v == NULL) 29251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 29264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik /* 29274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Copy only the normalized piece. 29284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * CRITICAL TODO: Check this. 29294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik */ 29308dd1e1bcad796ea4cc9ad8a76eb44868e6e0d329Kasimier T. Buchcik cur = xmlStrndup(start, i); 29311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) { 2932d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard xmlSchemaTypeErrMemory(node, "allocating hexbin data"); 29331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(v); 29341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 29351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 29371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total = i / 2; /* number of octets */ 293870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 29391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base = (xmlChar *) cur; 29401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard while (i-- > 0) { 29411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*base >= 'a') 29421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = *base - ('a' - 'A'); 29431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base++; 29441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 294570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 29461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.hex.str = (xmlChar *) cur; 29471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.hex.total = total; 29481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 29491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 29511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BASE64BINARY:{ 29531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* ISSUE: 29541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 29551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Ignore all stray characters? (yes, currently) 29561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Worry about long lines? (no, currently) 29571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 29581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * rfc2045.txt: 29591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 29601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * "The encoded output stream must be represented in lines of 29611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * no more than 76 characters each. All line breaks or other 29621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * characters not found in Table 1 must be ignored by decoding 29631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * software. In base64 data, characters other than those in 29641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * Table 1, line breaks, and other white space probably 29651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * indicate a transmission error, about which a warning 29661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * message or even a message rejection might be appropriate 29671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * under some circumstances." */ 29681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 29691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlChar *base; 29701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int total, i = 0, pad = 0; 29711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 29721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 29731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 29741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 29751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (; *cur; ++cur) { 29761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 29771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 29781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur); 29791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc < 0) ; 29801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (decc < 64) 29811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard i++; 29821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 29831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard break; 29841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (; *cur; ++cur) { 29861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 29871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 29881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur); 29891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc < 0) ; 29901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (decc < 64) 29911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 29921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc == 64) 29931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard pad++; 29941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 29951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 29961ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* rfc2045.txt: "Special processing is performed if fewer than 29971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * 24 bits are available at the end of the data being encoded. 29981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * A full encoding quantum is always completed at the end of a 29991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * body. When fewer than 24 input bits are available in an 30001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * input group, zero bits are added (on the right) to form an 30011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * integral number of 6-bit groups. Padding at the end of the 30021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * data is performed using the "=" character. Since all 30031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * base64 input is an integral number of octets, only the 30041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * following cases can arise: (1) the final quantum of 30051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * encoding input is an integral multiple of 24 bits; here, 30061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * the final unit of encoded output will be an integral 30071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * multiple ofindent: Standard input:701: Warning:old style 30081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * assignment ambiguity in "=*". Assuming "= *" 4 characters 30091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * with no "=" padding, (2) the final 30101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * quantum of encoding input is exactly 8 bits; here, the 30111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * final unit of encoded output will be two characters 30121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * followed by two "=" padding characters, or (3) the final 30131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * quantum of encoding input is exactly 16 bits; here, the 30141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * final unit of encoded output will be three characters 30151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard * followed by one "=" padding character." */ 30161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total = 3 * (i / 4); 30181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (pad == 0) { 30191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 0) 30201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30211ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (pad == 1) { 30221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 30231ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 3) 30251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (decc = _xmlSchemaBase64Decode(*cur); 30271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (decc < 0) || (decc > 63); 30281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur)) 30291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard --cur; 30301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 16bits in 24bits means 2 pad bits: nnnnnn nnmmmm mmmm00*/ 30311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 00111100 -> 0x3c */ 30321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc & ~0x3c) 30331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total += 2; 30351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (pad == 2) { 30361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int decc; 30371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (i % 4 != 2) 30391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (decc = _xmlSchemaBase64Decode(*cur); 30411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (decc < 0) || (decc > 63); 30421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard decc = _xmlSchemaBase64Decode(*cur)) 30431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard --cur; 30441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 8bits in 12bits means 4 pad bits: nnnnnn nn0000 */ 30451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard /* 00110000 -> 0x30 */ 30461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (decc & ~0x30) 30471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard total += 1; 30491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else 30501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 30531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v = xmlSchemaNewValue(XML_SCHEMAS_BASE64BINARY); 30541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v == NULL) 30551ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto error; 30561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard base = 30571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard (xmlChar *) xmlMallocAtomic((i + pad + 1) * 30581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sizeof(xmlChar)); 30591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (base == NULL) { 3060d0c9c32f64c09c699c54dc9ffb8558c297f9e08eDaniel Veillard xmlSchemaTypeErrMemory(node, "allocating base64 data"); 30611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(v); 30621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 30641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.base64.str = base; 30651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard for (cur = value; *cur; ++cur) 30661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (_xmlSchemaBase64Decode(*cur) >= 0) { 30671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = *cur; 30681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ++base; 30691ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 30701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *base = 0; 30711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.base64.total = total; 30721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 30731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 30741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 307570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 3076e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_INTEGER: 3077e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_PINTEGER: 3078e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_NPINTEGER: 3079e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_NINTEGER: 30801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_NNINTEGER:{ 30811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 30821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 3083ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack int sign = 0; 30841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 30851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 30861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 30874efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 30884efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 30891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 30901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sign = 1; 30911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 30921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (*cur == '+') 30931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 3094ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 3095ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (ret == -1) 3096ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 30974efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (normOnTheFly) 30984efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while IS_WSP_BLANK_CH(*cur) cur++; 3099ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (*cur != 0) 3100ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 310101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_NPINTEGER) { 31021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && 31031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((hi != 0) || (mi != 0) || (lo != 0))) 31041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 310501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_PINTEGER) { 31061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (sign == 1) 31071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((hi == 0) && (mi == 0) && (lo == 0)) 31091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 311001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_NINTEGER) { 31111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (sign == 0) 31121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((hi == 0) && (mi == 0) && (lo == 0)) 31141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 311501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_NNINTEGER) { 31161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && 31171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard ((hi != 0) || (mi != 0) || (lo != 0))) 31181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (val != NULL) { 312101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 31221ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 3123c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (ret == 0) 3124c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik ret++; 31251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 31266c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik v->value.decimal.mi = mi; 31276c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik v->value.decimal.hi = hi; 31281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = sign; 31291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 3130ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack v->value.decimal.total = ret; 31311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 31321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31341ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 31351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 3136e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_LONG: 3137e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_BYTE: 3138e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_SHORT: 31391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_INT:{ 3140478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *cur = value; 31411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 31421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int sign = 0; 31431ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 31441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 31451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (*cur == '-') { 31471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard sign = 1; 31481ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 31491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } else if (*cur == '+') 31501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard cur++; 3151ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 3152ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (ret < 0) 3153ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 3154ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (*cur != 0) 3155ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 315601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_LONG) { 31571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi >= 922) { 31581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi > 922) 31591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 33720368) { 31611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 33720368) 31621ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 54775807)) 31641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 54775808)) 31661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31681ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 316901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_INT) { 31701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi != 0) 31711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 21) { 31731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 21) 31741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 47483647)) 31761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 47483648)) 31781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 318001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_SHORT) { 31811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 31821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 32768)) 31841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 32767)) 31861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 318701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_BYTE) { 31881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 31891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31901ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 1) && (lo > 128)) 31911ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31921ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((sign == 0) && (lo > 127)) 31931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 31941ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 31951ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 319601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 31971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 31981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 31996c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik v->value.decimal.mi = mi; 32006c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik v->value.decimal.hi = hi; 32011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = sign; 32021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 3203ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack v->value.decimal.total = ret; 32041ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 32051ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 32081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 3209e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_UINT: 3210e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_ULONG: 3211e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_USHORT: 32121ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_UBYTE:{ 32131ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard const xmlChar *cur = value; 32141ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard unsigned long lo, mi, hi; 32151ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard 32161ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (cur == NULL) 32171ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 3218ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack ret = xmlSchemaParseUInt(&cur, &lo, &mi, &hi); 3219ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (ret < 0) 3220ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 3221ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack if (*cur != 0) 3222ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack goto return1; 322301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (type->builtInType == XML_SCHEMAS_ULONG) { 32241ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi >= 1844) { 32251ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi > 1844) 32261ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32271ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 67440737) { 32281ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 67440737) 32291ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32301ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 9551615) 32311ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32321ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32331ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 323401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_UINT) { 32351ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (hi != 0) 32361ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32371ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi >= 42) { 32381ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (mi > 42) 32391ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32401ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 94967295) 32411ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32421ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 324301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_USHORT) { 32441ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 32451ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32461ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 65535) 32471ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 324801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (type->builtInType == XML_SCHEMAS_UBYTE) { 32491ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if ((mi != 0) || (hi != 0)) 32501ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32511ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (lo > 255) 32521ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return1; 32531ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32541ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (val != NULL) { 325501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard v = xmlSchemaNewValue(type->builtInType); 32561ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (v != NULL) { 32571ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.lo = lo; 32581ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.mi = mi; 32591ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.hi = hi; 32601ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.sign = 0; 32611ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard v->value.decimal.frac = 0; 3262ec3b4b7d7f67760d72fa493f94b6672b45777bbbWilliam M. Brack v->value.decimal.total = ret; 32631ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard *val = v; 32641ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32651ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32661ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard goto return0; 32671ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 32684255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 3269b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 32701ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard done: 32711ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 32721ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 32731ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (ret); 32741ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return3: 32751ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 32761ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 32771ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (3); 32781ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return1: 32791ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 32801ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 32811ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (1); 32821ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return0: 32831ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 32841ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 32851ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (0); 32861ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard error: 32871ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (norm != NULL) 32881ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard xmlFree(norm); 32891ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return (-1); 3290b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 3291b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 3292b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 3293b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaValPredefTypeNode: 3294b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @type: the predefined type 3295b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @value: the value to check 3296b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @val: the return computed value 3297b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @node: the node containing the value 3298b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 3299b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check that a value conforms to the lexical space of the predefined type. 3300b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * if true a value is computed and returned in @val. 3301b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 3302b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns 0 if this validates, a positive error code number otherwise 3303b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * and -1 in case of internal or API error. 3304b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 3305b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardint 3306b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaValPredefTypeNode(xmlSchemaTypePtr type, const xmlChar *value, 3307b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard xmlSchemaValPtr *val, xmlNodePtr node) { 33084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return(xmlSchemaValAtomicType(type, value, val, node, 0, 33094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 1, 0)); 33104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 33114255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 33124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 3313c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * xmlSchemaValPredefTypeNodeNoNorm: 3314c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the predefined type 3315c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the value to check 3316c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val: the return computed value 3317c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @node: the node containing the value 3318c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 3319c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Check that a value conforms to the lexical space of the predefined type. 3320c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * if true a value is computed and returned in @val. 3321c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * This one does apply any normalization to the value. 3322c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 3323c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 3324c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * and -1 in case of internal or API error. 3325c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 3326c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardint 3327c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaValPredefTypeNodeNoNorm(xmlSchemaTypePtr type, const xmlChar *value, 3328c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard xmlSchemaValPtr *val, xmlNodePtr node) { 33294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return(xmlSchemaValAtomicType(type, value, val, node, 1, 33304efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN, 1, 0, 1)); 3331c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 3332c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 3333c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/** 3334c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * xmlSchemaValidatePredefinedType: 3335c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @type: the predefined type 3336c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @value: the value to check 3337c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * @val: the return computed value 3338c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * 3339c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Check that a value conforms to the lexical space of the predefined type. 3340c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * if true a value is computed and returned in @val. 3341c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * 3342c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * Returns 0 if this validates, a positive error code number otherwise 3343c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard * and -1 in case of internal or API error. 3344c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard */ 3345c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillardint 3346c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel VeillardxmlSchemaValidatePredefinedType(xmlSchemaTypePtr type, const xmlChar *value, 3347c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard xmlSchemaValPtr *val) { 3348c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard return(xmlSchemaValPredefTypeNode(type, value, val, NULL)); 3349c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard} 3350c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard 3351c3da18a148ac4abf9209f6af738cb9e2b65e5a24Daniel Veillard/** 33524255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareDecimals: 33534255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x: a first decimal value 33544255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y: a second decimal value 33554255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 33564255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 decimals 33574255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 33584255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error 33594255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 33604255d504151db75c17f85192ce74f45dd2d65533Daniel Veillardstatic int 33614255d504151db75c17f85192ce74f45dd2d65533Daniel VeillardxmlSchemaCompareDecimals(xmlSchemaValPtr x, xmlSchemaValPtr y) 33624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{ 33634255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard xmlSchemaValPtr swp; 3364273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack int order = 1, integx, integy, dlen; 3365273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack unsigned long hi, mi, lo; 33664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 3367273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3368273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * First test: If x is -ve and not zero 3369273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3370e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((x->value.decimal.sign) && 3371e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((x->value.decimal.lo != 0) || 3372e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (x->value.decimal.mi != 0) || 3373e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (x->value.decimal.hi != 0))) { 3374273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3375273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * Then if y is -ve and not zero reverse the compare 3376273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3377e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((y->value.decimal.sign) && 3378e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((y->value.decimal.lo != 0) || 3379e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.mi != 0) || 3380e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.hi != 0))) 338180b19092f24410a6b869abf519227686e8f207caDaniel Veillard order = -1; 3382273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3383273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * Otherwise (y >= 0) we have the answer 3384273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 338580b19092f24410a6b869abf519227686e8f207caDaniel Veillard else 338680b19092f24410a6b869abf519227686e8f207caDaniel Veillard return (-1); 3387273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3388273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * If x is not -ve and y is -ve we have the answer 3389273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3390e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } else if ((y->value.decimal.sign) && 3391e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((y->value.decimal.lo != 0) || 3392e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.mi != 0) || 3393e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (y->value.decimal.hi != 0))) { 33944255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return (1); 339580b19092f24410a6b869abf519227686e8f207caDaniel Veillard } 3396273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3397273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * If it's not simply determined by a difference in sign, 3398273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * then we need to compare the actual values of the two nums. 3399273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * To do this, we start by looking at the integral parts. 3400273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * If the number of integral digits differ, then we have our 3401273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * answer. 3402273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3403273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack integx = x->value.decimal.total - x->value.decimal.frac; 3404273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack integy = y->value.decimal.total - y->value.decimal.frac; 3405273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (integx > integy) 3406273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3407273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack else if (integy > integx) 3408273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return -order; 3409273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack /* 3410273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * If the number of integral digits is the same for both numbers, 3411273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * then things get a little more complicated. We need to "normalize" 3412273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * the numbers in order to properly compare them. To do this, we 3413273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * look at the total length of each number (length => number of 3414273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * significant digits), and divide the "shorter" by 10 (decreasing 3415273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack * the length) until they are of equal length. 3416273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack */ 3417273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack dlen = x->value.decimal.total - y->value.decimal.total; 3418273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (dlen < 0) { /* y has more digits than x */ 3419273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack swp = x; 3420273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack hi = y->value.decimal.hi; 3421273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack mi = y->value.decimal.mi; 3422273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack lo = y->value.decimal.lo; 3423273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack dlen = -dlen; 3424273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack order = -order; 3425273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else { /* x has more digits than y */ 3426273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack swp = y; 3427273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack hi = x->value.decimal.hi; 3428273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack mi = x->value.decimal.mi; 3429273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack lo = x->value.decimal.lo; 3430273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 3431273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack while (dlen > 8) { /* in effect, right shift by 10**8 */ 3432273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack lo = mi; 3433273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack mi = hi; 3434273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack hi = 0; 3435273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack dlen -= 8; 34364255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 3437273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack while (dlen > 0) { 3438273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack unsigned long rem1, rem2; 3439273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack rem1 = (hi % 10) * 100000000L; 3440273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack hi = hi / 10; 3441273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack rem2 = (mi % 10) * 100000000L; 3442273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack mi = (mi + rem1) / 10; 3443273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack lo = (lo + rem2) / 10; 3444273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack dlen--; 3445273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 3446273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (hi > swp->value.decimal.hi) { 3447273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3448273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else if (hi == swp->value.decimal.hi) { 3449273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (mi > swp->value.decimal.mi) { 3450273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3451273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else if (mi == swp->value.decimal.mi) { 3452273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (lo > swp->value.decimal.lo) { 3453273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3454273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else if (lo == swp->value.decimal.lo) { 3455273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack if (x->value.decimal.total == y->value.decimal.total) { 3456273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return 0; 3457273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } else { 3458273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return order; 3459273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 3460273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 3461273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack } 34624255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 3463273670f435219087fbb0a7da7e980ac6e28a8ae0William M. Brack return -order; 34644255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 34654255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 34664255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 3467070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * xmlSchemaCompareDurations: 3468070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @x: a first duration value 3469070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * @y: a second duration value 3470070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 3471070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Compare 2 durations 3472070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * 3473070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 3474070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard * case of error 3475070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard */ 3476070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillardstatic int 3477070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel VeillardxmlSchemaCompareDurations(xmlSchemaValPtr x, xmlSchemaValPtr y) 3478070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard{ 3479070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard long carry, mon, day; 3480070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard double sec; 348180b19092f24410a6b869abf519227686e8f207caDaniel Veillard int invert = 1; 348280b19092f24410a6b869abf519227686e8f207caDaniel Veillard long xmon, xday, myear, minday, maxday; 3483070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard static const long dayRange [2][12] = { 3484070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 0, 28, 59, 89, 120, 150, 181, 212, 242, 273, 303, 334, }, 3485070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} }; 3486070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3487070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((x == NULL) || (y == NULL)) 34885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 3489070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3490070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* months */ 3491070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard mon = x->value.dur.mon - y->value.dur.mon; 3492070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3493070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* seconds */ 3494070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard sec = x->value.dur.sec - y->value.dur.sec; 3495070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard carry = (long)sec / SECS_PER_DAY; 3496070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard sec -= (double)(carry * SECS_PER_DAY); 3497070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3498070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* days */ 3499070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard day = x->value.dur.day - y->value.dur.day + carry; 3500070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3501070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* easy test */ 3502070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (mon == 0) { 3503070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (day == 0) 3504070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (sec == 0.0) 3505070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 3506070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else if (sec < 0.0) 3507070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 3508070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else 3509070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 3510070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else if (day < 0) 3511070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 3512070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else 3513070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 3514070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 3515070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3516070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (mon > 0) { 3517070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((day >= 0) && (sec >= 0.0)) 3518070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 1; 3519070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard else { 3520070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = mon; 3521070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xday = -day; 3522070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 3523070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else if ((day <= 0) && (sec <= 0.0)) { 3524070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return -1; 3525070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } else { 352680b19092f24410a6b869abf519227686e8f207caDaniel Veillard invert = -1; 3527070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = -mon; 3528070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xday = day; 3529070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard } 3530070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3531070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard myear = xmon / 12; 353280b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (myear == 0) { 353380b19092f24410a6b869abf519227686e8f207caDaniel Veillard minday = 0; 353480b19092f24410a6b869abf519227686e8f207caDaniel Veillard maxday = 0; 353580b19092f24410a6b869abf519227686e8f207caDaniel Veillard } else { 353680b19092f24410a6b869abf519227686e8f207caDaniel Veillard maxday = 366 * ((myear + 3) / 4) + 353780b19092f24410a6b869abf519227686e8f207caDaniel Veillard 365 * ((myear - 1) % 4); 353880b19092f24410a6b869abf519227686e8f207caDaniel Veillard minday = maxday - 1; 353980b19092f24410a6b869abf519227686e8f207caDaniel Veillard } 354080b19092f24410a6b869abf519227686e8f207caDaniel Veillard 3541070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard xmon = xmon % 12; 3542070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard minday += dayRange[0][xmon]; 3543070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard maxday += dayRange[1][xmon]; 3544070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 354580b19092f24410a6b869abf519227686e8f207caDaniel Veillard if ((maxday == minday) && (maxday == xday)) 354680b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(0); /* can this really happen ? */ 3547070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (maxday < xday) 354880b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(-invert); 354980b19092f24410a6b869abf519227686e8f207caDaniel Veillard if (minday > xday) 355080b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(invert); 3551070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 3552070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard /* indeterminate */ 35535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; 35545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 35555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 35565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/* 35575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * macros for adding date/times and durations 35585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 35595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT(a,b) (floor(((double)a/(double)b))) 35605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO(a,b) (a - FQUOTIENT(a,b) * b) 35615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define FQUOTIENT_RANGE(a,low,high) (FQUOTIENT((a-low),(high-low))) 35625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define MODULO_RANGE(a,low,high) ((MODULO((a-low),(high-low)))+low) 35635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 35645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 3565669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * xmlSchemaDupVal: 3566669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @v: the #xmlSchemaValPtr value to duplicate 3567669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * 3568669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Makes a copy of @v. The calling program is responsible for freeing 3569669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the returned value. 3570669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * 3571669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * returns a pointer to a duplicated #xmlSchemaValPtr or NULL if error. 3572669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard */ 3573669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillardstatic xmlSchemaValPtr 3574669adfcd3af5dfda873b10119d44202a7450bb20Daniel VeillardxmlSchemaDupVal (xmlSchemaValPtr v) 3575669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard{ 3576669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaValPtr ret = xmlSchemaNewValue(v->type); 3577669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard if (ret == NULL) 3578669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return NULL; 3579669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard 3580669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard memcpy(ret, v, sizeof(xmlSchemaVal)); 35814efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret->next = NULL; 3582669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return ret; 3583669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard} 3584669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard 3585669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard/** 3586285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * xmlSchemaCopyValue: 3587285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * @val: the precomputed value to be copied 3588285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * 3589285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Copies the precomputed value. This duplicates any string within. 3590285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * 3591285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Returns the copy or NULL if a copy for a data-type is not implemented. 3592285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik */ 3593285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaValPtr 3594285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. BuchcikxmlSchemaCopyValue(xmlSchemaValPtr val) 3595285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik{ 35964efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaValPtr ret = NULL, prev = NULL, cur; 3597285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik 3598285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik /* 3599285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik * Copy the string values. 3600285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik */ 36014efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik while (val != NULL) { 36024efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik switch (val->type) { 36034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYTYPE: 36044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREFS: 36054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITIES: 36064efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKENS: 36074efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik xmlSchemaFreeValue(ret); 36084efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (NULL); 36094efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 36104efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_STRING: 36114efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 36124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_TOKEN: 36134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_LANGUAGE: 36144efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NAME: 36154efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NCNAME: 36164efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ID: 36174efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 36184efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ENTITY: 36194efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NMTOKEN: 36204efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_ANYURI: 36214efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 36224efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.str != NULL) 36234efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.str = xmlStrdup(BAD_CAST val->value.str); 36244efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 36254efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_QNAME: 36264efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_NOTATION: 36274efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 36284efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.qname.name != NULL) 36294efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.qname.name = 3630285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik xmlStrdup(BAD_CAST val->value.qname.name); 36314efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.qname.uri != NULL) 36324efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.qname.uri = 3633285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik xmlStrdup(BAD_CAST val->value.qname.uri); 36344efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 36354efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_HEXBINARY: 36364efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 36374efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.hex.str != NULL) 36384efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.hex.str = xmlStrdup(BAD_CAST val->value.hex.str); 36394efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 36404efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik case XML_SCHEMAS_BASE64BINARY: 36414efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 36424efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (val->value.base64.str != NULL) 36434efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur->value.base64.str = 3644285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik xmlStrdup(BAD_CAST val->value.base64.str); 36454efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 36464efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik default: 36474efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik cur = xmlSchemaDupVal(val); 36484efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik break; 36494efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik } 36504efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if (ret == NULL) 36514efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik ret = cur; 36524efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik else 36534efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik prev->next = cur; 36544efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik prev = cur; 36554efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik val = val->next; 3656285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik } 36574efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (ret); 3658285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik} 3659285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik 3660285ebabb07c93921a60e4ab2dbefcbc0c49fb334Kasimier T. Buchcik/** 36615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateAdd: 36625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 36635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dur: an #xmlSchemaValPtr of type #XS_DURATION 36645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 36655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compute a new date/time from @dt and @dur. This function assumes @dt 36665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH, 3667669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * or #XML_SCHEMAS_GYEAR. The returned #xmlSchemaVal is the same type as 3668669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt. The calling program is responsible for freeing the returned value. 36695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3670669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a pointer to a new #xmlSchemaVal or NULL if error. 36715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 36725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr 36735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur) 36745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 3675669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaValPtr ret, tmp; 36765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long carry, tempdays, temp; 36775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValDatePtr r, d; 36785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValDurationPtr u; 36795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 36805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((dt == NULL) || (dur == NULL)) 36815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 36825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 36835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = xmlSchemaNewValue(dt->type); 36845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret == NULL) 36855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 36865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3687669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard /* make a copy so we don't alter the original value */ 3688669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard tmp = xmlSchemaDupVal(dt); 3689669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard if (tmp == NULL) { 3690669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaFreeValue(ret); 3691669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard return NULL; 3692669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard } 3693669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard 36945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r = &(ret->value.date); 3695669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard d = &(tmp->value.date); 36965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard u = &(dur->value.dur); 36975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 36985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalization */ 36995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->mon == 0) 37005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->mon = 1; 37015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize for time zone offset */ 37035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard u->sec -= (d->tzo * 60); 37045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->tzo = 0; 37055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalization */ 37075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->day == 0) 37085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard d->day = 1; 37095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* month */ 37115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = d->mon + u->mon; 3712ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->mon = (unsigned int) MODULO_RANGE(carry, 1, 13); 3713ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT_RANGE(carry, 1, 13); 37145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* year (may be modified later) */ 37165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year = d->year + carry; 37175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->year == 0) { 37185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (d->year > 0) 37195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year--; 37205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 37215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year++; 37225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 37235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* time zone */ 37255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->tzo = d->tzo; 37265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->tz_flag = d->tz_flag; 37275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* seconds */ 37295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->sec = d->sec + u->sec; 3730ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT((long)r->sec, 60); 37315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->sec != 0.0) { 37325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->sec = MODULO(r->sec, 60.0); 37335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 37345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* minute */ 37365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry += d->min; 3737ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->min = (unsigned int) MODULO(carry, 60); 3738ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long) FQUOTIENT(carry, 60); 37395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* hours */ 37415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry += d->hour; 3742ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->hour = (unsigned int) MODULO(carry, 24); 3743ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard carry = (long)FQUOTIENT(carry, 24); 37445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 37465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * days 37475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Note we use tempdays because the temporary values may need more 37485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * than 5 bits 37495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 37505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) && 37515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (d->day > MAX_DAYINMONTH(r->year, r->mon))) 37525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = MAX_DAYINMONTH(r->year, r->mon); 37535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (d->day < 1) 37545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = 1; 37555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 37565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = d->day; 37575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays += u->day + carry; 37595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard while (1) { 37615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (tempdays < 1) { 37625e9576a492e4fb8c2d517ccd6056a139e801ec9fDaniel Veillard long tmon = (long) MODULO_RANGE((int)r->mon-1, 1, 13); 37635e9576a492e4fb8c2d517ccd6056a139e801ec9fDaniel Veillard long tyr = r->year + (long)FQUOTIENT_RANGE((int)r->mon-1, 1, 13); 37645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (tyr == 0) 37655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tyr--; 37665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays += MAX_DAYINMONTH(tyr, tmon); 37675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = -1; 3768ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard } else if (tempdays > (long) MAX_DAYINMONTH(r->year, r->mon)) { 37695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon); 37705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard carry = 1; 37715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } else 37725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 37735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard temp = r->mon + carry; 3775ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->mon = (unsigned int) MODULO_RANGE(temp, 1, 13); 3776ebe25d492075cb8fa141027e7627dfdfdd0262b8Daniel Veillard r->year = r->year + (unsigned int) FQUOTIENT_RANGE(temp, 1, 13); 37775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (r->year == 0) { 37785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (temp < 1) 37795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year--; 37805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 37815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->year++; 37825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 37835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 37845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard r->day = tempdays; 37865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 37875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 37885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * adjust the date/time type to the date values 37895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 37905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret->type != XML_SCHEMAS_DATETIME) { 37915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((r->hour) || (r->min) || (r->sec)) 37925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_DATETIME; 37935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (ret->type != XML_SCHEMAS_DATE) { 37945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((r->mon != 1) && (r->day != 1)) 37955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_DATE; 37965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1)) 37975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret->type = XML_SCHEMAS_GYEARMONTH; 37985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 37995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 38005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3801669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard xmlSchemaFreeValue(tmp); 38025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 38045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 38055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 38075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaDateNormalize: 3808669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @dt: an #xmlSchemaValPtr of a date/time type value. 3809669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * @offset: number of seconds to adjust @dt by. 38105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3811669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Normalize @dt to GMT time. The @offset parameter is subtracted from 3812669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * the return value is a time-zone offset is present on @dt. 38135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 3814669adfcd3af5dfda873b10119d44202a7450bb20Daniel Veillard * Returns a normalized copy of @dt or NULL if error. 38155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 38165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic xmlSchemaValPtr 38175a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset) 38185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 38195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValPtr dur, ret; 38205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dt == NULL) 38225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 38235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (((dt->type != XML_SCHEMAS_TIME) && 3825c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (dt->type != XML_SCHEMAS_DATETIME) && 3826c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (dt->type != XML_SCHEMAS_DATE)) || (dt->value.date.tzo == 0)) 38275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return xmlSchemaDupVal(dt); 38285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION); 38305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (dur == NULL) 38315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 38325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard dur->value.date.sec -= offset; 38345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = _xmlSchemaDateAdd(dt, dur); 38365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (ret == NULL) 38375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return NULL; 38385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaFreeValue(dur); 38405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* ret->value.date.tzo = 0; */ 38425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 38435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 38445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 38465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * _xmlSchemaDateCastYMToDays: 38475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 38485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 38495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Convert mon and year of @dt to total number of days. Take the 38505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * number of years since (or before) 1 AD and add the number of leap 38515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years. This is a function because negative 38525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * years must be handled a little differently and there is no zero year. 38535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 38545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns number of days. 38555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 38565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic long 38575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard_xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt) 38585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 38595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long ret; 386049e8963c640865343327c67d4755a1af705717d3Daniel Veillard int mon; 38615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 386249e8963c640865343327c67d4755a1af705717d3Daniel Veillard mon = dt->value.date.mon; 386349e8963c640865343327c67d4755a1af705717d3Daniel Veillard if (mon <= 0) mon = 1; /* normalization */ 386449e8963c640865343327c67d4755a1af705717d3Daniel Veillard 386549e8963c640865343327c67d4755a1af705717d3Daniel Veillard if (dt->value.date.year <= 0) 38665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = (dt->value.date.year * 365) + 38675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+ 38685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((dt->value.date.year+1)/400)) + 386949e8963c640865343327c67d4755a1af705717d3Daniel Veillard DAY_IN_YEAR(0, mon, dt->value.date.year); 38705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 38715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ret = ((dt->value.date.year-1) * 365) + 38725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+ 38735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((dt->value.date.year-1)/400)) + 387449e8963c640865343327c67d4755a1af705717d3Daniel Veillard DAY_IN_YEAR(0, mon, dt->value.date.year); 38755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return ret; 38775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard} 38785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 38805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * TIME_TO_NUMBER: 38815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @dt: an #xmlSchemaValPtr 38825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 38835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Calculates the number of seconds in the time portion of @dt. 38845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 38855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns seconds. 38865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 38875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard#define TIME_TO_NUMBER(dt) \ 38885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ((double)((dt->value.date.hour * SECS_PER_HOUR) + \ 3889b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard (dt->value.date.min * SECS_PER_MIN) + \ 3890b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard (dt->value.date.tzo * SECS_PER_MIN)) + \ 3891b3721c25237d233832b69ac599cc688eb5dcad62Daniel Veillard dt->value.date.sec) 38925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 38935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard/** 38945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * xmlSchemaCompareDates: 38955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @x: a first date/time value 38965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * @y: a second date/time value 38975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 38985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Compare 2 date/times 38995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * 39005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 39015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * case of error 39025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 39035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillardstatic int 39045a872413fd58df3095979521d9a03ad03cab73a5Daniel VeillardxmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y) 39055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard{ 39065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard unsigned char xmask, ymask, xor_mask, and_mask; 39075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmlSchemaValPtr p1, p2, q1, q2; 39085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard long p1d, p2d, q1d, q2d; 39095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if ((x == NULL) || (y == NULL)) 39115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 39125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.tz_flag) { 39145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (!y->value.date.tz_flag) { 39165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, 0); 39175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 39185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize y + 14:00 */ 39195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR)); 39205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 3922fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 3923fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3924fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 39255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 3926fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d == q1d) { 39275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 39285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 3930fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (sec < 0.0) { 3931fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3932fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 39335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 3934fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 39354aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 39365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize y - 14:00 */ 39375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR)); 39385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day; 39395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (p1d > q2d) 39404aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 39415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (p1d == q2d) { 39425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2); 39435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec > 0.0) 39444aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 39455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 39464aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 2; /* indeterminate */ 39475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 39484aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(p1); 39494aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q1); 39504aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q2); 39514aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard if (ret != 0) 39524aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 39535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 3954fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 3955fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3956fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 3957fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } 39585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 39595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } else if (y->value.date.tz_flag) { 39605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, 0); 39615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 39625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize x - 14:00 */ 39645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR)); 39655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 39665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 3967fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 3968fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3969fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 39705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 3971fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d == q1d) { 39725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 39735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 3975fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (sec < 0.0) { 3976fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 3977fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 39785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 3979fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 39804aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 39815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* normalize x + 14:00 */ 39825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR)); 39835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day; 39845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 39856560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard if (p2d > q1d) { 39864aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 39876560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard } else if (p2d == q1d) { 39885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1); 39895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec > 0.0) 39904aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 39915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else 39924aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 2; /* indeterminate */ 39935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 39946560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(p1); 39956560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(q1); 39966560a42c7b89e7c5df3d87eedad1f34e94ae53bbDaniel Veillard xmlSchemaFreeValue(p2); 39974aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard if (ret != 0) 39984aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 39995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 4000fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 4001fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(p1); 4002fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard xmlSchemaFreeValue(q1); 40035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* 40075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard * if the same type then calculate the difference 40085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard */ 40095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->type == y->type) { 40104aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard int ret = 0; 40115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1 = xmlSchemaDateNormalize(y, 0); 40125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day; 40135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1 = xmlSchemaDateNormalize(x, 0); 40155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day; 40165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 4017fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard if (p1d < q1d) { 40184aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = -1; 4019fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else if (p1d > q1d) { 40204aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 4021fdc9156a753e839386d9f82b7a962f9779de862cDaniel Veillard } else { 40225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard double sec; 40235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1); 40255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (sec < 0.0) 40264aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = -1; 40275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (sec > 0.0) 40284aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard ret = 1; 40295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40314aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(p1); 40324aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard xmlSchemaFreeValue(q1); 40334aede2e66b88ad782b506341c6ea40554456a8b4Daniel Veillard return(ret); 40345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard switch (x->type) { 40375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 40385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0xf; 40395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 40405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 40415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x7; 40425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 40435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 40445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x1; 40455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 40465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 40475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x2; 40485a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 40495a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 40505a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x3; 40515a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 40525a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 40535a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x3; 40545a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 40555a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 40565a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x6; 40575a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 40585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 40595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0x8; 40605a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 40615a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard default: 40625a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xmask = 0; 40635a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 40645a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40655a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40665a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard switch (y->type) { 40675a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 40685a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0xf; 40695a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 40705a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 40715a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x7; 40725a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 40735a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 40745a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x1; 40755a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 40765a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 40775a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x2; 40785a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 40795a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 40805a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x3; 40815a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 40825a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 40835a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x3; 40845a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 40855a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 40865a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x6; 40875a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 40885a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 40895a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0x8; 40905a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 40915a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard default: 40925a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard ymask = 0; 40935a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard break; 40945a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 40955a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40965a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard xor_mask = xmask ^ ymask; /* mark type differences */ 40975a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard and_mask = xmask & ymask; /* mark field specification */ 40985a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 40995a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* year */ 41005a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 1) 41015a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 41025a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 1) { 41035a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.year < y->value.date.year) 41045a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 41055a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.year > y->value.date.year) 41065a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 41075a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 41085a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41095a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* month */ 41105a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 2) 41115a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 41125a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 2) { 41135a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.mon < y->value.date.mon) 41145a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 41155a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.mon > y->value.date.mon) 41165a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 41175a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 41185a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* day */ 41205a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 4) 41215a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 41225a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 4) { 41235a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.day < y->value.date.day) 41245a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 41255a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.day > y->value.date.day) 41265a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 41275a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 41285a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 41295a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard /* time */ 41305a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (xor_mask & 8) 41315a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 2; /* indeterminate */ 41325a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (and_mask & 8) { 41335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard if (x->value.date.hour < y->value.date.hour) 41345a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 41355a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.hour > y->value.date.hour) 41365a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 41375a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.min < y->value.date.min) 41385a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 41395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.min > y->value.date.min) 41405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 41415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.sec < y->value.date.sec) 41425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -1; 41435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard else if (x->value.date.sec > y->value.date.sec) 41445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return 1; 41455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard } 41465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard 4147070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return 0; 4148070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard} 4149070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard 4150070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard/** 41516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveReplaceStrings: 4152478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @x: a first string value 4153478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @y: a second string value 41546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @invert: inverts the result if x < y or x > y. 41556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 41566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 41576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is 41586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "replace". I.e. @x could 41596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString". 41606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 41616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 41626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 41636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 41646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 4165478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaComparePreserveReplaceStrings(const xmlChar *x, 4166478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y, 41676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int invert) 41686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 41696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 41706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 4171478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4172478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (IS_WSP_REPLACE_CH(*y)) { 4173478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (! IS_WSP_SPACE_CH(*x)) { 4174478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*x - 0x20) < 0) { 41756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 41766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 41776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 41786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 41796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 41806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 41816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 41826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 41836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 41846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 41856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 41866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 4187478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x - *y; 41886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) { 41896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 41906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 41916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 41926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 41936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 41946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) { 41956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 41966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 41976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 41986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 41996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 42006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4201478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik x++; 4202478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 42036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4204478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) { 42056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4210478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 42116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 42166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 42176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 42186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 42196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 42206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings: 42216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 42226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 42236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 42246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 42256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is 42266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could 42276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString". 42286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 42296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 42306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 42316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 42326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 4233478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaComparePreserveCollapseStrings(const xmlChar *x, 4234478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y, 42356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int invert) 42366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 42376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 42386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 42396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 42406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip leading blank chars of the collapsed string. 42416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4242478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4243478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 42446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 4245478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4246478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*y) { 4247478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (! IS_WSP_SPACE_CH(*x)) { 42486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 4249478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * The yv character would have been replaced to 0x20. 42506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4251478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*x - 0x20) < 0) { 42526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 42576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 42626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4263478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik x++; 4264478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 42656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 42666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip contiguous blank chars of the collapsed string. 42676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4268478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4269478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 42706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 4271478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x++ - *y++; 42726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) { 42736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 42786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) { 42796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42836e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 42846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 42856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4286478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) { 42876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 42886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 42896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 42906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 42916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4292478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 42936e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 42946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip trailing blank chars of the collapsed string. 42956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4296478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4297478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 4298478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 42996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 43066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 43076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 43086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 43096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaComparePreserveCollapseStrings: 43106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 43116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 43126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 43136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 43146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x is a string with whitespace of "preserve", @y is 43156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * a string with a whitespace of "collapse". I.e. @x could 43166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * be an "xsd:string" and @y an "xsd:normalizedString". 43176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 43186e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 43196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 43206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 43216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 4322478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareReplaceCollapseStrings(const xmlChar *x, 4323478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y, 43246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int invert) 43256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 43266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 43276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 43286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 43296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip leading blank chars of the collapsed string. 43306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4331478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4332478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 43336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 4334478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4335478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*y) { 4336478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (! IS_WSP_BLANK_CH(*x)) { 43376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 4338478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * The yv character would have been replaced to 0x20. 43396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4340478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*x - 0x20) < 0) { 43416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 43466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4352478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik x++; 4353478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 43546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 43556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip contiguous blank chars of the collapsed string. 43566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4357478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4358478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 43596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 4360478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*x) { 43616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 4362478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * The xv character would have been replaced to 0x20. 43636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4364478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((0x20 - *y) < 0) { 43656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 43706e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43716e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43736e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43746e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4376478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x++ - *y++; 43776e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) 43786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) 43806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 43826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4383478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) { 43846e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43856e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 43866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4389478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 43906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 43916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Skip trailing blank chars of the collapsed string. 43926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 4393478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while IS_WSP_BLANK_CH(*y) 4394478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 4395478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 43966e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (invert) 43976e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 43986e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 43996e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44006e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 44016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 44026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 44036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 44046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 44056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 44066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 44076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareReplacedStrings: 44086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first string value 44096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second string value 44106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 44116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 string for their normalized values. 44126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 44136e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 44146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 44156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 44166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 4417478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareReplacedStrings(const xmlChar *x, 4418478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y) 44196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 44206e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik int tmp; 44216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 4422478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4423478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*y) { 4424478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (! IS_WSP_BLANK_CH(*x)) { 4425478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*x - 0x20) < 0) 44266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 44286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 44306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else { 4431478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if IS_WSP_BLANK_CH(*x) { 4432478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((0x20 - *y) < 0) 44336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 44356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44366e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4437478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x - *y; 44386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp < 0) 44396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (tmp > 0) 44416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 44426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4443478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik x++; 4444478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik y++; 44456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4446478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) 44476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(1); 4448478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) 44496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(-1); 44506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return(0); 44516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 44526e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 44536e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 4454c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaCompareNormStrings: 4455c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @x: a first string value 4456c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @y: a second string value 4457c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 4458c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Compare 2 string for their normalized values. 4459c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 4460c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, and -2 in 4461c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * case of error 4462c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */ 4463c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int 4464478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaCompareNormStrings(const xmlChar *x, 4465478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *y) { 4466c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard int tmp; 4467c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 4468478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*x)) x++; 4469478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*y)) y++; 4470478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while ((*x != 0) && (*y != 0)) { 4471478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (IS_BLANK_CH(*x)) { 4472478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (!IS_BLANK_CH(*y)) { 4473478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x - *y; 4474c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(tmp); 4475c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4476478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*x)) x++; 4477478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*y)) y++; 4478c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 4479478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik tmp = *x++ - *y++; 4480c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (tmp < 0) 4481c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4482c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (tmp > 0) 4483c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(1); 4484c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4485c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4486478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) { 4487478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*x)) x++; 4488478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*x != 0) 4489c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(1); 4490c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4491478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) { 4492478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik while (IS_BLANK_CH(*y)) y++; 4493478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (*y != 0) 4494c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4495c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4496c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(0); 4497c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard} 4498c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 4499c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/** 4500b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * xmlSchemaCompareFloats: 4501b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @x: a first float or double value 4502b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * @y: a second float or double value 4503b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 4504b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Compare 2 values 4505b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * 4506b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 4507b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * case of error 4508b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4509b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillardstatic int 4510b6c7f415b76d24b72119057688056374e7b062bbDaniel VeillardxmlSchemaCompareFloats(xmlSchemaValPtr x, xmlSchemaValPtr y) { 4511b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard double d1, d2; 4512b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4513b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if ((x == NULL) || (y == NULL)) 4514b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 4515b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4516b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 4517b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Cast everything to doubles. 4518b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4519b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->type == XML_SCHEMAS_DOUBLE) 4520b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d1 = x->value.d; 4521b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else if (x->type == XML_SCHEMAS_FLOAT) 4522b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d1 = x->value.f; 4523b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 4524b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 4525b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4526b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (y->type == XML_SCHEMAS_DOUBLE) 4527b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d2 = y->value.d; 4528b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else if (y->type == XML_SCHEMAS_FLOAT) 4529b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard d2 = y->value.f; 4530b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard else 4531b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-2); 4532b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4533b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 4534b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * Check for special cases. 4535b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4536b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d1)) { 4537b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d2)) 4538b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4539b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4540b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4541b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (xmlXPathIsNaN(d2)) 4542b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4543b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == xmlXPathPINF) { 4544b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathPINF) 4545b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4546b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4547b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4548b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathPINF) 4549b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4550b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == xmlXPathNINF) { 4551b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathNINF) 4552b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4553b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4554b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4555b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d2 == xmlXPathNINF) 4556b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4557b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4558b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard /* 4559b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * basic tests, the last one we should have equality, but 4560b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * portability is more important than speed and handling 4561b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard * NaN or Inf in a portable way is always a challenge, so ... 4562b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard */ 4563b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 < d2) 4564b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4565b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 > d2) 4566b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4567b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (d1 == d2) 4568b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4569b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(2); 4570b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard} 4571b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 4572b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard/** 45734255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * xmlSchemaCompareValues: 45744255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @x: a first value 45756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xvalue: the first value as a string (optional) 45766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xwtsp: the whitespace type 45774255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @y: a second value 45786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xvalue: the second value as a string (optional) 45796e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @ywtsp: the whitespace type 45804255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 45814255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Compare 2 values 45824255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 45834efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, 3 if not 45844efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * comparable and -2 in case of error 45854255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 45866e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikstatic int 45876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaCompareValuesInternal(xmlSchemaValType xtype, 45886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr x, 45896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *xvalue, 45906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, 45916c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValType ytype, 45926e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaValPtr y, 45936c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *yvalue, 4594478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaWhitespaceValueType yws) 4595478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{ 45966c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik switch (xtype) { 459780b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UNKNOWN: 45982f2a66324d18afa655d6aa659b2089c36e2c4a92William M. Brack case XML_SCHEMAS_ANYTYPE: 459980b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(-2); 460080b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_INTEGER: 460180b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NPINTEGER: 460280b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NINTEGER: 460380b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NNINTEGER: 460480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_PINTEGER: 460580b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_INT: 460680b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UINT: 460780b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_LONG: 460880b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ULONG: 460980b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_SHORT: 461080b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_USHORT: 461180b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_BYTE: 461280b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_UBYTE: 46134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMAS_DECIMAL: 46146c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 46156c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 46166c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == xtype) 461780b19092f24410a6b869abf519227686e8f207caDaniel Veillard return(xmlSchemaCompareDecimals(x, y)); 46186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((ytype == XML_SCHEMAS_DECIMAL) || 46196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_INTEGER) || 46206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NPINTEGER) || 46216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NINTEGER) || 46226c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NNINTEGER) || 46236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_PINTEGER) || 46246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_INT) || 46256c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_UINT) || 46266c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_LONG) || 46276c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_ULONG) || 46286c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_SHORT) || 46296c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_USHORT) || 46306c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_BYTE) || 46316c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_UBYTE)) 46324255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(xmlSchemaCompareDecimals(x, y)); 46335a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return(-2); 4634070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMAS_DURATION: 46356c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 46366c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 4637478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_DURATION) 4638070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(xmlSchemaCompareDurations(x, y)); 46395a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return(-2); 46405a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_TIME: 46415a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GDAY: 46425a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTH: 46435a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GMONTHDAY: 46445a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEAR: 46455a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_GYEARMONTH: 46465a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATE: 46475a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard case XML_SCHEMAS_DATETIME: 46486c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 46496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 46506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((ytype == XML_SCHEMAS_DATETIME) || 46516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_TIME) || 46526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GDAY) || 46536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GMONTH) || 46546c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GMONTHDAY) || 46556c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GYEAR) || 46566c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_DATE) || 46576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_GYEARMONTH)) 46585a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return (xmlSchemaCompareDates(x, y)); 46595a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return (-2); 46602ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik /* 46612ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * Note that we will support comparison of string types against 46622ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik * anySimpleType as well. 46632ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik */ 46642ee855d0d0b5aff0c20768ebe5afe6601443ee0bKasimier T. Buchcik case XML_SCHEMAS_ANYSIMPLETYPE: 46656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_STRING: 46666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 466780b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_TOKEN: 466880b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_LANGUAGE: 466980b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NMTOKEN: 467080b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NAME: 467180b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_NCNAME: 467280b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ID: 467380b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_IDREF: 467480b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ENTITY: 467580b19092f24410a6b869abf519227686e8f207caDaniel Veillard case XML_SCHEMAS_ANYURI: 46766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik { 46776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *xv, *yv; 46786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 46796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (x == NULL) 46806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xv = xvalue; 46816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik else 46826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xv = x->value.str; 46836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (y == NULL) 46846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik yv = yvalue; 46856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik else 46866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik yv = y->value.str; 46876e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* 46886e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * TODO: Compare those against QName. 46896e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 46906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_QNAME) { 46916e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik TODO 46926c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (y == NULL) 46936c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 46946e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-2); 46956e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 46966c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((ytype == XML_SCHEMAS_ANYSIMPLETYPE) || 46976c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_STRING) || 46986c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NORMSTRING) || 46996c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_TOKEN) || 47006c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_LANGUAGE) || 47016c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NMTOKEN) || 47026c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NAME) || 47036c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_NCNAME) || 47046c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_ID) || 47056c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_IDREF) || 47066c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_ENTITY) || 47076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_ANYURI)) { 47086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 47096e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (xws == XML_SCHEMA_WHITESPACE_PRESERVE) { 47106e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 47116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) { 47126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik /* TODO: What about x < y or x > y. */ 47136c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (xmlStrEqual(xv, yv)) 47146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (0); 47156e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 47166e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (2); 47176e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else if (yws == XML_SCHEMA_WHITESPACE_REPLACE) 47186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaComparePreserveReplaceStrings(xv, yv, 0)); 47196e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) 47206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaComparePreserveCollapseStrings(xv, yv, 0)); 47216e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 47226e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else if (xws == XML_SCHEMA_WHITESPACE_REPLACE) { 47236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 47246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) 47256c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaComparePreserveReplaceStrings(yv, xv, 1)); 47266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_REPLACE) 47276c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaCompareReplacedStrings(xv, yv)); 47286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) 47296c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaCompareReplaceCollapseStrings(xv, yv, 0)); 47306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 47316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else if (xws == XML_SCHEMA_WHITESPACE_COLLAPSE) { 47326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 47336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_PRESERVE) 47346c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaComparePreserveCollapseStrings(yv, xv, 1)); 47356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_REPLACE) 47366c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaCompareReplaceCollapseStrings(yv, xv, 1)); 47376e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (yws == XML_SCHEMA_WHITESPACE_COLLAPSE) 47386c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return (xmlSchemaCompareNormStrings(xv, yv)); 47396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } else 47406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-2); 47416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 47426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 4743c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return (-2); 47446c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik } 4745e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard case XML_SCHEMAS_QNAME: 4746c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NOTATION: 47476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 47486c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 4749c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((ytype == XML_SCHEMAS_QNAME) || 4750c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (ytype == XML_SCHEMAS_NOTATION)) { 4751e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if ((xmlStrEqual(x->value.qname.name, y->value.qname.name)) && 4752e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (xmlStrEqual(x->value.qname.uri, y->value.qname.uri))) 4753e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(0); 4754e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return(2); 4755e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard } 4756e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard return (-2); 4757c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_FLOAT: 4758c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_DOUBLE: 47596c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 47606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 47616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((ytype == XML_SCHEMAS_FLOAT) || 47626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (ytype == XML_SCHEMAS_DOUBLE)) 4763b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (xmlSchemaCompareFloats(x, y)); 4764b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (-2); 4765c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_BOOLEAN: 47666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 47676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 47686c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_BOOLEAN) { 4769b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->value.b == y->value.b) 4770b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(0); 4771b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard if (x->value.b == 0) 4772b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(-1); 4773b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return(1); 4774b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard } 4775b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard return (-2); 4776560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_HEXBINARY: 47776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 47786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 47796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_HEXBINARY) { 478070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard if (x->value.hex.total == y->value.hex.total) { 478170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard int ret = xmlStrcmp(x->value.hex.str, y->value.hex.str); 478270bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard if (ret > 0) 478370bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(1); 478470bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard else if (ret == 0) 478570bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(0); 478670bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 478770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard else if (x->value.hex.total > y->value.hex.total) 478870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(1); 478970bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard 479070bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard return(-1); 479170bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 4792560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return (-2); 47931ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard case XML_SCHEMAS_BASE64BINARY: 47946c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 47956c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-2); 47966c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ytype == XML_SCHEMAS_BASE64BINARY) { 47971ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (x->value.base64.total == y->value.base64.total) { 47981ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard int ret = xmlStrcmp(x->value.base64.str, 47991ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard y->value.base64.str); 48001ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard if (ret > 0) 48011ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(1); 48021ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (ret == 0) 48031ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(0); 4804d369b1387e592791049a41eb4cc16046fe52e985Daniel Veillard else 4805d369b1387e592791049a41eb4cc16046fe52e985Daniel Veillard return(-1); 48061ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 48071ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if (x->value.base64.total > y->value.base64.total) 48081ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(1); 48091ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else 48101ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard return(-1); 48111ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard } 48126e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-2); 4813c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_IDREFS: 4814c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_ENTITIES: 4815c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard case XML_SCHEMAS_NMTOKENS: 4816c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard TODO 4817c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 48184255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 48195a872413fd58df3095979521d9a03ad03cab73a5Daniel Veillard return -2; 48204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 48214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 48224255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard/** 48236e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValues: 48246e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first value 48256e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second value 48266e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 48276e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values 48286e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 48296e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 48306e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 48316e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 48326e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint 48336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) { 48346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, yws; 48356e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 48365e094143e423c01739ac9221f371846fd290be4eDaniel Veillard if ((x == NULL) || (y == NULL)) 48375e094143e423c01739ac9221f371846fd290be4eDaniel Veillard return(-2); 48386e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (x->type == XML_SCHEMAS_STRING) 48396e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xws = XML_SCHEMA_WHITESPACE_PRESERVE; 48406e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else if (x->type == XML_SCHEMAS_NORMSTRING) 48416e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xws = XML_SCHEMA_WHITESPACE_REPLACE; 48426e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 48436e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik xws = XML_SCHEMA_WHITESPACE_COLLAPSE; 48446e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 48456e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (y->type == XML_SCHEMAS_STRING) 48466e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik yws = XML_SCHEMA_WHITESPACE_PRESERVE; 48476e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else if (x->type == XML_SCHEMAS_NORMSTRING) 48486e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik yws = XML_SCHEMA_WHITESPACE_REPLACE; 48496e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik else 48506e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik yws = XML_SCHEMA_WHITESPACE_COLLAPSE; 48516e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 48526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type, 48536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik y, NULL, yws)); 48546e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 48556e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 48566e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 48576e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaCompareValuesWhtsp: 48586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @x: a first value 48596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @xws: the whitespace value of x 48606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @y: a second value 48616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @yws: the whitespace value of y 48626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 48636e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Compare 2 values 48646e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 48656e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 48666e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * case of error 48676e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 48686e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint 48696e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. BuchcikxmlSchemaCompareValuesWhtsp(xmlSchemaValPtr x, 48706c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, 48716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr y, 48726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType yws) 48736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{ 48749dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik if ((x == NULL) || (y == NULL)) 48759dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik return(-2); 48766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaCompareValuesInternal(x->type, x, NULL, xws, y->type, 48776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik y, NULL, yws)); 48786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik} 48796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 48806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/** 48816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaCompareValuesWhtspExt: 48826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @x: a first value 48836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @xws: the whitespace value of x 48846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @y: a second value 48856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @yws: the whitespace value of y 48866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 48876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Compare 2 values 48886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 48896c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in 48906c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * case of error 48916c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 48926c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikstatic int 48936c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaCompareValuesWhtspExt(xmlSchemaValType xtype, 48946c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr x, 48956c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *xvalue, 48966c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType xws, 48976c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValType ytype, 48986c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr y, 48996c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *yvalue, 49006c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType yws) 49016c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{ 49026c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaCompareValuesInternal(xtype, x, xvalue, xws, ytype, y, 49036c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik yvalue, yws)); 49046e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 49056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 49066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 4907c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * xmlSchemaNormLen: 4908c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * @value: a string 4909c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 4910c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Computes the UTF8 length of the normalized value of the string 4911c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * 4912c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard * Returns the length or -1 in case of error. 4913c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard */ 4914c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillardstatic int 4915c4c215519fae43487ab55bbe1f923646af40d306Daniel VeillardxmlSchemaNormLen(const xmlChar *value) { 4916c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard const xmlChar *utf; 4917c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard int ret = 0; 4918c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 4919c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (value == NULL) 4920c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4921c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf = value; 492276e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf)) utf++; 4923c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard while (*utf != 0) { 4924c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (utf[0] & 0x80) { 4925c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[1] & 0xc0) != 0x80) 4926c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4927c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xe0) == 0xe0) { 4928c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[2] & 0xc0) != 0x80) 4929c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4930c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xf0) == 0xf0) { 4931c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if ((utf[0] & 0xf8) != 0xf0 || (utf[3] & 0xc0) != 0x80) 4932c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(-1); 4933c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 4; 4934c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 4935c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 3; 4936c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4937c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 4938c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf += 2; 4939c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 494076e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack } else if (IS_BLANK_CH(*utf)) { 494176e95df05556c9610b564b14cf578c8f9e34c9c1William M. Brack while (IS_BLANK_CH(*utf)) utf++; 4942c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard if (*utf == 0) 4943c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard break; 4944c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } else { 4945c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard utf++; 4946c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4947c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard ret++; 4948c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard } 4949c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard return(ret); 4950c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard} 4951c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard 49526927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard/** 49536927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaGetFacetValueAsULong: 49546927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * @facet: an schemas type facet 49556927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * 49566927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Extract the value of a facet 49576927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * 49586927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * Returns the value as a long 49596927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard */ 4960c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillardunsigned long 4961c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel VeillardxmlSchemaGetFacetValueAsULong(xmlSchemaFacetPtr facet) 4962c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{ 4963c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard /* 4964c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * TODO: Check if this is a decimal. 4965c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 4966094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack if (facet == NULL) 4967094dd86c130f3ffb7ec9bc47bb0ed711e0f68994William M. Brack return 0; 4968c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return ((unsigned long) facet->val->value.decimal.lo); 4969c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 4970c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 4971c4c215519fae43487ab55bbe1f923646af40d306Daniel Veillard/** 497201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateListSimpleTypeFacet: 497301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @facet: the facet to check 497401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @value: the lexical repr of the value to validate 497501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @actualLen: the number of list items 497601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * @expectedLen: the resulting expected number of list items 497701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 497801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Checks the value of a list simple type against a facet. 497901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * 498001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * Returns 0 if the value is valid, a positive error code 498101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * number otherwise and -1 in case of an internal error. 498201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 498301fa6156e51259229470f40619af93e915b4bc94Daniel Veillardint 498401fa6156e51259229470f40619af93e915b4bc94Daniel VeillardxmlSchemaValidateListSimpleTypeFacet(xmlSchemaFacetPtr facet, 498501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard const xmlChar *value, 498601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard unsigned long actualLen, 498701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard unsigned long *expectedLen) 498801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard{ 4989ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard if (facet == NULL) 4990ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard return(-1); 499101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 499201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * TODO: Check if this will work with large numbers. 499301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * (compare value.decimal.mi and value.decimal.hi as well?). 499401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 499501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 499601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen != facet->val->value.decimal.lo) { 4997478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (expectedLen != NULL) 4998c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 499901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_LENGTH_VALID); 500001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 500101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 500201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen < facet->val->value.decimal.lo) { 5003478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (expectedLen != NULL) 5004c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 500501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_MINLENGTH_VALID); 500601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 500701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MAXLENGTH) { 500801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard if (actualLen > facet->val->value.decimal.lo) { 5009478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (expectedLen != NULL) 5010c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *expectedLen = facet->val->value.decimal.lo; 501101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (XML_SCHEMAV_CVC_MAXLENGTH_VALID); 501201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } 501301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard } else 501401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 501501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * NOTE: That we can pass NULL as xmlSchemaValPtr to 501601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * xmlSchemaValidateFacet, since the remaining facet types 501701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * are: XML_SCHEMA_FACET_PATTERN, XML_SCHEMA_FACET_ENUMERATION. 501801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 501901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(xmlSchemaValidateFacet(NULL, facet, value, NULL)); 502001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return (0); 502101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard} 502201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard 502301fa6156e51259229470f40619af93e915b4bc94Daniel Veillard/** 50246927b10615d4f48fbc3fa0f3b114890275488991Daniel Veillard * xmlSchemaValidateLengthFacet: 5025c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @type: the built-in type 5026c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @facet: the facet to check 5027c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @value: the lexical repr. of the value to be validated 5028c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @val: the precomputed value 5029478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value 5030c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * @length: the actual length of the value 5031c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 5032c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Checka a value against a "length", "minLength" and "maxLength" 5033c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * facet; sets @length to the computed length of @value. 5034c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * 5035c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * Returns 0 if the value is valid, a positive error code 5036c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard * otherwise and -1 in case of an internal or API error. 5037c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard */ 5038478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikstatic int 5039478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacetInternal(xmlSchemaFacetPtr facet, 5040478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaTypeType valType, 5041478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *value, 5042478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 5043478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik unsigned long *length, 5044478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 5045c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard{ 5046c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard unsigned int len = 0; 5047c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 5048478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((length == NULL) || (facet == NULL)) 5049ce682bc24b79f1dd29b781d4c17f9bf169ce7e32Daniel Veillard return (-1); 5050c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *length = 0; 5051c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((facet->type != XML_SCHEMA_FACET_LENGTH) && 5052c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->type != XML_SCHEMA_FACET_MAXLENGTH) && 5053c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->type != XML_SCHEMA_FACET_MINLENGTH)) 5054c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return (-1); 5055c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 5056478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5057478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: length, maxLength and minLength must be of type 5058478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * nonNegativeInteger only. Check if decimal is used somehow. 5059478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5060c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((facet->val == NULL) || 5061c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard ((facet->val->type != XML_SCHEMAS_DECIMAL) && 5062c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 5063c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard (facet->val->value.decimal.frac != 0)) { 5064c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(-1); 5065c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 5066c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) 5067c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard len = val->value.hex.total; 5068c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY)) 5069c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard len = val->value.base64.total; 5070c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard else { 5071478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik switch (valType) { 5072478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_STRING: 5073c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NORMSTRING: 5074478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { 5075478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5076478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * This is to ensure API compatibility with the old 5077478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateLengthFacet(). Anyway, this was and 5078478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * is not the correct handling. 5079478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: Get rid of this case somehow. 5080478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5081478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (valType == XML_SCHEMAS_STRING) 5082478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlUTF8Strlen(value); 5083478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5084478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5085478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } else if (value != NULL) { 5086478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 5087478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5088478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5089478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5090478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Should be OK for "preserve" as well. 5091478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5092478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlUTF8Strlen(value); 5093478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } 5094478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 5095478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 5096c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_TOKEN: 5097c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_LANGUAGE: 5098c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NMTOKEN: 5099c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NAME: 5100c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_NCNAME: 5101bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik case XML_SCHEMAS_ID: 5102bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik /* 5103bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik * FIXME: What exactly to do with anyURI? 5104478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5105c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard case XML_SCHEMAS_ANYURI: 5106c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (value != NULL) 5107478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5108c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard break; 5109bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik case XML_SCHEMAS_QNAME: 5110bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik case XML_SCHEMAS_NOTATION: 5111bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik /* 51124efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * For QName and NOTATION, those facets are 51134efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik * deprecated and should be ignored. 5114bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik */ 5115bd6c3f7df8fe63f5adc03a3c45a7eb2e834fde47Kasimier T. Buchcik return (0); 5116c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard default: 5117c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard TODO 5118c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 5119c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 5120c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard *length = (unsigned long) len; 5121478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5122478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: Return the whole expected value, i.e. "lo", "mi" and "hi". 5123478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5124c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 5125c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len != facet->val->value.decimal.lo) 5126c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_LENGTH_VALID); 5127c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 5128c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len < facet->val->value.decimal.lo) 5129c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_MINLENGTH_VALID); 5130c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } else { 5131c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard if (len > facet->val->value.decimal.lo) 5132c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return(XML_SCHEMAV_CVC_MAXLENGTH_VALID); 5133c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard } 5134c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 5135c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard return (0); 5136c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard} 5137c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard 5138c0826a7709eddbf10ade02f0ce80e5d077ac05f6Daniel Veillard/** 5139478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateLengthFacet: 5140478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @type: the built-in type 5141478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @facet: the facet to check 5142478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @value: the lexical repr. of the value to be validated 5143478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @val: the precomputed value 5144478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @length: the actual length of the value 5145478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * 5146478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Checka a value against a "length", "minLength" and "maxLength" 5147478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * facet; sets @length to the computed length of @value. 5148478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * 5149478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Returns 0 if the value is valid, a positive error code 5150478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * otherwise and -1 in case of an internal or API error. 5151478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5152478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikint 5153478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacet(xmlSchemaTypePtr type, 5154478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaFacetPtr facet, 5155478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *value, 5156478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 5157478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik unsigned long *length) 5158478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{ 5159cc5e2330ef2432493afce6566d3651195366d822Daniel Veillard if (type == NULL) 5160cc5e2330ef2432493afce6566d3651195366d822Daniel Veillard return(-1); 5161478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (xmlSchemaValidateLengthFacetInternal(facet, 5162478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik type->builtInType, value, val, length, 5163478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN)); 5164478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik} 5165478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik 5166478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik/** 5167478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateLengthFacetWhtsp: 5168478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @facet: the facet to check 5169478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @valType: the built-in type 5170478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @value: the lexical repr. of the value to be validated 5171478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @val: the precomputed value 5172478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value 5173478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @length: the actual length of the value 5174478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * 5175478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Checka a value against a "length", "minLength" and "maxLength" 5176478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * facet; sets @length to the computed length of @value. 5177478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * 5178478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Returns 0 if the value is valid, a positive error code 5179478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * otherwise and -1 in case of an internal or API error. 5180478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5181478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcikint 5182478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValidateLengthFacetWhtsp(xmlSchemaFacetPtr facet, 5183478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValType valType, 5184478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik const xmlChar *value, 5185478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 5186478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik unsigned long *length, 5187478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 5188478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{ 5189478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (xmlSchemaValidateLengthFacetInternal(facet, valType, value, val, 5190478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik length, ws)); 5191478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik} 5192478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik 5193478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik/** 51946c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetInternal: 51954255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @facet: the facet to check 5196478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @fws: the whitespace type of the facet's value 5197478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @valType: the built-in type of the value 51984255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @value: the lexical repr of the value to validate 51994255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * @val: the precomputed value 5200478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * @ws: the whitespace type of the value 52014255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 52024255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Check a value against a facet condition 52034255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * 52044255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * Returns 0 if the element is schemas valid, a positive error code 52054255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard * number otherwise and -1 in case of internal or API error. 52064255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard */ 52076c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikstatic int 52086c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaValidateFacetInternal(xmlSchemaFacetPtr facet, 52096c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType fws, 5210478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValType valType, 52116c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *value, 5212478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 52136c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 52144255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard{ 52154255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard int ret; 52164255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 52176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (facet == NULL) 52186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-1); 52196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 52204255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard switch (facet->type) { 52214255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMA_FACET_PATTERN: 52226c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik /* 52236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * NOTE that for patterns, the @value needs to be the normalized 52246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * value, *not* the lexical initial value or the canonical value. 52256c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 52266c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (value == NULL) 52276c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-1); 52284255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = xmlRegexpExec(facet->regexp, value); 52294255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == 1) 52304255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 52316c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == 0) 523201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_PATTERN_VALID); 52334255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(ret); 52344255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard case XML_SCHEMA_FACET_MAXEXCLUSIVE: 52354255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 52366c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 52374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(-1); 52384255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard if (ret == -1) 52394255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 524001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXEXCLUSIVE_VALID); 5241070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MAXINCLUSIVE: 5242070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 52436c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 5244070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 5245070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret == -1) || (ret == 0)) 5246070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 524701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXINCLUSIVE_VALID); 5248070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MINEXCLUSIVE: 5249070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 52506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 5251070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 5252070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if (ret == 1) 5253070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 525401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MINEXCLUSIVE_VALID); 5255070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard case XML_SCHEMA_FACET_MININCLUSIVE: 5256070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard ret = xmlSchemaCompareValues(val, facet->val); 52576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 5258070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(-1); 5259070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard if ((ret == 1) || (ret == 0)) 5260070803b315fa3a5b1167bdda5a2d247bcc526ed2Daniel Veillard return(0); 526101fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MININCLUSIVE_VALID); 52628651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard case XML_SCHEMA_FACET_WHITESPACE: 52638bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard /* TODO whitespaces */ 526401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard /* 526501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * NOTE: Whitespace should be handled to normalize 526601fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * the value to be validated against a the facets; 526701fa6156e51259229470f40619af93e915b4bc94Daniel Veillard * not to normalize the value in-between. 526801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard */ 52698651f5365c182ce5c52fe1cdc2b9d72b2ecc34e2Daniel Veillard return(0); 52708bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_ENUMERATION: 5271478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { 5272478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5273478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * This is to ensure API compatibility with the old 5274478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateFacet(). 5275478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: Get rid of this case. 5276478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 52776c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if ((facet->value != NULL) && 52786c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik (xmlStrEqual(facet->value, value))) 52796c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(0); 52806c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik } else { 52816c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik ret = xmlSchemaCompareValuesWhtspExt(facet->val->type, 52826c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik facet->val, facet->value, fws, valType, val, 52836c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik value, ws); 52846c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == -2) 52856c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(-1); 52866c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik if (ret == 0) 52876c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(0); 52886c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik } 528901fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_ENUMERATION_VALID); 52908bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_LENGTH: 5291aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik /* 5292aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik * SPEC (1.3) "if {primitive type definition} is QName or NOTATION, 5293aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik * then any {value} is facet-valid." 5294aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik */ 5295aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik if ((valType == XML_SCHEMAS_QNAME) || 5296aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik (valType == XML_SCHEMAS_NOTATION)) 5297aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik return (0); 5298aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik /* No break on purpose. */ 5299e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard case XML_SCHEMA_FACET_MAXLENGTH: 53008bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard case XML_SCHEMA_FACET_MINLENGTH: { 53018bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard unsigned int len = 0; 5302e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard 53034efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik if ((valType == XML_SCHEMAS_QNAME) || 53044efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik (valType == XML_SCHEMAS_NOTATION)) 53054efd90d9c3629354fdf404a30f7fdd66f3d7af05Kasimier T. Buchcik return (0); 5306478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5307478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: length, maxLength and minLength must be of type 5308478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * nonNegativeInteger only. Check if decimal is used somehow. 5309478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 53108bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard if ((facet->val == NULL) || 5311e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard ((facet->val->type != XML_SCHEMAS_DECIMAL) && 5312e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 53138bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard (facet->val->value.decimal.frac != 0)) { 53148bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard return(-1); 53158bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 5316560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((val != NULL) && (val->type == XML_SCHEMAS_HEXBINARY)) 531770bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard len = val->value.hex.total; 53181ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else if ((val != NULL) && (val->type == XML_SCHEMAS_BASE64BINARY)) 53191ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard len = val->value.base64.total; 53201ac24d36b12487995b659a8fc23a02b9460edb36Daniel Veillard else { 53216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik switch (valType) { 5322478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_STRING: 5323478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 5324478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_UNKNOWN) { 5325478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5326478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * This is to ensure API compatibility with the old 5327478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * xmlSchemaValidateFacet(). Anyway, this was and 5328478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * is not the correct handling. 5329478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * TODO: Get rid of this case somehow. 5330478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5331478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (valType == XML_SCHEMAS_STRING) 5332478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlUTF8Strlen(value); 5333478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5334478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5335478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } else if (value != NULL) { 5336478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 5337478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5338478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5339478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik /* 5340478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Should be OK for "preserve" as well. 5341478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik */ 5342478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlUTF8Strlen(value); 5343478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } 5344478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 5345478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 5346560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_TOKEN: 5347560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_LANGUAGE: 5348560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NMTOKEN: 5349560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NAME: 5350560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_NCNAME: 5351560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMAS_ID: 535201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard case XML_SCHEMAS_ANYURI: 5353478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (value != NULL) 5354478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik len = xmlSchemaNormLen(value); 5355478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 5356560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard default: 5357560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard TODO 535870bcb0ea2464e1619f54dc56334b043767d793dcDaniel Veillard } 53598bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 53608bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard if (facet->type == XML_SCHEMA_FACET_LENGTH) { 5361e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len != facet->val->value.decimal.lo) 536201fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_LENGTH_VALID); 53638bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_MINLENGTH) { 5364e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len < facet->val->value.decimal.lo) 536501fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MINLENGTH_VALID); 53668bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } else { 5367e637c4ad2e5c5422393f76b5be5ddb9ebe3755e2Daniel Veillard if (len > facet->val->value.decimal.lo) 536801fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_MAXLENGTH_VALID); 5369e19fc23b6427f4df516af7b3f6df7baa942e4207Daniel Veillard } 53708bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard break; 53718bc6cf9a80cdba7f060b5bcb20f82572270af727Daniel Veillard } 5372560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMA_FACET_TOTALDIGITS: 5373560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard case XML_SCHEMA_FACET_FRACTIONDIGITS: 5374560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 5375560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((facet->val == NULL) || 537669dea3a0c01e8a952b1d2f07ab0a3aa450f0cdfeKasimier T. Buchcik ((facet->val->type != XML_SCHEMAS_PINTEGER) && 5377560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (facet->val->type != XML_SCHEMAS_NNINTEGER)) || 5378560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (facet->val->value.decimal.frac != 0)) { 5379560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return(-1); 5380560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 5381560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if ((val == NULL) || 5382560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard ((val->type != XML_SCHEMAS_DECIMAL) && 5383560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_INTEGER) && 5384560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NPINTEGER) && 5385560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NINTEGER) && 5386560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_NNINTEGER) && 5387560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_PINTEGER) && 5388560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_INT) && 5389560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_UINT) && 5390560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_LONG) && 5391560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_ULONG) && 5392560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_SHORT) && 5393560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_USHORT) && 5394560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_BYTE) && 5395560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard (val->type != XML_SCHEMAS_UBYTE))) { 5396560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard return(-1); 5397560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 5398560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (facet->type == XML_SCHEMA_FACET_TOTALDIGITS) { 5399560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (val->value.decimal.total > facet->val->value.decimal.lo) 540001fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_TOTALDIGITS_VALID); 5401560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard 5402560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } else if (facet->type == XML_SCHEMA_FACET_FRACTIONDIGITS) { 5403560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard if (val->value.decimal.frac > facet->val->value.decimal.lo) 540401fa6156e51259229470f40619af93e915b4bc94Daniel Veillard return(XML_SCHEMAV_CVC_FRACTIONDIGITS_VALID); 5405560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard } 5406560c2a441bf27f5b9d55252a70f3d5952d9ae351Daniel Veillard break; 54074255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard default: 54084255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard TODO 54094255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard } 54104255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard return(0); 5411b6c7f415b76d24b72119057688056374e7b062bbDaniel Veillard 54124255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard} 54134255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard 54146e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik/** 54156c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacet: 54166c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @base: the base type 54176c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @facet: the facet to check 54186c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @value: the lexical repr of the value to validate 54196c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @val: the precomputed value 54206c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 54216c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Check a value against a facet condition 54226c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 54236c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns 0 if the element is schemas valid, a positive error code 54246c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * number otherwise and -1 in case of internal or API error. 54256c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 54266c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikint 54279dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. BuchcikxmlSchemaValidateFacet(xmlSchemaTypePtr base, 54286c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaFacetPtr facet, 54296c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *value, 54306c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaValPtr val) 54316c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{ 54326c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik /* 54336c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * This tries to ensure API compatibility regarding the old 54346c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacet() and the new xmlSchemaValidateFacetInternal() and 54356c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetWhtsp(). 54366c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 54379dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik if (val != NULL) 54386c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaValidateFacetInternal(facet, 54399dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN, val->type, value, val, 54406c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN)); 54419dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik else if (base != NULL) 54426c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaValidateFacetInternal(facet, 54439dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN, base->builtInType, value, val, 5444478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik XML_SCHEMA_WHITESPACE_UNKNOWN)); 54459dbb0ceacaff0e59e4f3085387c4a44d6dbd14e5Kasimier T. Buchcik return(-1); 54466c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik} 54476c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 54486c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/** 54496c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * xmlSchemaValidateFacetWhtsp: 54506c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @facet: the facet to check 54516c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @fws: the whitespace type of the facet's value 54526c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @valType: the built-in type of the value 54536c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @value: the lexical (or normalized for pattern) repr of the value to validate 54546c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @val: the precomputed value 54556c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * @ws: the whitespace type of the value 54566c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 54576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Check a value against a facet condition. This takes value normalization 54586c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * according to the specified whitespace types into account. 54596c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Note that @value needs to be the *normalized* value if the facet 54606c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * is of type "pattern". 54616c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * 54626c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * Returns 0 if the element is schemas valid, a positive error code 54636c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik * number otherwise and -1 in case of internal or API error. 54646c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik */ 54656c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcikint 54666c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. BuchcikxmlSchemaValidateFacetWhtsp(xmlSchemaFacetPtr facet, 54676c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType fws, 5468478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValType valType, 54696c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik const xmlChar *value, 5470478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik xmlSchemaValPtr val, 54716c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 54726c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik{ 54736c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik return(xmlSchemaValidateFacetInternal(facet, fws, valType, 5474478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik value, val, ws)); 54756c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik} 54766c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik 5477c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#if 0 5478c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifndef DBL_DIG 5479c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define DBL_DIG 16 5480c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif 5481c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#ifndef DBL_EPSILON 5482c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define DBL_EPSILON 1E-9 5483c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif 5484c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5485c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define INTEGER_DIGITS DBL_DIG 5486c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define FRACTION_DIGITS (DBL_DIG + 1) 5487c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#define EXPONENT_DIGITS (3 + 2) 5488c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5489c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik/** 5490c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * xmlXPathFormatNumber: 5491c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @number: number to format 5492c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @buffer: output buffer 5493c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @buffersize: size of output buffer 5494c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 5495c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Convert the number into a string representation. 5496c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5497c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcikstatic void 5498c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. BuchcikxmlSchemaFormatFloat(double number, char buffer[], int buffersize) 5499c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik{ 5500c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik switch (xmlXPathIsInf(number)) { 5501c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case 1: 5502c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (buffersize > (int)sizeof("INF")) 5503c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buffer, buffersize, "INF"); 5504c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5505c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case -1: 5506c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (buffersize > (int)sizeof("-INF")) 5507c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buffer, buffersize, "-INF"); 5508c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5509c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik default: 5510c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (xmlXPathIsNaN(number)) { 5511c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (buffersize > (int)sizeof("NaN")) 5512c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buffer, buffersize, "NaN"); 5513c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else if (number == 0) { 5514c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buffer, buffersize, "0.0E0"); 5515c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5516c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 3 is sign, decimal point, and terminating zero */ 5517c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char work[DBL_DIG + EXPONENT_DIGITS + 3]; 5518c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int integer_place, fraction_place; 5519c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char *ptr; 5520c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char *after_fraction; 5521c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik double absolute_value; 5522c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int size; 5523c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5524c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik absolute_value = fabs(number); 5525c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5526c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5527c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Result is in work, and after_fraction points 5528c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * just past the fractional part. 5529c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Use scientific notation 5530c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5531c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik integer_place = DBL_DIG + EXPONENT_DIGITS + 1; 5532c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik fraction_place = DBL_DIG - 1; 5533c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(work, sizeof(work),"%*.*e", 5534c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik integer_place, fraction_place, number); 5535c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik after_fraction = strchr(work + DBL_DIG, 'e'); 5536c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Remove fractional trailing zeroes */ 5537c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik ptr = after_fraction; 5538c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik while (*(--ptr) == '0') 5539c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik ; 5540c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (*ptr != '.') 5541c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik ptr++; 5542c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik while ((*ptr++ = *after_fraction++) != 0); 5543c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5544c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Finally copy result back to caller */ 5545c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik size = strlen(work) + 1; 5546c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (size > buffersize) { 5547c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik work[buffersize - 1] = 0; 5548c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik size = buffersize; 5549c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5550c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik memmove(buffer, work, size); 5551c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5552c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5553c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5554c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik} 5555c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik#endif 5556c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 55576c81d0ea8dcb47a8ca15796daa764ff883d985d8Kasimier T. Buchcik/** 55586e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * xmlSchemaGetCanonValue: 55596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @val: the precomputed value 55606e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * @retValue: the returned value 55616e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 5562478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * Get a the cononical lexical representation of the value. 5563c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * The caller has to FREE the returned retValue. 5564c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 5565478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * WARNING: Some value types are not supported yet, resulting 5566478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik * in a @retValue of "???". 5567c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 5568c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: XML Schema 1.0 does not define canonical representations 5569c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * for: duration, gYearMonth, gYear, gMonthDay, gMonth, gDay, 5570c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * anyURI, QName, NOTATION. This will be fixed in XML Schema 1.1. 5571c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 55726e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik * 5573c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Returns 0 if the value could be built, 1 if the value type is 5574c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * not supported yet and -1 in case of API errors. 55756e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik */ 55766e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcikint 5577b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel VeillardxmlSchemaGetCanonValue(xmlSchemaValPtr val, const xmlChar **retValue) 55786e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik{ 5579b5839c3b57f7d130cbbe112a83e4dadb292c3dc8Daniel Veillard if ((retValue == NULL) || (val == NULL)) 55806e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik return (-1); 55816e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik *retValue = NULL; 55826e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik switch (val->type) { 5583478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_STRING: 5584478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (val->value.str == NULL) 5585478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); 5586478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else 5587478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = 5588478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik BAD_CAST xmlStrdup((const xmlChar *) val->value.str); 5589478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 55906e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 5591478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (val->value.str == NULL) 5592478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); 5593478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik else { 5594478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = xmlSchemaWhiteSpaceReplace( 5595478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik (const xmlChar *) val->value.str); 5596478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if ((*retValue) == NULL) 5597478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup( 5598478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik (const xmlChar *) val->value.str); 5599478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } 5600478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 56016e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_TOKEN: 56026e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_LANGUAGE: 56036e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NMTOKEN: 5604478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_NAME: 56056e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_NCNAME: 56066e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_ID: 56076e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_IDREF: 56086e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik case XML_SCHEMAS_ENTITY: 5609c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NOTATION: /* Unclear */ 5610c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_ANYURI: /* Unclear */ 56116e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik if (val->value.str == NULL) 5612478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (-1); 5613aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik *retValue = 5614aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik BAD_CAST xmlSchemaCollapseString(BAD_CAST val->value.str); 5615aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik if (*retValue == NULL) 5616aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik *retValue = 5617aba15f7670990df4aeedf9b8301c0f43fade5f58Kasimier T. Buchcik BAD_CAST xmlStrdup((const xmlChar *) val->value.str); 5618478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 5619478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik case XML_SCHEMAS_QNAME: 5620c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0. */ 5621478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik if (val->value.qname.uri == NULL) { 5622478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.qname.name); 5623478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (0); 5624478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } else { 5625478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST "{"); 5626478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), 5627478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik BAD_CAST val->value.qname.uri); 5628478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), 5629478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik BAD_CAST "}"); 5630478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrcat((xmlChar *) (*retValue), 5631478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik BAD_CAST val->value.qname.uri); 5632478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik } 5633478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik break; 5634c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DECIMAL: 5635c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5636c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Lookout for a more simple implementation. 5637c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5638c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((val->value.decimal.total == 1) && 5639c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (val->value.decimal.lo == 0)) { 5640c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlStrdup(BAD_CAST "0.0"); 5641c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5642c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValDecimal dec = val->value.decimal; 5643c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int bufsize; 5644c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char *buf = NULL, *offs; 5645c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5646c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Add room for the decimal point as well. */ 5647c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik bufsize = dec.total + 2; 5648c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5649c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik bufsize++; 5650c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Add room for leading/trailing zero. */ 5651c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((dec.frac == 0) || (dec.frac == dec.total)) 5652c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik bufsize++; 5653c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik buf = xmlMalloc(bufsize); 5654c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik offs = buf; 5655c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5656c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs++ = '-'; 5657c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.frac == dec.total) { 5658c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs++ = '0'; 5659c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs++ = '.'; 5660c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5661c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.hi != 0) 5662c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(offs, bufsize - (offs - buf), 5663c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu%lu%lu", dec.hi, dec.mi, dec.lo); 5664c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else if (dec.mi != 0) 5665c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(offs, bufsize - (offs - buf), 5666c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu%lu", dec.mi, dec.lo); 5667c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5668c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(offs, bufsize - (offs - buf), 5669c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu", dec.lo); 5670c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5671c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.frac != 0) { 5672c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.frac != dec.total) { 5673c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int diff = dec.total - dec.frac; 5674c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5675c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Insert the decimal point. 5676c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5677c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik memmove(offs + diff + 1, offs + diff, dec.frac +1); 5678c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik offs[diff] = '.'; 5679c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5680c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik unsigned int i = 0; 5681c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5682c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Insert missing zeroes behind the decimal point. 5683c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5684c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik while (*(offs + i) != 0) 5685c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik i++; 5686c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (i < dec.total) { 5687c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik memmove(offs + (dec.total - i), offs, i +1); 5688c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik memset(offs, '0', dec.total - i); 5689c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5690c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5691c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5692c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5693c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Append decimal point and zero. 5694c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5695c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik offs = buf + bufsize - 1; 5696c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs-- = 0; 5697c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs-- = '0'; 5698c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *offs-- = '.'; 5699c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5700c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST buf; 5701c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5702c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5703c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_INTEGER: 5704c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_PINTEGER: 5705c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NPINTEGER: 5706c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NINTEGER: 5707c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NNINTEGER: 5708c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_LONG: 5709c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_BYTE: 5710c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_SHORT: 5711c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_INT: 5712c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_UINT: 5713c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_ULONG: 5714c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_USHORT: 5715c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_UBYTE: 5716c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((val->value.decimal.total == 1) && 5717c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (val->value.decimal.lo == 0)) 5718c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlStrdup(BAD_CAST "0"); 5719c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else { 5720c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValDecimal dec = val->value.decimal; 5721c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik int bufsize = dec.total + 1; 5722c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5723c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* Add room for the decimal point as well. */ 5724c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5725c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik bufsize++; 5726c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlMalloc(bufsize); 5727c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.hi != 0) { 5728c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5729c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, 5730c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "-%lu%lu%lu", dec.hi, dec.mi, dec.lo); 5731c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5732c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, 5733c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu%lu%lu", dec.hi, dec.mi, dec.lo); 5734c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else if (dec.mi != 0) { 5735c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5736c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, 5737c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "-%lu%lu", dec.mi, dec.lo); 5738c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5739c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, 5740c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%lu%lu", dec.mi, dec.lo); 5741c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5742c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (dec.sign) 5743c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, "-%lu", dec.lo); 5744c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5745c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, bufsize, "%lu", dec.lo); 5746c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5747c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5748c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5749c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_BOOLEAN: 5750c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.b) 5751c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST "true"); 5752c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5753c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST "false"); 5754c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5755c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DURATION: { 5756c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[100]; 5757c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik unsigned long year; 5758c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik unsigned long mon, day, hour = 0, min = 0; 5759c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik double sec = 0, left; 5760c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5761c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5762c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5763c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: This results in a normalized output of the value 5764c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * - which is NOT conformant to the spec - 5765c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * since the exact values of each property are not 5766c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * recoverable. Think about extending the structure to 5767c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * provide a field for every property. 5768c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5769c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik year = (unsigned long) FQUOTIENT(labs(val->value.dur.mon), 12); 5770c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik mon = labs(val->value.dur.mon) - 12 * year; 5771c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5772c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik day = (unsigned long) FQUOTIENT(fabs(val->value.dur.sec), 86400); 5773c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik left = fabs(val->value.dur.sec) - day * 86400; 5774c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (left > 0) { 5775c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik hour = (unsigned long) FQUOTIENT(left, 3600); 5776c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik left = left - (hour * 3600); 5777c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (left > 0) { 5778c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik min = (unsigned long) FQUOTIENT(left, 60); 5779c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik sec = left - (min * 60); 5780c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5781c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5782c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((val->value.dur.mon < 0) || (val->value.dur.sec < 0)) 5783c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 100, "P%luY%luM%luDT%luH%luM%.14gS", 5784c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik year, mon, day, hour, min, sec); 5785c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5786c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 100, "-P%luY%luM%luDT%luH%luM%.14gS", 5787c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik year, mon, day, hour, min, sec); 5788c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5789c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5790c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5791c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GYEAR: { 5792c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[30]; 5793c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5794c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5795c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, "%04ld", val->value.date.year); 5796c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5797c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5798c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5799c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GMONTH: { 5800c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5801c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5802c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlMalloc(5); 5803c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, 6, "--%02u", 5804c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.mon); 5805c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5806c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5807c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GDAY: { 5808c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5809c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5810c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlMalloc(6); 5811c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, 6, "---%02u", 5812c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.day); 5813c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5814c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5815c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GMONTHDAY: { 5816c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5817c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5818c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlMalloc(8); 5819c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf((char *) *retValue, 8, "--%02u-%02u", 5820c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.mon, val->value.date.day); 5821c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5822c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5823c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_GYEARMONTH: { 5824c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[35]; 5825c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: Unclear in XML Schema 1.0 */ 5826c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* TODO: What to do with the timezone? */ 5827c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.date.year < 0) 5828c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 35, "-%04ld-%02u", 5829c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik labs(val->value.date.year), 5830c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.mon); 5831c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 5832c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 35, "%04ld-%02u", 5833c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.year, val->value.date.mon); 5834c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5835c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5836c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5837c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_TIME: 5838c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik { 5839c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[30]; 5840c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5841c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.date.tz_flag) { 5842c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValPtr norm; 5843c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5844c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm = xmlSchemaDateNormalize(val, 0); 5845c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (norm == NULL) 5846c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 5847c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5848c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Check if "%.14g" is portable. 5849c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5850c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, 5851c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%02u:%02u:%02.14gZ", 5852c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.hour, 5853c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.min, 5854c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.sec); 5855c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaFreeValue(norm); 5856c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5857c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, 5858c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%02u:%02u:%02.14g", 5859c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.hour, 5860c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.min, 5861c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.sec); 5862c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5863c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5864c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5865c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5866c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DATE: 5867c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik { 5868c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[30]; 5869c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5870c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.date.tz_flag) { 5871c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValPtr norm; 5872c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5873c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm = xmlSchemaDateNormalize(val, 0); 5874c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (norm == NULL) 5875c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 5876c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5877c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Append the canonical value of the 5878c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * recoverable timezone and not "Z". 5879c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5880c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, 5881c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%04ld:%02u:%02uZ", 5882c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.year, norm->value.date.mon, 5883c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.day); 5884c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaFreeValue(norm); 5885c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5886c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, 5887c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%04ld:%02u:%02u", 5888c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.year, val->value.date.mon, 5889c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.day); 5890c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5891c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5892c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5893c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5894c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DATETIME: 5895c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik { 5896c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[50]; 5897c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5898c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.date.tz_flag) { 5899c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaValPtr norm; 5900c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5901c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm = xmlSchemaDateNormalize(val, 0); 5902c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (norm == NULL) 5903c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 5904c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5905c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Check if "%.14g" is portable. 5906c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5907c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 50, 5908c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%04ld:%02u:%02uT%02u:%02u:%02.14gZ", 5909c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.year, norm->value.date.mon, 5910c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.day, norm->value.date.hour, 5911c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik norm->value.date.min, norm->value.date.sec); 5912c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaFreeValue(norm); 5913c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } else { 5914c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 50, 5915c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik "%04ld:%02u:%02uT%02u:%02u:%02.14g", 5916c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.year, val->value.date.mon, 5917c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.day, val->value.date.hour, 5918c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik val->value.date.min, val->value.date.sec); 5919c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5920c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5921c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5922c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5923c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_HEXBINARY: 5924c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.hex.str); 5925c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5926c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_BASE64BINARY: 5927c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5928c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Is the following spec piece implemented?: 5929c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * SPEC: "Note: For some values the canonical form defined 5930c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * above does not conform to [RFC 2045], which requires breaking 5931c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * with linefeeds at appropriate intervals." 5932c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5933c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST val->value.base64.str); 5934c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5935c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_FLOAT: { 5936c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[30]; 5937c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5938c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * |m| < 16777216, -149 <= e <= 104. 5939c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Handle, NaN, INF, -INF. The format is not 5940c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * yet conformant. The c type float does not cover 5941c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * the whole range. 5942c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5943c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 30, "%01.14e", val->value.f); 5944c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5945c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5946c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 5947c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_DOUBLE: { 5948c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik char buf[40]; 5949c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* |m| < 9007199254740992, -1075 <= e <= 970 */ 5950c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik /* 5951c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * TODO: Handle, NaN, INF, -INF. The format is not 5952c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * yet conformant. The c type float does not cover 5953c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * the whole range. 5954c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5955c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik snprintf(buf, 40, "%01.14e", val->value.d); 5956c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST buf); 5957c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 5958c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 59596e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik default: 5960478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST "???"); 5961c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (1); 59626e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik } 5963478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (0); 5964478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik} 5965478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik 5966bda59576670f1cabea3c49520628d82e401702caDaniel Veillard/** 5967c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * xmlSchemaGetCanonValueWhtsp: 5968c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @val: the precomputed value 5969c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @retValue: the returned value 5970c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * @ws: the whitespace type of the value 5971c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 5972c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Get a the cononical representation of the value. 5973c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * The caller has to free the returned @retValue. 5974c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * 5975c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * Returns 0 if the value could be built, 1 if the value type is 5976c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik * not supported yet and -1 in case of API errors. 5977c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik */ 5978c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcikint 5979c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. BuchcikxmlSchemaGetCanonValueWhtsp(xmlSchemaValPtr val, 5980c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik const xmlChar **retValue, 5981c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik xmlSchemaWhitespaceValueType ws) 5982c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik{ 5983c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((retValue == NULL) || (val == NULL)) 5984c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 5985c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((ws == XML_SCHEMA_WHITESPACE_UNKNOWN) || 5986c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik (ws > XML_SCHEMA_WHITESPACE_COLLAPSE)) 5987c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (-1); 5988c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 5989c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = NULL; 5990c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik switch (val->type) { 5991c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_STRING: 5992c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.str == NULL) 5993c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); 5994c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 5995c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlSchemaCollapseString(val->value.str); 5996c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else if (ws == XML_SCHEMA_WHITESPACE_REPLACE) 5997c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlSchemaWhiteSpaceReplace(val->value.str); 5998c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((*retValue) == NULL) 5999c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(val->value.str); 6000c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 6001c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik case XML_SCHEMAS_NORMSTRING: 6002c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (val->value.str == NULL) 6003c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(BAD_CAST ""); 6004c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else { 6005c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if (ws == XML_SCHEMA_WHITESPACE_COLLAPSE) 6006c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlSchemaCollapseString(val->value.str); 6007c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik else 6008c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = xmlSchemaWhiteSpaceReplace(val->value.str); 6009c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik if ((*retValue) == NULL) 6010c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik *retValue = BAD_CAST xmlStrdup(val->value.str); 6011c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 6012c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik break; 6013c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik default: 6014c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (xmlSchemaGetCanonValue(val, retValue)); 6015c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik } 6016c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik return (0); 6017c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik} 6018c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik 6019c872afbd82e904c45f2f7f6b929b5f9beeefc07bKasimier T. Buchcik/** 6020bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * xmlSchemaGetValType: 6021bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * @val: a schemas value 6022bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * 6023bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * Accessor for the type of a value 6024bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * 6025bda59576670f1cabea3c49520628d82e401702caDaniel Veillard * Returns the xmlSchemaValType of the value 6026bda59576670f1cabea3c49520628d82e401702caDaniel Veillard */ 6027478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaValType 6028478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. BuchcikxmlSchemaGetValType(xmlSchemaValPtr val) 6029478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik{ 6030bda59576670f1cabea3c49520628d82e401702caDaniel Veillard if (val == NULL) 6031bda59576670f1cabea3c49520628d82e401702caDaniel Veillard return(XML_SCHEMAS_UNKNOWN); 6032478d693fa23d5b4256dbecbe3a114ba9703760e8Kasimier T. Buchcik return (val->type); 60336e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik} 60346e224f1272bc2a7d069b72f70b3ce737caf3cf81Kasimier T. Buchcik 60355d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#define bottom_xmlschemastypes 60365d4644ef6e38479a648615eca758c5e962a141d5Daniel Veillard#include "elfgcchack.h" 60374255d504151db75c17f85192ce74f45dd2d65533Daniel Veillard#endif /* LIBXML_SCHEMAS_ENABLED */ 6038